├── VERSION ├── public ├── img │ ├── code.png │ └── favicon.ico ├── css │ ├── font-awesome │ │ ├── font │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.ttf │ │ │ └── fontawesome-webfont.woff │ │ └── css │ │ │ ├── font-awesome.min.css │ │ │ └── archive │ │ │ └── font-awesome.css │ ├── font │ │ ├── OpenSans-Regular-webfont.eot │ │ ├── OpenSans-Regular-webfont.ttf │ │ └── OpenSans-Regular-webfont.woff │ ├── odometer.css │ ├── pages │ │ └── dashboard.css │ ├── bootstrap-responsive.min.css │ └── style.css └── js │ ├── base.js │ ├── odometer.js │ └── dashboard.js ├── cfg.ini ├── funcs ├── portstat.go ├── ifstat.go ├── diskstats.go └── cpustat.go ├── .gopmfile ├── README.md ├── .gitignore ├── go.mod ├── http ├── mem_rt.go ├── net_rt.go ├── template_func.go ├── cpu_rt.go ├── df_rt.go ├── kernel_rt.go ├── system_rt.go ├── http.go └── iostats_rt.go ├── main.go ├── LICENSE ├── global ├── global.go └── cfg.go ├── control ├── templates └── index.tmpl └── go.sum /VERSION: -------------------------------------------------------------------------------- 1 | 0.0.1 -------------------------------------------------------------------------------- /public/img/code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/falcon-eye/HEAD/public/img/code.png -------------------------------------------------------------------------------- /public/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/falcon-eye/HEAD/public/img/favicon.ico -------------------------------------------------------------------------------- /public/css/font-awesome/font/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/falcon-eye/HEAD/public/css/font-awesome/font/FontAwesome.otf -------------------------------------------------------------------------------- /public/css/font/OpenSans-Regular-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/falcon-eye/HEAD/public/css/font/OpenSans-Regular-webfont.eot -------------------------------------------------------------------------------- /public/css/font/OpenSans-Regular-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/falcon-eye/HEAD/public/css/font/OpenSans-Regular-webfont.ttf -------------------------------------------------------------------------------- /public/css/font/OpenSans-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/falcon-eye/HEAD/public/css/font/OpenSans-Regular-webfont.woff -------------------------------------------------------------------------------- /public/css/font-awesome/font/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/falcon-eye/HEAD/public/css/font-awesome/font/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/css/font-awesome/font/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/falcon-eye/HEAD/public/css/font-awesome/font/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/css/font-awesome/font/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlricQin/falcon-eye/HEAD/public/css/font-awesome/font/fontawesome-webfont.woff -------------------------------------------------------------------------------- /cfg.ini: -------------------------------------------------------------------------------- 1 | ;[common] 2 | ;pid = /var/run/falcon_eye/falcon_eye.pid 3 | 4 | ;[log] 5 | ;trace debug info warn error fetal 6 | ;level = info 7 | 8 | ;[http] 9 | ;port = 1988 10 | 11 | ;[collector] 12 | ;base_interval_in_seconds = 1 13 | -------------------------------------------------------------------------------- /funcs/portstat.go: -------------------------------------------------------------------------------- 1 | package funcs 2 | 3 | import ( 4 | "github.com/ulricqin/falcon/collector" 5 | "github.com/ulricqin/goutils/slicetool" 6 | ) 7 | 8 | func PortIsListen(port int64) bool { 9 | return slicetool.SliceContainsInt64(collector.ListenPorts(), port) 10 | } 11 | -------------------------------------------------------------------------------- /.gopmfile: -------------------------------------------------------------------------------- 1 | [target] 2 | path = github.com/ulricqin/falcon-eye 3 | 4 | [deps] 5 | github.com/ulricqin/goutils= 6 | github.com/ulricqin/falcon= 7 | github.com/astaxie/beego= 8 | github.com/go-martini/martini= 9 | github.com/martini-contrib/render= 10 | 11 | [res] 12 | include=templates|public 13 | 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | falcon-eye 2 | ========== 3 | 4 | linux monitor tool. an agent running on your host collect and display performance data. just like https://github.com/afaqurk/linux-dash 5 | 6 | 7 | ### compile 8 | 9 | ``` 10 | go build 11 | ``` 12 | 13 | # update 14 | 15 | we move to [falcon-agent](https://github.com/open-falcon/agent) 16 | 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Object files, Static and Dynamic libs (Shared Objects) 2 | *.o 3 | *.a 4 | *.so 5 | 6 | # Folders 7 | _obj 8 | _test 9 | 10 | # Architecture specific extensions/prefixes 11 | *.[568vq] 12 | [568vq].out 13 | 14 | *.cgo1.go 15 | *.cgo2.c 16 | _cgo_defun.c 17 | _cgo_gotypes.go 18 | _cgo_export.* 19 | 20 | _testmain.go 21 | 22 | *.exe 23 | *.test 24 | 25 | falcon-eye.tar.gz 26 | falcon-eye 27 | /var 28 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/ulricqin/falcon-eye 2 | 3 | go 1.17 4 | 5 | require ( 6 | github.com/astaxie/beego v1.12.3 7 | github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab 8 | github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11 9 | github.com/ulricqin/falcon v0.0.0-20141030024612-a05615b01fa8 10 | github.com/ulricqin/goutils v0.0.0-20141016093831-470e8f553458 11 | ) 12 | 13 | require ( 14 | github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 // indirect 15 | github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect 16 | ) 17 | -------------------------------------------------------------------------------- /http/mem_rt.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import ( 4 | "github.com/ulricqin/falcon/collector" 5 | "net/http" 6 | ) 7 | 8 | func CfgMemRouter() { 9 | m.Get("/proc/mem", func(w http.ResponseWriter) string { 10 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 11 | mem, err := collector.MemInfo() 12 | if err != nil { 13 | return RenderErrDto(err.Error()) 14 | } 15 | memFree := mem.MemFree + mem.Buffers + mem.Cached 16 | memUsed := mem.MemTotal - memFree 17 | return RenderDataDto([]interface{}{mem.MemTotal / 1024 / 1024, memUsed / 1024 / 1024, memFree / 1024 / 1024}) 18 | }) 19 | 20 | } 21 | -------------------------------------------------------------------------------- /http/net_rt.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import ( 4 | "fmt" 5 | "github.com/ulricqin/falcon-eye/funcs" 6 | "github.com/ulricqin/goutils/formatter" 7 | "net/http" 8 | ) 9 | 10 | func CfgNetRouter() { 11 | 12 | m.Get("/proc/net/rate", func(w http.ResponseWriter) string { 13 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 14 | 15 | ret := [][]string{} 16 | for k, _ := range funcs.NetIfList { 17 | item := []string{ 18 | k, 19 | fmt.Sprintf("%s/s", formatter.DisplaySize(float64(funcs.NetReceiveBytesRate(k)))), 20 | fmt.Sprintf("%s/s", formatter.DisplaySize(float64(funcs.NetTransmitBytesRate(k)))), 21 | fmt.Sprintf("%s/s", formatter.DisplaySize(float64(funcs.NetTotalBytesRate(k)))), 22 | fmt.Sprintf("%d/s", funcs.NetDroppedRate(k)), 23 | } 24 | ret = append(ret, item) 25 | } 26 | 27 | return RenderDataDto(ret) 28 | }) 29 | 30 | } 31 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "github.com/ulricqin/falcon-eye/funcs" 6 | "github.com/ulricqin/falcon-eye/global" 7 | "github.com/ulricqin/falcon-eye/http" 8 | "github.com/ulricqin/goutils/filetool" 9 | "github.com/ulricqin/goutils/logtool" 10 | "time" 11 | ) 12 | 13 | func main() { 14 | var cfgFile string 15 | flag.StringVar(&cfgFile, "c", "", "configuration file") 16 | flag.Parse() 17 | 18 | if cfgFile == "" { 19 | cfgFile, _ = filetool.RealPath("cfg.ini") 20 | logtool.Warn("no configuration file specified. use default: %s", cfgFile) 21 | } 22 | 23 | global.InitEnv(cfgFile) 24 | 25 | go InitDataHistory() 26 | 27 | http.StartHttp() 28 | 29 | select {} 30 | } 31 | 32 | func InitDataHistory() { 33 | for { 34 | funcs.UpdateCpuStat() 35 | funcs.UpdateIfStat() 36 | funcs.UpdateDiskStats() 37 | time.Sleep(global.CollBaseInfoInterval) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /http/template_func.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import ( 4 | "html/template" 5 | "strings" 6 | "time" 7 | ) 8 | 9 | func nl2br(in string) (out string) { 10 | out = strings.Replace(in, "\n", "
", -1) 11 | return 12 | } 13 | 14 | func htmlQuote(src string) string { 15 | text := string(src) 16 | text = strings.Replace(text, "&", "&", -1) 17 | text = strings.Replace(text, "<", "<", -1) 18 | text = strings.Replace(text, ">", ">", -1) 19 | text = strings.Replace(text, "'", "'", -1) 20 | text = strings.Replace(text, "\"", """, -1) 21 | text = strings.Replace(text, "“", "“", -1) 22 | text = strings.Replace(text, "”", "”", -1) 23 | text = strings.Replace(text, " ", " ", -1) 24 | return strings.TrimSpace(text) 25 | } 26 | 27 | func str2html(raw string) template.HTML { 28 | return template.HTML(raw) 29 | } 30 | 31 | func dateFormat(unixnano int64) string { 32 | return time.Unix(0, unixnano).Format("2006-01-02 15:04:05") 33 | } 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 UlricQin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /http/cpu_rt.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import ( 4 | "fmt" 5 | "github.com/ulricqin/falcon-eye/funcs" 6 | "net/http" 7 | ) 8 | 9 | func CfgCpuRouter() { 10 | m.Get("/proc/cpu/num", func(w http.ResponseWriter) string { 11 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 12 | return RenderDataDto(funcs.CpuCnt()) 13 | }) 14 | 15 | m.Get("/proc/cpu/usage", func(w http.ResponseWriter) string { 16 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 17 | 18 | if funcs.CpuSnapshootList[1] == nil { 19 | return RenderDataDto([][10]string{}) 20 | } 21 | 22 | item := [10]string{ 23 | fmt.Sprintf("%.1f%%", funcs.CpuIdle()), 24 | fmt.Sprintf("%.1f%%", funcs.CpuBusy()), 25 | fmt.Sprintf("%.1f%%", funcs.CpuUser()), 26 | fmt.Sprintf("%.1f%%", funcs.CpuNice()), 27 | fmt.Sprintf("%.1f%%", funcs.CpuSystem()), 28 | fmt.Sprintf("%.1f%%", funcs.CpuIowait()), 29 | fmt.Sprintf("%.1f%%", funcs.CpuIrq()), 30 | fmt.Sprintf("%.1f%%", funcs.CpuSoftIrq()), 31 | fmt.Sprintf("%.1f%%", funcs.CpuSteal()), 32 | fmt.Sprintf("%.1f%%", funcs.CpuGuest()), 33 | } 34 | 35 | return RenderDataDto([][10]string{item}) 36 | }) 37 | 38 | } 39 | -------------------------------------------------------------------------------- /global/global.go: -------------------------------------------------------------------------------- 1 | package global 2 | 3 | import ( 4 | "github.com/astaxie/beego/config" 5 | "github.com/ulricqin/goutils/filetool" 6 | log "github.com/ulricqin/goutils/logtool" 7 | "github.com/ulricqin/goutils/systool" 8 | "os" 9 | "runtime" 10 | ) 11 | 12 | var Config config.Configer 13 | var UseSystemConfig bool = false 14 | 15 | func InitEnv(configPath string) { 16 | 17 | if !filetool.IsExist(configPath) { 18 | log.Warn("configuration file[%s] is nonexistent", configPath) 19 | UseSystemConfig = true 20 | } 21 | 22 | if !UseSystemConfig { 23 | var err error 24 | Config, err = config.NewConfig("ini", configPath) 25 | if err != nil { 26 | log.Fetal("configuration file[%s] cannot parse. ", configPath) 27 | os.Exit(1) 28 | } 29 | } 30 | 31 | if !UseSystemConfig { 32 | log.SetLevelWithDefault(Config.String("log::level"), "info") 33 | } else { 34 | log.SetLevel("info") 35 | } 36 | 37 | initCfg() 38 | 39 | defaultPidPath := "/var/run/falcon_eye/falcon_eye.pid" 40 | if !UseSystemConfig { 41 | if iniPidPath := Config.String("common::pid"); iniPidPath != "" { 42 | defaultPidPath = iniPidPath 43 | } 44 | } 45 | systool.WritePidFile(defaultPidPath) 46 | 47 | runtime.GOMAXPROCS(runtime.NumCPU()) 48 | } 49 | -------------------------------------------------------------------------------- /http/df_rt.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import ( 4 | "fmt" 5 | "github.com/ulricqin/falcon/collector" 6 | "github.com/ulricqin/goutils/formatter" 7 | "net/http" 8 | ) 9 | 10 | func CfgDfRouter() { 11 | m.Get("/proc/df/bytes", func(w http.ResponseWriter) string { 12 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 13 | 14 | mountPoints, err := collector.ListMountPoint() 15 | if err != nil { 16 | return RenderErrDto(err.Error()) 17 | } 18 | 19 | var ret [][]interface{} = make([][]interface{}, 0) 20 | for idx := range mountPoints { 21 | var du *collector.DeviceUsageStruct 22 | du, err = collector.BuildDeviceUsage(mountPoints[idx]) 23 | if err == nil { 24 | ret = append(ret, 25 | []interface{}{ 26 | du.FsSpec, 27 | formatter.DisplaySize(float64(du.BlocksAll)), 28 | formatter.DisplaySize(float64(du.BlocksUsed)), 29 | formatter.DisplaySize(float64(du.BlocksFree)), 30 | fmt.Sprintf("%.1f%%", du.BlocksUsedPercent), 31 | du.FsFile, 32 | formatter.DisplaySize(float64(du.InodesAll)), 33 | formatter.DisplaySize(float64(du.InodesUsed)), 34 | formatter.DisplaySize(float64(du.InodesFree)), 35 | fmt.Sprintf("%.1f%%", du.BlocksUsedPercent), 36 | du.FsVfstype, 37 | }) 38 | } 39 | } 40 | 41 | return RenderDataDto(ret) 42 | 43 | }) 44 | 45 | } 46 | -------------------------------------------------------------------------------- /funcs/ifstat.go: -------------------------------------------------------------------------------- 1 | package funcs 2 | 3 | import ( 4 | "github.com/ulricqin/falcon/collector" 5 | ) 6 | 7 | var NetIfList = make(map[string][2]*collector.NetIf) 8 | 9 | func UpdateIfStat() error { 10 | netIfs, err := collector.NetIfs() 11 | if err != nil { 12 | return err 13 | } 14 | 15 | for i := 0; i < len(netIfs); i++ { 16 | iface := netIfs[i].Iface 17 | NetIfList[iface] = [2]*collector.NetIf{netIfs[i], NetIfList[iface][0]} 18 | } 19 | return nil 20 | } 21 | 22 | func NetReceiveBytesRate(iface string) int64 { 23 | val, ok := NetIfList[iface] 24 | if !ok { 25 | return 0 26 | } 27 | 28 | if val[1] == nil { 29 | return 0 30 | } 31 | 32 | return val[0].InBytes - val[1].InBytes 33 | } 34 | 35 | func NetTransmitBytesRate(iface string) int64 { 36 | val, ok := NetIfList[iface] 37 | if !ok { 38 | return 0 39 | } 40 | 41 | if val[1] == nil { 42 | return 0 43 | } 44 | 45 | return val[0].OutBytes - val[1].OutBytes 46 | } 47 | 48 | func NetTotalBytesRate(iface string) int64 { 49 | val, ok := NetIfList[iface] 50 | if !ok { 51 | return 0 52 | } 53 | 54 | if val[1] == nil { 55 | return 0 56 | } 57 | 58 | return val[0].TotalBytes - val[1].TotalBytes 59 | } 60 | 61 | func NetDroppedRate(iface string) int64 { 62 | val, ok := NetIfList[iface] 63 | if !ok { 64 | return 0 65 | } 66 | 67 | if val[1] == nil { 68 | return 0 69 | } 70 | 71 | return val[0].TotalDropped - val[1].TotalDropped 72 | } 73 | -------------------------------------------------------------------------------- /http/kernel_rt.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import ( 4 | "github.com/ulricqin/falcon/collector" 5 | "github.com/ulricqin/goutils/systool" 6 | "net/http" 7 | ) 8 | 9 | func CfgKernelRouter() { 10 | m.Get("/proc/kernel/hostname", func(w http.ResponseWriter) string { 11 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 12 | hostname, err := collector.KernelHostname() 13 | if err != nil { 14 | return RenderErrDto(err.Error()) 15 | } 16 | return RenderDataDto(hostname) 17 | }) 18 | 19 | m.Get("/proc/kernel/maxproc", func(w http.ResponseWriter) string { 20 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 21 | maxProc, err := collector.KernelMaxProc() 22 | if err != nil { 23 | return RenderErrDto(err.Error()) 24 | } 25 | return RenderDataDto(maxProc) 26 | }) 27 | 28 | m.Get("/proc/kernel/maxfiles", func(w http.ResponseWriter) string { 29 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 30 | maxFiles, err := collector.KernelMaxFiles() 31 | if err != nil { 32 | return RenderErrDto(err.Error()) 33 | } 34 | return RenderDataDto(maxFiles) 35 | }) 36 | 37 | m.Get("/proc/kernel/version", func(w http.ResponseWriter) string { 38 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 39 | ver, err := systool.CmdOutNoLn("uname", "-r") 40 | if err != nil { 41 | return RenderErrDto(err.Error()) 42 | } 43 | return RenderDataDto(ver) 44 | }) 45 | } 46 | -------------------------------------------------------------------------------- /global/cfg.go: -------------------------------------------------------------------------------- 1 | package global 2 | 3 | import ( 4 | "github.com/ulricqin/goutils/filetool" 5 | log "github.com/ulricqin/goutils/logtool" 6 | "os" 7 | "time" 8 | ) 9 | 10 | const MaxCpustatHistory = 60 11 | 12 | var CollBaseInfoInterval time.Duration 13 | var HttpPort string 14 | var Version string 15 | 16 | // configuration 17 | func initCfg() { 18 | initHttpConfig() 19 | initCollectBaseInfoInterval() 20 | initVersion() 21 | } 22 | 23 | func initVersion() { 24 | var err error 25 | Version, err = filetool.ReadFileToStringNoLn("VERSION") 26 | if err != nil { 27 | log.Fetal("read VERSION file fail") 28 | os.Exit(1) 29 | } 30 | } 31 | 32 | func initHttpConfig() { 33 | HttpPort = Config.String("http::port") 34 | if HttpPort == "" { 35 | log.Warn("http::port is blank. use default 1988") 36 | HttpPort = "1988" 37 | } 38 | } 39 | 40 | func initCollectBaseInfoInterval() { 41 | if UseSystemConfig { 42 | CollBaseInfoInterval = 1 * time.Second 43 | return 44 | } 45 | 46 | str := Config.String("collector::base_interval_in_seconds") 47 | if str == "" { 48 | log.Warn("collector::base_interval_in_seconds is blank. use default 1s") 49 | CollBaseInfoInterval = 1 * time.Second 50 | return 51 | } 52 | 53 | v, err := Config.Int64("collector::base_interval_in_seconds") 54 | if err != nil { 55 | log.Warn("collector::base_interval_in_seconds config error") 56 | os.Exit(1) 57 | } 58 | 59 | CollBaseInfoInterval = time.Duration(v) * time.Second 60 | } 61 | -------------------------------------------------------------------------------- /http/system_rt.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import ( 4 | "fmt" 5 | "github.com/ulricqin/falcon/collector" 6 | "net/http" 7 | ) 8 | 9 | func CfgSystemRouter() { 10 | m.Get("/proc/system/date", func(w http.ResponseWriter) string { 11 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 12 | out, err := collector.SystemDate() 13 | if err != nil { 14 | return RenderErrDto(err.Error()) 15 | } 16 | return RenderDataDto(out) 17 | }) 18 | 19 | m.Get("/proc/system/uptime", func(w http.ResponseWriter) string { 20 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 21 | arr, err := collector.SystemUptime() 22 | if err != nil { 23 | return RenderErrDto(err.Error()) 24 | } 25 | 26 | return RenderDataDto(fmt.Sprintf("%d days %d hours %d minutes", arr[0], arr[1], arr[2])) 27 | }) 28 | 29 | m.Get("/proc/system/loadavg", func(w http.ResponseWriter) string { 30 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 31 | cpuNum := collector.CpuNum() 32 | load, err := collector.LoadAvg() 33 | if err != nil { 34 | return RenderErrDto(err.Error()) 35 | } 36 | 37 | ret := [3][2]interface{}{ 38 | [2]interface{}{load.Avg1min, int64(load.Avg1min * 100.0 / float64(cpuNum))}, 39 | [2]interface{}{load.Avg5min, int64(load.Avg5min * 100.0 / float64(cpuNum))}, 40 | [2]interface{}{load.Avg15min, int64(load.Avg15min * 100.0 / float64(cpuNum))}, 41 | } 42 | 43 | return RenderDataDto(ret) 44 | }) 45 | 46 | } 47 | -------------------------------------------------------------------------------- /control: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | WORKSPACE=$(cd $(dirname $0)/; pwd) 4 | cd $WORKSPACE 5 | 6 | mkdir -p var 7 | 8 | app=falcon-eye 9 | conf=cfg.ini 10 | pidfile=var/app.pid 11 | logfile=var/app.log 12 | RELEASE_FILE=falcon-eye.tar.gz 13 | 14 | function pack() { 15 | go build 16 | tar zcf $RELEASE_FILE $app $conf control VERSION public templates 17 | echo "target: $RELEASE_FILE" 18 | } 19 | 20 | function check_pid() { 21 | if [ -f $pidfile ];then 22 | pid=`cat $pidfile` 23 | if [ -n $pid ]; then 24 | running=`ps -p $pid|grep -v "PID TTY" |wc -l` 25 | return $running 26 | fi 27 | fi 28 | return 0 29 | } 30 | 31 | function start() { 32 | check_pid 33 | running=$? 34 | if [ $running -gt 0 ];then 35 | echo -n "$app now is running already, pid=" 36 | cat $pidfile 37 | return 1 38 | fi 39 | 40 | nohup ./$app -c $conf &> $logfile & 41 | echo $! > $pidfile 42 | echo "$app started..., pid=$!" 43 | } 44 | 45 | function stop() { 46 | pgrep $app | xargs kill &>/dev/null 47 | echo "$app stoped..." 48 | } 49 | function restart() { 50 | stop 51 | sleep 1 52 | start 53 | } 54 | function status() { 55 | check_pid 56 | running=$? 57 | if [ $running -gt 0 ];then 58 | echo -n "$app now is running, pid=" 59 | cat $pidfile 60 | else 61 | echo "$app is stoped" 62 | fi 63 | } 64 | function help() { 65 | echo "$0 start|stop|restart|status|pack|update" 66 | } 67 | 68 | if [ "$1" == "" ]; then 69 | help 70 | elif [ "$1" == "stop" ];then 71 | stop 72 | elif [ "$1" == "start" ];then 73 | start 74 | elif [ "$1" == "restart" ];then 75 | restart 76 | elif [ "$1" == "pack" ];then 77 | pack 78 | elif [ "$1" == "status" ];then 79 | status 80 | else 81 | help 82 | fi 83 | -------------------------------------------------------------------------------- /funcs/diskstats.go: -------------------------------------------------------------------------------- 1 | package funcs 2 | 3 | import ( 4 | "github.com/ulricqin/falcon/collector" 5 | ) 6 | 7 | var DiskStatsList = make(map[string][2]*collector.DiskStats) 8 | 9 | func UpdateDiskStats() error { 10 | dsList, err := collector.ListDiskStats() 11 | if err != nil { 12 | return err 13 | } 14 | 15 | for i := 0; i < len(dsList); i++ { 16 | device := dsList[i].Device 17 | DiskStatsList[device] = [2]*collector.DiskStats{dsList[i], DiskStatsList[device][0]} 18 | } 19 | return nil 20 | } 21 | 22 | func IOReadRequests(arr [2]*collector.DiskStats) uint64 { 23 | return arr[0].ReadRequests - arr[1].ReadRequests 24 | } 25 | 26 | func IOReadMerged(arr [2]*collector.DiskStats) uint64 { 27 | return arr[0].ReadMerged - arr[1].ReadMerged 28 | } 29 | 30 | func IOReadSectors(arr [2]*collector.DiskStats) uint64 { 31 | return arr[0].ReadSectors - arr[1].ReadSectors 32 | } 33 | 34 | func IOMsecRead(arr [2]*collector.DiskStats) uint64 { 35 | return arr[0].MsecRead - arr[1].MsecRead 36 | } 37 | 38 | func IOWriteRequests(arr [2]*collector.DiskStats) uint64 { 39 | return arr[0].WriteRequests - arr[1].WriteRequests 40 | } 41 | 42 | func IOWriteMerged(arr [2]*collector.DiskStats) uint64 { 43 | return arr[0].WriteMerged - arr[1].WriteMerged 44 | } 45 | 46 | func IOWriteSectors(arr [2]*collector.DiskStats) uint64 { 47 | return arr[0].WriteSectors - arr[1].WriteSectors 48 | } 49 | 50 | func IOMsecWrite(arr [2]*collector.DiskStats) uint64 { 51 | return arr[0].MsecWrite - arr[1].MsecWrite 52 | } 53 | 54 | func IOMsecTotal(arr [2]*collector.DiskStats) uint64 { 55 | return arr[0].MsecTotal - arr[1].MsecTotal 56 | } 57 | 58 | func IOMsecWeightedTotal(arr [2]*collector.DiskStats) uint64 { 59 | return arr[0].MsecWeightedTotal - arr[1].MsecWeightedTotal 60 | } 61 | 62 | func IODelta(device string, f func([2]*collector.DiskStats) uint64) uint64 { 63 | val, ok := DiskStatsList[device] 64 | if !ok { 65 | return 0 66 | } 67 | 68 | if val[1] == nil { 69 | return 0 70 | } 71 | return f(val) 72 | } 73 | -------------------------------------------------------------------------------- /http/http.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/go-martini/martini" 6 | "github.com/martini-contrib/render" 7 | "github.com/ulricqin/falcon-eye/funcs" 8 | "github.com/ulricqin/falcon-eye/global" 9 | "github.com/ulricqin/goutils/logtool" 10 | "html/template" 11 | "net/http" 12 | "os" 13 | "strconv" 14 | ) 15 | 16 | type Dto struct { 17 | Succ bool 18 | Msg string 19 | Data interface{} 20 | } 21 | 22 | func ErrDto(message string) Dto { 23 | return Dto{Succ: false, Msg: message} 24 | } 25 | 26 | func DataDto(d interface{}) Dto { 27 | return Dto{Succ: true, Msg: "", Data: d} 28 | } 29 | 30 | func RenderErrDto(message string) string { 31 | dto := ErrDto(message) 32 | bs, err := json.Marshal(dto) 33 | if err != nil { 34 | return err.Error() 35 | } else { 36 | return string(bs) 37 | } 38 | } 39 | 40 | func RenderDataDto(d interface{}) string { 41 | dto := DataDto(d) 42 | bs, err := json.Marshal(dto) 43 | 44 | if err != nil { 45 | return err.Error() 46 | } else { 47 | return string(bs) 48 | } 49 | } 50 | 51 | var m *martini.ClassicMartini 52 | 53 | func StartHttp() { 54 | 55 | p, err := strconv.Atoi(global.HttpPort) 56 | if err != nil { 57 | logtool.Fetal("port[%s] format error", global.HttpPort) 58 | os.Exit(1) 59 | } 60 | 61 | if funcs.PortIsListen(int64(p)) { 62 | logtool.Fetal("port[%d] is in listen", p) 63 | os.Exit(1) 64 | } 65 | 66 | m = martini.Classic() 67 | 68 | m.Use(render.Renderer(render.Options{ 69 | Funcs: []template.FuncMap{{ 70 | "nl2br": nl2br, 71 | "htmlquote": htmlQuote, 72 | "str2html": str2html, 73 | "dateformat": dateFormat, 74 | }}, 75 | })) 76 | 77 | m.Get("/healthz", func() string { 78 | return "ok" 79 | }) 80 | 81 | m.Get("/", func(re render.Render) { 82 | m := make(map[string]string) 83 | m["version"] = global.Version 84 | re.HTML(200, "index", m) 85 | }) 86 | 87 | CfgKernelRouter() 88 | CfgSystemRouter() 89 | CfgCpuRouter() 90 | CfgMemRouter() 91 | CfgDfRouter() 92 | CfgNetRouter() 93 | CfgIORouter() 94 | 95 | logtool.Info("use http port: %s", global.HttpPort) 96 | http.ListenAndServe(":"+global.HttpPort, m) 97 | } 98 | -------------------------------------------------------------------------------- /http/iostats_rt.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import ( 4 | "fmt" 5 | "github.com/ulricqin/falcon-eye/funcs" 6 | "net/http" 7 | ) 8 | 9 | /* 10 | Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util 11 | sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12 | */ 13 | 14 | func CfgIORouter() { 15 | 16 | m.Get("/proc/io", func(w http.ResponseWriter) string { 17 | w.Header().Set("Content-Type", "application/json; charset=UTF-8") 18 | 19 | ret := [][]string{} 20 | for k, _ := range funcs.DiskStatsList { 21 | rio := funcs.IODelta(k, funcs.IOReadRequests) 22 | wio := funcs.IODelta(k, funcs.IOWriteRequests) 23 | delta_rsec := funcs.IODelta(k, funcs.IOReadSectors) 24 | delta_wsec := funcs.IODelta(k, funcs.IOWriteSectors) 25 | ruse := funcs.IODelta(k, funcs.IOMsecRead) 26 | wuse := funcs.IODelta(k, funcs.IOMsecWrite) 27 | use := funcs.IODelta(k, funcs.IOMsecTotal) 28 | n_io := rio + wio 29 | avgrq_sz := 0.0 30 | await := 0.0 31 | svctm := 0.0 32 | if n_io != 0 { 33 | avgrq_sz = float64(delta_rsec+delta_wsec) / float64(n_io) 34 | await = float64(ruse+wuse) / float64(n_io) 35 | svctm = float64(use) / float64(n_io) 36 | } 37 | 38 | item := []string{ 39 | k, 40 | fmt.Sprintf("%d", funcs.IODelta(k, funcs.IOReadMerged)), 41 | fmt.Sprintf("%d", funcs.IODelta(k, funcs.IOWriteMerged)), 42 | fmt.Sprintf("%d", rio), 43 | fmt.Sprintf("%d", wio), 44 | fmt.Sprintf("%.2f", float64(delta_rsec)/2.0), 45 | fmt.Sprintf("%.2f", float64(delta_wsec)/2.0), 46 | fmt.Sprintf("%.2f", avgrq_sz), // avgrq-sz: delta(rsect+wsect)/delta(rio+wio) 47 | fmt.Sprintf("%.2f", float64(funcs.IODelta(k, funcs.IOMsecWeightedTotal))/1000.0), // avgqu-sz: delta(aveq)/s/1000 48 | fmt.Sprintf("%.2f", await), // await: delta(ruse+wuse)/delta(rio+wio) 49 | fmt.Sprintf("%.2f", svctm), // svctm: delta(use)/delta(rio+wio) 50 | fmt.Sprintf("%.2f%%", float64(use)/10.0), // %util: delta(use)/s/1000 * 100% 51 | } 52 | ret = append(ret, item) 53 | } 54 | 55 | return RenderDataDto(ret) 56 | }) 57 | 58 | } 59 | -------------------------------------------------------------------------------- /public/js/base.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function() { 2 | 3 | // enable popovers 4 | $(".pop").popover(); 5 | 6 | // activate tooltips on hover 7 | $("[data-toggle='tooltip']").tooltip({trigger: 'hover', placement:'right'}); 8 | 9 | dashboard.getAll(); 10 | }).on("click", ".js-smoothscroll", function(event) { 11 | event.preventDefault(); 12 | var target = $(this.hash).parent(); 13 | pulseElement(target, 8, 400); 14 | 15 | $("html,body").animate({ 16 | scrollTop: target.offset().top - 130 17 | }, 1000); 18 | }).on("click", ".js-refresh-info", function(event) { 19 | event.preventDefault(); 20 | var target = event.target; 21 | var item = target.id.split("-").splice(-1)[0]; 22 | 23 | // if the refresh icon is click (where in a ) target will not have an id, so grab its parent instead 24 | if(target.id == "") { 25 | var parent = $(target).parent()[0]; 26 | item = parent.id.split("-").splice(-1)[0]; 27 | } 28 | 29 | dashboard.fnMap[item](); 30 | }); 31 | 32 | // Handle for cancelling active effect. 33 | var pulsing = { 34 | element: null, 35 | timeoutIDs: [], 36 | resetfn: function() { 37 | pulsing.element = null; 38 | pulsing.timeoutIDs = []; 39 | } 40 | }; 41 | 42 | /** 43 | * Applies a pulse effect to the specified element. If triggered while already 44 | * active the ongoing effect is cancelled immediately. 45 | * 46 | * @param {HTMLElement} element The element to apply the effect to. 47 | * @param {Number} times How many pulses. 48 | * @param {Number} interval Milliseconds between pulses. 49 | */ 50 | function pulseElement(element, times, interval) { 51 | if (pulsing.element) { 52 | pulsing.element.removeClass("pulse"). 53 | parent().removeClass("pulse-border"); 54 | pulsing.timeoutIDs.forEach(function(ID) { 55 | clearTimeout(ID); 56 | }); 57 | pulsing.timeoutIDs = []; 58 | } 59 | pulsing.element = element; 60 | var parent = element.parent(); 61 | var f = function() { 62 | element.toggleClass("pulse"); 63 | parent.toggleClass("pulse-border"); 64 | }; 65 | 66 | pulsing.timeoutIDs.push(setTimeout(pulsing.resetfn, 67 | (times + 1) * interval)); 68 | for (; times > 0; --times) { 69 | pulsing.timeoutIDs.push(setTimeout(f, times * interval)); 70 | } 71 | } 72 | 73 | function isInArray(array, search) 74 | { 75 | return (array.indexOf(search) >= 0) ? true : false; 76 | } 77 | -------------------------------------------------------------------------------- /funcs/cpustat.go: -------------------------------------------------------------------------------- 1 | package funcs 2 | 3 | import ( 4 | "github.com/ulricqin/falcon-eye/global" 5 | "github.com/ulricqin/falcon/collector" 6 | ) 7 | 8 | var CpuNum int 9 | var CpuSnapshootList [global.MaxCpustatHistory]*collector.CpuSnapshoot 10 | 11 | func UpdateCpuStat() error { 12 | if CpuNum == 0 { 13 | CpuNum = collector.CpuNum() 14 | } 15 | 16 | snap, err := collector.CpuSnapShoot() 17 | if err != nil { 18 | return err 19 | } 20 | 21 | length := global.MaxCpustatHistory 22 | for i := length - 1; i > 0; i-- { 23 | CpuSnapshootList[i] = CpuSnapshootList[i-1] 24 | } 25 | 26 | CpuSnapshootList[0] = snap 27 | return nil 28 | } 29 | 30 | func CpuIdle() float64 { 31 | dTot := float64(CpuSnapshootList[0].Total - CpuSnapshootList[1].Total) 32 | invQuotient := 100.00 / dTot 33 | return float64(CpuSnapshootList[0].Idle-CpuSnapshootList[1].Idle) * invQuotient 34 | } 35 | 36 | func CpuBusy() float64 { 37 | dTot := float64(CpuSnapshootList[0].Total - CpuSnapshootList[1].Total) 38 | dI := float64(CpuSnapshootList[0].Idle - CpuSnapshootList[1].Idle) 39 | return (dTot - dI) * 100 / dTot 40 | } 41 | 42 | func CpuUser() float64 { 43 | dTot := float64(CpuSnapshootList[0].Total - CpuSnapshootList[1].Total) 44 | invQuotient := 100.00 / dTot 45 | return float64(CpuSnapshootList[0].User-CpuSnapshootList[1].User) * invQuotient 46 | } 47 | 48 | func CpuNice() float64 { 49 | dTot := float64(CpuSnapshootList[0].Total - CpuSnapshootList[1].Total) 50 | invQuotient := 100.00 / dTot 51 | return float64(CpuSnapshootList[0].Nice-CpuSnapshootList[1].Nice) * invQuotient 52 | } 53 | 54 | func CpuSystem() float64 { 55 | dTot := float64(CpuSnapshootList[0].Total - CpuSnapshootList[1].Total) 56 | invQuotient := 100.00 / dTot 57 | return float64(CpuSnapshootList[0].System-CpuSnapshootList[1].System) * invQuotient 58 | } 59 | 60 | func CpuIowait() float64 { 61 | dTot := float64(CpuSnapshootList[0].Total - CpuSnapshootList[1].Total) 62 | invQuotient := 100.00 / dTot 63 | return float64(CpuSnapshootList[0].Iowait-CpuSnapshootList[1].Iowait) * invQuotient 64 | } 65 | 66 | func CpuIrq() float64 { 67 | dTot := float64(CpuSnapshootList[0].Total - CpuSnapshootList[1].Total) 68 | invQuotient := 100.00 / dTot 69 | return float64(CpuSnapshootList[0].Irq-CpuSnapshootList[1].Irq) * invQuotient 70 | } 71 | 72 | func CpuSoftIrq() float64 { 73 | dTot := float64(CpuSnapshootList[0].Total - CpuSnapshootList[1].Total) 74 | invQuotient := 100.00 / dTot 75 | return float64(CpuSnapshootList[0].SoftIrq-CpuSnapshootList[1].SoftIrq) * invQuotient 76 | } 77 | 78 | func CpuSteal() float64 { 79 | dTot := float64(CpuSnapshootList[0].Total - CpuSnapshootList[1].Total) 80 | invQuotient := 100.00 / dTot 81 | return float64(CpuSnapshootList[0].Steal-CpuSnapshootList[1].Steal) * invQuotient 82 | } 83 | 84 | func CpuGuest() float64 { 85 | dTot := float64(CpuSnapshootList[0].Total - CpuSnapshootList[1].Total) 86 | invQuotient := 100.00 / dTot 87 | return float64(CpuSnapshootList[0].Guest-CpuSnapshootList[1].Guest) * invQuotient 88 | } 89 | 90 | func CpuCnt() int { 91 | return CpuNum 92 | } 93 | -------------------------------------------------------------------------------- /public/css/odometer.css: -------------------------------------------------------------------------------- 1 | .odometer.odometer-auto-theme, .odometer.odometer-theme-default { 2 | display: -moz-inline-box; 3 | -moz-box-orient: vertical; 4 | display: inline-block; 5 | vertical-align: middle; 6 | *vertical-align: auto; 7 | position: relative; 8 | } 9 | .odometer.odometer-auto-theme, .odometer.odometer-theme-default { 10 | *display: inline; 11 | } 12 | .odometer.odometer-auto-theme .odometer-digit, .odometer.odometer-theme-default .odometer-digit { 13 | display: -moz-inline-box; 14 | -moz-box-orient: vertical; 15 | display: inline-block; 16 | vertical-align: middle; 17 | *vertical-align: auto; 18 | position: relative; 19 | } 20 | .odometer.odometer-auto-theme .odometer-digit, .odometer.odometer-theme-default .odometer-digit { 21 | *display: inline; 22 | } 23 | .odometer.odometer-auto-theme .odometer-digit .odometer-digit-spacer, .odometer.odometer-theme-default .odometer-digit .odometer-digit-spacer { 24 | display: -moz-inline-box; 25 | -moz-box-orient: vertical; 26 | display: inline-block; 27 | vertical-align: middle; 28 | *vertical-align: auto; 29 | visibility: hidden; 30 | } 31 | .odometer.odometer-auto-theme .odometer-digit .odometer-digit-spacer, .odometer.odometer-theme-default .odometer-digit .odometer-digit-spacer { 32 | *display: inline; 33 | } 34 | .odometer.odometer-auto-theme .odometer-digit .odometer-digit-inner, .odometer.odometer-theme-default .odometer-digit .odometer-digit-inner { 35 | text-align: left; 36 | display: block; 37 | position: absolute; 38 | top: 0; 39 | left: 0; 40 | right: 0; 41 | bottom: 0; 42 | overflow: hidden; 43 | } 44 | .odometer.odometer-auto-theme .odometer-digit .odometer-ribbon, .odometer.odometer-theme-default .odometer-digit .odometer-ribbon { 45 | display: block; 46 | } 47 | .odometer.odometer-auto-theme .odometer-digit .odometer-ribbon-inner, .odometer.odometer-theme-default .odometer-digit .odometer-ribbon-inner { 48 | display: block; 49 | } 50 | .odometer.odometer-auto-theme .odometer-digit .odometer-value, .odometer.odometer-theme-default .odometer-digit .odometer-value { 51 | display: block; 52 | } 53 | .odometer.odometer-auto-theme .odometer-digit .odometer-value.odometer-last-value, .odometer.odometer-theme-default .odometer-digit .odometer-value.odometer-last-value { 54 | position: absolute; 55 | } 56 | .odometer.odometer-auto-theme.odometer-animating-up .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-up .odometer-ribbon-inner { 57 | -webkit-transition: -webkit-transform 1s; 58 | -moz-transition: -moz-transform 1s; 59 | -ms-transition: -ms-transform 1s; 60 | -o-transition: -o-transform 1s; 61 | transition: transform 1s; 62 | } 63 | .odometer.odometer-auto-theme.odometer-animating-up.odometer-animating .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-up.odometer-animating .odometer-ribbon-inner { 64 | -webkit-transform: translateY(-100%); 65 | -moz-transform: translateY(-100%); 66 | -ms-transform: translateY(-100%); 67 | -o-transform: translateY(-100%); 68 | transform: translateY(-100%); 69 | } 70 | .odometer.odometer-auto-theme.odometer-animating-down .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-down .odometer-ribbon-inner { 71 | -webkit-transform: translateY(-100%); 72 | -moz-transform: translateY(-100%); 73 | -ms-transform: translateY(-100%); 74 | -o-transform: translateY(-100%); 75 | transform: translateY(-100%); 76 | } 77 | .odometer.odometer-auto-theme.odometer-animating-down.odometer-animating .odometer-ribbon-inner, .odometer.odometer-theme-default.odometer-animating-down.odometer-animating .odometer-ribbon-inner { 78 | -webkit-transition: -webkit-transform 1s; 79 | -moz-transition: -moz-transform 1s; 80 | -ms-transition: -ms-transform 1s; 81 | -o-transition: -o-transform 1s; 82 | -o-transition: -o-transform 1s; 83 | transition: transform 1s; 84 | -webkit-transform: translateY(0); 85 | -moz-transform: translateY(0); 86 | -ms-transform: translateY(0); 87 | -o-transform: translateY(0); 88 | transform: translateY(0); 89 | } 90 | 91 | .odometer.odometer-auto-theme, .odometer.odometer-theme-default { 92 | font-family: "Helvetica Neue", sans-serif; 93 | line-height: 1.1em; 94 | } 95 | -------------------------------------------------------------------------------- /public/css/pages/dashboard.css: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------ 2 | Bootstrap Admin Template by EGrappler.com 3 | ------------------------------------------------------------------*/ 4 | 5 | 6 | 7 | /*------------------------------------------------------------------ 8 | [1. Shortcuts / .shortcuts] 9 | */ 10 | 11 | .shortcuts { 12 | text-align: center; 13 | } 14 | 15 | .shortcuts .shortcut { 16 | width: 22.50%; 17 | display: inline-block; 18 | padding: 12px 0; 19 | margin: 0 .9% 1em; 20 | vertical-align: top; 21 | 22 | text-decoration: none; 23 | 24 | background: #f9f6f1; 25 | 26 | border-radius: 5px; 27 | } 28 | 29 | .shortcuts .shortcut .shortcut-icon { 30 | margin-top: .25em; 31 | margin-bottom: .25em; 32 | 33 | font-size: 32px; 34 | color: #545454; 35 | } 36 | 37 | .shortcuts .shortcut:hover { 38 | background: #00ba8b; 39 | } 40 | 41 | .shortcuts .shortcut:hover span{ 42 | color: #fff; 43 | } 44 | 45 | .shortcuts .shortcut:hover .shortcut-icon { 46 | color: #fff; 47 | } 48 | 49 | .shortcuts .shortcut-label { 50 | display: block; 51 | 52 | font-weight: 400; 53 | color: #545454; 54 | } 55 | 56 | 57 | 58 | /*------------------------------------------------------------------ 59 | [2. Stats / .stats] 60 | */ 61 | 62 | .stats { 63 | width: 100%; 64 | display: table; 65 | padding: 0 0 0 10px; 66 | margin-top: .5em; 67 | margin-bottom: 1.9em; 68 | } 69 | 70 | .stats .stat { 71 | display: table-cell; 72 | width: 40%; 73 | vertical-align: top; 74 | 75 | font-size: 11px; 76 | font-weight: bold; 77 | color: #999; 78 | } 79 | 80 | .stat-value { 81 | display: block; 82 | margin-bottom: .55em; 83 | 84 | font-size: 30px; 85 | font-weight: bold; 86 | letter-spacing: -2px; 87 | color: #444; 88 | } 89 | 90 | .stat-time { 91 | text-align: center; 92 | padding-top: 1.5em; 93 | } 94 | 95 | .stat-time .stat-value { 96 | color: #19bc9c; 97 | font-size: 40px; 98 | } 99 | 100 | .stats #donut-chart { 101 | height: 100px; 102 | margin-left: -20px; 103 | } 104 | 105 | 106 | 107 | 108 | 109 | /*------------------------------------------------------------------ 110 | [3. News Item / .news-items] 111 | */ 112 | 113 | .news-items { 114 | margin: 1em 0 0; 115 | } 116 | 117 | .news-items li { 118 | display: table; 119 | padding: 0 2em 0 1.5em; 120 | padding-bottom: 1em; 121 | margin-bottom: 1em; 122 | border-bottom: 1px dotted #CCC; 123 | } 124 | 125 | .news-items li:last-child { padding-bottom: 0; border: none; } 126 | 127 | .news-item-date { 128 | display: table-cell; 129 | } 130 | 131 | .news-item-detail { 132 | display: table-cell; 133 | } 134 | 135 | .news-item-title { 136 | font-size: 13px; 137 | font-weight: 600; 138 | } 139 | 140 | .news-item-date { 141 | width: 75px; 142 | vertical-align: middle; 143 | text-align: center; 144 | 145 | } 146 | 147 | .news-item-day { 148 | display: block; 149 | margin-bottom: .25em; 150 | 151 | font-size: 24px; 152 | color: #888; 153 | } 154 | 155 | .news-item-preview { 156 | margin-bottom: 0; 157 | 158 | color: #777; 159 | } 160 | 161 | .news-item-month { 162 | display: block; 163 | padding-right: 1px; 164 | 165 | font-size: 12px; 166 | font-weight: 600; 167 | color: #888; 168 | } 169 | 170 | 171 | 172 | /*------------------------------------------------------------------ 173 | [4. Action Table / .action-table] 174 | */ 175 | 176 | .action-table .btn-small { 177 | padding: 4px 5px 5px; 178 | 179 | font-size: 10px; 180 | } 181 | 182 | .action-table .td-actions { 183 | width: 80px; 184 | 185 | text-align: center; 186 | } 187 | 188 | .action-table .td-actions .btn { 189 | margin-right: .5em; 190 | } 191 | 192 | .action-table .td-actions .btn:last-child { 193 | margin-rigth: 0; 194 | } 195 | 196 | 197 | 198 | .big_stats { 199 | width: 100%; 200 | display: table; 201 | margin-top: 1.5em; 202 | } 203 | 204 | .big-stats-container .widget-content { 205 | border:0; 206 | } 207 | 208 | .big_stats .stat { 209 | width: 35%; 210 | height: auto; 211 | text-align: center; 212 | display: table-cell; 213 | padding: 0 0 1em; 214 | position: relative; 215 | 216 | border-right: 1px solid #CCC; 217 | border-left: 1px solid #FFF; 218 | } 219 | 220 | .big_stats i { font-size:20px; display:block; line-height: 30px; color:#b2afaa; } 221 | .big_stats .stat i { font: 20px/2em "Open Sans", sans-serif; color:#19bc9c; } 222 | 223 | h6.bigstats { 224 | margin: 20px; 225 | border-bottom: 1px solid #eee; 226 | padding-bottom: 20px; 227 | margin-bottom: 26px; 228 | } 229 | 230 | .big_stats .stat:first-child { 231 | border-left: none; 232 | width:33%; 233 | } 234 | 235 | .big_stats .stat:last-child { 236 | border-right: none; 237 | width:33%; 238 | } 239 | 240 | .big_stats .stat h4 { 241 | font-size: 11px; 242 | font-weight: bold; 243 | color: #777; 244 | margin-bottom: 1.5em; 245 | } 246 | 247 | .big_stats .stat .value { 248 | font-size: 20px; 249 | font-weight: bold; 250 | color: #545454; 251 | line-height: 1em; 252 | } 253 | 254 | 255 | 256 | @media all and (max-width: 950px) and (min-width: 1px) { 257 | 258 | .big_stats { 259 | display: block; 260 | margin-bottom: -10px; 261 | } 262 | 263 | .big_stats .stat { 264 | width: 32%; 265 | display: block; 266 | margin-bottom: 1em; 267 | float: left; 268 | } 269 | 270 | 271 | 272 | } 273 | 274 | @media (max-width: 767px) { 275 | .big_stats .stat .value { 276 | font-size: 25px; 277 | } 278 | } 279 | 280 | 281 | 282 | 283 | @media (max-width: 979px) { 284 | 285 | .shortcuts .shortcut { 286 | width: 31%; 287 | } 288 | } 289 | 290 | 291 | @media (max-width: 480px) { 292 | 293 | .stats .stat { 294 | 295 | margin-bottom: 3em; 296 | } 297 | 298 | .stats .stat .stat-value { 299 | margin-bottom: .15em; 300 | 301 | font-size: 20px; 302 | } 303 | 304 | .stats { 305 | float: left; 306 | 307 | display: block; 308 | 309 | margin-bottom: 0; 310 | } 311 | 312 | #chart-stats { 313 | margin: 2em 0 1em; 314 | } 315 | 316 | .shortcuts .shortcut { 317 | width: 48%; 318 | } 319 | } 320 | 321 | /* ADDED BY AFAQ */ 322 | .widget-content { padding:0px; } 323 | .dataTables_length { display:none; } 324 | .dataTable { margin-bottom:0px; } 325 | 326 | .pulse { 327 | background:#19bc9c; 328 | border:1px solid #19bc9c; 329 | color:white; 330 | } 331 | 332 | .pulse-border { 333 | border-color:#19bc9c; 334 | } 335 | 336 | .navbar { 337 | position:fixed; 338 | top:0; 339 | z-index:9999999; 340 | width:100%; 341 | } 342 | 343 | .subnavbar { 344 | position:fixed; 345 | top:50px; 346 | z-index:9999999; 347 | width:100%; 348 | } 349 | 350 | .main { 351 | margin-top:130px; 352 | } 353 | .dataTables_paginate{ width:100%; text-align:center; margin-top:10px; margin-left:-30px;} 354 | .dataTables_paginate a{ margin-left:8px;} 355 | .dataTables_paginate a:hover{ pointer:pointer;} 356 | .navbar-fixed-top{ margin-left:0px;} 357 | .widget-search{display: inline-block; vertical-align: middle; margin: 0 6px; width: 200px;} 358 | -------------------------------------------------------------------------------- /public/js/odometer.js: -------------------------------------------------------------------------------- 1 | /*! odometer 0.3.6 */ 2 | (function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y;p='',m=''+p+"",d='8'+m+"",g='',c=",ddd",h=60,f=2e3,a=20,i=2,e=.5,j=1e3/h,b=1e3/a,n="transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",t=document.createElement("div").style,o=null!=t.transition||null!=t.webkitTransition||null!=t.mozTransition||null!=t.oTransition,s=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,k=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,q=function(a){var b;return b=document.createElement("div"),b.innerHTML=a,b.children[0]},r=function(){var a,b;return null!=(a=null!=(b=window.performance)?b.now():void 0)?a:+new Date},v=!1,(u=function(){var a,b,c,d,e;if(!v&&null!=window.jQuery){for(v=!0,d=["html","text"],e=[],b=0,c=d.length;c>b;b++)a=d[b],e.push(function(a){var b;return b=window.jQuery.fn[a],window.jQuery.fn[a]=function(a){return null==a||null==this[0].odometer?b.apply(this,arguments):this[0].odometer.update(a)}}(a));return e}})(),setTimeout(u,0),l=function(){function a(b){var d,e,g,h,k,l,m,n,o,p,q,r,s,t,u,v=this;if(this.options=b,this.el=this.options.el,null!=this.el.odometer)return this.el.odometer;for(this.el.odometer=this,s=a.options,h=o=0,q=s.length;q>o;h=++o)e=s[h],null==this.options[e]&&(this.options[e]=h);this.value=this.cleanValue(null!=(t=this.options.value)?t:""),null==(k=this.options).format&&(k.format=c),(l=this.options).format||(l.format="d"),null==(m=this.options).duration&&(m.duration=f),this.MAX_VALUES=0|this.options.duration/j/i,this.renderInside(),this.render();try{for(u=["HTML","Text"],n=function(a){return Object.defineProperty(v.el,"inner"+a,{get:function(){return v.inside["outer"+a]},set:function(a){return v.update(v.cleanValue(a))}})},p=0,r=u.length;r>p;p++)g=u[p],n(g)}catch(w){d=w,this.watchForMutations()}}return a.prototype.renderInside=function(){return this.inside=document.createElement("div"),this.inside.className="odometer-inside",this.el.innerHTML="",this.el.appendChild(this.inside)},a.prototype.watchForMutations=function(){var a,b=this;if(null!=k)try{return null==this.observer&&(this.observer=new k(function(){var a;return a=b.el.innerText,b.renderInside(),b.render(b.value),b.update(a)})),this.watchMutations=!0,this.startWatchingMutations()}catch(c){a=c}},a.prototype.startWatchingMutations=function(){return this.watchMutations?this.observer.observe(this.el,{childList:!0}):void 0},a.prototype.stopWatchingMutations=function(){var a;return null!=(a=this.observer)?a.disconnect():void 0},a.prototype.cleanValue=function(a){return parseInt(a.toString().replace(/[.,]/g,""),10)||0},a.prototype.bindTransitionEnd=function(){var a,b,c,d,e,f,g=this;if(!this.transitionEndBound){for(this.transitionEndBound=!0,b=!1,e=n.split(" "),f=[],c=0,d=e.length;d>c;c++)a=e[c],f.push(this.el.addEventListener(a,function(){return b?!0:(b=!0,setTimeout(function(){return g.render(),b=!1},0),!0)},!1));return f}},a.prototype.resetFormat=function(){return this.format=this.options.format.split("").reverse().join("")},a.prototype.render=function(a){var b,c,d,e,f,g,h,i,j;for(null==a&&(a=this.value),this.stopWatchingMutations(),this.resetFormat(),this.inside.innerHTML="",b=this.el.className.split(" "),e=[],f=0,h=b.length;h>f;f++)c=b[f],c.length&&(/^odometer(-|$)/.test(c)||e.push(c));for(e.push("odometer"),o||e.push("odometer-no-transitions"),this.options.theme?e.push("odometer-theme-"+this.options.theme):e.push("odometer-auto-theme"),this.el.className=e.join(" "),this.ribbons={},this.digits=[],j=a.toString().split("").reverse(),g=0,i=j.length;i>g;g++)d=j[g],this.addDigit(d);return this.startWatchingMutations()},a.prototype.update=function(a){var b,c=this;return a=this.cleanValue(a),(b=a-this.value)?(this.el.className+=b>0?" odometer-animating-up":" odometer-animating-down",this.stopWatchingMutations(),this.animate(a),this.startWatchingMutations(),setTimeout(function(){return c.el.offsetHeight,c.el.className+=" odometer-animating"},0),this.value=a):void 0},a.prototype.renderDigit=function(){return q(d)},a.prototype.insertDigit=function(a){return this.inside.children.length?this.inside.insertBefore(a,this.inside.children[0]):this.inside.appendChild(a)},a.prototype.addSpacer=function(a){var b;return b=q(g),b.innerHTML=a,this.insertDigit(b)},a.prototype.addDigit=function(a){var b,c,d;if("-"===a)return this.addSpacer("-"),void 0;for(d=!1;;){if("-"===a)break;if(!this.format.length){if(d)throw new Error("Bad odometer format without digits");this.resetFormat(),d=!0}if(b=this.format[0],this.format=this.format.substring(1),"d"===b)break;this.addSpacer(b)}return c=this.renderDigit(),c.querySelector(".odometer-value").innerHTML=a,this.digits.push(c),this.insertDigit(c)},a.prototype.animate=function(a){return o?this.animateSlide(a):this.animateCount(a)},a.prototype.animateCount=function(a){var c,d,e,f,g,h=this;if(d=+a-this.value)return f=e=r(),c=this.value,(g=function(){var i,j,k;return r()-f>h.options.duration?(h.value=a,h.render(),void 0):(i=r()-e,i>b&&(e=r(),k=i/h.options.duration,j=d*k,c+=j,h.render(Math.round(c))),null!=window.requestAnimationFrame?s(g):setTimeout(g,b))})()},a.prototype.animateSlide=function(a){var b,c,d,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y;if(d=a-this.value){for(this.bindTransitionEnd(),f=Math.ceil(Math.log(Math.max(Math.abs(a),Math.abs(this.value))+1)/Math.log(10)),g=[],b=0,l=r=0;f>=0?f>r:r>f;l=f>=0?++r:--r){if(p=Math.floor(this.value/Math.pow(10,f-l-1)),i=Math.floor(a/Math.pow(10,f-l-1)),h=i-p,Math.abs(h)>this.MAX_VALUES){for(k=[],m=h/(this.MAX_VALUES+this.MAX_VALUES*b*e),c=p;h>0&&i>c||0>h&&c>i;)k.push(Math.round(c)),c+=m;k[k.length-1]!==i&&k.push(i),b++}else k=function(){x=[];for(var a=p;i>=p?i>=a:a>=i;i>=p?a++:a--)x.push(a);return x}.apply(this);for(l=s=0,u=k.length;u>s;l=++s)j=k[l],k[l]=Math.abs(j%10);g.push(k)}for(w=g.reverse(),y=[],l=t=0,v=w.length;v>t;l=++t)k=w[l],this.digits[l]||this.addDigit(" "),null==(q=this.ribbons)[l]&&(q[l]=this.digits[l].querySelector(".odometer-ribbon-inner")),this.ribbons[l].innerHTML="",0>d&&(k=k.reverse()),y.push(function(){var a,b,c;for(c=[],n=b=0,a=k.length;a>b;n=++b)j=k[n],o=document.createElement("div"),o.className="odometer-value",o.innerHTML=j,this.ribbons[l].appendChild(o),n===k.length-1&&(o.className+=" odometer-last-value"),0===n?c.push(o.className+=" odometer-first-value"):c.push(void 0);return c}.call(this));return y}},a}(),l.options=null!=(x=window.odometerOptions)?x:{},setTimeout(function(){var a,b,c,d,e;if(window.odometerOptions){d=window.odometerOptions,e=[];for(a in d)b=d[a],e.push(null!=(c=l.options)[a]?(c=l.options)[a]:c[a]=b);return e}},0),l.init=function(){var a,b,c,d,e;for(b=document.querySelectorAll(l.options.selector||".odometer"),e=[],c=0,d=b.length;d>c;c++)a=b[c],e.push(a.odometer=new l({el:a,value:a.innerText}));return e},null!=(null!=(y=document.documentElement)?y.doScroll:void 0)&&null!=document.createEventObject?(w=document.onreadystatechange,document.onreadystatechange=function(){return"complete"===document.readyState&&l.options.auto!==!1&&l.init(),null!=w?w.apply(this,arguments):void 0}):document.addEventListener("DOMContentLoaded",function(){return l.options.auto!==!1?l.init():void 0},!1),window.Odometer=l}).call(this); -------------------------------------------------------------------------------- /public/css/bootstrap-responsive.min.css: -------------------------------------------------------------------------------- 1 | .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";} 2 | .clearfix:after{clear:both;} 3 | .hide-text{overflow:hidden;text-indent:100%;white-space:nowrap;} 4 | .input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} 5 | .hidden{display:none;visibility:hidden;} 6 | .visible-phone{display:none;} 7 | .visible-tablet{display:none;} 8 | .visible-desktop{display:block;} 9 | .hidden-phone{display:block;} 10 | .hidden-tablet{display:block;} 11 | .hidden-desktop{display:none;} 12 | @media (max-width:767px){.visible-phone{display:block;} .hidden-phone{display:none;} .hidden-desktop{display:block;} .visible-desktop{display:none;}}@media (min-width:768px) and (max-width:979px){.visible-tablet{display:block;} .hidden-tablet{display:none;} .hidden-desktop{display:block;} .visible-desktop{display:none;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top{margin-left:-20px;margin-right:-20px;} .container{width:auto;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;} .thumbnails [class*="span"]{width:auto;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid > .span12{width:99.999999993%;} .row-fluid > .span11{width:91.436464082%;} .row-fluid > .span10{width:82.87292817100001%;} .row-fluid > .span9{width:74.30939226%;} .row-fluid > .span8{width:65.74585634900001%;} .row-fluid > .span7{width:57.182320438000005%;} .row-fluid > .span6{width:48.618784527%;} .row-fluid > .span5{width:40.055248616%;} .row-fluid > .span4{width:31.491712705%;} .row-fluid > .span3{width:22.928176794%;} .row-fluid > .span2{width:14.364640883%;} .row-fluid > .span1{width:5.801104972%;} input,textarea,.uneditable-input{margin-left:0;} input.span12, textarea.span12, .uneditable-input.span12{width:714px;} input.span11, textarea.span11, .uneditable-input.span11{width:652px;} input.span10, textarea.span10, .uneditable-input.span10{width:590px;} input.span9, textarea.span9, .uneditable-input.span9{width:528px;} input.span8, textarea.span8, .uneditable-input.span8{width:466px;} input.span7, textarea.span7, .uneditable-input.span7{width:404px;} input.span6, textarea.span6, .uneditable-input.span6{width:342px;} input.span5, textarea.span5, .uneditable-input.span5{width:280px;} input.span4, textarea.span4, .uneditable-input.span4{width:218px;} input.span3, textarea.span3, .uneditable-input.span3{width:156px;} input.span2, textarea.span2, .uneditable-input.span2{width:94px;} input.span1, textarea.span1, .uneditable-input.span1{width:32px;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav .nav-header{color:#999999;text-shadow:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px;} .span12{width:1170px;} .span11{width:1070px;} .span10{width:970px;} .span9{width:870px;} .span8{width:770px;} .span7{width:670px;} .span6{width:570px;} .span5{width:470px;} .span4{width:370px;} .span3{width:270px;} .span2{width:170px;} .span1{width:70px;} .offset12{margin-left:1230px;} .offset11{margin-left:1130px;} .offset10{margin-left:1030px;} .offset9{margin-left:930px;} .offset8{margin-left:830px;} .offset7{margin-left:730px;} .offset6{margin-left:630px;} .offset5{margin-left:530px;} .offset4{margin-left:430px;} .offset3{margin-left:330px;} .offset2{margin-left:230px;} .offset1{margin-left:130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid > .span12{width:100%;} .row-fluid > .span11{width:91.45299145300001%;} .row-fluid > .span10{width:82.905982906%;} .row-fluid > .span9{width:74.358974359%;} .row-fluid > .span8{width:65.81196581200001%;} .row-fluid > .span7{width:57.264957265%;} .row-fluid > .span6{width:48.717948718%;} .row-fluid > .span5{width:40.170940171000005%;} .row-fluid > .span4{width:31.623931624%;} .row-fluid > .span3{width:23.076923077%;} .row-fluid > .span2{width:14.529914530000001%;} .row-fluid > .span1{width:5.982905983%;} input,textarea,.uneditable-input{margin-left:0;} input.span12, textarea.span12, .uneditable-input.span12{width:1160px;} input.span11, textarea.span11, .uneditable-input.span11{width:1060px;} input.span10, textarea.span10, .uneditable-input.span10{width:960px;} input.span9, textarea.span9, .uneditable-input.span9{width:860px;} input.span8, textarea.span8, .uneditable-input.span8{width:760px;} input.span7, textarea.span7, .uneditable-input.span7{width:660px;} input.span6, textarea.span6, .uneditable-input.span6{width:560px;} input.span5, textarea.span5, .uneditable-input.span5{width:460px;} input.span4, textarea.span4, .uneditable-input.span4{width:360px;} input.span3, textarea.span3, .uneditable-input.span3{width:260px;} input.span2, textarea.span2, .uneditable-input.span2{width:160px;} input.span1, textarea.span1, .uneditable-input.span1{width:60px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} -------------------------------------------------------------------------------- /public/js/dashboard.js: -------------------------------------------------------------------------------- 1 | // Gets data from provided url and updates DOM element. 2 | function generate_os_data(url, element) { 3 | $.get(url, function (d) { 4 | if (d.Succ) { 5 | $(element).text(d.Data); 6 | } else { 7 | $(element).text(d.Msg); 8 | } 9 | }, "json"); 10 | } 11 | 12 | // If dataTable with provided ID exists, destroy it. 13 | function destroy_dataTable(table_id) { 14 | var table = $("#" + table_id); 15 | var ex = document.getElementById(table_id); 16 | if ($.fn.DataTable.fnIsDataTable(ex)) { 17 | table.hide().dataTable().fnClearTable(); 18 | table.dataTable().fnDestroy(); 19 | } 20 | } 21 | 22 | //DataTables 23 | //Sort file size data. 24 | jQuery.extend(jQuery.fn.dataTableExt.oSort, { 25 | "file-size-units": { 26 | K: 1024, 27 | M: Math.pow(1024, 2), 28 | G: Math.pow(1024, 3), 29 | T: Math.pow(1024, 4), 30 | P: Math.pow(1024, 5), 31 | E: Math.pow(1024, 6) 32 | }, 33 | 34 | "file-size-pre": function (a) { 35 | var x = a.substring(0, a.length - 1); 36 | var x_unit = a.substring(a.length - 1, a.length); 37 | if (jQuery.fn.dataTableExt.oSort['file-size-units'][x_unit]) { 38 | return parseInt(x * jQuery.fn.dataTableExt.oSort['file-size-units'][x_unit], 10); 39 | } 40 | else { 41 | return parseInt(x + x_unit, 10); 42 | } 43 | }, 44 | 45 | "file-size-asc": function (a, b) { 46 | return ((a < b) ? -1 : ((a > b) ? 1 : 0)); 47 | }, 48 | 49 | "file-size-desc": function (a, b) { 50 | return ((a < b) ? 1 : ((a > b) ? -1 : 0)); 51 | } 52 | }); 53 | 54 | //DataTables 55 | //Sort numeric data which has a percent sign with it. 56 | jQuery.extend(jQuery.fn.dataTableExt.oSort, { 57 | "percent-pre": function (a) { 58 | var x = (a === "-") ? 0 : a.replace(/%/, ""); 59 | return parseFloat(x); 60 | }, 61 | 62 | "percent-asc": function (a, b) { 63 | return ((a < b) ? -1 : ((a > b) ? 1 : 0)); 64 | }, 65 | 66 | "percent-desc": function (a, b) { 67 | return ((a < b) ? 1 : ((a > b) ? -1 : 0)); 68 | } 69 | }); 70 | 71 | //DataTables 72 | //Sort IP addresses 73 | jQuery.extend(jQuery.fn.dataTableExt.oSort, { 74 | "ip-address-pre": function (a) { 75 | // split the address into octets 76 | // 77 | var x = a.split('.'); 78 | 79 | // pad each of the octets to three digits in length 80 | // 81 | function zeroPad(num, places) { 82 | var zero = places - num.toString().length + 1; 83 | return Array(+(zero > 0 && zero)).join("0") + num; 84 | } 85 | 86 | // build the resulting IP 87 | var r = ''; 88 | for (var i = 0; i < x.length; i++) 89 | r = r + zeroPad(x[i], 3); 90 | 91 | // return the formatted IP address 92 | // 93 | return r; 94 | }, 95 | 96 | "ip-address-asc": function (a, b) { 97 | return ((a < b) ? -1 : ((a > b) ? 1 : 0)); 98 | }, 99 | 100 | "ip-address-desc": function (a, b) { 101 | return ((a < b) ? 1 : ((a > b) ? -1 : 0)); 102 | } 103 | }); 104 | 105 | /******************************* 106 | Data Call Functions 107 | *******************************/ 108 | 109 | var dashboard = {}; 110 | 111 | dashboard.getRam = function () { 112 | $.get("/proc/mem", function (data) { 113 | var ram_total = data.Data[0]; 114 | var ram_used = Math.round((data.Data[1] / ram_total) * 100); 115 | var ram_free = Math.round((data.Data[2] / ram_total) * 100); 116 | 117 | $("#ram-total").text(ram_total); 118 | $("#ram-used").text(data.Data[1]); 119 | $("#ram-free").text(data.Data[2]); 120 | 121 | $("#ram-free-per").text(ram_free); 122 | $("#ram-used-per").text(ram_used); 123 | }, "json"); 124 | } 125 | 126 | dashboard.getDf = function () { 127 | $.get("/proc/df/bytes", function (data) { 128 | var table = $("#df_dashboard"); 129 | var ex = document.getElementById("df_dashboard"); 130 | if ($.fn.DataTable.fnIsDataTable(ex)) { 131 | table.hide().dataTable().fnClearTable(); 132 | table.dataTable().fnDestroy(); 133 | } 134 | 135 | table.dataTable({ 136 | aaData: data.Data, 137 | aoColumns: [ 138 | { sTitle: "Filesystem" }, 139 | { sTitle: "BTotal", sType: "file-size" }, 140 | { sTitle: "BUsed", sType: "file-size" }, 141 | { sTitle: "BFree", sType: "file-size" }, 142 | { sTitle: "BUse%", sType: "percent" }, 143 | { sTitle: "Mounted" }, 144 | { sTitle: "ITotal", sType: "file-size" }, 145 | { sTitle: "IUsed", sType: "file-size" }, 146 | { sTitle: "IFree", sType: "file-size" }, 147 | { sTitle: "IUse%", sType: "percent" }, 148 | { sTitle: "Vfstype" } 149 | ], 150 | bPaginate: false, 151 | bFilter: false, 152 | bAutoWidth: true, 153 | bInfo: false 154 | }).fadeIn(); 155 | }, "json"); 156 | } 157 | 158 | dashboard.getCpu = function () { 159 | $.get("/proc/cpu/usage", function (data) { 160 | var table = $("#cpu_dashboard"); 161 | var ex = document.getElementById("cpu_dashboard"); 162 | if ($.fn.DataTable.fnIsDataTable(ex)) { 163 | table.hide().dataTable().fnClearTable(); 164 | table.dataTable().fnDestroy(); 165 | } 166 | 167 | table.dataTable({ 168 | aaData: data.Data, 169 | aoColumns: [ 170 | { sTitle: "idle"}, 171 | { sTitle: "busy"}, 172 | { sTitle: "user"}, 173 | { sTitle: "nice"}, 174 | { sTitle: "system"}, 175 | { sTitle: "iowait"}, 176 | { sTitle: "irq"}, 177 | { sTitle: "softirq"}, 178 | { sTitle: "steal"}, 179 | { sTitle: "guest"} 180 | ], 181 | bPaginate: false, 182 | bFilter: false, 183 | bAutoWidth: true, 184 | bInfo: false 185 | }).fadeIn(); 186 | }, "json"); 187 | } 188 | 189 | dashboard.getNet = function () { 190 | $.get("/proc/net/rate", function (data) { 191 | var table = $("#net_dashboard"); 192 | var ex = document.getElementById("net_dashboard"); 193 | if ($.fn.DataTable.fnIsDataTable(ex)) { 194 | table.hide().dataTable().fnClearTable(); 195 | table.dataTable().fnDestroy(); 196 | } 197 | 198 | table.dataTable({ 199 | aaData: data.Data, 200 | aoColumns: [ 201 | { sTitle: "iface"}, 202 | { sTitle: "Receive"}, 203 | { sTitle: "Transmit"}, 204 | { sTitle: "total"}, 205 | { sTitle: "dropped"}, 206 | ], 207 | bPaginate: false, 208 | bFilter: false, 209 | bAutoWidth: true, 210 | bInfo: false 211 | }).fadeIn(); 212 | }, "json"); 213 | } 214 | 215 | dashboard.getDiskstats = function () { 216 | $.get("/proc/io", function (data) { 217 | var table = $("#diskstats_dashboard"); 218 | var ex = document.getElementById("diskstats_dashboard"); 219 | if ($.fn.DataTable.fnIsDataTable(ex)) { 220 | table.hide().dataTable().fnClearTable(); 221 | table.dataTable().fnDestroy(); 222 | } 223 | 224 | table.dataTable({ 225 | aaData: data.Data, 226 | aoColumns: [ 227 | { sTitle: "Device"}, 228 | { sTitle: "rrqm/s"}, 229 | { sTitle: "wrqm/s"}, 230 | { sTitle: "r/s"}, 231 | { sTitle: "w/s"}, 232 | { sTitle: "rkB/s"}, 233 | { sTitle: "wkB/s"}, 234 | { sTitle: "avgrq-sz"}, 235 | { sTitle: "avgqu-sz"}, 236 | { sTitle: "await"}, 237 | { sTitle: "svctm"}, 238 | { sTitle: "%util"}, 239 | ], 240 | bPaginate: false, 241 | bFilter: false, 242 | bAutoWidth: true, 243 | bInfo: false 244 | }).fadeIn(); 245 | }, "json"); 246 | } 247 | 248 | dashboard.getOs = function () { 249 | generate_os_data("/proc/kernel/version", "#os-info"); 250 | generate_os_data("/proc/kernel/hostname", "#os-hostname"); 251 | generate_os_data("/proc/system/date", "#os-time"); 252 | generate_os_data("/proc/system/uptime", "#os-uptime"); 253 | } 254 | 255 | dashboard.getLoadAverage = function () { 256 | $.get("/proc/system/loadavg", function (d) { 257 | $("#cpu-1min").text(d.Data[0][0]); 258 | $("#cpu-5min").text(d.Data[1][0]); 259 | $("#cpu-15min").text(d.Data[2][0]); 260 | $("#cpu-1min-per").text(d.Data[0][1]); 261 | $("#cpu-5min-per").text(d.Data[1][1]); 262 | $("#cpu-15min-per").text(d.Data[2][1]); 263 | }, "json"); 264 | generate_os_data("/proc/cpu/num", "#core-number"); 265 | } 266 | 267 | /** 268 | * Refreshes all widgets. Does not call itself recursively. 269 | */ 270 | dashboard.getAll = function () { 271 | for (var item in dashboard.fnMap) { 272 | if (dashboard.fnMap.hasOwnProperty(item) && item !== "all") { 273 | dashboard.fnMap[item](); 274 | } 275 | } 276 | } 277 | 278 | dashboard.fnMap = { 279 | all: dashboard.getAll, 280 | ram: dashboard.getRam, 281 | df: dashboard.getDf, 282 | os: dashboard.getOs, 283 | load: dashboard.getLoadAverage, 284 | cpu: dashboard.getCpu, 285 | net: dashboard.getNet, 286 | diskstats: dashboard.getDiskstats, 287 | }; 288 | -------------------------------------------------------------------------------- /templates/index.tmpl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | linux-dash : Server Monitoring Web Dashboard 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 20 | 21 | 22 | 39 | 78 |
79 |
80 |
81 |
82 |
83 |
84 | A simple web dashboard to monitor your server. 85 |
86 |
87 |
88 | 89 |
90 |
91 |
92 |
93 | 94 |

95 | General Info 96 |

97 |
98 |
99 |
100 |
101 | Kernel Version 102 | 103 |
104 |
105 | Uptime 106 | 107 |
108 |
109 | Server Time 110 | 111 |
112 |
113 | Hostname 114 | 115 |
116 |
117 | Agent Version 118 | {{.version}} 119 |
120 |
121 |
122 |
123 | 124 |
125 |
126 |
127 | 128 |

129 | Load average 130 |

131 |
132 |
133 |
134 |
135 | Number of cores: 0 136 |
137 |
138 |
139 | 1 min  %
140 | 141 |
142 |
143 | 5 min  %
144 | 145 |
146 |
147 | 15 min  %
148 | 149 |
150 |
151 |
152 |
153 |
154 | 155 |
156 |
157 |
158 | 159 |

160 | RAM 161 |

162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 | Total  MB 170 |
171 |
172 | Used  MB
173 | % 174 |
175 |
176 | Free  MB
177 | % 178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 | 187 |
188 |
189 |
190 |
191 | 192 |

193 | Disk Usage 194 |

195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 | 204 | 205 |
206 |
207 |
208 |
209 | 210 |

211 | Disk IO Stats 212 |

213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 | 222 |
223 |
224 |
225 |
226 | 227 |

228 | CPU 229 |

230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 | 239 | 240 |
241 |
242 |
243 |
244 | 245 |

246 | Net 247 |

248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 | 258 | 259 |
260 |
261 |
262 | falcon-eye is open source on GitHub.
263 | Patches, suggestions, and comments are welcome. 264 |
265 |
266 | Powered by UlricQin 267 |
268 |
269 | 270 | 271 |
272 |
273 |
274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 2 | github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= 3 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 4 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 5 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 6 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 7 | github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= 8 | github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk= 9 | github.com/astaxie/beego v1.12.3 h1:SAQkdD2ePye+v8Gn1r4X6IKZM1wd28EyUOVQ3PDSOOQ= 10 | github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA= 11 | github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ= 12 | github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU= 13 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 14 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 15 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 16 | github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= 17 | github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= 18 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 19 | github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= 20 | github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= 21 | github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= 22 | github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U= 23 | github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c= 24 | github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= 25 | github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= 26 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 27 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 28 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 29 | github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= 30 | github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI= 31 | github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= 32 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 33 | github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw= 34 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 35 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 36 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 37 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 38 | github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= 39 | github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= 40 | github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= 41 | github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= 42 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 43 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 44 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 45 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 46 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 47 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 48 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 49 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 50 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 51 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 52 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 53 | github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 54 | github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 55 | github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= 56 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 57 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 58 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 59 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 60 | github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 61 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 62 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 63 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 64 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 65 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 66 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 67 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 68 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 69 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 70 | github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ= 71 | github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= 72 | github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11 h1:YFh+sjyJTMQSYjKwM4dFKhJPJC/wfo98tPUc17HdoYw= 73 | github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:Ah2dBMoxZEqk118as2T4u4fjfXarE0pPnMJaArZQZsI= 74 | github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= 75 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 76 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 77 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 78 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 79 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 80 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 81 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= 82 | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 83 | github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= 84 | github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= 85 | github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= 86 | github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= 87 | github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 88 | github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 89 | github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= 90 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 91 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 92 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 93 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 94 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 95 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 96 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 97 | github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 98 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 99 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 100 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 101 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 102 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= 103 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 104 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 105 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 106 | github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg= 107 | github.com/siddontang/go v0.0.0-20170517070808-cb568a3e5cc0/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= 108 | github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKzU3qCuvj/tPnimWSsZZzvk9qvkvrIL5naVBPh5s= 109 | github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= 110 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 111 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 112 | github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= 113 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 114 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 115 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 116 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 117 | github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= 118 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 119 | github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= 120 | github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= 121 | github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= 122 | github.com/ulricqin/falcon v0.0.0-20141030024612-a05615b01fa8 h1:gBhhsFVZWE9CemF9bIjGRAuFwjXQrJToQ2TZW9PdSfg= 123 | github.com/ulricqin/falcon v0.0.0-20141030024612-a05615b01fa8/go.mod h1:9FYj//pw7Dnu9xBonJvoaCTtSC5dX9WSfXAFDtYH2ws= 124 | github.com/ulricqin/goutils v0.0.0-20141016093831-470e8f553458 h1:6SkA7SsfZnENbuuZm3YTN/KJ0AllpiUK4QEOsW/ZS2o= 125 | github.com/ulricqin/goutils v0.0.0-20141016093831-470e8f553458/go.mod h1:PppwW1JHqv3COBlf3KOMFgZobXc7N1+UpgFtl36kkj4= 126 | github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= 127 | github.com/yuin/gopher-lua v0.0.0-20171031051903-609c9cd26973/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU= 128 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 129 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 130 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 131 | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 132 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 133 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 134 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 135 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 136 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 137 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 138 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 139 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 140 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 141 | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 142 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 143 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 144 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 145 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 146 | golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 147 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 148 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 149 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 150 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 151 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 152 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 153 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 154 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 155 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 156 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 157 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 158 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 159 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 160 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 161 | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 162 | gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= 163 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 164 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 165 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 166 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 167 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 168 | gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= 169 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 170 | -------------------------------------------------------------------------------- /public/css/font-awesome/css/font-awesome.min.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:'FontAwesome';src:url('../font/fontawesome-webfont.eot?v=3.2.1');src:url('../font/fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'),url('../font/fontawesome-webfont.woff?v=3.2.1') format('woff'),url('../font/fontawesome-webfont.ttf?v=3.2.1') format('truetype'),url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;} 2 | [class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none;} 3 | .icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em;} 4 | a [class^="icon-"],a [class*=" icon-"]{display:inline;} 5 | [class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.1428571428571428em;text-align:right;padding-right:0.2857142857142857em;}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.4285714285714286em;} 6 | .icons-ul{margin-left:2.142857142857143em;list-style-type:none;}.icons-ul>li{position:relative;} 7 | .icons-ul .icon-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;text-align:center;line-height:inherit;} 8 | [class^="icon-"].hide,[class*=" icon-"].hide{display:none;} 9 | .icon-muted{color:#eeeeee;} 10 | .icon-light{color:#ffffff;} 11 | .icon-dark{color:#333333;} 12 | .icon-border{border:solid 1px #eeeeee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} 13 | .icon-2x{font-size:2em;}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} 14 | .icon-3x{font-size:3em;}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} 15 | .icon-4x{font-size:4em;}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} 16 | .icon-5x{font-size:5em;}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;} 17 | .pull-right{float:right;} 18 | .pull-left{float:left;} 19 | [class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em;} 20 | [class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em;} 21 | [class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0% 0%;background-repeat:repeat;margin-top:0;} 22 | .icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none;} 23 | .btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em;} 24 | .btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block;} 25 | .nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em;} 26 | .btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em;} 27 | .btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em;} 28 | .btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em;} 29 | .btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0;}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em;} 30 | .btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em;} 31 | .btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em;} 32 | .nav-list [class^="icon-"],.nav-list [class*=" icon-"]{line-height:inherit;} 33 | .icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%;}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em;} 34 | .icon-stack .icon-stack-base{font-size:2em;*line-height:1em;} 35 | .icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;} 36 | a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none;} 37 | @-moz-keyframes spin{0%{-moz-transform:rotate(0deg);} 100%{-moz-transform:rotate(359deg);}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);} 100%{-webkit-transform:rotate(359deg);}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);} 100%{-o-transform:rotate(359deg);}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg);} 100%{-ms-transform:rotate(359deg);}}@keyframes spin{0%{transform:rotate(0deg);} 100%{transform:rotate(359deg);}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);} 38 | .icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);} 39 | .icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);} 40 | .icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1);} 41 | .icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1);} 42 | a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block;} 43 | .icon-glass:before{content:"\f000";} 44 | .icon-music:before{content:"\f001";} 45 | .icon-search:before{content:"\f002";} 46 | .icon-envelope-alt:before{content:"\f003";} 47 | .icon-heart:before{content:"\f004";} 48 | .icon-star:before{content:"\f005";} 49 | .icon-star-empty:before{content:"\f006";} 50 | .icon-user:before{content:"\f007";} 51 | .icon-film:before{content:"\f008";} 52 | .icon-th-large:before{content:"\f009";} 53 | .icon-th:before{content:"\f00a";} 54 | .icon-th-list:before{content:"\f00b";} 55 | .icon-ok:before{content:"\f00c";} 56 | .icon-remove:before{content:"\f00d";} 57 | .icon-zoom-in:before{content:"\f00e";} 58 | .icon-zoom-out:before{content:"\f010";} 59 | .icon-power-off:before,.icon-off:before{content:"\f011";} 60 | .icon-signal:before{content:"\f012";} 61 | .icon-gear:before,.icon-cog:before{content:"\f013";} 62 | .icon-trash:before{content:"\f014";} 63 | .icon-home:before{content:"\f015";} 64 | .icon-file-alt:before{content:"\f016";} 65 | .icon-time:before{content:"\f017";} 66 | .icon-road:before{content:"\f018";} 67 | .icon-download-alt:before{content:"\f019";} 68 | .icon-download:before{content:"\f01a";} 69 | .icon-upload:before{content:"\f01b";} 70 | .icon-inbox:before{content:"\f01c";} 71 | .icon-play-circle:before{content:"\f01d";} 72 | .icon-rotate-right:before,.icon-repeat:before{content:"\f01e";} 73 | .icon-refresh:before{content:"\f021";} 74 | .icon-list-alt:before{content:"\f022";} 75 | .icon-lock:before{content:"\f023";} 76 | .icon-flag:before{content:"\f024";} 77 | .icon-headphones:before{content:"\f025";} 78 | .icon-volume-off:before{content:"\f026";} 79 | .icon-volume-down:before{content:"\f027";} 80 | .icon-volume-up:before{content:"\f028";} 81 | .icon-qrcode:before{content:"\f029";} 82 | .icon-barcode:before{content:"\f02a";} 83 | .icon-tag:before{content:"\f02b";} 84 | .icon-tags:before{content:"\f02c";} 85 | .icon-book:before{content:"\f02d";} 86 | .icon-bookmark:before{content:"\f02e";} 87 | .icon-print:before{content:"\f02f";} 88 | .icon-camera:before{content:"\f030";} 89 | .icon-font:before{content:"\f031";} 90 | .icon-bold:before{content:"\f032";} 91 | .icon-italic:before{content:"\f033";} 92 | .icon-text-height:before{content:"\f034";} 93 | .icon-text-width:before{content:"\f035";} 94 | .icon-align-left:before{content:"\f036";} 95 | .icon-align-center:before{content:"\f037";} 96 | .icon-align-right:before{content:"\f038";} 97 | .icon-align-justify:before{content:"\f039";} 98 | .icon-list:before{content:"\f03a";} 99 | .icon-indent-left:before{content:"\f03b";} 100 | .icon-indent-right:before{content:"\f03c";} 101 | .icon-facetime-video:before{content:"\f03d";} 102 | .icon-picture:before{content:"\f03e";} 103 | .icon-pencil:before{content:"\f040";} 104 | .icon-map-marker:before{content:"\f041";} 105 | .icon-adjust:before{content:"\f042";} 106 | .icon-tint:before{content:"\f043";} 107 | .icon-edit:before{content:"\f044";} 108 | .icon-share:before{content:"\f045";} 109 | .icon-check:before{content:"\f046";} 110 | .icon-move:before{content:"\f047";} 111 | .icon-step-backward:before{content:"\f048";} 112 | .icon-fast-backward:before{content:"\f049";} 113 | .icon-backward:before{content:"\f04a";} 114 | .icon-play:before{content:"\f04b";} 115 | .icon-pause:before{content:"\f04c";} 116 | .icon-stop:before{content:"\f04d";} 117 | .icon-forward:before{content:"\f04e";} 118 | .icon-fast-forward:before{content:"\f050";} 119 | .icon-step-forward:before{content:"\f051";} 120 | .icon-eject:before{content:"\f052";} 121 | .icon-chevron-left:before{content:"\f053";} 122 | .icon-chevron-right:before{content:"\f054";} 123 | .icon-plus-sign:before{content:"\f055";} 124 | .icon-minus-sign:before{content:"\f056";} 125 | .icon-remove-sign:before{content:"\f057";} 126 | .icon-ok-sign:before{content:"\f058";} 127 | .icon-question-sign:before{content:"\f059";} 128 | .icon-info-sign:before{content:"\f05a";} 129 | .icon-screenshot:before{content:"\f05b";} 130 | .icon-remove-circle:before{content:"\f05c";} 131 | .icon-ok-circle:before{content:"\f05d";} 132 | .icon-ban-circle:before{content:"\f05e";} 133 | .icon-arrow-left:before{content:"\f060";} 134 | .icon-arrow-right:before{content:"\f061";} 135 | .icon-arrow-up:before{content:"\f062";} 136 | .icon-arrow-down:before{content:"\f063";} 137 | .icon-mail-forward:before,.icon-share-alt:before{content:"\f064";} 138 | .icon-resize-full:before{content:"\f065";} 139 | .icon-resize-small:before{content:"\f066";} 140 | .icon-plus:before{content:"\f067";} 141 | .icon-minus:before{content:"\f068";} 142 | .icon-asterisk:before{content:"\f069";} 143 | .icon-exclamation-sign:before{content:"\f06a";} 144 | .icon-gift:before{content:"\f06b";} 145 | .icon-leaf:before{content:"\f06c";} 146 | .icon-fire:before{content:"\f06d";} 147 | .icon-eye-open:before{content:"\f06e";} 148 | .icon-eye-close:before{content:"\f070";} 149 | .icon-warning-sign:before{content:"\f071";} 150 | .icon-plane:before{content:"\f072";} 151 | .icon-calendar:before{content:"\f073";} 152 | .icon-random:before{content:"\f074";} 153 | .icon-comment:before{content:"\f075";} 154 | .icon-magnet:before{content:"\f076";} 155 | .icon-chevron-up:before{content:"\f077";} 156 | .icon-chevron-down:before{content:"\f078";} 157 | .icon-retweet:before{content:"\f079";} 158 | .icon-shopping-cart:before{content:"\f07a";} 159 | .icon-folder-close:before{content:"\f07b";} 160 | .icon-folder-open:before{content:"\f07c";} 161 | .icon-resize-vertical:before{content:"\f07d";} 162 | .icon-resize-horizontal:before{content:"\f07e";} 163 | .icon-bar-chart:before{content:"\f080";} 164 | .icon-twitter-sign:before{content:"\f081";} 165 | .icon-facebook-sign:before{content:"\f082";} 166 | .icon-camera-retro:before{content:"\f083";} 167 | .icon-key:before{content:"\f084";} 168 | .icon-gears:before,.icon-cogs:before{content:"\f085";} 169 | .icon-comments:before{content:"\f086";} 170 | .icon-thumbs-up-alt:before{content:"\f087";} 171 | .icon-thumbs-down-alt:before{content:"\f088";} 172 | .icon-star-half:before{content:"\f089";} 173 | .icon-heart-empty:before{content:"\f08a";} 174 | .icon-signout:before{content:"\f08b";} 175 | .icon-linkedin-sign:before{content:"\f08c";} 176 | .icon-pushpin:before{content:"\f08d";} 177 | .icon-external-link:before{content:"\f08e";} 178 | .icon-signin:before{content:"\f090";} 179 | .icon-trophy:before{content:"\f091";} 180 | .icon-github-sign:before{content:"\f092";} 181 | .icon-upload-alt:before{content:"\f093";} 182 | .icon-lemon:before{content:"\f094";} 183 | .icon-phone:before{content:"\f095";} 184 | .icon-unchecked:before,.icon-check-empty:before{content:"\f096";} 185 | .icon-bookmark-empty:before{content:"\f097";} 186 | .icon-phone-sign:before{content:"\f098";} 187 | .icon-twitter:before{content:"\f099";} 188 | .icon-facebook:before{content:"\f09a";} 189 | .icon-github:before{content:"\f09b";} 190 | .icon-unlock:before{content:"\f09c";} 191 | .icon-credit-card:before{content:"\f09d";} 192 | .icon-rss:before{content:"\f09e";} 193 | .icon-hdd:before{content:"\f0a0";} 194 | .icon-bullhorn:before{content:"\f0a1";} 195 | .icon-bell:before{content:"\f0a2";} 196 | .icon-certificate:before{content:"\f0a3";} 197 | .icon-hand-right:before{content:"\f0a4";} 198 | .icon-hand-left:before{content:"\f0a5";} 199 | .icon-hand-up:before{content:"\f0a6";} 200 | .icon-hand-down:before{content:"\f0a7";} 201 | .icon-circle-arrow-left:before{content:"\f0a8";} 202 | .icon-circle-arrow-right:before{content:"\f0a9";} 203 | .icon-circle-arrow-up:before{content:"\f0aa";} 204 | .icon-circle-arrow-down:before{content:"\f0ab";} 205 | .icon-globe:before{content:"\f0ac";} 206 | .icon-wrench:before{content:"\f0ad";} 207 | .icon-tasks:before{content:"\f0ae";} 208 | .icon-filter:before{content:"\f0b0";} 209 | .icon-briefcase:before{content:"\f0b1";} 210 | .icon-fullscreen:before{content:"\f0b2";} 211 | .icon-group:before{content:"\f0c0";} 212 | .icon-link:before{content:"\f0c1";} 213 | .icon-cloud:before{content:"\f0c2";} 214 | .icon-beaker:before{content:"\f0c3";} 215 | .icon-cut:before{content:"\f0c4";} 216 | .icon-copy:before{content:"\f0c5";} 217 | .icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6";} 218 | .icon-save:before{content:"\f0c7";} 219 | .icon-sign-blank:before{content:"\f0c8";} 220 | .icon-reorder:before{content:"\f0c9";} 221 | .icon-list-ul:before{content:"\f0ca";} 222 | .icon-list-ol:before{content:"\f0cb";} 223 | .icon-strikethrough:before{content:"\f0cc";} 224 | .icon-underline:before{content:"\f0cd";} 225 | .icon-table:before{content:"\f0ce";} 226 | .icon-magic:before{content:"\f0d0";} 227 | .icon-truck:before{content:"\f0d1";} 228 | .icon-pinterest:before{content:"\f0d2";} 229 | .icon-pinterest-sign:before{content:"\f0d3";} 230 | .icon-google-plus-sign:before{content:"\f0d4";} 231 | .icon-google-plus:before{content:"\f0d5";} 232 | .icon-money:before{content:"\f0d6";} 233 | .icon-caret-down:before{content:"\f0d7";} 234 | .icon-caret-up:before{content:"\f0d8";} 235 | .icon-caret-left:before{content:"\f0d9";} 236 | .icon-caret-right:before{content:"\f0da";} 237 | .icon-columns:before{content:"\f0db";} 238 | .icon-sort:before{content:"\f0dc";} 239 | .icon-sort-down:before{content:"\f0dd";} 240 | .icon-sort-up:before{content:"\f0de";} 241 | .icon-envelope:before{content:"\f0e0";} 242 | .icon-linkedin:before{content:"\f0e1";} 243 | .icon-rotate-left:before,.icon-undo:before{content:"\f0e2";} 244 | .icon-legal:before{content:"\f0e3";} 245 | .icon-dashboard:before{content:"\f0e4";} 246 | .icon-comment-alt:before{content:"\f0e5";} 247 | .icon-comments-alt:before{content:"\f0e6";} 248 | .icon-bolt:before{content:"\f0e7";} 249 | .icon-sitemap:before{content:"\f0e8";} 250 | .icon-umbrella:before{content:"\f0e9";} 251 | .icon-paste:before{content:"\f0ea";} 252 | .icon-lightbulb:before{content:"\f0eb";} 253 | .icon-exchange:before{content:"\f0ec";} 254 | .icon-cloud-download:before{content:"\f0ed";} 255 | .icon-cloud-upload:before{content:"\f0ee";} 256 | .icon-user-md:before{content:"\f0f0";} 257 | .icon-stethoscope:before{content:"\f0f1";} 258 | .icon-suitcase:before{content:"\f0f2";} 259 | .icon-bell-alt:before{content:"\f0f3";} 260 | .icon-coffee:before{content:"\f0f4";} 261 | .icon-food:before{content:"\f0f5";} 262 | .icon-file-text-alt:before{content:"\f0f6";} 263 | .icon-building:before{content:"\f0f7";} 264 | .icon-hospital:before{content:"\f0f8";} 265 | .icon-ambulance:before{content:"\f0f9";} 266 | .icon-medkit:before{content:"\f0fa";} 267 | .icon-fighter-jet:before{content:"\f0fb";} 268 | .icon-beer:before{content:"\f0fc";} 269 | .icon-h-sign:before{content:"\f0fd";} 270 | .icon-plus-sign-alt:before{content:"\f0fe";} 271 | .icon-double-angle-left:before{content:"\f100";} 272 | .icon-double-angle-right:before{content:"\f101";} 273 | .icon-double-angle-up:before{content:"\f102";} 274 | .icon-double-angle-down:before{content:"\f103";} 275 | .icon-angle-left:before{content:"\f104";} 276 | .icon-angle-right:before{content:"\f105";} 277 | .icon-angle-up:before{content:"\f106";} 278 | .icon-angle-down:before{content:"\f107";} 279 | .icon-desktop:before{content:"\f108";} 280 | .icon-laptop:before{content:"\f109";} 281 | .icon-tablet:before{content:"\f10a";} 282 | .icon-mobile-phone:before{content:"\f10b";} 283 | .icon-circle-blank:before{content:"\f10c";} 284 | .icon-quote-left:before{content:"\f10d";} 285 | .icon-quote-right:before{content:"\f10e";} 286 | .icon-spinner:before{content:"\f110";} 287 | .icon-circle:before{content:"\f111";} 288 | .icon-mail-reply:before,.icon-reply:before{content:"\f112";} 289 | .icon-github-alt:before{content:"\f113";} 290 | .icon-folder-close-alt:before{content:"\f114";} 291 | .icon-folder-open-alt:before{content:"\f115";} 292 | .icon-expand-alt:before{content:"\f116";} 293 | .icon-collapse-alt:before{content:"\f117";} 294 | .icon-smile:before{content:"\f118";} 295 | .icon-frown:before{content:"\f119";} 296 | .icon-meh:before{content:"\f11a";} 297 | .icon-gamepad:before{content:"\f11b";} 298 | .icon-keyboard:before{content:"\f11c";} 299 | .icon-flag-alt:before{content:"\f11d";} 300 | .icon-flag-checkered:before{content:"\f11e";} 301 | .icon-terminal:before{content:"\f120";} 302 | .icon-code:before{content:"\f121";} 303 | .icon-reply-all:before{content:"\f122";} 304 | .icon-mail-reply-all:before{content:"\f122";} 305 | .icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123";} 306 | .icon-location-arrow:before{content:"\f124";} 307 | .icon-crop:before{content:"\f125";} 308 | .icon-code-fork:before{content:"\f126";} 309 | .icon-unlink:before{content:"\f127";} 310 | .icon-question:before{content:"\f128";} 311 | .icon-info:before{content:"\f129";} 312 | .icon-exclamation:before{content:"\f12a";} 313 | .icon-superscript:before{content:"\f12b";} 314 | .icon-subscript:before{content:"\f12c";} 315 | .icon-eraser:before{content:"\f12d";} 316 | .icon-puzzle-piece:before{content:"\f12e";} 317 | .icon-microphone:before{content:"\f130";} 318 | .icon-microphone-off:before{content:"\f131";} 319 | .icon-shield:before{content:"\f132";} 320 | .icon-calendar-empty:before{content:"\f133";} 321 | .icon-fire-extinguisher:before{content:"\f134";} 322 | .icon-rocket:before{content:"\f135";} 323 | .icon-maxcdn:before{content:"\f136";} 324 | .icon-chevron-sign-left:before{content:"\f137";} 325 | .icon-chevron-sign-right:before{content:"\f138";} 326 | .icon-chevron-sign-up:before{content:"\f139";} 327 | .icon-chevron-sign-down:before{content:"\f13a";} 328 | .icon-html5:before{content:"\f13b";} 329 | .icon-css3:before{content:"\f13c";} 330 | .icon-anchor:before{content:"\f13d";} 331 | .icon-unlock-alt:before{content:"\f13e";} 332 | .icon-bullseye:before{content:"\f140";} 333 | .icon-ellipsis-horizontal:before{content:"\f141";} 334 | .icon-ellipsis-vertical:before{content:"\f142";} 335 | .icon-rss-sign:before{content:"\f143";} 336 | .icon-play-sign:before{content:"\f144";} 337 | .icon-ticket:before{content:"\f145";} 338 | .icon-minus-sign-alt:before{content:"\f146";} 339 | .icon-check-minus:before{content:"\f147";} 340 | .icon-level-up:before{content:"\f148";} 341 | .icon-level-down:before{content:"\f149";} 342 | .icon-check-sign:before{content:"\f14a";} 343 | .icon-edit-sign:before{content:"\f14b";} 344 | .icon-external-link-sign:before{content:"\f14c";} 345 | .icon-share-sign:before{content:"\f14d";} 346 | .icon-compass:before{content:"\f14e";} 347 | .icon-collapse:before{content:"\f150";} 348 | .icon-collapse-top:before{content:"\f151";} 349 | .icon-expand:before{content:"\f152";} 350 | .icon-euro:before,.icon-eur:before{content:"\f153";} 351 | .icon-gbp:before{content:"\f154";} 352 | .icon-dollar:before,.icon-usd:before{content:"\f155";} 353 | .icon-rupee:before,.icon-inr:before{content:"\f156";} 354 | .icon-yen:before,.icon-jpy:before{content:"\f157";} 355 | .icon-renminbi:before,.icon-cny:before{content:"\f158";} 356 | .icon-won:before,.icon-krw:before{content:"\f159";} 357 | .icon-bitcoin:before,.icon-btc:before{content:"\f15a";} 358 | .icon-file:before{content:"\f15b";} 359 | .icon-file-text:before{content:"\f15c";} 360 | .icon-sort-by-alphabet:before{content:"\f15d";} 361 | .icon-sort-by-alphabet-alt:before{content:"\f15e";} 362 | .icon-sort-by-attributes:before{content:"\f160";} 363 | .icon-sort-by-attributes-alt:before{content:"\f161";} 364 | .icon-sort-by-order:before{content:"\f162";} 365 | .icon-sort-by-order-alt:before{content:"\f163";} 366 | .icon-thumbs-up:before{content:"\f164";} 367 | .icon-thumbs-down:before{content:"\f165";} 368 | .icon-youtube-sign:before{content:"\f166";} 369 | .icon-youtube:before{content:"\f167";} 370 | .icon-xing:before{content:"\f168";} 371 | .icon-xing-sign:before{content:"\f169";} 372 | .icon-youtube-play:before{content:"\f16a";} 373 | .icon-dropbox:before{content:"\f16b";} 374 | .icon-stackexchange:before{content:"\f16c";} 375 | .icon-instagram:before{content:"\f16d";} 376 | .icon-flickr:before{content:"\f16e";} 377 | .icon-adn:before{content:"\f170";} 378 | .icon-bitbucket:before{content:"\f171";} 379 | .icon-bitbucket-sign:before{content:"\f172";} 380 | .icon-tumblr:before{content:"\f173";} 381 | .icon-tumblr-sign:before{content:"\f174";} 382 | .icon-long-arrow-down:before{content:"\f175";} 383 | .icon-long-arrow-up:before{content:"\f176";} 384 | .icon-long-arrow-left:before{content:"\f177";} 385 | .icon-long-arrow-right:before{content:"\f178";} 386 | .icon-apple:before{content:"\f179";} 387 | .icon-windows:before{content:"\f17a";} 388 | .icon-android:before{content:"\f17b";} 389 | .icon-linux:before{content:"\f17c";} 390 | .icon-dribbble:before{content:"\f17d";} 391 | .icon-skype:before{content:"\f17e";} 392 | .icon-foursquare:before{content:"\f180";} 393 | .icon-trello:before{content:"\f181";} 394 | .icon-female:before{content:"\f182";} 395 | .icon-male:before{content:"\f183";} 396 | .icon-gittip:before{content:"\f184";} 397 | .icon-sun:before{content:"\f185";} 398 | .icon-moon:before{content:"\f186";} 399 | .icon-archive:before{content:"\f187";} 400 | .icon-bug:before{content:"\f188";} 401 | .icon-vk:before{content:"\f189";} 402 | .icon-weibo:before{content:"\f18a";} 403 | .icon-renren:before{content:"\f18b";} 404 | -------------------------------------------------------------------------------- /public/css/style.css: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------ 2 | Bootstrap Admin Template by EGrappler.com 3 | ------------------------------------------------------------------*/ 4 | 5 | 6 | 7 | /*------------------------------------------------------------------ 8 | [1. Global] 9 | */ 10 | 11 | @font-face { 12 | font-family: "Open Sans"; 13 | font-style: normal; 14 | font-weight: normal; 15 | src: url("font/OpenSans-Regular-webfont.eot") format("embedded-opentype"), 16 | url("font/OpenSans-Regular-webfont.woff") format("woff"), 17 | url("font/OpenSans-Regular-webfont.ttf") format("truetype"), 18 | url("font/OpenSans-Regular-webfont.svg#OpenSansRegular") format("svg"); 19 | } 20 | 21 | body { 22 | background: #f9f6f1; 23 | font: 12px/1.5em "Open Sans", sans-serif; 24 | } 25 | 26 | a { 27 | cursor: pointer; 28 | } 29 | 30 | input, 31 | button, 32 | select, 33 | textarea { 34 | font-family: 'Open Sans'; 35 | } 36 | 37 | .dropdown .dropdown-menu { 38 | -webkit-border-radius: 6px; 39 | -moz-border-radius: 6px; 40 | border-radius: 6px; 41 | } 42 | 43 | .btn-icon-only { 44 | padding-right: 3px; 45 | padding-left: 3px; 46 | } 47 | 48 | .table td { 49 | vertical-align: middle; 50 | } 51 | 52 | .table-bordered th { 53 | background: #E9E9E9; 54 | background:-moz-linear-gradient(top, #FAFAFA 0%, #E9E9E9 100%); /* FF3.6+ */ 55 | background:-webkit-gradient(linear, left top, left bottom, color-stop(0%,#FAFAFA), color-stop(100%,#E9E9E9)); /* Chrome,Safari4+ */ 56 | background:-webkit-linear-gradient(top, #FAFAFA 0%,#E9E9E9 100%); /* Chrome10+,Safari5.1+ */ 57 | background:-o-linear-gradient(top, #FAFAFA 0%,#E9E9E9 100%); /* Opera11.10+ */ 58 | background:-ms-linear-gradient(top, #FAFAFA 0%,#E9E9E9 100%); /* IE10+ */ 59 | background:linear-gradient(top, #FAFAFA 0%,#E9E9E9 100%); /* W3C */ 60 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E9E9E9'); 61 | -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#FAFAFA', endColorstr='#E9E9E9')"; 62 | 63 | font-size: 10px; 64 | color: #444; 65 | text-transform: uppercase; 66 | } 67 | 68 | 69 | /*------------------------------------------------------------------ 70 | [2. Navbar / .navbar] 71 | */ 72 | 73 | .navbar .container { 74 | position: relative; 75 | } 76 | 77 | .navbar-inner { 78 | padding: 7px 0; 79 | 80 | background: #00ba8b !important; 81 | 82 | -moz-border-radius: 0; 83 | -webkit-border-radius: 0; 84 | border-radius: 0; 85 | } 86 | 87 | .navbar-fixed-top { 88 | position: static; 89 | } 90 | 91 | .navbar .nav a { 92 | font-size: 11px; 93 | } 94 | .navbar .nav>li>a { color:#fff !important;} 95 | .navbar .brand { 96 | font-weight: 600; 97 | position: relative; 98 | top: 2px; 99 | } 100 | 101 | .navbar .search-query { 102 | background-color: #444; 103 | width: 150px; 104 | font-size: 11px; 105 | font-weight: bold; 106 | } 107 | 108 | .navbar .search-query::-webkit-input-placeholder { 109 | color: #666; 110 | } 111 | 112 | .navbar .search-query:-moz-placeholder { 113 | color: #666; 114 | } 115 | 116 | .navbar-search .search-query { background:#008866; border:0; color:#fff; line-height:normal;} 117 | 118 | 119 | /*------------------------------------------------------------------ 120 | [3. Subnavbar / .subnavbar] 121 | */ 122 | 123 | .subnavbar { 124 | margin-bottom: 2.5em; 125 | } 126 | 127 | .subnavbar-inner { 128 | height: 60px; 129 | background: #fff; 130 | border-bottom: 1px solid #d6d6d6; 131 | } 132 | 133 | .subnavbar .container > ul { 134 | display: inline-block; 135 | 136 | height: 80px; 137 | padding: 0; 138 | margin: 0; 139 | 140 | } 141 | 142 | .subnavbar .container > ul > li { 143 | float: left; 144 | 145 | min-width: 90px; 146 | height: 60px; 147 | padding: 0; 148 | margin: 0; 149 | 150 | text-align: center; 151 | list-style: none; 152 | 153 | border-left: 1px solid #d9d9d9; 154 | 155 | 156 | } 157 | 158 | .subnavbar .container > ul > li > a { 159 | display: block; 160 | 161 | height: 100%; 162 | padding: 0 15px; 163 | 164 | font-size: 12px; 165 | font-weight: bold; 166 | color: #b2afaa; 167 | } 168 | 169 | .subnavbar .container > ul > li > a:hover { 170 | color: #888; 171 | text-decoration: none; 172 | } 173 | 174 | .subnavbar .container > ul > li > a > i { 175 | display: inline-block; 176 | 177 | width: 24px; 178 | height: 24px; 179 | margin-top: 11px; 180 | margin-bottom: -3px; 181 | font-size: 20px; 182 | } 183 | 184 | .subnavbar .container > ul > li > a > span { 185 | display: block; 186 | 187 | } 188 | 189 | 190 | .subnavbar .container > ul > li:hover > a { 191 | 192 | border-bottom:3px solid #ff7f74; 193 | color: #383838; 194 | } 195 | 196 | 197 | .subnavbar .dropdown .dropdown-menu a { 198 | font-size: 12px; 199 | } 200 | 201 | 202 | .subnavbar .dropdown .dropdown-menu { 203 | text-align: left; 204 | 205 | -webkit-border-top-left-radius: 0; 206 | -webkit-border-top-right-radius: 0; 207 | -moz-border-radius-topleft: 0; 208 | -moz-border-radius-topright: 0; 209 | border-top-left-radius: 0; 210 | border-top-right-radius: 0; 211 | } 212 | 213 | 214 | 215 | .subnavbar .dropdown-menu::before { 216 | content: ''; 217 | display: inline-block; 218 | border-left: 7px solid transparent; 219 | border-right: 7px solid transparent; 220 | border-bottom: 7px solid #CCC; 221 | border-bottom-color: rgba(0, 0, 0, 0.2); 222 | position: absolute; 223 | top: -7px; 224 | left: 9px; 225 | } 226 | 227 | .subnavbar .dropdown-menu::after { 228 | content: ''; 229 | display: inline-block; 230 | border-left: 6px solid transparent; 231 | border-right: 6px solid transparent; 232 | border-bottom: 6px solid white; 233 | position: absolute; 234 | top: -6px; 235 | left: 10px; 236 | } 237 | 238 | 239 | .subnavbar .caret { 240 | margin-top: 4px; 241 | 242 | border-top-color: white; 243 | border-bottom-color: white; 244 | } 245 | 246 | .subnavbar .dropdown.open .caret { 247 | display: none; 248 | } 249 | 250 | 251 | 252 | 253 | 254 | /*------------------------------------------------------------------ 255 | [4. Main / .main] 256 | 257 | 258 | .main { 259 | padding-bottom: 2em; 260 | 261 | border-bottom: 1px solid #000; 262 | } 263 | */ 264 | 265 | 266 | /*------------------------------------------------------------------ 267 | [5. Extra / .extra] 268 | */ 269 | 270 | .extra { 271 | 272 | border-top: 1px solid #585858; 273 | border-bottom: 1px solid #000; 274 | 275 | } 276 | 277 | .extra-inner { 278 | padding: 20px 0; 279 | 280 | font-size: 11px; 281 | color: #BBB; 282 | 283 | background: #1A1A1A; 284 | } 285 | 286 | .extra a { 287 | color: #666; 288 | } 289 | 290 | .extra h4 { 291 | margin-bottom: 1em; 292 | 293 | font-weight: 400; 294 | } 295 | 296 | .extra ul { 297 | padding: 0; 298 | margin: 0; 299 | } 300 | 301 | .extra li { 302 | margin-bottom: .6em; 303 | 304 | list-style: none; 305 | } 306 | 307 | 308 | 309 | 310 | /*------------------------------------------------------------------ 311 | [6. Footer/ .footer] 312 | */ 313 | 314 | .footer { 315 | margin-top: 0; 316 | 317 | border-top: 1px solid #292929; 318 | } 319 | 320 | .footer-inner { 321 | padding: 15px 0; 322 | 323 | font-size: 12px; 324 | background: #111; 325 | color: #999; 326 | } 327 | 328 | .footer a { 329 | color: #999; 330 | } 331 | 332 | .footer a:hover { 333 | color: #FFF; 334 | text-decoration: none; 335 | } 336 | 337 | 338 | /*------------------------------------------------------------------ 339 | [6. Widget / .widget] 340 | */ 341 | 342 | .widget { 343 | 344 | position: relative; 345 | clear: both; 346 | 347 | width: auto; 348 | 349 | margin-bottom: 2em; 350 | 351 | overflow: hidden; 352 | } 353 | 354 | .widget-header { 355 | position: relative; 356 | cursor: move; 357 | height: 40px; 358 | line-height: 40px; 359 | 360 | background: #f9f6f1; 361 | background:-moz-linear-gradient(top, #f9f6f1 0%, #f2efea 100%); /* FF3.6+ */ 362 | background:-webkit-gradient(linear, left top, left bottom, color-stop(0%,#f9f6f1), color-stop(100%,#f2efea)); /* Chrome,Safari4+ */ 363 | background:-webkit-linear-gradient(top, #f9f6f1 0%,#f2efea 100%); /* Chrome10+,Safari5.1+ */ 364 | background:-o-linear-gradient(top, #f9f6f1 0%,#f2efea 100%); /* Opera11.10+ */ 365 | background:-ms-linear-gradient(top, #f9f6f1 0%,#f2efea 100%); /* IE10+ */ 366 | background:linear-gradient(top, #f9f6f1 0%,#f2efea 100%); /* W3C */ 367 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f6f1', endColorstr='#f2efea'); 368 | -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f6f1', endColorstr='#f2efea')"; 369 | 370 | 371 | border: 1px solid #d6d6d6; 372 | 373 | 374 | -webkit-background-clip: padding-box; 375 | } 376 | 377 | .widget-header h3 { 378 | position: relative; 379 | top: 2px; 380 | left: 10px; 381 | 382 | display: inline-block; 383 | margin-right: 3em; 384 | 385 | font-size: 14px; 386 | font-weight: 800; 387 | color: #525252; 388 | line-height: 18px; 389 | 390 | text-shadow: 1px 1px 2px rgba(255,255,255,.5); 391 | } 392 | 393 | .widget-header [class^="icon-"], .widget-header [class*=" icon-"] { 394 | 395 | display: inline-block; 396 | margin-left: 13px; 397 | margin-right: -2px; 398 | 399 | font-size: 16px; 400 | color: #555; 401 | vertical-align: middle; 402 | } 403 | 404 | .widget-content { 405 | padding: 20px 15px 15px; 406 | background: #FFF; 407 | 408 | 409 | border: 1px solid #D5D5D5; 410 | 411 | -moz-border-radius: 5px; 412 | -webkit-border-radius: 5px; 413 | border-radius: 5px; 414 | } 415 | 416 | .widget-header+.widget-content { 417 | border-top: none; 418 | 419 | -webkit-border-top-left-radius: 0; 420 | -webkit-border-top-right-radius: 0; 421 | -moz-border-radius-topleft: 0; 422 | -moz-border-radius-topright: 0; 423 | border-top-left-radius: 0; 424 | border-top-right-radius: 0; 425 | } 426 | 427 | .widget-nopad .widget-content { 428 | padding: 0; 429 | } 430 | 431 | /* Widget Content Clearfix */ 432 | .widget-content:before, 433 | .widget-content:after { 434 | content:""; 435 | display:table; 436 | } 437 | 438 | .widget-content:after { 439 | clear:both; 440 | } 441 | 442 | /* For IE 6/7 (trigger hasLayout) */ 443 | .widget-content { 444 | zoom:1; 445 | } 446 | 447 | /* Widget Table */ 448 | 449 | .widget-table .widget-content { 450 | padding: 0; 451 | } 452 | 453 | .widget-table .table { 454 | margin-bottom: 0; 455 | 456 | border: none; 457 | } 458 | 459 | .widget-table .table tr td:first-child { 460 | border-left: none; 461 | } 462 | 463 | .widget-table .table tr th:first-child { 464 | border-left: none; 465 | } 466 | 467 | 468 | /* Widget Plain */ 469 | 470 | .widget-plain { 471 | 472 | background: transparent; 473 | 474 | border: none; 475 | } 476 | 477 | .widget-plain .widget-content { 478 | padding: 0; 479 | 480 | background: transparent; 481 | 482 | border: none; 483 | } 484 | 485 | 486 | /* Widget Box */ 487 | 488 | .widget-box { 489 | 490 | } 491 | 492 | .widget-box .widget-content { 493 | background: #E3E3E3; 494 | background: #FFF; 495 | } 496 | 497 | 498 | 499 | /*------------------------------------------------------------------ 500 | [7. Error / .error-container] 501 | */ 502 | 503 | .error-container { 504 | margin-top: 4em; 505 | margin-bottom: 4em; 506 | text-align: center; 507 | } 508 | 509 | .error-container h1 { 510 | margin-bottom: .5em; 511 | 512 | font-size: 120px; 513 | line-height: 1em; 514 | } 515 | 516 | .error-container h2 { 517 | margin-bottom: .75em; 518 | font-size: 28px; 519 | } 520 | 521 | .error-container .error-details { 522 | margin-bottom: 1.5em; 523 | 524 | font-size: 16px; 525 | } 526 | 527 | .error-container .error-actions a { 528 | margin: 0 .5em; 529 | } 530 | 531 | 532 | 533 | /* Message layout */ 534 | 535 | 536 | ul.messages_layout { 537 | position: relative; 538 | margin: 0; 539 | padding: 0 540 | } 541 | ul.messages_layout li { 542 | float: left; 543 | list-style: none; 544 | position: relative 545 | } 546 | ul.messages_layout li.left { 547 | padding-left: 75px 548 | } 549 | ul.messages_layout li.right { 550 | padding-right: 75px 551 | } 552 | ul.messages_layout li.right .avatar { 553 | right: 0; 554 | left: auto 555 | } 556 | ul.messages_layout li.right .message_wrap .arrow { 557 | right: -12px; 558 | left: auto; 559 | background-position: 0 -213px; 560 | height: 15px; 561 | width: 12px 562 | } 563 | ul.messages_layout li.by_myself .message_wrap { 564 | border: 1px solid #b3cdf8 565 | } 566 | ul.messages_layout li.by_myself .message_wrap .info a.name { 567 | color: #4a8cf7 568 | } 569 | ul.messages_layout li a.avatar { 570 | position: absolute; 571 | left: 0; 572 | top: 0 573 | } 574 | ul.messages_layout li a.avatar img { 575 | -webkit-border-radius: 5px; 576 | -moz-border-radius: 5px; 577 | border-radius: 5px 578 | } 579 | ul.messages_layout li .message_wrap { 580 | -webkit-border-radius: 3px; 581 | -moz-border-radius: 3px; 582 | border-radius: 3px; 583 | position: relative; 584 | border: 1px solid #e9e9e9; 585 | padding: 10px; 586 | border: 1px solid #cbcbcb; 587 | margin-bottom: 20px; 588 | float: left; 589 | background: #fefefe; 590 | -webkit-box-shadow: rgba(0,0,0,0.1) 0 1px 0px; 591 | -moz-box-shadow: rgba(0,0,0,0.1) 0 1px 0px; 592 | box-shadow: rgba(0,0,0,0.1) 0 1px 0px 593 | } 594 | ul.messages_layout li .message_wrap .arrow { 595 | background-position: 0 -228px; 596 | height: 15px; 597 | width: 12px; 598 | height: 15px; 599 | width: 12px; 600 | position: absolute; 601 | left: -12px; 602 | top: 13px 603 | } 604 | ul.messages_layout li .message_wrap .info { 605 | float: left; 606 | width: 100%; 607 | border-bottom: 1px solid #fff; 608 | line-height: 23px 609 | } 610 | ul.messages_layout li .message_wrap .info .name { 611 | float: left; 612 | font-weight: bold; 613 | color: #483734 614 | } 615 | ul.messages_layout li .message_wrap .info .time { 616 | float: left; 617 | font-size: 11px; 618 | margin-left: 6px 619 | } 620 | ul.messages_layout li .message_wrap .text { 621 | float: left; 622 | width: 100%; 623 | border-top: 1px solid #cfcfcf; 624 | padding-top: 5px 625 | } 626 | 627 | ul.messages_layout .dropdown-menu li{ width:100%; font-size:11px;} 628 | 629 | 630 | /* Full Calendar */ 631 | 632 | .fc { 633 | direction: ltr; 634 | text-align: left; 635 | position: relative 636 | } 637 | .fc table { 638 | border-collapse: collapse; 639 | border-spacing: 0 640 | } 641 | html .fc, .fc table { 642 | font-size: 1em 643 | } 644 | .fc td, .fc th { 645 | padding: 0; 646 | vertical-align: top 647 | } 648 | .fc-header td { 649 | white-space: nowrap; 650 | background: none 651 | } 652 | .fc-header-left { 653 | width: 100%; 654 | text-align: left; 655 | position: absolute; 656 | left: 0; 657 | top: 6px 658 | } 659 | .fc-header-left .fc-button { 660 | margin: 0; 661 | position: relative 662 | } 663 | .fc-header-left .fc-button-prev, .fc-header-left .fc-button-next { 664 | float: left; 665 | border: none; 666 | padding: 14px 10px; 667 | opacity: 0.5 668 | } 669 | .fc-header-left .fc-button-prev .fc-button-inner, .fc-header-left .fc-button-next .fc-button-inner { 670 | border: none 671 | } 672 | .fc-header-left .fc-button-prev .fc-button-inner .fc-button-content, .fc-header-left .fc-button-next .fc-button-inner .fc-button-content { 673 | display: none 674 | } 675 | .fc-header-left .fc-button-prev.fc-state-hover, .fc-header-left .fc-button-next.fc-state-hover { 676 | opacity: 1 677 | } 678 | .fc-header-left .fc-button-prev.fc-state-down, .fc-header-left .fc-button-next.fc-state-down { 679 | background: none !important; 680 | margin-top: -1px 681 | } 682 | .fc-header-left .fc-button-prev .fc-button-inner { 683 | background-position: 0 -351px; 684 | height: 16px; 685 | width: 11px 686 | } 687 | .fc-header-left .fc-button-next { 688 | float: right 689 | } 690 | .fc-header-left .fc-button-next .fc-button-inner { 691 | background-position: 0 -367px; 692 | height: 16px; 693 | width: 11px 694 | } 695 | .fc-header-center { 696 | text-align: center 697 | } 698 | .fc-header-right { 699 | text-align: right; 700 | position: absolute; 701 | top: -34px; 702 | right: 10px 703 | } 704 | .fc-header-title { 705 | display: inline-block; 706 | vertical-align: top 707 | } 708 | .fc-header-title h2 { 709 | margin-top: 0; 710 | white-space: nowrap; 711 | font-size: 1.1rem; 712 | color: #6C737F; 713 | line-height: 55px; 714 | } 715 | .fc .fc-header-space { 716 | padding-left: 10px 717 | } 718 | .fc-header .fc-button { 719 | margin-bottom: 1em; 720 | vertical-align: top 721 | } 722 | .fc-header .fc-button { 723 | margin-right: -1px 724 | } 725 | .fc-header .fc-corner-right { 726 | margin-right: 1px 727 | } 728 | .fc-header .ui-corner-right { 729 | margin-right: 0 730 | } 731 | .fc-header .fc-state-hover, .fc-header .ui-state-hover { 732 | z-index: 2 733 | } 734 | .fc-header .fc-state-down { 735 | z-index: 3 736 | } 737 | .fc-header .fc-state-active, .fc-header .ui-state-active { 738 | z-index: 4 739 | } 740 | .fc-content { 741 | clear: both; 742 | background: #f9f9f9 743 | } 744 | .fc-view { 745 | width: 100%; 746 | overflow: hidden 747 | } 748 | .fc-view thead { 749 | background:#e9ecf1; 750 | line-height: 35px 751 | } 752 | .fc-widget-header, .fc-widget-content { 753 | border: 1px solid #ccc 754 | } 755 | .fc-state-highlight { 756 | background: #F4F3E6 757 | } 758 | .fc-cell-overlay { 759 | background: #9cf; 760 | opacity: .2; 761 | filter: alpha(opacity=20) 762 | } 763 | .fc-button { 764 | position: relative; 765 | display: inline-block; 766 | cursor: pointer 767 | } 768 | .fc-button-today{margin-top: 8px !important;} 769 | .fc-state-default { 770 | border-style: solid; 771 | border-width: 1px 0 772 | } 773 | .fc-button-inner { 774 | position: relative; 775 | float: left; 776 | overflow: hidden 777 | } 778 | .fc-state-default .fc-button-inner { 779 | border-style: solid; 780 | border-width: 0 1px 781 | } 782 | .fc-button-content { 783 | position: relative; 784 | float: left; 785 | height: 1.9em; 786 | line-height: 1.9em; 787 | padding: 0 .6em; 788 | white-space: nowrap 789 | } 790 | .fc-button-content .fc-icon-wrap { 791 | position: relative; 792 | float: left; 793 | top: 50% 794 | } 795 | .fc-button-content .ui-icon { 796 | position: relative; 797 | float: left; 798 | margin-top: -50%; 799 | *margin-top:0; 800 | *top:-50% 801 | } 802 | .fc-state-default .fc-button-effect { 803 | position: absolute; 804 | top: 50%; 805 | left: 0 806 | } 807 | .fc-state-default .fc-button-effect span { 808 | position: absolute; 809 | top: -100px; 810 | left: 0; 811 | width: 500px; 812 | height: 100px; 813 | border-width: 100px 0 0 1px; 814 | border-style: solid; 815 | border-color: #fff; 816 | background: #444; 817 | opacity: .09; 818 | filter: alpha(opacity=9) 819 | } 820 | .fc-state-default, .fc-state-default .fc-button-inner { 821 | border-style: solid; 822 | border-color: #ccc #bbb #aaa; 823 | color: #000 824 | } 825 | .fc-state-hover, .fc-state-hover .fc-button-inner { 826 | border-color: #999 827 | } 828 | .fc-state-down { 829 | border-color: #555; 830 | background: #777 831 | } 832 | .fc-state-active, .fc-state-active .fc-button-inner { 833 | border-color: #555; 834 | background: #777; 835 | color: #fff 836 | } 837 | .fc-state-disabled, .fc-state-disabled .fc-button-inner { 838 | color: #999; 839 | border-color: #ddd 840 | } 841 | .fc-state-disabled { 842 | cursor: default 843 | } 844 | .fc-state-disabled .fc-button-effect { 845 | display: none 846 | } 847 | .fc-event { 848 | border-style: solid; 849 | border-width: 0; 850 | font-size: .85em; 851 | cursor: default 852 | } 853 | a.fc-event, .fc-event-draggable { 854 | cursor: pointer 855 | } 856 | a.fc-event { 857 | text-decoration: none 858 | } 859 | .fc-rtl .fc-event { 860 | text-align: right 861 | } 862 | .fc-event-skin { 863 | border-color: #3f85f5; 864 | background-color: #5e96ea; 865 | color: #fff 866 | } 867 | .fc-event-inner { 868 | position: relative; 869 | width: 100%; 870 | height: 100%; 871 | border-style: solid; 872 | border-width: 0; 873 | overflow: hidden 874 | } 875 | .fc-event-time, .fc-event-title { 876 | padding: 0 1px 877 | } 878 | .fc .ui-resizable-handle { 879 | display: block; 880 | position: absolute; 881 | z-index: 99999; 882 | overflow: hidden; 883 | font-size: 300%; 884 | line-height: 50% 885 | } 886 | .fc-event-hori { 887 | border-width: 1px 0; 888 | margin-bottom: 1px 889 | } 890 | .fc-event-hori .ui-resizable-e { 891 | top: 0 !important; 892 | right: -3px !important; 893 | width: 7px !important; 894 | height: 100% !important; 895 | cursor: e-resize 896 | } 897 | .fc-event-hori .ui-resizable-w { 898 | top: 0 !important; 899 | left: -3px !important; 900 | width: 7px !important; 901 | height: 100% !important; 902 | cursor: w-resize 903 | } 904 | .fc-event-hori .ui-resizable-handle { 905 | _padding-bottom: 14px 906 | } 907 | .fc-corner-left { 908 | margin-left: 1px 909 | } 910 | .fc-corner-left .fc-button-inner, .fc-corner-left .fc-event-inner { 911 | margin-left: -1px 912 | } 913 | .fc-corner-right { 914 | margin-right: 1px 915 | } 916 | .fc-corner-right .fc-button-inner, .fc-corner-right .fc-event-inner { 917 | margin-right: -1px 918 | } 919 | .fc-corner-top { 920 | margin-top: 1px 921 | } 922 | .fc-corner-top .fc-event-inner { 923 | margin-top: -1px 924 | } 925 | .fc-corner-bottom { 926 | margin-bottom: 1px 927 | } 928 | .fc-corner-bottom .fc-event-inner { 929 | margin-bottom: -1px 930 | } 931 | .fc-corner-left .fc-event-inner { 932 | border-left-width: 1px 933 | } 934 | .fc-corner-right .fc-event-inner { 935 | border-right-width: 1px 936 | } 937 | .fc-corner-top .fc-event-inner { 938 | border-top-width: 1px 939 | } 940 | .fc-corner-bottom .fc-event-inner { 941 | border-bottom-width: 1px 942 | } 943 | table.fc-border-separate { 944 | border-collapse: separate 945 | } 946 | .fc-border-separate th, .fc-border-separate td { 947 | border-width: 1px 0 0 1px 948 | } 949 | .fc-border-separate th.fc-last, .fc-border-separate td.fc-last { 950 | border-right-width: 1px 951 | } 952 | .fc-border-separate tr.fc-last th, .fc-border-separate tr.fc-last td { 953 | border-bottom-width: 0px 954 | } 955 | .fc-first { 956 | border-left-width: 0 !important 957 | } 958 | .fc-last { 959 | border-right-width: 0 !important 960 | } 961 | .fc-grid th { 962 | text-align: center 963 | } 964 | .fc-grid .fc-day-number { 965 | float: right; 966 | padding: 0 2px 967 | } 968 | .fc-grid .fc-other-month .fc-day-number { 969 | opacity: 0.3; 970 | filter: alpha(opacity=30) 971 | } 972 | .fc-grid .fc-day-content { 973 | clear: both; 974 | padding: 2px 2px 1px 975 | } 976 | .fc-grid .fc-event-time { 977 | font-weight: bold 978 | } 979 | .fc-rtl .fc-grid .fc-day-number { 980 | float: left 981 | } 982 | .fc-rtl .fc-grid .fc-event-time { 983 | float: right 984 | } 985 | .fc-agenda table { 986 | border-collapse: separate 987 | } 988 | .fc-agenda-days th { 989 | text-align: center 990 | } 991 | .fc-agenda .fc-agenda-axis { 992 | width: 60px !important; 993 | padding: 0 4px; 994 | vertical-align: middle; 995 | text-align: right; 996 | white-space: nowrap; 997 | font-weight: normal 998 | } 999 | .fc-agenda .fc-day-content { 1000 | padding: 2px 2px 1px 1001 | } 1002 | .fc-agenda-days .fc-agenda-axis { 1003 | border-right-width: 1px 1004 | } 1005 | .fc-agenda-days .fc-col0 { 1006 | border-left-width: 0 1007 | } 1008 | .fc-agenda-allday th { 1009 | border-width: 0 1px 1010 | } 1011 | .fc-agenda-allday .fc-day-content { 1012 | min-height: 34px; 1013 | _height: 34px 1014 | } 1015 | .fc-agenda-divider-inner { 1016 | height: 2px; 1017 | overflow: hidden 1018 | } 1019 | .fc-widget-header .fc-agenda-divider-inner { 1020 | background: #eee 1021 | } 1022 | .fc-agenda-slots th { 1023 | border-width: 1px 1px 0 1024 | } 1025 | .fc-agenda-slots td { 1026 | border-width: 1px 0 0; 1027 | background: none 1028 | } 1029 | .fc-agenda-slots td div { 1030 | height: 20px 1031 | } 1032 | .fc-agenda-slots tr.fc-slot0 th, .fc-agenda-slots tr.fc-slot0 td { 1033 | border-top-width: 0 1034 | } 1035 | .fc-agenda-slots tr.fc-minor th, .fc-agenda-slots tr.fc-minor td { 1036 | border-top-style: dotted 1037 | } 1038 | .fc-agenda-slots tr.fc-minor th.ui-widget-header { 1039 | *border-top-style:solid 1040 | } 1041 | .fc-event-vert { 1042 | border-width: 0 1px 1043 | } 1044 | .fc-event-vert .fc-event-head, .fc-event-vert .fc-event-content { 1045 | position: relative; 1046 | z-index: 2; 1047 | width: 100%; 1048 | overflow: hidden 1049 | } 1050 | .fc-event-vert .fc-event-time { 1051 | white-space: nowrap; 1052 | font-size: 10px 1053 | } 1054 | .fc-event-vert .fc-event-bg { 1055 | position: absolute; 1056 | z-index: 1; 1057 | top: 0; 1058 | left: 0; 1059 | width: 100%; 1060 | height: 100%; 1061 | background: #fff; 1062 | opacity: .3; 1063 | filter: alpha(opacity=30) 1064 | } 1065 | .fc .ui-draggable-dragging .fc-event-bg, .fc-select-helper .fc-event-bg { 1066 | display: none\9 1067 | } 1068 | .fc-event-vert .ui-resizable-s { 1069 | bottom: 0 !important; 1070 | width: 100% !important; 1071 | height: 8px !important; 1072 | overflow: hidden !important; 1073 | line-height: 8px !important; 1074 | font-size: 11px !important; 1075 | font-family: monospace; 1076 | text-align: center; 1077 | cursor: s-resize 1078 | } 1079 | .fc-agenda .ui-resizable-resizing { 1080 | _overflow: hidden 1081 | } 1082 | .fc-header-left .fc-button-prev .fc-button-inner {background: url('../img/icons-sa7c41345d9.png') no-repeat; background-position: 0 -351px; 1083 | height: 16px; 1084 | width: 11px;} 1085 | 1086 | .fc-header-left .fc-button-next .fc-button-inner {background: url('../img/icons-sa7c41345d9.png') no-repeat; background-position: 0 -367px; 1087 | height: 16px; 1088 | width: 11px;} 1089 | 1090 | /*------------------------------------------------------------------ 1091 | [8. Miscellaneous] 1092 | */ 1093 | 1094 | .chart-holder { 1095 | width: 100%; 1096 | height: 250px; 1097 | } 1098 | 1099 | .dropdown-menu li>a:hover, .dropdown-menu .active>a, .dropdown-menu .active>a:hover { background:#00ba8b;} 1100 | 1101 | .accordion-heading { background:#e5e5e5; } 1102 | .accordion-heading a { color:#545454; text-decoration:none; font-weight:bold; } 1103 | 1104 | .btn-facebook-alt i { 1105 | color: #23386a; 1106 | } 1107 | .btn-twitter-alt i { 1108 | color: #0098d0; 1109 | } 1110 | .btn-google-alt i { 1111 | color: #b6362d; 1112 | } 1113 | .btn-linkedin-alt i { 1114 | color: #0073b2; 1115 | } 1116 | .btn-pinterest-alt i { 1117 | color: #ab171e; 1118 | } 1119 | .btn-github-alt i { 1120 | color: #333; 1121 | } 1122 | 1123 | .all-icons li { list-style:none;} 1124 | 1125 | .ML0 { margin-left:0} 1126 | .MR0 { margin-right:0;} 1127 | 1128 | .paginate_active { text-decoration: underline; } 1129 | 1130 | #refresh-ispeed .icon-refresh, #refresh-ping .icon-refresh, #refresh-bandwidth .icon-refresh { 1131 | margin: 0; 1132 | } 1133 | 1134 | /*------------------------------------------------------------------ 1135 | [1. Max Width: 480px] 1136 | */ 1137 | 1138 | @media (max-width: 480px) { 1139 | 1140 | .error-container h1 { 1141 | font-size: 72px; 1142 | } 1143 | 1144 | } 1145 | 1146 | 1147 | 1148 | 1149 | 1150 | /*------------------------------------------------------------------ 1151 | [1. Max Width: 767px] 1152 | */ 1153 | 1154 | @media (max-width: 767px) { 1155 | 1156 | #main { 1157 | padding: 0 10px; 1158 | margin-right: -20px; 1159 | margin-left: -20px; 1160 | } 1161 | 1162 | 1163 | .subnavbar { 1164 | margin-left: -20px; 1165 | margin-right: -20px; 1166 | } 1167 | 1168 | 1169 | .subnavbar-inner { 1170 | height: auto; 1171 | } 1172 | 1173 | .subnavbar .container > ul { 1174 | width: 100%; 1175 | height: auto; 1176 | 1177 | border: none; 1178 | } 1179 | 1180 | .subnavbar .container > ul > li { 1181 | width: 33%; 1182 | height: 70px; 1183 | margin-bottom: 0; 1184 | 1185 | border: none; 1186 | } 1187 | 1188 | 1189 | 1190 | .subnavbar .container > ul > li.active > a { 1191 | font-size: 11px; 1192 | background: transparent; 1193 | } 1194 | 1195 | .subnavbar .container > ul > li > a > i { 1196 | display: inline-block; 1197 | margin-bottom: 0; 1198 | 1199 | font-size: 20px; 1200 | } 1201 | 1202 | 1203 | .subnavbar-open-right .dropdown-menu { 1204 | left: auto; 1205 | right: 0; 1206 | } 1207 | 1208 | .subnavbar-open-right .dropdown-menu:before { 1209 | left: auto; 1210 | right: 12px; 1211 | } 1212 | .subnavbar-open-right .dropdown-menu:after { 1213 | left: auto; 1214 | right: 13px; 1215 | } 1216 | 1217 | .extra { 1218 | margin-right: -20px; 1219 | margin-left: -20px; 1220 | } 1221 | 1222 | .extra .container { 1223 | padding: 0 20px; 1224 | } 1225 | 1226 | .footer { 1227 | margin-right: -20px; 1228 | margin-left: -20px; 1229 | } 1230 | 1231 | .footer .container { 1232 | padding: 0 20px; 1233 | } 1234 | 1235 | .footer .footer-terms { 1236 | text-align: left; 1237 | } 1238 | 1239 | .footer .footer-terms a { 1240 | margin-left: 0; 1241 | margin-right: 1em; 1242 | } 1243 | 1244 | } 1245 | 1246 | 1247 | 1248 | 1249 | 1250 | /*------------------------------------------------------------------ 1251 | [2. Max Width: 979px] 1252 | */ 1253 | 1254 | @media (max-width: 979px) { 1255 | 1256 | .navbar-fixed-top { 1257 | position: static; 1258 | 1259 | margin-bottom: 0; 1260 | } 1261 | 1262 | .subnavbar { 1263 | } 1264 | 1265 | .subnavbar .container { 1266 | width: auto; 1267 | } 1268 | 1269 | .widget-header { 1270 | height: 100%; 1271 | } 1272 | 1273 | .widget-header h3 { 1274 | margin-right: 1em; 1275 | } 1276 | 1277 | .js-refresh-info { 1278 | margin-left: 25px; 1279 | } 1280 | } 1281 | 1282 | 1283 | 1284 | 1285 | 1286 | 1287 | /*------------------------------------------------------------------ 1288 | [3. Max Width: 1199px] 1289 | */ 1290 | 1291 | @media (max-width: 1199px) { 1292 | .navbar .search-query { 1293 | width: 200px; 1294 | } 1295 | 1296 | .widget-header { 1297 | height: 100%; 1298 | } 1299 | 1300 | .js-refresh-info { 1301 | margin-left: 25px; 1302 | } 1303 | } 1304 | 1305 | /* ---------------------------------------- 1306 | Subnavbar CSS fix/work-around 1307 | */ 1308 | 1309 | .container.nav-collapse.in { 1310 | overflow:visible; 1311 | } 1312 | .btn-navbar { 1313 | margin-top:-38px; 1314 | } 1315 | 1316 | /*------------------------------------------------------------------ 1317 | general-info widget specific style 1318 | */ 1319 | 1320 | #general-info-widget .general-title { 1321 | font-weight: bold; 1322 | } 1323 | 1324 | #general-info-widget .general-title:after { 1325 | content:":"; 1326 | } 1327 | 1328 | #general-info-widget .widget-content { 1329 | padding:5px; 1330 | } 1331 | 1332 | #general-info-widget .widget-content div { 1333 | margin-bottom:5px; 1334 | } 1335 | 1336 | footer { 1337 | border-top: 1px solid #D8D7CF; 1338 | clear: both; 1339 | color: #9A9994; 1340 | font-size: 12px; 1341 | line-height: 15.4px; 1342 | margin-top: 15px; 1343 | overflow: hidden; 1344 | padding: 20px 0 40px; 1345 | } 1346 | footer .site-source { 1347 | background: url("/img/code.png") no-repeat scroll 0 2px transparent; 1348 | float: left; 1349 | padding-left: 46px; 1350 | } 1351 | footer .sfc-member {float: right;text-align: right;} 1352 | footer a {color: #403F3C;} 1353 | -------------------------------------------------------------------------------- /public/css/font-awesome/css/archive/font-awesome.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 3.2.1 3 | * the iconic font designed for Bootstrap 4 | * ------------------------------------------------------------------------------ 5 | * The full suite of pictographic icons, examples, and documentation can be 6 | * found at http://fontawesome.io. Stay up to date on Twitter at 7 | * http://twitter.com/fontawesome. 8 | * 9 | * License 10 | * ------------------------------------------------------------------------------ 11 | * - The Font Awesome font is licensed under SIL OFL 1.1 - 12 | * http://scripts.sil.org/OFL 13 | * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - 14 | * http://opensource.org/licenses/mit-license.html 15 | * - Font Awesome documentation licensed under CC BY 3.0 - 16 | * http://creativecommons.org/licenses/by/3.0/ 17 | * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: 18 | * "Font Awesome by Dave Gandy - http://fontawesome.io" 19 | * 20 | * Author - Dave Gandy 21 | * ------------------------------------------------------------------------------ 22 | * Email: dave@fontawesome.io 23 | * Twitter: http://twitter.com/davegandy 24 | * Work: Lead Product Designer @ Kyruus - http://kyruus.com 25 | */ 26 | /* FONT PATH 27 | * -------------------------- */ 28 | @font-face { 29 | font-family: 'FontAwesome'; 30 | src: url('../font/fontawesome-webfont.eot?v=3.2.1'); 31 | src: url('../font/fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'), url('../font/fontawesome-webfont.woff?v=3.2.1') format('woff'), url('../font/fontawesome-webfont.ttf?v=3.2.1') format('truetype'), url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg'); 32 | font-weight: normal; 33 | font-style: normal; 34 | } 35 | /* FONT AWESOME CORE 36 | * -------------------------- */ 37 | [class^="icon-"], 38 | [class*=" icon-"] { 39 | font-family: FontAwesome; 40 | font-weight: normal; 41 | font-style: normal; 42 | text-decoration: inherit; 43 | -webkit-font-smoothing: antialiased; 44 | *margin-right: .3em; 45 | } 46 | [class^="icon-"]:before, 47 | [class*=" icon-"]:before { 48 | text-decoration: inherit; 49 | display: inline-block; 50 | speak: none; 51 | } 52 | /* makes the font 33% larger relative to the icon container */ 53 | .icon-large:before { 54 | vertical-align: -10%; 55 | font-size: 1.3333333333333333em; 56 | } 57 | /* makes sure icons active on rollover in links */ 58 | a [class^="icon-"], 59 | a [class*=" icon-"] { 60 | display: inline; 61 | } 62 | /* increased font size for icon-large */ 63 | [class^="icon-"].icon-fixed-width, 64 | [class*=" icon-"].icon-fixed-width { 65 | display: inline-block; 66 | width: 1.1428571428571428em; 67 | text-align: right; 68 | padding-right: 0.2857142857142857em; 69 | } 70 | [class^="icon-"].icon-fixed-width.icon-large, 71 | [class*=" icon-"].icon-fixed-width.icon-large { 72 | width: 1.4285714285714286em; 73 | } 74 | .icons-ul { 75 | margin-left: 2.142857142857143em; 76 | list-style-type: none; 77 | } 78 | .icons-ul > li { 79 | position: relative; 80 | } 81 | .icons-ul .icon-li { 82 | position: absolute; 83 | left: -2.142857142857143em; 84 | width: 2.142857142857143em; 85 | text-align: center; 86 | line-height: inherit; 87 | } 88 | [class^="icon-"].hide, 89 | [class*=" icon-"].hide { 90 | display: none; 91 | } 92 | .icon-muted { 93 | color: #eeeeee; 94 | } 95 | .icon-light { 96 | color: #ffffff; 97 | } 98 | .icon-dark { 99 | color: #333333; 100 | } 101 | .icon-border { 102 | border: solid 1px #eeeeee; 103 | padding: .2em .25em .15em; 104 | -webkit-border-radius: 3px; 105 | -moz-border-radius: 3px; 106 | border-radius: 3px; 107 | } 108 | .icon-2x { 109 | font-size: 2em; 110 | } 111 | .icon-2x.icon-border { 112 | border-width: 2px; 113 | -webkit-border-radius: 4px; 114 | -moz-border-radius: 4px; 115 | border-radius: 4px; 116 | } 117 | .icon-3x { 118 | font-size: 3em; 119 | } 120 | .icon-3x.icon-border { 121 | border-width: 3px; 122 | -webkit-border-radius: 5px; 123 | -moz-border-radius: 5px; 124 | border-radius: 5px; 125 | } 126 | .icon-4x { 127 | font-size: 4em; 128 | } 129 | .icon-4x.icon-border { 130 | border-width: 4px; 131 | -webkit-border-radius: 6px; 132 | -moz-border-radius: 6px; 133 | border-radius: 6px; 134 | } 135 | .icon-5x { 136 | font-size: 5em; 137 | } 138 | .icon-5x.icon-border { 139 | border-width: 5px; 140 | -webkit-border-radius: 7px; 141 | -moz-border-radius: 7px; 142 | border-radius: 7px; 143 | } 144 | .pull-right { 145 | float: right; 146 | } 147 | .pull-left { 148 | float: left; 149 | } 150 | [class^="icon-"].pull-left, 151 | [class*=" icon-"].pull-left { 152 | margin-right: .3em; 153 | } 154 | [class^="icon-"].pull-right, 155 | [class*=" icon-"].pull-right { 156 | margin-left: .3em; 157 | } 158 | /* BOOTSTRAP SPECIFIC CLASSES 159 | * -------------------------- */ 160 | /* Bootstrap 2.0 sprites.less reset */ 161 | [class^="icon-"], 162 | [class*=" icon-"] { 163 | display: inline; 164 | width: auto; 165 | height: auto; 166 | line-height: normal; 167 | vertical-align: baseline; 168 | background-image: none; 169 | background-position: 0% 0%; 170 | background-repeat: repeat; 171 | margin-top: 0; 172 | } 173 | /* more sprites.less reset */ 174 | .icon-white, 175 | .nav-pills > .active > a > [class^="icon-"], 176 | .nav-pills > .active > a > [class*=" icon-"], 177 | .nav-list > .active > a > [class^="icon-"], 178 | .nav-list > .active > a > [class*=" icon-"], 179 | .navbar-inverse .nav > .active > a > [class^="icon-"], 180 | .navbar-inverse .nav > .active > a > [class*=" icon-"], 181 | .dropdown-menu > li > a:hover > [class^="icon-"], 182 | .dropdown-menu > li > a:hover > [class*=" icon-"], 183 | .dropdown-menu > .active > a > [class^="icon-"], 184 | .dropdown-menu > .active > a > [class*=" icon-"], 185 | .dropdown-submenu:hover > a > [class^="icon-"], 186 | .dropdown-submenu:hover > a > [class*=" icon-"] { 187 | background-image: none; 188 | } 189 | /* keeps Bootstrap styles with and without icons the same */ 190 | .btn [class^="icon-"].icon-large, 191 | .nav [class^="icon-"].icon-large, 192 | .btn [class*=" icon-"].icon-large, 193 | .nav [class*=" icon-"].icon-large { 194 | line-height: .9em; 195 | } 196 | .btn [class^="icon-"].icon-spin, 197 | .nav [class^="icon-"].icon-spin, 198 | .btn [class*=" icon-"].icon-spin, 199 | .nav [class*=" icon-"].icon-spin { 200 | display: inline-block; 201 | } 202 | .nav-tabs [class^="icon-"], 203 | .nav-pills [class^="icon-"], 204 | .nav-tabs [class*=" icon-"], 205 | .nav-pills [class*=" icon-"], 206 | .nav-tabs [class^="icon-"].icon-large, 207 | .nav-pills [class^="icon-"].icon-large, 208 | .nav-tabs [class*=" icon-"].icon-large, 209 | .nav-pills [class*=" icon-"].icon-large { 210 | line-height: .9em; 211 | } 212 | .btn [class^="icon-"].pull-left.icon-2x, 213 | .btn [class*=" icon-"].pull-left.icon-2x, 214 | .btn [class^="icon-"].pull-right.icon-2x, 215 | .btn [class*=" icon-"].pull-right.icon-2x { 216 | margin-top: .18em; 217 | } 218 | .btn [class^="icon-"].icon-spin.icon-large, 219 | .btn [class*=" icon-"].icon-spin.icon-large { 220 | line-height: .8em; 221 | } 222 | .btn.btn-small [class^="icon-"].pull-left.icon-2x, 223 | .btn.btn-small [class*=" icon-"].pull-left.icon-2x, 224 | .btn.btn-small [class^="icon-"].pull-right.icon-2x, 225 | .btn.btn-small [class*=" icon-"].pull-right.icon-2x { 226 | margin-top: .25em; 227 | } 228 | .btn.btn-large [class^="icon-"], 229 | .btn.btn-large [class*=" icon-"] { 230 | margin-top: 0; 231 | } 232 | .btn.btn-large [class^="icon-"].pull-left.icon-2x, 233 | .btn.btn-large [class*=" icon-"].pull-left.icon-2x, 234 | .btn.btn-large [class^="icon-"].pull-right.icon-2x, 235 | .btn.btn-large [class*=" icon-"].pull-right.icon-2x { 236 | margin-top: .05em; 237 | } 238 | .btn.btn-large [class^="icon-"].pull-left.icon-2x, 239 | .btn.btn-large [class*=" icon-"].pull-left.icon-2x { 240 | margin-right: .2em; 241 | } 242 | .btn.btn-large [class^="icon-"].pull-right.icon-2x, 243 | .btn.btn-large [class*=" icon-"].pull-right.icon-2x { 244 | margin-left: .2em; 245 | } 246 | /* Fixes alignment in nav lists */ 247 | .nav-list [class^="icon-"], 248 | .nav-list [class*=" icon-"] { 249 | line-height: inherit; 250 | } 251 | /* EXTRAS 252 | * -------------------------- */ 253 | /* Stacked and layered icon */ 254 | .icon-stack { 255 | position: relative; 256 | display: inline-block; 257 | width: 2em; 258 | height: 2em; 259 | line-height: 2em; 260 | vertical-align: -35%; 261 | } 262 | .icon-stack [class^="icon-"], 263 | .icon-stack [class*=" icon-"] { 264 | display: block; 265 | text-align: center; 266 | position: absolute; 267 | width: 100%; 268 | height: 100%; 269 | font-size: 1em; 270 | line-height: inherit; 271 | *line-height: 2em; 272 | } 273 | .icon-stack .icon-stack-base { 274 | font-size: 2em; 275 | *line-height: 1em; 276 | } 277 | /* Animated rotating icon */ 278 | .icon-spin { 279 | display: inline-block; 280 | -moz-animation: spin 2s infinite linear; 281 | -o-animation: spin 2s infinite linear; 282 | -webkit-animation: spin 2s infinite linear; 283 | animation: spin 2s infinite linear; 284 | } 285 | /* Prevent stack and spinners from being taken inline when inside a link */ 286 | a .icon-stack, 287 | a .icon-spin { 288 | display: inline-block; 289 | text-decoration: none; 290 | } 291 | @-moz-keyframes spin { 292 | 0% { 293 | -moz-transform: rotate(0deg); 294 | } 295 | 100% { 296 | -moz-transform: rotate(359deg); 297 | } 298 | } 299 | @-webkit-keyframes spin { 300 | 0% { 301 | -webkit-transform: rotate(0deg); 302 | } 303 | 100% { 304 | -webkit-transform: rotate(359deg); 305 | } 306 | } 307 | @-o-keyframes spin { 308 | 0% { 309 | -o-transform: rotate(0deg); 310 | } 311 | 100% { 312 | -o-transform: rotate(359deg); 313 | } 314 | } 315 | @-ms-keyframes spin { 316 | 0% { 317 | -ms-transform: rotate(0deg); 318 | } 319 | 100% { 320 | -ms-transform: rotate(359deg); 321 | } 322 | } 323 | @keyframes spin { 324 | 0% { 325 | transform: rotate(0deg); 326 | } 327 | 100% { 328 | transform: rotate(359deg); 329 | } 330 | } 331 | /* Icon rotations and mirroring */ 332 | .icon-rotate-90:before { 333 | -webkit-transform: rotate(90deg); 334 | -moz-transform: rotate(90deg); 335 | -ms-transform: rotate(90deg); 336 | -o-transform: rotate(90deg); 337 | transform: rotate(90deg); 338 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); 339 | } 340 | .icon-rotate-180:before { 341 | -webkit-transform: rotate(180deg); 342 | -moz-transform: rotate(180deg); 343 | -ms-transform: rotate(180deg); 344 | -o-transform: rotate(180deg); 345 | transform: rotate(180deg); 346 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); 347 | } 348 | .icon-rotate-270:before { 349 | -webkit-transform: rotate(270deg); 350 | -moz-transform: rotate(270deg); 351 | -ms-transform: rotate(270deg); 352 | -o-transform: rotate(270deg); 353 | transform: rotate(270deg); 354 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); 355 | } 356 | .icon-flip-horizontal:before { 357 | -webkit-transform: scale(-1, 1); 358 | -moz-transform: scale(-1, 1); 359 | -ms-transform: scale(-1, 1); 360 | -o-transform: scale(-1, 1); 361 | transform: scale(-1, 1); 362 | } 363 | .icon-flip-vertical:before { 364 | -webkit-transform: scale(1, -1); 365 | -moz-transform: scale(1, -1); 366 | -ms-transform: scale(1, -1); 367 | -o-transform: scale(1, -1); 368 | transform: scale(1, -1); 369 | } 370 | /* ensure rotation occurs inside anchor tags */ 371 | a .icon-rotate-90:before, 372 | a .icon-rotate-180:before, 373 | a .icon-rotate-270:before, 374 | a .icon-flip-horizontal:before, 375 | a .icon-flip-vertical:before { 376 | display: inline-block; 377 | } 378 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen 379 | readers do not read off random characters that represent icons */ 380 | .icon-glass:before { 381 | content: "\f000"; 382 | } 383 | .icon-music:before { 384 | content: "\f001"; 385 | } 386 | .icon-search:before { 387 | content: "\f002"; 388 | } 389 | .icon-envelope-alt:before { 390 | content: "\f003"; 391 | } 392 | .icon-heart:before { 393 | content: "\f004"; 394 | } 395 | .icon-star:before { 396 | content: "\f005"; 397 | } 398 | .icon-star-empty:before { 399 | content: "\f006"; 400 | } 401 | .icon-user:before { 402 | content: "\f007"; 403 | } 404 | .icon-film:before { 405 | content: "\f008"; 406 | } 407 | .icon-th-large:before { 408 | content: "\f009"; 409 | } 410 | .icon-th:before { 411 | content: "\f00a"; 412 | } 413 | .icon-th-list:before { 414 | content: "\f00b"; 415 | } 416 | .icon-ok:before { 417 | content: "\f00c"; 418 | } 419 | .icon-remove:before { 420 | content: "\f00d"; 421 | } 422 | .icon-zoom-in:before { 423 | content: "\f00e"; 424 | } 425 | .icon-zoom-out:before { 426 | content: "\f010"; 427 | } 428 | .icon-power-off:before, 429 | .icon-off:before { 430 | content: "\f011"; 431 | } 432 | .icon-signal:before { 433 | content: "\f012"; 434 | } 435 | .icon-gear:before, 436 | .icon-cog:before { 437 | content: "\f013"; 438 | } 439 | .icon-trash:before { 440 | content: "\f014"; 441 | } 442 | .icon-home:before { 443 | content: "\f015"; 444 | } 445 | .icon-file-alt:before { 446 | content: "\f016"; 447 | } 448 | .icon-time:before { 449 | content: "\f017"; 450 | } 451 | .icon-road:before { 452 | content: "\f018"; 453 | } 454 | .icon-download-alt:before { 455 | content: "\f019"; 456 | } 457 | .icon-download:before { 458 | content: "\f01a"; 459 | } 460 | .icon-upload:before { 461 | content: "\f01b"; 462 | } 463 | .icon-inbox:before { 464 | content: "\f01c"; 465 | } 466 | .icon-play-circle:before { 467 | content: "\f01d"; 468 | } 469 | .icon-rotate-right:before, 470 | .icon-repeat:before { 471 | content: "\f01e"; 472 | } 473 | .icon-refresh:before { 474 | content: "\f021"; 475 | } 476 | .icon-list-alt:before { 477 | content: "\f022"; 478 | } 479 | .icon-lock:before { 480 | content: "\f023"; 481 | } 482 | .icon-flag:before { 483 | content: "\f024"; 484 | } 485 | .icon-headphones:before { 486 | content: "\f025"; 487 | } 488 | .icon-volume-off:before { 489 | content: "\f026"; 490 | } 491 | .icon-volume-down:before { 492 | content: "\f027"; 493 | } 494 | .icon-volume-up:before { 495 | content: "\f028"; 496 | } 497 | .icon-qrcode:before { 498 | content: "\f029"; 499 | } 500 | .icon-barcode:before { 501 | content: "\f02a"; 502 | } 503 | .icon-tag:before { 504 | content: "\f02b"; 505 | } 506 | .icon-tags:before { 507 | content: "\f02c"; 508 | } 509 | .icon-book:before { 510 | content: "\f02d"; 511 | } 512 | .icon-bookmark:before { 513 | content: "\f02e"; 514 | } 515 | .icon-print:before { 516 | content: "\f02f"; 517 | } 518 | .icon-camera:before { 519 | content: "\f030"; 520 | } 521 | .icon-font:before { 522 | content: "\f031"; 523 | } 524 | .icon-bold:before { 525 | content: "\f032"; 526 | } 527 | .icon-italic:before { 528 | content: "\f033"; 529 | } 530 | .icon-text-height:before { 531 | content: "\f034"; 532 | } 533 | .icon-text-width:before { 534 | content: "\f035"; 535 | } 536 | .icon-align-left:before { 537 | content: "\f036"; 538 | } 539 | .icon-align-center:before { 540 | content: "\f037"; 541 | } 542 | .icon-align-right:before { 543 | content: "\f038"; 544 | } 545 | .icon-align-justify:before { 546 | content: "\f039"; 547 | } 548 | .icon-list:before { 549 | content: "\f03a"; 550 | } 551 | .icon-indent-left:before { 552 | content: "\f03b"; 553 | } 554 | .icon-indent-right:before { 555 | content: "\f03c"; 556 | } 557 | .icon-facetime-video:before { 558 | content: "\f03d"; 559 | } 560 | .icon-picture:before { 561 | content: "\f03e"; 562 | } 563 | .icon-pencil:before { 564 | content: "\f040"; 565 | } 566 | .icon-map-marker:before { 567 | content: "\f041"; 568 | } 569 | .icon-adjust:before { 570 | content: "\f042"; 571 | } 572 | .icon-tint:before { 573 | content: "\f043"; 574 | } 575 | .icon-edit:before { 576 | content: "\f044"; 577 | } 578 | .icon-share:before { 579 | content: "\f045"; 580 | } 581 | .icon-check:before { 582 | content: "\f046"; 583 | } 584 | .icon-move:before { 585 | content: "\f047"; 586 | } 587 | .icon-step-backward:before { 588 | content: "\f048"; 589 | } 590 | .icon-fast-backward:before { 591 | content: "\f049"; 592 | } 593 | .icon-backward:before { 594 | content: "\f04a"; 595 | } 596 | .icon-play:before { 597 | content: "\f04b"; 598 | } 599 | .icon-pause:before { 600 | content: "\f04c"; 601 | } 602 | .icon-stop:before { 603 | content: "\f04d"; 604 | } 605 | .icon-forward:before { 606 | content: "\f04e"; 607 | } 608 | .icon-fast-forward:before { 609 | content: "\f050"; 610 | } 611 | .icon-step-forward:before { 612 | content: "\f051"; 613 | } 614 | .icon-eject:before { 615 | content: "\f052"; 616 | } 617 | .icon-chevron-left:before { 618 | content: "\f053"; 619 | } 620 | .icon-chevron-right:before { 621 | content: "\f054"; 622 | } 623 | .icon-plus-sign:before { 624 | content: "\f055"; 625 | } 626 | .icon-minus-sign:before { 627 | content: "\f056"; 628 | } 629 | .icon-remove-sign:before { 630 | content: "\f057"; 631 | } 632 | .icon-ok-sign:before { 633 | content: "\f058"; 634 | } 635 | .icon-question-sign:before { 636 | content: "\f059"; 637 | } 638 | .icon-info-sign:before { 639 | content: "\f05a"; 640 | } 641 | .icon-screenshot:before { 642 | content: "\f05b"; 643 | } 644 | .icon-remove-circle:before { 645 | content: "\f05c"; 646 | } 647 | .icon-ok-circle:before { 648 | content: "\f05d"; 649 | } 650 | .icon-ban-circle:before { 651 | content: "\f05e"; 652 | } 653 | .icon-arrow-left:before { 654 | content: "\f060"; 655 | } 656 | .icon-arrow-right:before { 657 | content: "\f061"; 658 | } 659 | .icon-arrow-up:before { 660 | content: "\f062"; 661 | } 662 | .icon-arrow-down:before { 663 | content: "\f063"; 664 | } 665 | .icon-mail-forward:before, 666 | .icon-share-alt:before { 667 | content: "\f064"; 668 | } 669 | .icon-resize-full:before { 670 | content: "\f065"; 671 | } 672 | .icon-resize-small:before { 673 | content: "\f066"; 674 | } 675 | .icon-plus:before { 676 | content: "\f067"; 677 | } 678 | .icon-minus:before { 679 | content: "\f068"; 680 | } 681 | .icon-asterisk:before { 682 | content: "\f069"; 683 | } 684 | .icon-exclamation-sign:before { 685 | content: "\f06a"; 686 | } 687 | .icon-gift:before { 688 | content: "\f06b"; 689 | } 690 | .icon-leaf:before { 691 | content: "\f06c"; 692 | } 693 | .icon-fire:before { 694 | content: "\f06d"; 695 | } 696 | .icon-eye-open:before { 697 | content: "\f06e"; 698 | } 699 | .icon-eye-close:before { 700 | content: "\f070"; 701 | } 702 | .icon-warning-sign:before { 703 | content: "\f071"; 704 | } 705 | .icon-plane:before { 706 | content: "\f072"; 707 | } 708 | .icon-calendar:before { 709 | content: "\f073"; 710 | } 711 | .icon-random:before { 712 | content: "\f074"; 713 | } 714 | .icon-comment:before { 715 | content: "\f075"; 716 | } 717 | .icon-magnet:before { 718 | content: "\f076"; 719 | } 720 | .icon-chevron-up:before { 721 | content: "\f077"; 722 | } 723 | .icon-chevron-down:before { 724 | content: "\f078"; 725 | } 726 | .icon-retweet:before { 727 | content: "\f079"; 728 | } 729 | .icon-shopping-cart:before { 730 | content: "\f07a"; 731 | } 732 | .icon-folder-close:before { 733 | content: "\f07b"; 734 | } 735 | .icon-folder-open:before { 736 | content: "\f07c"; 737 | } 738 | .icon-resize-vertical:before { 739 | content: "\f07d"; 740 | } 741 | .icon-resize-horizontal:before { 742 | content: "\f07e"; 743 | } 744 | .icon-bar-chart:before { 745 | content: "\f080"; 746 | } 747 | .icon-twitter-sign:before { 748 | content: "\f081"; 749 | } 750 | .icon-facebook-sign:before { 751 | content: "\f082"; 752 | } 753 | .icon-camera-retro:before { 754 | content: "\f083"; 755 | } 756 | .icon-key:before { 757 | content: "\f084"; 758 | } 759 | .icon-gears:before, 760 | .icon-cogs:before { 761 | content: "\f085"; 762 | } 763 | .icon-comments:before { 764 | content: "\f086"; 765 | } 766 | .icon-thumbs-up-alt:before { 767 | content: "\f087"; 768 | } 769 | .icon-thumbs-down-alt:before { 770 | content: "\f088"; 771 | } 772 | .icon-star-half:before { 773 | content: "\f089"; 774 | } 775 | .icon-heart-empty:before { 776 | content: "\f08a"; 777 | } 778 | .icon-signout:before { 779 | content: "\f08b"; 780 | } 781 | .icon-linkedin-sign:before { 782 | content: "\f08c"; 783 | } 784 | .icon-pushpin:before { 785 | content: "\f08d"; 786 | } 787 | .icon-external-link:before { 788 | content: "\f08e"; 789 | } 790 | .icon-signin:before { 791 | content: "\f090"; 792 | } 793 | .icon-trophy:before { 794 | content: "\f091"; 795 | } 796 | .icon-github-sign:before { 797 | content: "\f092"; 798 | } 799 | .icon-upload-alt:before { 800 | content: "\f093"; 801 | } 802 | .icon-lemon:before { 803 | content: "\f094"; 804 | } 805 | .icon-phone:before { 806 | content: "\f095"; 807 | } 808 | .icon-unchecked:before, 809 | .icon-check-empty:before { 810 | content: "\f096"; 811 | } 812 | .icon-bookmark-empty:before { 813 | content: "\f097"; 814 | } 815 | .icon-phone-sign:before { 816 | content: "\f098"; 817 | } 818 | .icon-twitter:before { 819 | content: "\f099"; 820 | } 821 | .icon-facebook:before { 822 | content: "\f09a"; 823 | } 824 | .icon-github:before { 825 | content: "\f09b"; 826 | } 827 | .icon-unlock:before { 828 | content: "\f09c"; 829 | } 830 | .icon-credit-card:before { 831 | content: "\f09d"; 832 | } 833 | .icon-rss:before { 834 | content: "\f09e"; 835 | } 836 | .icon-hdd:before { 837 | content: "\f0a0"; 838 | } 839 | .icon-bullhorn:before { 840 | content: "\f0a1"; 841 | } 842 | .icon-bell:before { 843 | content: "\f0a2"; 844 | } 845 | .icon-certificate:before { 846 | content: "\f0a3"; 847 | } 848 | .icon-hand-right:before { 849 | content: "\f0a4"; 850 | } 851 | .icon-hand-left:before { 852 | content: "\f0a5"; 853 | } 854 | .icon-hand-up:before { 855 | content: "\f0a6"; 856 | } 857 | .icon-hand-down:before { 858 | content: "\f0a7"; 859 | } 860 | .icon-circle-arrow-left:before { 861 | content: "\f0a8"; 862 | } 863 | .icon-circle-arrow-right:before { 864 | content: "\f0a9"; 865 | } 866 | .icon-circle-arrow-up:before { 867 | content: "\f0aa"; 868 | } 869 | .icon-circle-arrow-down:before { 870 | content: "\f0ab"; 871 | } 872 | .icon-globe:before { 873 | content: "\f0ac"; 874 | } 875 | .icon-wrench:before { 876 | content: "\f0ad"; 877 | } 878 | .icon-tasks:before { 879 | content: "\f0ae"; 880 | } 881 | .icon-filter:before { 882 | content: "\f0b0"; 883 | } 884 | .icon-briefcase:before { 885 | content: "\f0b1"; 886 | } 887 | .icon-fullscreen:before { 888 | content: "\f0b2"; 889 | } 890 | .icon-group:before { 891 | content: "\f0c0"; 892 | } 893 | .icon-link:before { 894 | content: "\f0c1"; 895 | } 896 | .icon-cloud:before { 897 | content: "\f0c2"; 898 | } 899 | .icon-beaker:before { 900 | content: "\f0c3"; 901 | } 902 | .icon-cut:before { 903 | content: "\f0c4"; 904 | } 905 | .icon-copy:before { 906 | content: "\f0c5"; 907 | } 908 | .icon-paperclip:before, 909 | .icon-paper-clip:before { 910 | content: "\f0c6"; 911 | } 912 | .icon-save:before { 913 | content: "\f0c7"; 914 | } 915 | .icon-sign-blank:before { 916 | content: "\f0c8"; 917 | } 918 | .icon-reorder:before { 919 | content: "\f0c9"; 920 | } 921 | .icon-list-ul:before { 922 | content: "\f0ca"; 923 | } 924 | .icon-list-ol:before { 925 | content: "\f0cb"; 926 | } 927 | .icon-strikethrough:before { 928 | content: "\f0cc"; 929 | } 930 | .icon-underline:before { 931 | content: "\f0cd"; 932 | } 933 | .icon-table:before { 934 | content: "\f0ce"; 935 | } 936 | .icon-magic:before { 937 | content: "\f0d0"; 938 | } 939 | .icon-truck:before { 940 | content: "\f0d1"; 941 | } 942 | .icon-pinterest:before { 943 | content: "\f0d2"; 944 | } 945 | .icon-pinterest-sign:before { 946 | content: "\f0d3"; 947 | } 948 | .icon-google-plus-sign:before { 949 | content: "\f0d4"; 950 | } 951 | .icon-google-plus:before { 952 | content: "\f0d5"; 953 | } 954 | .icon-money:before { 955 | content: "\f0d6"; 956 | } 957 | .icon-caret-down:before { 958 | content: "\f0d7"; 959 | } 960 | .icon-caret-up:before { 961 | content: "\f0d8"; 962 | } 963 | .icon-caret-left:before { 964 | content: "\f0d9"; 965 | } 966 | .icon-caret-right:before { 967 | content: "\f0da"; 968 | } 969 | .icon-columns:before { 970 | content: "\f0db"; 971 | } 972 | .icon-sort:before { 973 | content: "\f0dc"; 974 | } 975 | .icon-sort-down:before { 976 | content: "\f0dd"; 977 | } 978 | .icon-sort-up:before { 979 | content: "\f0de"; 980 | } 981 | .icon-envelope:before { 982 | content: "\f0e0"; 983 | } 984 | .icon-linkedin:before { 985 | content: "\f0e1"; 986 | } 987 | .icon-rotate-left:before, 988 | .icon-undo:before { 989 | content: "\f0e2"; 990 | } 991 | .icon-legal:before { 992 | content: "\f0e3"; 993 | } 994 | .icon-dashboard:before { 995 | content: "\f0e4"; 996 | } 997 | .icon-comment-alt:before { 998 | content: "\f0e5"; 999 | } 1000 | .icon-comments-alt:before { 1001 | content: "\f0e6"; 1002 | } 1003 | .icon-bolt:before { 1004 | content: "\f0e7"; 1005 | } 1006 | .icon-sitemap:before { 1007 | content: "\f0e8"; 1008 | } 1009 | .icon-umbrella:before { 1010 | content: "\f0e9"; 1011 | } 1012 | .icon-paste:before { 1013 | content: "\f0ea"; 1014 | } 1015 | .icon-lightbulb:before { 1016 | content: "\f0eb"; 1017 | } 1018 | .icon-exchange:before { 1019 | content: "\f0ec"; 1020 | } 1021 | .icon-cloud-download:before { 1022 | content: "\f0ed"; 1023 | } 1024 | .icon-cloud-upload:before { 1025 | content: "\f0ee"; 1026 | } 1027 | .icon-user-md:before { 1028 | content: "\f0f0"; 1029 | } 1030 | .icon-stethoscope:before { 1031 | content: "\f0f1"; 1032 | } 1033 | .icon-suitcase:before { 1034 | content: "\f0f2"; 1035 | } 1036 | .icon-bell-alt:before { 1037 | content: "\f0f3"; 1038 | } 1039 | .icon-coffee:before { 1040 | content: "\f0f4"; 1041 | } 1042 | .icon-food:before { 1043 | content: "\f0f5"; 1044 | } 1045 | .icon-file-text-alt:before { 1046 | content: "\f0f6"; 1047 | } 1048 | .icon-building:before { 1049 | content: "\f0f7"; 1050 | } 1051 | .icon-hospital:before { 1052 | content: "\f0f8"; 1053 | } 1054 | .icon-ambulance:before { 1055 | content: "\f0f9"; 1056 | } 1057 | .icon-medkit:before { 1058 | content: "\f0fa"; 1059 | } 1060 | .icon-fighter-jet:before { 1061 | content: "\f0fb"; 1062 | } 1063 | .icon-beer:before { 1064 | content: "\f0fc"; 1065 | } 1066 | .icon-h-sign:before { 1067 | content: "\f0fd"; 1068 | } 1069 | .icon-plus-sign-alt:before { 1070 | content: "\f0fe"; 1071 | } 1072 | .icon-double-angle-left:before { 1073 | content: "\f100"; 1074 | } 1075 | .icon-double-angle-right:before { 1076 | content: "\f101"; 1077 | } 1078 | .icon-double-angle-up:before { 1079 | content: "\f102"; 1080 | } 1081 | .icon-double-angle-down:before { 1082 | content: "\f103"; 1083 | } 1084 | .icon-angle-left:before { 1085 | content: "\f104"; 1086 | } 1087 | .icon-angle-right:before { 1088 | content: "\f105"; 1089 | } 1090 | .icon-angle-up:before { 1091 | content: "\f106"; 1092 | } 1093 | .icon-angle-down:before { 1094 | content: "\f107"; 1095 | } 1096 | .icon-desktop:before { 1097 | content: "\f108"; 1098 | } 1099 | .icon-laptop:before { 1100 | content: "\f109"; 1101 | } 1102 | .icon-tablet:before { 1103 | content: "\f10a"; 1104 | } 1105 | .icon-mobile-phone:before { 1106 | content: "\f10b"; 1107 | } 1108 | .icon-circle-blank:before { 1109 | content: "\f10c"; 1110 | } 1111 | .icon-quote-left:before { 1112 | content: "\f10d"; 1113 | } 1114 | .icon-quote-right:before { 1115 | content: "\f10e"; 1116 | } 1117 | .icon-spinner:before { 1118 | content: "\f110"; 1119 | } 1120 | .icon-circle:before { 1121 | content: "\f111"; 1122 | } 1123 | .icon-mail-reply:before, 1124 | .icon-reply:before { 1125 | content: "\f112"; 1126 | } 1127 | .icon-github-alt:before { 1128 | content: "\f113"; 1129 | } 1130 | .icon-folder-close-alt:before { 1131 | content: "\f114"; 1132 | } 1133 | .icon-folder-open-alt:before { 1134 | content: "\f115"; 1135 | } 1136 | .icon-expand-alt:before { 1137 | content: "\f116"; 1138 | } 1139 | .icon-collapse-alt:before { 1140 | content: "\f117"; 1141 | } 1142 | .icon-smile:before { 1143 | content: "\f118"; 1144 | } 1145 | .icon-frown:before { 1146 | content: "\f119"; 1147 | } 1148 | .icon-meh:before { 1149 | content: "\f11a"; 1150 | } 1151 | .icon-gamepad:before { 1152 | content: "\f11b"; 1153 | } 1154 | .icon-keyboard:before { 1155 | content: "\f11c"; 1156 | } 1157 | .icon-flag-alt:before { 1158 | content: "\f11d"; 1159 | } 1160 | .icon-flag-checkered:before { 1161 | content: "\f11e"; 1162 | } 1163 | .icon-terminal:before { 1164 | content: "\f120"; 1165 | } 1166 | .icon-code:before { 1167 | content: "\f121"; 1168 | } 1169 | .icon-reply-all:before { 1170 | content: "\f122"; 1171 | } 1172 | .icon-mail-reply-all:before { 1173 | content: "\f122"; 1174 | } 1175 | .icon-star-half-full:before, 1176 | .icon-star-half-empty:before { 1177 | content: "\f123"; 1178 | } 1179 | .icon-location-arrow:before { 1180 | content: "\f124"; 1181 | } 1182 | .icon-crop:before { 1183 | content: "\f125"; 1184 | } 1185 | .icon-code-fork:before { 1186 | content: "\f126"; 1187 | } 1188 | .icon-unlink:before { 1189 | content: "\f127"; 1190 | } 1191 | .icon-question:before { 1192 | content: "\f128"; 1193 | } 1194 | .icon-info:before { 1195 | content: "\f129"; 1196 | } 1197 | .icon-exclamation:before { 1198 | content: "\f12a"; 1199 | } 1200 | .icon-superscript:before { 1201 | content: "\f12b"; 1202 | } 1203 | .icon-subscript:before { 1204 | content: "\f12c"; 1205 | } 1206 | .icon-eraser:before { 1207 | content: "\f12d"; 1208 | } 1209 | .icon-puzzle-piece:before { 1210 | content: "\f12e"; 1211 | } 1212 | .icon-microphone:before { 1213 | content: "\f130"; 1214 | } 1215 | .icon-microphone-off:before { 1216 | content: "\f131"; 1217 | } 1218 | .icon-shield:before { 1219 | content: "\f132"; 1220 | } 1221 | .icon-calendar-empty:before { 1222 | content: "\f133"; 1223 | } 1224 | .icon-fire-extinguisher:before { 1225 | content: "\f134"; 1226 | } 1227 | .icon-rocket:before { 1228 | content: "\f135"; 1229 | } 1230 | .icon-maxcdn:before { 1231 | content: "\f136"; 1232 | } 1233 | .icon-chevron-sign-left:before { 1234 | content: "\f137"; 1235 | } 1236 | .icon-chevron-sign-right:before { 1237 | content: "\f138"; 1238 | } 1239 | .icon-chevron-sign-up:before { 1240 | content: "\f139"; 1241 | } 1242 | .icon-chevron-sign-down:before { 1243 | content: "\f13a"; 1244 | } 1245 | .icon-html5:before { 1246 | content: "\f13b"; 1247 | } 1248 | .icon-css3:before { 1249 | content: "\f13c"; 1250 | } 1251 | .icon-anchor:before { 1252 | content: "\f13d"; 1253 | } 1254 | .icon-unlock-alt:before { 1255 | content: "\f13e"; 1256 | } 1257 | .icon-bullseye:before { 1258 | content: "\f140"; 1259 | } 1260 | .icon-ellipsis-horizontal:before { 1261 | content: "\f141"; 1262 | } 1263 | .icon-ellipsis-vertical:before { 1264 | content: "\f142"; 1265 | } 1266 | .icon-rss-sign:before { 1267 | content: "\f143"; 1268 | } 1269 | .icon-play-sign:before { 1270 | content: "\f144"; 1271 | } 1272 | .icon-ticket:before { 1273 | content: "\f145"; 1274 | } 1275 | .icon-minus-sign-alt:before { 1276 | content: "\f146"; 1277 | } 1278 | .icon-check-minus:before { 1279 | content: "\f147"; 1280 | } 1281 | .icon-level-up:before { 1282 | content: "\f148"; 1283 | } 1284 | .icon-level-down:before { 1285 | content: "\f149"; 1286 | } 1287 | .icon-check-sign:before { 1288 | content: "\f14a"; 1289 | } 1290 | .icon-edit-sign:before { 1291 | content: "\f14b"; 1292 | } 1293 | .icon-external-link-sign:before { 1294 | content: "\f14c"; 1295 | } 1296 | .icon-share-sign:before { 1297 | content: "\f14d"; 1298 | } 1299 | .icon-compass:before { 1300 | content: "\f14e"; 1301 | } 1302 | .icon-collapse:before { 1303 | content: "\f150"; 1304 | } 1305 | .icon-collapse-top:before { 1306 | content: "\f151"; 1307 | } 1308 | .icon-expand:before { 1309 | content: "\f152"; 1310 | } 1311 | .icon-euro:before, 1312 | .icon-eur:before { 1313 | content: "\f153"; 1314 | } 1315 | .icon-gbp:before { 1316 | content: "\f154"; 1317 | } 1318 | .icon-dollar:before, 1319 | .icon-usd:before { 1320 | content: "\f155"; 1321 | } 1322 | .icon-rupee:before, 1323 | .icon-inr:before { 1324 | content: "\f156"; 1325 | } 1326 | .icon-yen:before, 1327 | .icon-jpy:before { 1328 | content: "\f157"; 1329 | } 1330 | .icon-renminbi:before, 1331 | .icon-cny:before { 1332 | content: "\f158"; 1333 | } 1334 | .icon-won:before, 1335 | .icon-krw:before { 1336 | content: "\f159"; 1337 | } 1338 | .icon-bitcoin:before, 1339 | .icon-btc:before { 1340 | content: "\f15a"; 1341 | } 1342 | .icon-file:before { 1343 | content: "\f15b"; 1344 | } 1345 | .icon-file-text:before { 1346 | content: "\f15c"; 1347 | } 1348 | .icon-sort-by-alphabet:before { 1349 | content: "\f15d"; 1350 | } 1351 | .icon-sort-by-alphabet-alt:before { 1352 | content: "\f15e"; 1353 | } 1354 | .icon-sort-by-attributes:before { 1355 | content: "\f160"; 1356 | } 1357 | .icon-sort-by-attributes-alt:before { 1358 | content: "\f161"; 1359 | } 1360 | .icon-sort-by-order:before { 1361 | content: "\f162"; 1362 | } 1363 | .icon-sort-by-order-alt:before { 1364 | content: "\f163"; 1365 | } 1366 | .icon-thumbs-up:before { 1367 | content: "\f164"; 1368 | } 1369 | .icon-thumbs-down:before { 1370 | content: "\f165"; 1371 | } 1372 | .icon-youtube-sign:before { 1373 | content: "\f166"; 1374 | } 1375 | .icon-youtube:before { 1376 | content: "\f167"; 1377 | } 1378 | .icon-xing:before { 1379 | content: "\f168"; 1380 | } 1381 | .icon-xing-sign:before { 1382 | content: "\f169"; 1383 | } 1384 | .icon-youtube-play:before { 1385 | content: "\f16a"; 1386 | } 1387 | .icon-dropbox:before { 1388 | content: "\f16b"; 1389 | } 1390 | .icon-stackexchange:before { 1391 | content: "\f16c"; 1392 | } 1393 | .icon-instagram:before { 1394 | content: "\f16d"; 1395 | } 1396 | .icon-flickr:before { 1397 | content: "\f16e"; 1398 | } 1399 | .icon-adn:before { 1400 | content: "\f170"; 1401 | } 1402 | .icon-bitbucket:before { 1403 | content: "\f171"; 1404 | } 1405 | .icon-bitbucket-sign:before { 1406 | content: "\f172"; 1407 | } 1408 | .icon-tumblr:before { 1409 | content: "\f173"; 1410 | } 1411 | .icon-tumblr-sign:before { 1412 | content: "\f174"; 1413 | } 1414 | .icon-long-arrow-down:before { 1415 | content: "\f175"; 1416 | } 1417 | .icon-long-arrow-up:before { 1418 | content: "\f176"; 1419 | } 1420 | .icon-long-arrow-left:before { 1421 | content: "\f177"; 1422 | } 1423 | .icon-long-arrow-right:before { 1424 | content: "\f178"; 1425 | } 1426 | .icon-apple:before { 1427 | content: "\f179"; 1428 | } 1429 | .icon-windows:before { 1430 | content: "\f17a"; 1431 | } 1432 | .icon-android:before { 1433 | content: "\f17b"; 1434 | } 1435 | .icon-linux:before { 1436 | content: "\f17c"; 1437 | } 1438 | .icon-dribbble:before { 1439 | content: "\f17d"; 1440 | } 1441 | .icon-skype:before { 1442 | content: "\f17e"; 1443 | } 1444 | .icon-foursquare:before { 1445 | content: "\f180"; 1446 | } 1447 | .icon-trello:before { 1448 | content: "\f181"; 1449 | } 1450 | .icon-female:before { 1451 | content: "\f182"; 1452 | } 1453 | .icon-male:before { 1454 | content: "\f183"; 1455 | } 1456 | .icon-gittip:before { 1457 | content: "\f184"; 1458 | } 1459 | .icon-sun:before { 1460 | content: "\f185"; 1461 | } 1462 | .icon-moon:before { 1463 | content: "\f186"; 1464 | } 1465 | .icon-archive:before { 1466 | content: "\f187"; 1467 | } 1468 | .icon-bug:before { 1469 | content: "\f188"; 1470 | } 1471 | .icon-vk:before { 1472 | content: "\f189"; 1473 | } 1474 | .icon-weibo:before { 1475 | content: "\f18a"; 1476 | } 1477 | .icon-renren:before { 1478 | content: "\f18b"; 1479 | } 1480 | --------------------------------------------------------------------------------