├── public
├── favicon.ico
├── packages
│ └── .gitkeep
├── robots.txt
├── img
│ ├── image1.jpg
│ ├── image2.jpg
│ ├── image3.jpg
│ ├── image4.jpg
│ └── image5.jpg
├── css
│ ├── icomoon
│ │ ├── icomoon.eot
│ │ ├── icomoon.ttf
│ │ ├── icomoon.woff
│ │ ├── icomoon.svg
│ │ └── icomoon.dev.svg
│ ├── fonts
│ │ └── medium-icons.woff
│ └── styles.css
├── fonts
│ ├── glyphicons-halflings-regular.eot
│ ├── glyphicons-halflings-regular.ttf
│ ├── glyphicons-halflings-regular.woff
│ └── glyphicons-halflings-regular.svg
├── .htaccess
├── index.php
└── js
│ ├── app.js
│ └── vendor
│ ├── grande.js
│ └── bootstrap.min.js
├── app
├── commands
│ └── .gitkeep
├── config
│ ├── packages
│ │ └── .gitkeep
│ ├── blog.php
│ ├── compile.php
│ ├── testing
│ │ ├── cache.php
│ │ └── session.php
│ ├── workbench.php
│ ├── view.php
│ ├── queue.php
│ ├── auth.php
│ ├── cache.php
│ ├── database.php
│ ├── mail.php
│ ├── session.php
│ └── app.php
├── controllers
│ ├── .gitkeep
│ ├── Admin
│ │ ├── PostsController.php
│ │ └── CommentsController.php
│ ├── BaseController.php
│ └── AuthController.php
├── database
│ ├── seeds
│ │ ├── .gitkeep
│ │ ├── DatabaseSeeder.php
│ │ ├── UserSeeder.php
│ │ └── PostSeeder.php
│ ├── migrations
│ │ ├── .gitkeep
│ │ ├── 2013_10_18_064413_create_tags_table.php
│ │ ├── 2013_10_18_064415_create_post_tag_table.php
│ │ ├── 2013_10_18_064417_create_categories_table.php
│ │ ├── 2013_10_18_070220_create_category_post_table.php
│ │ ├── 2013_10_18_064256_create_users_table.php
│ │ ├── 2013_10_18_064423_create_comments_table.php
│ │ └── 2013_10_18_064412_create_posts_table.php
│ └── production.sqlite
├── start
│ ├── local.php
│ ├── artisan.php
│ └── global.php
├── storage
│ ├── .gitignore
│ ├── cache
│ │ └── .gitignore
│ ├── logs
│ │ └── .gitignore
│ ├── meta
│ │ └── .gitignore
│ ├── sessions
│ │ └── .gitignore
│ └── views
│ │ └── .gitignore
├── models
│ ├── Tag.php
│ ├── Category.php
│ ├── Comment.php
│ ├── Post.php
│ └── User.php
├── tests
│ ├── ExampleTest.php
│ └── TestCase.php
├── views
│ ├── layouts
│ │ └── default.blade.php
│ └── blog.blade.php
├── routes.php
├── lang
│ └── en
│ │ ├── pagination.php
│ │ ├── reminders.php
│ │ └── validation.php
└── filters.php
├── .gitignore
├── CONTRIBUTING.md
├── server.php
├── phpunit.xml
├── composer.json
├── Boxfile
├── readme.md
├── bootstrap
├── paths.php
├── start.php
└── autoload.php
└── artisan
/public/favicon.ico:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/commands/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/config/packages/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/controllers/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/database/seeds/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/public/packages/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/database/migrations/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/database/production.sqlite:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/start/local.php:
--------------------------------------------------------------------------------
1 | belongsToMany('Post');
8 | }
9 | }
--------------------------------------------------------------------------------
/public/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/codrops-medium-style-page-transitions/master/public/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/public/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/codrops-medium-style-page-transitions/master/public/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/public/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/msurguy/codrops-medium-style-page-transitions/master/public/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/app/models/Category.php:
--------------------------------------------------------------------------------
1 | belongsToMany('Post');
8 | }
9 | }
--------------------------------------------------------------------------------
/app/config/blog.php:
--------------------------------------------------------------------------------
1 | array(
7 | 'admin' => 40,
8 | 'contributor' => 30,
9 | 'user' => 10
10 | ),
11 | );
--------------------------------------------------------------------------------
/public/.htaccess:
--------------------------------------------------------------------------------
1 |
She closed the door, locked it, and put the key carefully in the pocket of her dress. And so, with Toto trotting along soberly behind her, she started on her journey.
There were several roads near by, but it did not take her long to find the one paved with yellow bricks. Within a short time she was walking briskly toward the Emerald City, her silver shoes tinkling merrily on the hard, yellow road-bed. The sun shone bright and the birds sang sweetly, and Dorothy did not feel nearly so bad as you might think a little girl would who had been suddenly whisked away from her own country and set down in the midst of a strange land.
She was surprised, as she walked along, to see how pretty the country was about her. There were neat fences at the sides of the road, painted a dainty blue color, and beyond them were fields of grain and vegetables in abundance. Evidently the Munchkins were good farmers and able to raise large crops. Once in a while she would pass a house, and the people came out to look at her and bow low as she went by; for everyone knew she had been the means of destroying the Wicked Witch and setting them free from bondage. The houses of the Munchkins were odd-looking dwellings, for each was round, with a big dome for a roof. All were painted blue, for in this country of the East blue was the favorite color.
', 18 | )); 19 | 20 | Post::create(array( 21 | 'user_id' => '1', 22 | 'title' => 'Second Post', 23 | 'slug' => 'second_post', 24 | 'description' => 'This is my Second post', 25 | 'image' => 'img/image2.jpg', 26 | 'published_at' => '2013-10-26 10:15:10', 27 | 'published' => 1, 28 | 'content' => 'She closed the door, locked it, and put the key carefully in the pocket of her dress. And so, with Toto trotting along soberly behind her, she started on her journey.
There were several roads near by, but it did not take her long to find the one paved with yellow bricks. Within a short time she was walking briskly toward the Emerald City, her silver shoes tinkling merrily on the hard, yellow road-bed. The sun shone bright and the birds sang sweetly, and Dorothy did not feel nearly so bad as you might think a little girl would who had been suddenly whisked away from her own country and set down in the midst of a strange land.
She was surprised, as she walked along, to see how pretty the country was about her. There were neat fences at the sides of the road, painted a dainty blue color, and beyond them were fields of grain and vegetables in abundance. Evidently the Munchkins were good farmers and able to raise large crops. Once in a while she would pass a house, and the people came out to look at her and bow low as she went by; for everyone knew she had been the means of destroying the Wicked Witch and setting them free from bondage. The houses of the Munchkins were odd-looking dwellings, for each was round, with a big dome for a roof. All were painted blue, for in this country of the East blue was the favorite color.
', 29 | )); 30 | 31 | Post::create(array( 32 | 'user_id' => '1', 33 | 'title' => 'Third Post', 34 | 'slug' => 'third_post', 35 | 'description' => 'This is my Third post', 36 | 'image' => 'img/image3.jpg', 37 | 'published_at' => '2013-10-26 10:15:10', 38 | 'published' => 1, 39 | 'content' => 'She closed the door, locked it, and put the key carefully in the pocket of her dress. And so, with Toto trotting along soberly behind her, she started on her journey.
There were several roads near by, but it did not take her long to find the one paved with yellow bricks. Within a short time she was walking briskly toward the Emerald City, her silver shoes tinkling merrily on the hard, yellow road-bed. The sun shone bright and the birds sang sweetly, and Dorothy did not feel nearly so bad as you might think a little girl would who had been suddenly whisked away from her own country and set down in the midst of a strange land.
She was surprised, as she walked along, to see how pretty the country was about her. There were neat fences at the sides of the road, painted a dainty blue color, and beyond them were fields of grain and vegetables in abundance. Evidently the Munchkins were good farmers and able to raise large crops. Once in a while she would pass a house, and the people came out to look at her and bow low as she went by; for everyone knew she had been the means of destroying the Wicked Witch and setting them free from bondage. The houses of the Munchkins were odd-looking dwellings, for each was round, with a big dome for a roof. All were painted blue, for in this country of the East blue was the favorite color.
', 40 | )); 41 | } 42 | } -------------------------------------------------------------------------------- /public/js/app.js: -------------------------------------------------------------------------------- 1 | ArticleAnimator.load = function(){ 2 | this.currentPostIndex = getURLIndex(); 3 | this.makeSelections(); 4 | 5 | $body.append( this.$current ) 6 | $body.append( this.$next ) 7 | 8 | var self = this; 9 | this.createPost({ type: 'current' }, function(){ 10 | self.createPost({ type: 'next' }, function(){ 11 | 12 | /* Selections. */ 13 | self.refreshCurrentAndNextSelection(); 14 | 15 | /* Push initial on to stack */ 16 | history.pushState(pageState(), "", "#" + self.currentPostIndex) 17 | 18 | /* Bind to some events. */ 19 | self.bindGotoNextClick(); 20 | self.bindPopstate(); 21 | self.bindWindowScroll(); 22 | }) 23 | }) 24 | } 25 | 26 | ArticleAnimator.makeSelections = function(){ 27 | this.$page = $('.page'); 28 | this.pageTemplate = elementToTemplate( this.$page.clone() ); 29 | this.$current = this.currentElementClone(); 30 | this.$next = this.nextElementClone(); 31 | } 32 | 33 | ArticleAnimator.getPost = function(index, callback){ 34 | callback = callback || $.noop; 35 | 36 | if ( this.postCache[index] ){ 37 | callback( this.postCache[index] ); 38 | return; 39 | } 40 | 41 | var self = this; 42 | $.getJSON('api/posts/'+ index, function(d){ 43 | self.postCache[index] = d; 44 | callback(d) 45 | }); 46 | } 47 | 48 | ArticleAnimator.nextPostIndex = function(index){ 49 | return (index === this.postCount+this.firstPostIndex-1) ? this.firstPostIndex : this.nextPostID 50 | } 51 | 52 | ArticleAnimator.createPost = function(opts, callback){ 53 | opts = opts || {}; 54 | var self = this; 55 | var type = opts['type'] || 'next'; 56 | 57 | if ( opts['fromTemplate'] ){ 58 | $body.append( this.nextElementClone() ); 59 | this['$' + type] = $('.' + type) 60 | } 61 | 62 | var index = (type == 'next') ? this.nextPostIndex( this.currentPostIndex) : this.currentPostIndex; 63 | this.getPost(index, function(d){ 64 | self.nextPostID = d.nextID; 65 | self.contentizeElement(self['$' + type], d); 66 | callback && callback(); 67 | }); 68 | 69 | } 70 | 71 | ArticleAnimator.contentizeElement = function($el, d){ 72 | $el.find('.big-image').css({ backgroundImage: "url(" + d.image + ")" }); 73 | $el.find('h1.title').html(d.title); 74 | $el.find('h2.description').html(d.description); 75 | $el.find('.content .text').html(d.content); 76 | $el.find('h3.byline time').html(d.date); 77 | $el.find('h3.byline .author').html(d.author); 78 | } 79 | 80 | ArticleAnimator.animatePage = function(callback){ 81 | var self = this; 82 | var translationValue = this.$next.get(0).getBoundingClientRect().top; 83 | this.canScroll = false; 84 | 85 | this.$current.addClass('fade-up-out'); 86 | 87 | this.$next.removeClass('content-hidden next') 88 | .addClass('easing-upward') 89 | .css({ "transform": "translate3d(0, -"+ translationValue +"px, 0)" }); 90 | 91 | setTimeout(function(){ 92 | self.$current.remove(); 93 | self.$next.removeClass('easing-upward'); 94 | self.$next.css({ "transform": "" }); 95 | scrollTop(); 96 | 97 | self.$current = self.$next.addClass('current'); 98 | 99 | self.canScroll = true; 100 | self.currentPostIndex = self.nextPostIndex( self.currentPostIndex ); 101 | 102 | callback(); 103 | }, self.animationDuration ); 104 | } 105 | 106 | ArticleAnimator.bindGotoNextClick = function(){ 107 | var self = this; 108 | var e = 'ontouchstart' in window ? 'touchstart' : 'click'; 109 | 110 | this.$next.find('.big-image').on(e, function(e){ 111 | e.preventDefault(); 112 | $(this).unbind(e); 113 | 114 | self.animatePage(function(){ 115 | self.createPost({ fromTemplate: true, type: 'next' }); 116 | self.bindGotoNextClick(); 117 | history.pushState( pageState(), '', "#" + self.currentPostIndex); 118 | }); 119 | }); 120 | } 121 | 122 | ArticleAnimator.bindPopstate = function(){ 123 | var self = this; 124 | $window.on('popstate', function(e){ 125 | 126 | if( !history.state || self.initialLoad ){ 127 | self.initialLoad = false; 128 | return; 129 | } 130 | 131 | self.currentPostIndex = history.state.index; 132 | self.$current.replaceWith( history.state.current ); 133 | self.$next.replaceWith( history.state.next ); 134 | 135 | self.refreshCurrentAndNextSelection(); 136 | self.createPost({ type: 'next' }); 137 | self.bindGotoNextClick(); 138 | }); 139 | } 140 | 141 | ArticleAnimator.bindWindowScroll = function(){ 142 | var self = this; 143 | $window.on('mousewheel', function(ev){ 144 | if ( !self.canScroll ) 145 | ev.preventDefault() 146 | }) 147 | } 148 | 149 | ArticleAnimator.refreshCurrentAndNextSelection = function(){ 150 | this.$current = $('.page.current'); 151 | this.$next = $('.page.next'); 152 | } 153 | 154 | ArticleAnimator.nextElementClone = function(){ 155 | return this.$page.clone().removeClass('hidden').addClass('next content-hidden'); 156 | } 157 | 158 | ArticleAnimator.currentElementClone = function(){ 159 | return this.$page.clone().removeClass('hidden').addClass('current'); 160 | } 161 | 162 | /* 163 | Helper Functions. 164 | ************************************************************************/ 165 | function elementToTemplate($element){ 166 | return $element.get(0).outerHTML; 167 | } 168 | 169 | function scrollTop(){ 170 | $body.add($html).scrollTop(0); 171 | } 172 | 173 | function pageState(){ 174 | return { index: ArticleAnimator.currentPostIndex, current: elementToTemplate(ArticleAnimator.$current), next: elementToTemplate(ArticleAnimator.$next) } 175 | } 176 | 177 | function getURLIndex(){ 178 | return parseInt( (history.state && history.state.index) ||window.location.hash.replace('#', "") || ArticleAnimator.currentPostIndex ); 179 | } 180 | -------------------------------------------------------------------------------- /public/css/icomoon/icomoon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /public/css/icomoon/icomoon.dev.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /public/css/styles.css: -------------------------------------------------------------------------------- 1 | /* line 2, ../scss/_extensions.scss */ 2 | .container, body article.page .content { 3 | max-width: 600px; 4 | margin: 0 auto; 5 | } 6 | 7 | /* line 7, ../scss/_extensions.scss */ 8 | .stretchy-bg, body article.page .big-image { 9 | background-position: center center; 10 | background-repeat: none; 11 | -webkit-background-size: cover; 12 | -moz-background-size: cover; 13 | -o-background-size: cover; 14 | background-size: cover; 15 | } 16 | 17 | /* line 13, ../scss/_extensions.scss */ 18 | .big-image, body article.page .big-image { 19 | height: 300px; 20 | } 21 | @media only screen and (min-width: 500px) { 22 | /* line 13, ../scss/_extensions.scss */ 23 | .big-image, body article.page .big-image { 24 | height: 420px; 25 | } 26 | } 27 | 28 | /* line 61, ../../../../../../../../../Applications/LiveReload.app/Contents/Resources/SASS.lrplugin/lib/compass/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss */ 29 | * html { 30 | font-size: 125%; 31 | } 32 | 33 | /* line 64, ../../../../../../../../../Applications/LiveReload.app/Contents/Resources/SASS.lrplugin/lib/compass/frameworks/compass/stylesheets/compass/typography/_vertical_rhythm.scss */ 34 | html { 35 | font-size: 20px; 36 | line-height: 0.3em; 37 | } 38 | 39 | /* line 4, ../scss/_mixins.scss */ 40 | ::-webkit-scrollbar { 41 | width: 3px; 42 | height: 3px; 43 | } 44 | 45 | /* line 9, ../scss/_mixins.scss */ 46 | ::-webkit-scrollbar-thumb { 47 | background: #666666; 48 | } 49 | 50 | /* line 13, ../scss/_mixins.scss */ 51 | ::-webkit-scrollbar-track { 52 | background: rgba(255, 255, 255, 0.1); 53 | } 54 | 55 | /* line 18, ../scss/_mixins.scss */ 56 | body { 57 | scrollbar-face-color: #666666; 58 | scrollbar-track-color: rgba(255, 255, 255, 0.1); 59 | } 60 | 61 | /* line 11, ../scss/styles.scss */ 62 | body { 63 | font-family: 'PT Serif', serif; 64 | color: #555; 65 | padding: 20px; 66 | padding: 0; 67 | margin: 0; 68 | -webkit-backface-visibility: hidden; 69 | -webkit-font-smoothing: antialiased; 70 | text-rendering: optimizeLegibility; 71 | line-height: 1.8em; 72 | /* Responsive typography, yay! */ 73 | font-size: 80%; 74 | /* Page-wrap styles. */ 75 | } 76 | @media only screen and (min-width: 500px) { 77 | /* line 11, ../scss/styles.scss */ 78 | body { 79 | font-size: 100%; 80 | } 81 | } 82 | /* line 27, ../scss/styles.scss */ 83 | body h1 { 84 | font-family: 'Source Sans Pro', serif; 85 | } 86 | /* line 31, ../scss/styles.scss */ 87 | body h1, body h2, body h3, body h4, body h5, body h6 { 88 | color: #333; 89 | } 90 | /* line 36, ../scss/styles.scss */ 91 | body article.page { 92 | -webkit-transform-origin: bottom center; 93 | /* Class applied when when page fades away. */ 94 | /* The large image that accompanies every post. */ 95 | /* The content. */ 96 | } 97 | /* line 39, ../scss/styles.scss */ 98 | body article.page.hidden { 99 | display: none; 100 | } 101 | /* line 42, ../scss/styles.scss */ 102 | body article.page.next .big-image, body article.page.next .big-image { 103 | cursor: pointer; 104 | } 105 | /* line 43, ../scss/styles.scss */ 106 | body article.page.next .big-image .inner, body article.page.next .big-image .inner { 107 | opacity: 1; 108 | } 109 | /* line 47, ../scss/styles.scss */ 110 | body article.page.content-hidden .content { 111 | display: none; 112 | } 113 | /* line 51, ../scss/styles.scss */ 114 | body article.page.fade-up-out { 115 | opacity: 0; 116 | -webkit-transform: scale(0.8) translate3d(0, -10%, 0); 117 | -moz-transform: scale(0.8) translate3d(0, -10%, 0); 118 | -ms-transform: scale(0.8) translate3d(0, -10%, 0); 119 | -o-transform: scale(0.8) translate3d(0, -10%, 0); 120 | transform: scale(0.8) translate3d(0, -10%, 0); 121 | -webkit-transition: all 450ms cubic-bezier(0.165, 0.84, 0.44, 1); 122 | -moz-transition: all 450ms cubic-bezier(0.165, 0.84, 0.44, 1); 123 | -o-transition: all 450ms cubic-bezier(0.165, 0.84, 0.44, 1); 124 | transition: all 450ms cubic-bezier(0.165, 0.84, 0.44, 1); 125 | } 126 | /* line 57, ../scss/styles.scss */ 127 | body article.page.easing-upward { 128 | -webkit-transition: all 450ms cubic-bezier(0.165, 0.84, 0.44, 1); 129 | -moz-transition: all 450ms cubic-bezier(0.165, 0.84, 0.44, 1); 130 | -o-transition: all 450ms cubic-bezier(0.165, 0.84, 0.44, 1); 131 | transition: all 450ms cubic-bezier(0.165, 0.84, 0.44, 1); 132 | } 133 | /* line 62, ../scss/styles.scss */ 134 | body article.page .big-image, body article.page .big-image { 135 | font-size: 80%; 136 | } 137 | @media only screen and (min-width: 500px) { 138 | /* line 62, ../scss/styles.scss */ 139 | body article.page .big-image, body article.page .big-image { 140 | font-size: 100%; 141 | } 142 | } 143 | /* line 69, ../scss/styles.scss */ 144 | body article.page .big-image .inner, body article.page .big-image .inner { 145 | position: relative; 146 | width: 100%; 147 | height: 100%; 148 | text-align: center; 149 | overflow: hidden; 150 | opacity: 0; 151 | text-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2); 152 | -webkit-transition: all 0.5s ease; 153 | -moz-transition: all 0.5s ease; 154 | -o-transition: all 0.5s ease; 155 | transition: all 0.5s ease; 156 | } 157 | /* line 78, ../scss/styles.scss */ 158 | body article.page .big-image .inner .fader, body article.page .big-image .inner .fader { 159 | width: 100%; 160 | height: 100%; 161 | background: rgba(0, 0, 0, 0.6); 162 | } 163 | /* line 83, ../scss/styles.scss */ 164 | body article.page .big-image .inner .fader .text { 165 | position: absolute; 166 | top: 50%; 167 | left: 50%; 168 | width: 80%; 169 | -webkit-transform: translateX(-50%) translateY(-50%); 170 | -moz-transform: translateX(-50%) translateY(-50%); 171 | -ms-transform: translateX(-50%) translateY(-50%); 172 | -o-transform: translateX(-50%) translateY(-50%); 173 | transform: translateX(-50%) translateY(-50%); 174 | } 175 | /* line 89, ../scss/styles.scss */ 176 | body article.page .big-image .inner .fader .text a, body article.page .big-image .inner .fader .text h1, body article.page .big-image .inner .fader .text h2 { 177 | color: white; 178 | } 179 | /* line 91, ../scss/styles.scss */ 180 | body article.page .big-image .inner .fader .text a { 181 | color: white; 182 | border-bottom: 1px solid white; 183 | text-decoration: none; 184 | font-style: italic; 185 | font-size: 0.8em; 186 | line-height: 1.5em; 187 | } 188 | /* line 99, ../scss/styles.scss */ 189 | body article.page .big-image .inner .fader .text h1 { 190 | margin: 0; 191 | margin-top: 0.1em; 192 | padding-top: 0em; 193 | padding-bottom: 0em; 194 | margin-bottom: 0em; 195 | font-size: 3em; 196 | line-height: 1.1em; 197 | } 198 | /* line 105, ../scss/styles.scss */ 199 | body article.page .big-image .inner .fader .text h2 { 200 | margin: 0; 201 | font-style: italic; 202 | font-weight: normal; 203 | margin-top: 0.2em; 204 | padding-top: 0em; 205 | padding-bottom: 0em; 206 | margin-bottom: 0em; 207 | font-size: 1.5em; 208 | line-height: 1.2em; 209 | } 210 | /* line 119, ../scss/styles.scss */ 211 | body article.page .content { 212 | padding: 0 3em; 213 | } 214 | /* line 123, ../scss/styles.scss */ 215 | body article.page .content h3 { 216 | color: #999; 217 | font-family: 'Source Sans Pro', serif; 218 | font-weight: 400; 219 | margin-top: 3em; 220 | padding-top: 0em; 221 | padding-bottom: 0em; 222 | margin-bottom: 0.375em; 223 | font-size: 0.8em; 224 | line-height: 1.5em; 225 | } 226 | /* line 131, ../scss/styles.scss */ 227 | body article.page .content h1 { 228 | margin-top: 0em; 229 | padding-top: 0em; 230 | padding-bottom: 0em; 231 | margin-bottom: 0.24em; 232 | font-size: 2.5em; 233 | line-height: 1.08em; 234 | } 235 | /* line 136, ../scss/styles.scss */ 236 | body article.page .content h2.description { 237 | font-weight: normal; 238 | font-style: italic; 239 | } 240 | /* line 140, ../scss/styles.scss */ 241 | body article.page .content p:last-child { 242 | margin-bottom: 3em; 243 | } 244 | -------------------------------------------------------------------------------- /app/config/app.php: -------------------------------------------------------------------------------- 1 | true, 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Application URL 21 | |-------------------------------------------------------------------------- 22 | | 23 | | This URL is used by the console to properly generate URLs when using 24 | | the Artisan command line tool. You should set this to the root of 25 | | your application so that it is used when running Artisan tasks. 26 | | 27 | */ 28 | 29 | 'url' => 'http://localhost', 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Application Timezone 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here you may specify the default timezone for your application, which 37 | | will be used by the PHP date and date-time functions. We have gone 38 | | ahead and set this to a sensible default for you out of the box. 39 | | 40 | */ 41 | 42 | 'timezone' => 'UTC', 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Application Locale Configuration 47 | |-------------------------------------------------------------------------- 48 | | 49 | | The application locale determines the default locale that will be used 50 | | by the translation service provider. You are free to set this value 51 | | to any of the locales which will be supported by the application. 52 | | 53 | */ 54 | 55 | 'locale' => 'en', 56 | 57 | /* 58 | |-------------------------------------------------------------------------- 59 | | Encryption Key 60 | |-------------------------------------------------------------------------- 61 | | 62 | | This key is used by the Illuminate encrypter service and should be set 63 | | to a random, 32 character string, otherwise these encrypted strings 64 | | will not be safe. Please do this before deploying an application! 65 | | 66 | */ 67 | 68 | 'key' => 'ZnDfbD26yd38QLumFVU4VdcaRPWsmuDV', 69 | 70 | /* 71 | |-------------------------------------------------------------------------- 72 | | Autoloaded Service Providers 73 | |-------------------------------------------------------------------------- 74 | | 75 | | The service providers listed here will be automatically loaded on the 76 | | request to your application. Feel free to add your own services to 77 | | this array to grant expanded functionality to your applications. 78 | | 79 | */ 80 | 81 | 'providers' => array( 82 | 83 | 'Illuminate\Foundation\Providers\ArtisanServiceProvider', 84 | 'Illuminate\Auth\AuthServiceProvider', 85 | 'Illuminate\Cache\CacheServiceProvider', 86 | 'Illuminate\Foundation\Providers\CommandCreatorServiceProvider', 87 | 'Illuminate\Session\CommandsServiceProvider', 88 | 'Illuminate\Foundation\Providers\ComposerServiceProvider', 89 | 'Illuminate\Routing\ControllerServiceProvider', 90 | 'Illuminate\Cookie\CookieServiceProvider', 91 | 'Illuminate\Database\DatabaseServiceProvider', 92 | 'Illuminate\Encryption\EncryptionServiceProvider', 93 | 'Illuminate\Filesystem\FilesystemServiceProvider', 94 | 'Illuminate\Hashing\HashServiceProvider', 95 | 'Illuminate\Html\HtmlServiceProvider', 96 | 'Illuminate\Foundation\Providers\KeyGeneratorServiceProvider', 97 | 'Illuminate\Log\LogServiceProvider', 98 | 'Illuminate\Mail\MailServiceProvider', 99 | 'Illuminate\Foundation\Providers\MaintenanceServiceProvider', 100 | 'Illuminate\Database\MigrationServiceProvider', 101 | 'Illuminate\Foundation\Providers\OptimizeServiceProvider', 102 | 'Illuminate\Pagination\PaginationServiceProvider', 103 | 'Illuminate\Foundation\Providers\PublisherServiceProvider', 104 | 'Illuminate\Queue\QueueServiceProvider', 105 | 'Illuminate\Redis\RedisServiceProvider', 106 | 'Illuminate\Auth\Reminders\ReminderServiceProvider', 107 | 'Illuminate\Foundation\Providers\RouteListServiceProvider', 108 | 'Illuminate\Database\SeedServiceProvider', 109 | 'Illuminate\Foundation\Providers\ServerServiceProvider', 110 | 'Illuminate\Session\SessionServiceProvider', 111 | 'Illuminate\Foundation\Providers\TinkerServiceProvider', 112 | 'Illuminate\Translation\TranslationServiceProvider', 113 | 'Illuminate\Validation\ValidationServiceProvider', 114 | 'Illuminate\View\ViewServiceProvider', 115 | 'Illuminate\Workbench\WorkbenchServiceProvider', 116 | 117 | ), 118 | 119 | /* 120 | |-------------------------------------------------------------------------- 121 | | Service Provider Manifest 122 | |-------------------------------------------------------------------------- 123 | | 124 | | The service provider manifest is used by Laravel to lazy load service 125 | | providers which are not needed for each request, as well to keep a 126 | | list of all of the services. Here, you may set its storage spot. 127 | | 128 | */ 129 | 130 | 'manifest' => storage_path().'/meta', 131 | 132 | /* 133 | |-------------------------------------------------------------------------- 134 | | Class Aliases 135 | |-------------------------------------------------------------------------- 136 | | 137 | | This array of class aliases will be registered when this application 138 | | is started. However, feel free to register as many as you wish as 139 | | the aliases are "lazy" loaded so they don't hinder performance. 140 | | 141 | */ 142 | 143 | 'aliases' => array( 144 | 145 | 'App' => 'Illuminate\Support\Facades\App', 146 | 'Artisan' => 'Illuminate\Support\Facades\Artisan', 147 | 'Auth' => 'Illuminate\Support\Facades\Auth', 148 | 'Blade' => 'Illuminate\Support\Facades\Blade', 149 | 'Cache' => 'Illuminate\Support\Facades\Cache', 150 | 'ClassLoader' => 'Illuminate\Support\ClassLoader', 151 | 'Config' => 'Illuminate\Support\Facades\Config', 152 | 'Controller' => 'Illuminate\Routing\Controllers\Controller', 153 | 'Cookie' => 'Illuminate\Support\Facades\Cookie', 154 | 'Crypt' => 'Illuminate\Support\Facades\Crypt', 155 | 'DB' => 'Illuminate\Support\Facades\DB', 156 | 'Eloquent' => 'Illuminate\Database\Eloquent\Model', 157 | 'Event' => 'Illuminate\Support\Facades\Event', 158 | 'File' => 'Illuminate\Support\Facades\File', 159 | 'Form' => 'Illuminate\Support\Facades\Form', 160 | 'Hash' => 'Illuminate\Support\Facades\Hash', 161 | 'HTML' => 'Illuminate\Support\Facades\HTML', 162 | 'Input' => 'Illuminate\Support\Facades\Input', 163 | 'Lang' => 'Illuminate\Support\Facades\Lang', 164 | 'Log' => 'Illuminate\Support\Facades\Log', 165 | 'Mail' => 'Illuminate\Support\Facades\Mail', 166 | 'Paginator' => 'Illuminate\Support\Facades\Paginator', 167 | 'Password' => 'Illuminate\Support\Facades\Password', 168 | 'Queue' => 'Illuminate\Support\Facades\Queue', 169 | 'Redirect' => 'Illuminate\Support\Facades\Redirect', 170 | 'Redis' => 'Illuminate\Support\Facades\Redis', 171 | 'Request' => 'Illuminate\Support\Facades\Request', 172 | 'Response' => 'Illuminate\Support\Facades\Response', 173 | 'Route' => 'Illuminate\Support\Facades\Route', 174 | 'Schema' => 'Illuminate\Support\Facades\Schema', 175 | 'Seeder' => 'Illuminate\Database\Seeder', 176 | 'Session' => 'Illuminate\Support\Facades\Session', 177 | 'Str' => 'Illuminate\Support\Str', 178 | 'URL' => 'Illuminate\Support\Facades\URL', 179 | 'Validator' => 'Illuminate\Support\Facades\Validator', 180 | 'View' => 'Illuminate\Support\Facades\View', 181 | 182 | ), 183 | 184 | ); 185 | -------------------------------------------------------------------------------- /public/js/vendor/grande.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var EDGE = -999; 3 | 4 | var root = this, // Root object, this is going to be the window for now 5 | document = this.document, // Safely store a document here for us to use 6 | editableNodes = document.querySelectorAll(".g-body article"), 7 | editNode = editableNodes[0], // TODO: cross el support for imageUpload 8 | isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1, 9 | options = { 10 | animate: true 11 | }, 12 | textMenu, 13 | optionsNode, 14 | urlInput, 15 | previouslySelectedText, 16 | imageTooltip, 17 | imageInput, 18 | imageBound; 19 | 20 | grande = { 21 | bind: function(bindableNodes, opts) { 22 | if (bindableNodes) { 23 | editableNodes = bindableNodes; 24 | } 25 | 26 | options = opts || options; 27 | 28 | attachToolbarTemplate(); 29 | bindTextSelectionEvents(); 30 | bindTextStylingEvents(); 31 | }, 32 | select: function() { 33 | triggerTextSelection(); 34 | } 35 | }, 36 | 37 | tagClassMap = { 38 | "b": "bold", 39 | "i": "italic", 40 | "h1": "header1", 41 | "h2": "header2", 42 | "a": "url", 43 | "blockquote": "quote" 44 | }; 45 | 46 | function attachToolbarTemplate() { 47 | var div = document.createElement("div"), 48 | toolbarTemplate = "", 61 | imageTooltipTemplate = document.createElement("div"); 62 | 63 | imageTooltipTemplate.innerHTML = "after a
293 | if (sel.anchorNode.nodeName === "DIV") { 294 | toggleFormatBlock("p"); 295 | } 296 | 297 | parentParagraph = getParentWithTag(sel.anchorNode, "p"); 298 | 299 | if (parentParagraph) { 300 | insertHorizontalRule(parentParagraph); 301 | } 302 | } 303 | } 304 | 305 | function insertHorizontalRule(parentParagraph) { 306 | var prevSibling, 307 | prevPrevSibling, 308 | hr; 309 | 310 | prevSibling = parentParagraph.previousSibling; 311 | prevPrevSibling = prevSibling; 312 | 313 | while(prevPrevSibling = prevPrevSibling.previousSibling) { 314 | if (prevPrevSibling.nodeType != Node.TEXT_NODE) { 315 | break; 316 | } 317 | } 318 | 319 | if (prevSibling.nodeName === "P" && !prevSibling.textContent.length && prevPrevSibling.nodeName !== "HR") { 320 | hr = document.createElement("hr"); 321 | hr.contentEditable = false; 322 | parentParagraph.parentNode.replaceChild(hr, prevSibling); 323 | } 324 | } 325 | 326 | function getTextProp(el) { 327 | var textProp; 328 | 329 | if (el.nodeType === Node.TEXT_NODE) { 330 | textProp = "data"; 331 | } else if (isFirefox) { 332 | textProp = "textContent"; 333 | } else { 334 | textProp = "innerText"; 335 | } 336 | 337 | return textProp; 338 | } 339 | 340 | function insertListOnSelection(sel, textProp, listType) { 341 | var execListCommand = listType === "ol" ? "insertOrderedList" : "insertUnorderedList", 342 | nodeOffset = listType === "ol" ? 3 : 2; 343 | 344 | document.execCommand(execListCommand); 345 | sel.anchorNode[textProp] = sel.anchorNode[textProp].substring(nodeOffset); 346 | 347 | return getParentWithTag(sel.anchorNode, listType); 348 | } 349 | 350 | function triggerTextParse(event) { 351 | var sel = window.getSelection(), 352 | textProp, 353 | subject, 354 | insertedNode, 355 | unwrap, 356 | node, 357 | parent, 358 | range; 359 | 360 | // FF will return sel.anchorNode to be the parentNode when the triggered keyCode is 13 361 | if (!sel.isCollapsed || !sel.anchorNode || sel.anchorNode.nodeName === "ARTICLE") { 362 | return; 363 | } 364 | 365 | textProp = getTextProp(sel.anchorNode); 366 | subject = sel.anchorNode[textProp]; 367 | 368 | if (subject.match(/^-\s/) && sel.anchorNode.parentNode.nodeName !== "LI") { 369 | insertedNode = insertListOnSelection(sel, textProp, "ul"); 370 | } 371 | 372 | if (subject.match(/^1\.\s/) && sel.anchorNode.parentNode.nodeName !== "LI") { 373 | insertedNode = insertListOnSelection(sel, textProp, "ol"); 374 | } 375 | 376 | unwrap = insertedNode && 377 | ["ul", "ol"].indexOf(insertedNode.nodeName.toLocaleLowerCase()) >= 0 && 378 | ["p", "div"].indexOf(insertedNode.parentNode.nodeName.toLocaleLowerCase()) >= 0; 379 | 380 | if (unwrap) { 381 | node = sel.anchorNode; 382 | parent = insertedNode.parentNode; 383 | parent.parentNode.insertBefore(insertedNode, parent); 384 | parent.parentNode.removeChild(parent); 385 | moveCursorToBeginningOfSelection(sel, node); 386 | } 387 | } 388 | 389 | function moveCursorToBeginningOfSelection(selection, node) { 390 | range = document.createRange(); 391 | range.setStart(node, 0); 392 | range.setEnd(node, 0); 393 | selection.removeAllRanges(); 394 | selection.addRange(range); 395 | } 396 | 397 | function triggerTextStyling(node) { 398 | var className = node.className, 399 | sel = window.getSelection(), 400 | selNode = sel.anchorNode, 401 | tagClass, 402 | reTag; 403 | 404 | for (var tag in tagClassMap) { 405 | tagClass = tagClassMap[tag]; 406 | reTag = new RegExp(tagClass); 407 | 408 | if (reTag.test(className)) { 409 | switch(tag) { 410 | case "b": 411 | if (selNode && !hasParentWithTag(selNode, "h1") && !hasParentWithTag(selNode, "h2")) { 412 | document.execCommand(tagClass, false); 413 | } 414 | return; 415 | case "i": 416 | document.execCommand(tagClass, false); 417 | return; 418 | 419 | case "h1": 420 | case "h2": 421 | case "h3": 422 | case "blockquote": 423 | toggleFormatBlock(tag); 424 | return; 425 | 426 | case "a": 427 | toggleUrlInput(); 428 | optionsNode.className = "options url-mode"; 429 | return; 430 | } 431 | } 432 | } 433 | 434 | triggerTextSelection(); 435 | } 436 | 437 | function triggerUrlBlur(event) { 438 | var url = urlInput.value; 439 | 440 | optionsNode.className = "options"; 441 | window.getSelection().addRange(previouslySelectedText); 442 | 443 | document.execCommand("unlink", false); 444 | 445 | if (url === "") { 446 | return false; 447 | } 448 | 449 | if (!url.match("^(http://|https://|mailto:)")) { 450 | url = "http://" + url; 451 | } 452 | 453 | document.execCommand("createLink", false, url); 454 | 455 | urlInput.value = ""; 456 | } 457 | 458 | function triggerUrlSet(event) { 459 | if (event.keyCode === 13) { 460 | event.preventDefault(); 461 | event.stopPropagation(); 462 | 463 | urlInput.blur(); 464 | } 465 | } 466 | 467 | function toggleFormatBlock(tag) { 468 | if (hasParentWithTag(getFocusNode(), tag)) { 469 | document.execCommand("formatBlock", false, "p"); 470 | document.execCommand("outdent"); 471 | } else { 472 | document.execCommand("formatBlock", false, tag); 473 | } 474 | } 475 | 476 | function toggleUrlInput() { 477 | setTimeout(function() { 478 | var url = getParentHref(getFocusNode()); 479 | 480 | if (typeof url !== "undefined") { 481 | urlInput.value = url; 482 | } else { 483 | document.execCommand("createLink", false, "/"); 484 | } 485 | 486 | previouslySelectedText = window.getSelection().getRangeAt(0); 487 | 488 | urlInput.focus(); 489 | }, 150); 490 | } 491 | 492 | function getParent(node, condition, returnCallback) { 493 | while (node.parentNode) { 494 | if (condition(node)) { 495 | return returnCallback(node); 496 | } 497 | 498 | node = node.parentNode; 499 | } 500 | } 501 | 502 | function getParentWithTag(node, nodeType) { 503 | var checkNodeType = function(node) { return node.nodeName.toLowerCase() === nodeType; }, 504 | returnNode = function(node) { return node; }; 505 | 506 | return getParent(node, checkNodeType, returnNode); 507 | } 508 | 509 | function hasParentWithTag(node, nodeType) { 510 | return !!getParentWithTag(node, nodeType); 511 | } 512 | 513 | function getParentHref(node) { 514 | var checkHref = function(node) { return typeof node.href !== "undefined"; }, 515 | returnHref = function(node) { return node.href; }; 516 | 517 | return getParent(node, checkHref, returnHref); 518 | } 519 | 520 | function triggerTextSelection() { 521 | var selectedText = root.getSelection(), 522 | range, 523 | clientRectBounds; 524 | 525 | // The selected text is collapsed, push the menu out of the way 526 | if (selectedText.isCollapsed) { 527 | setTextMenuPosition(EDGE, EDGE); 528 | textMenu.className = "text-menu hide"; 529 | } else { 530 | range = selectedText.getRangeAt(0); 531 | clientRectBounds = range.getBoundingClientRect(); 532 | 533 | // Every time we show the menu, reload the state 534 | reloadMenuState(); 535 | setTextMenuPosition( 536 | clientRectBounds.top - 5 + root.pageYOffset, 537 | (clientRectBounds.left + clientRectBounds.right) / 2 538 | ); 539 | } 540 | } 541 | 542 | function setTextMenuPosition(top, left) { 543 | textMenu.style.top = top + "px"; 544 | textMenu.style.left = left + "px"; 545 | 546 | if (options.animate) { 547 | if (top === EDGE) { 548 | textMenu.className = "text-menu hide"; 549 | } else { 550 | textMenu.className = "text-menu active"; 551 | } 552 | } 553 | } 554 | 555 | root.grande = grande; 556 | 557 | }).call(this); 558 | -------------------------------------------------------------------------------- /public/js/vendor/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * bootstrap.js v3.0.0 by @fat and @mdo 3 | * Copyright 2013 Twitter Inc. 4 | * http://www.apache.org/licenses/LICENSE-2.0 5 | */ 6 | if(!jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(window.jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(window.jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('
').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i