utton" rel="nofollow" href="/mcot/spacemcot/src/911316392227c3aa23ef2ca576aaae9b5ec168c0/static/bower_components/angular-bootstrap-lightbox/LICENSE.txt">Vedi File
@@ -0,0 +1,21 @@
1
+The MIT License (MIT)
2
+
3
+Copyright (c) 2014
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.

+ 172 - 0
static/bower_components/angular-bootstrap-lightbox/README.md

@@ -0,0 +1,172 @@
1
+# angular-bootstrap-lightbox
2
+
3
+This lightbox displays images using an [AngularUI Bootstrap Modal](http://angular-ui.github.io/bootstrap/#/modal) (v0.14).
4
+
5
+When the lightbox is opened, navigating to the previous/next image can be achieved by clicking buttons above the image, clicking the left/right arrow keys, or swiping to the left/right (optional with ngTouch). The escape key for closing the modal is automatically binded by AngularUI Bootstrap.
6
+
7
+Large images are scaled to fit inside the window. An optional image caption overlays the top left corner of the image.
8
+
9
+## Demos
10
+
11
+[Demos](http://compact.github.io/angular-bootstrap-lightbox/)
12
+
13
+## Setup
14
+
15
+1. Install in one of the following ways:
16
+
17
+  * Install with Bower: `bower install angular-bootstrap-lightbox --save`
18
+  * Install with npm: `npm install angular-bootstrap-lightbox --save`
19
+  * Manually save the script and stylesheet from [`dist`](dist).
20
+
21
+2. Include the stylesheet in your app:
22
+
23
+  ```html
24
+  <link rel="stylesheet" href="angular-bootstrap-lightbox/dist/angular-bootstrap-lightbox.css">
25
+  ```
26
+
27
+3. Include the script in your app:
28
+
29
+  ```html
30
+  <script src="angular-bootstrap-lightbox/dist/angular-bootstrap-lightbox.js"></script>
31
+  ```
32
+
33
+4. The Angular module is named `bootstrapLightbox`. Add it as a dependency to your module:
34
+
35
+  ```js
36
+  angular.module('app', ['bootstrapLightbox']);
37
+  ```
38
+
39
+5. Optional dependencies:
40
+
41
+  * To enable swipe navigation in the lightbox, include the [ngTouch](https://docs.angularjs.org/api/ngTouch) script.
42
+  * To show a loading bar while an image is loading, include the [angular-loading-bar](https://github.com/chieffancypants/angular-loading-bar) script.
43
+  * For video support, include the [ng-videosharing-embed](https://github.com/erost/ng-videosharing-embed) script.
44
+
45
+## Basic example
46
+
47
+Gallery:
48
+
49
+```html
50
+<ul ng-controller="GalleryCtrl">
51
+  <li ng-repeat="image in images">
52
+    <a ng-click="openLightboxModal($index)">
53
+      <img ng-src="{{image.thumbUrl}}" class="img-thumbnail">
54
+    </a>
55
+  </li>
56
+</ul>
57
+```
58
+
59
+Controller:
60
+
61
+```js
62
+angular.module('app').controller('GalleryCtrl', function ($scope, Lightbox) {
63
+  $scope.images = [
64
+    {
65
+      'url': '1.jpg',
66
+      'caption': 'Optional caption',
67
+      'thumbUrl': 'thumb1.jpg' // used only for this example
68
+    },
69
+    {
70
+      'url': '2.gif',
71
+      'thumbUrl': 'thumb2.jpg'
72
+    },
73
+    {
74
+      'url': '3.png',
75
+      'thumbUrl': 'thumb3.png'
76
+    }
77
+  ];
78
+
79
+  $scope.openLightboxModal = function (index) {
80
+    Lightbox.openModal($scope.images, index);
81
+  };
82
+});
83
+```
84
+
85
+## Configuration
86
+
87
+### Changing the appearance of the modal lightbox
88
+
89
+The default view template for the lightbox is [lightbox.html](src/lightbox.html). Its look can be changed by making your own custom template and/or adding CSS rules; for example, use the selector `.lightbox-image-caption` to style the caption.
90
+
91
+If you make your own template and save it at `lightbox.html`, no further code is necessary. If you save it at a different path, set it in the provider:
92
+
93
+```js
94
+angular.module('app').config(function (LightboxProvider) {
95
+  // set a custom template
96
+  LightboxProvider.templateUrl = 'path/to/your-template.html';
97
+});
98
+```
99
+
100
+### Disabling the keyboard navigation
101
+
102
+The keyboard navigation in the lightbox with the left/right arrow keys can be enabled/disabled at any time by changing the value of the boolean `Lightbox.keyboardNavEnabled`.
103
+
104
+### Array of images
105
+
106
+The first argument to `Lightbox.openModal` must be an array, and its elements may be of any type. In the basic example above, it is an array of objects with properties `url` and `caption`, but this is only the default and is not required. To let the `Lightbox` service know the correct values, set these methods in the provider:
107
+
108
+```js
109
+angular.module('app').config(function (LightboxProvider) {
110
+  LightboxProvider.getImageUrl = function (image) {
111
+    return '/base/dir/' + image.getName();
112
+  };
113
+
114
+  LightboxProvider.getImageCaption = function (image) {
115
+    return image.label;
116
+  };
117
+});
118
+```
119
+
120
+### Image and modal scaling
121
+
122
+By default, images are scaled only if they are too large for the modal to contain without scrolling.
123
+
124
+If you want all images to be scaled to the maximum possible dimensions, update the `Lightbox.fullScreenMode` boolean:
125
+
126
+```js
127
+angular.module('app').config(function (LightboxProvider) {
128
+  LightboxProvider.fullScreenMode = true;
129
+});
130
+```
131
+
132
+For more custom behaviour, see the [documentation](src/lightbox-service.js) of the methods `calculateImageDimensionLimits` and `calculateModalDimensions`.
133
+
134
+### Videos
135
+
136
+An element in the array of 'images' is considered a video if it is an object with a `type` property having the value `video` (see the [demo](http://compact.github.io/angular-bootstrap-lightbox/demo5/index.html)). To change this, write your own `LightboxProvider.isVideo` method.
137
+
138
+By default, a video is embedded directly if its url ends in `.mp4`, `.ogg`, or `.webm`. Every other url is considered a video from an external sharing service (such as YouTube). To change this check, edit the `LightboxProvider.isSharedVideo` method. The `ng-videosharing-embed` library is used for embedding shared videos if it is included in your app. You can use another video library by changing the template.
139
+
140
+For now, the maximum video dimensions are fixed at 1280x720 (16:9).
141
+
142
+## Development
143
+
144
+* [API documentation](api.md) of the services and directive in the Angular module
145
+
146
+* Setup:
147
+
148
+  ```sh
149
+  npm install
150
+  bower install
151
+  ```
152
+
153
+* Build:
154
+
155
+  ```sh
156
+  grunt
157
+  ```
158
+
159
+* Generate docs:
160
+
161
+  ```sh
162
+  grunt jsdoc2md
163
+  ```
164
+
165
+* Serve the GitHub Pages:
166
+
167
+  ```sh
168
+  git checkout gh-pages
169
+  git checkout master -- dist/angular-bootstrap-lightbox.min.js dist/angular-bootstrap-lightbox.min.css
170
+  bundle install
171
+  bundle exec jekyll serve
172
+  ```

+ 278 - 0
static/bower_components/angular-bootstrap-lightbox/api.md

@@ -0,0 +1,278 @@
1
+<a name="bootstrapLightbox"></a>
2
+## bootstrapLightbox : <code>object</code>
3
+**Kind**: global namespace  
4
+
5
+* [bootstrapLightbox](#bootstrapLightbox) : <code>object</code>
6
+  * [.ImageLoader](#bootstrapLightbox.ImageLoader)
7
+    * [.load](#bootstrapLightbox.ImageLoader.load) ⇒ <code>Promise</code>
8
+  * [.Lightbox](#bootstrapLightbox.Lightbox)
9
+    * [.templateUrl](#bootstrapLightbox.Lightbox.templateUrl) : <code>String</code>
10
+    * [.fullScreenMode](#bootstrapLightbox.Lightbox.fullScreenMode) : <code>Boolean</code>
11
+    * [.getImageUrl](#bootstrapLightbox.Lightbox.getImageUrl) ⇒ <code>String</code>
12
+    * [.getImageCaption](#bootstrapLightbox.Lightbox.getImageCaption) ⇒ <code>String</code>
13
+    * [.calculateImageDimensionLimits](#bootstrapLightbox.Lightbox.calculateImageDimensionLimits) ⇒ <code>Object</code>
14
+    * [.calculateModalDimensions](#bootstrapLightbox.Lightbox.calculateModalDimensions) ⇒ <code>Object</code>
15
+    * [.isVideo](#bootstrapLightbox.Lightbox.isVideo) ⇒ <code>Boolean</code>
16
+    * [.isSharedVideo](#bootstrapLightbox.Lightbox.isSharedVideo) ⇒ <code>Boolean</code>
17
+    * [.images](#bootstrapLightbox.Lightbox.images) : <code>Array</code>
18
+    * [.index](#bootstrapLightbox.Lightbox.index) : <code>Number</code>
19
+    * [.keyboardNavEnabled](#bootstrapLightbox.Lightbox.keyboardNavEnabled) : <code>Boolean</code>
20
+    * [.image](#bootstrapLightbox.Lightbox.image) : <code>\*</code>
21
+    * [.modalInstance](#bootstrapLightbox.Lightbox.modalInstance) : <code>Object</code>
22
+    * [.imageUrl](#bootstrapLightbox.Lightbox.imageUrl) : <code>String</code>
23
+    * [.imageCaption](#bootstrapLightbox.Lightbox.imageCaption) : <code>String</code>
24
+    * [.loading](#bootstrapLightbox.Lightbox.loading) : <code>Boolean</code>
25
+    * [.openModal](#bootstrapLightbox.Lightbox.openModal) ⇒ <code>Object</code>
26
+    * [.closeModal](#bootstrapLightbox.Lightbox.closeModal) : <code>function</code>
27
+    * [.setImage](#bootstrapLightbox.Lightbox.setImage) : <code>function</code>
28
+    * [.firstImage](#bootstrapLightbox.Lightbox.firstImage) : <code>function</code>
29
+    * [.prevImage](#bootstrapLightbox.Lightbox.prevImage) : <code>function</code>
30
+    * [.nextImage](#bootstrapLightbox.Lightbox.nextImage) : <code>function</code>
31
+    * [.lastImage](#bootstrapLightbox.Lightbox.lastImage) : <code>function</code>
32
+    * [.setImages](#bootstrapLightbox.Lightbox.setImages) : <code>function</code>
33
+  * [.lightboxSrc](#bootstrapLightbox.lightboxSrc)
34
+
35
+<a name="bootstrapLightbox.ImageLoader"></a>
36
+### bootstrapLightbox.ImageLoader
37
+Service for loading an image.
38
+
39
+**Kind**: static class of <code>[bootstrapLightbox](#bootstrapLightbox)</code>  
40
+<a name="bootstrapLightbox.ImageLoader.load"></a>
41
+#### ImageLoader.load ⇒ <code>Promise</code>
42
+Load the image at the given URL.
43
+
44
+**Kind**: static property of <code>[ImageLoader](#bootstrapLightbox.ImageLoader)</code>  
45
+**Returns**: <code>Promise</code> - A $q promise that resolves when the image has loaded
46
+  successfully.  
47
+
48
+| Param | Type |
49
+| --- | --- |
50
+| url | <code>String</code> | 
51
+
52
+<a name="bootstrapLightbox.Lightbox"></a>
53
+### bootstrapLightbox.Lightbox
54
+Lightbox service.
55
+
56
+**Kind**: static class of <code>[bootstrapLightbox](#bootstrapLightbox)</code>  
57
+
58
+* [.Lightbox](#bootstrapLightbox.Lightbox)
59
+  * [.templateUrl](#bootstrapLightbox.Lightbox.templateUrl) : <code>String</code>
60
+  * [.fullScreenMode](#bootstrapLightbox.Lightbox.fullScreenMode) : <code>Boolean</code>
61
+  * [.getImageUrl](#bootstrapLightbox.Lightbox.getImageUrl) ⇒ <code>String</code>
62
+  * [.getImageCaption](#bootstrapLightbox.Lightbox.getImageCaption) ⇒ <code>String</code>
63
+  * [.calculateImageDimensionLimits](#bootstrapLightbox.Lightbox.calculateImageDimensionLimits) ⇒ <code>Object</code>
64
+  * [.calculateModalDimensions](#bootstrapLightbox.Lightbox.calculateModalDimensions) ⇒ <code>Object</code>
65
+  * [.isVideo](#bootstrapLightbox.Lightbox.isVideo) ⇒ <code>Boolean</code>
66
+  * [.isSharedVideo](#bootstrapLightbox.Lightbox.isSharedVideo) ⇒ <code>Boolean</code>
67
+  * [.images](#bootstrapLightbox.Lightbox.images) : <code>Array</code>
68
+  * [.index](#bootstrapLightbox.Lightbox.index) : <code>Number</code>
69
+  * [.keyboardNavEnabled](#bootstrapLightbox.Lightbox.keyboardNavEnabled) : <code>Boolean</code>
70
+  * [.image](#bootstrapLightbox.Lightbox.image) : <code>\*</code>
71
+  * [.modalInstance](#bootstrapLightbox.Lightbox.modalInstance) : <code>Object</code>
72
+  * [.imageUrl](#bootstrapLightbox.Lightbox.imageUrl) : <code>String</code>
73
+  * [.imageCaption](#bootstrapLightbox.Lightbox.imageCaption) : <code>String</code>
74
+  * [.loading](#bootstrapLightbox.Lightbox.loading) : <code>Boolean</code>
75
+  * [.openModal](#bootstrapLightbox.Lightbox.openModal) ⇒ <code>Object</code>
76
+  * [.closeModal](#bootstrapLightbox.Lightbox.closeModal) : <code>function</code>
77
+  * [.setImage](#bootstrapLightbox.Lightbox.setImage) : <code>function</code>
78
+  * [.firstImage](#bootstrapLightbox.Lightbox.firstImage) : <code>function</code>
79
+  * [.prevImage](#bootstrapLightbox.Lightbox.prevImage) : <code>function</code>
80
+  * [.nextImage](#bootstrapLightbox.Lightbox.nextImage) : <code>function</code>
81
+  * [.lastImage](#bootstrapLightbox.Lightbox.lastImage) : <code>function</code>
82
+  * [.setImages](#bootstrapLightbox.Lightbox.setImages) : <code>function</code>
83
+
84
+<a name="bootstrapLightbox.Lightbox.templateUrl"></a>
85
+#### Lightbox.templateUrl : <code>String</code>
86
+Template URL passed into `$uibModal.open()`.
87
+
88
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
89
+<a name="bootstrapLightbox.Lightbox.fullScreenMode"></a>
90
+#### Lightbox.fullScreenMode : <code>Boolean</code>
91
+Whether images should be scaled to the maximum possible dimensions.
92
+
93
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
94
+<a name="bootstrapLightbox.Lightbox.getImageUrl"></a>
95
+#### Lightbox.getImageUrl ⇒ <code>String</code>
96
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
97
+**Returns**: <code>String</code> - The URL of the given image.  
98
+
99
+| Param | Type | Description |
100
+| --- | --- | --- |
101
+| image | <code>\*</code> | An element in the array of images. |
102
+
103
+<a name="bootstrapLightbox.Lightbox.getImageCaption"></a>
104
+#### Lightbox.getImageCaption ⇒ <code>String</code>
105
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
106
+**Returns**: <code>String</code> - The caption of the given image.  
107
+
108
+| Param | Type | Description |
109
+| --- | --- | --- |
110
+| image | <code>\*</code> | An element in the array of images. |
111
+
112
+<a name="bootstrapLightbox.Lightbox.calculateImageDimensionLimits"></a>
113
+#### Lightbox.calculateImageDimensionLimits ⇒ <code>Object</code>
114
+Calculate the max and min limits to the width and height of the displayed
115
+  image (all are optional). The max dimensions override the min
116
+  dimensions if they conflict.
117
+
118
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
119
+**Returns**: <code>Object</code> - May optionally contain the properties `minWidth`,
120
+  `minHeight`, `maxWidth`, and `maxHeight`.  
121
+
122
+| Param | Type | Description |
123
+| --- | --- | --- |
124
+| dimensions | <code>Object</code> | Contains the properties `windowWidth`,   `windowHeight`, `imageWidth`, and `imageHeight`. |
125
+
126
+<a name="bootstrapLightbox.Lightbox.calculateModalDimensions"></a>
127
+#### Lightbox.calculateModalDimensions ⇒ <code>Object</code>
128
+Calculate the width and height of the modal. This method gets called
129
+  after the width and height of the image, as displayed inside the modal,
130
+  are calculated.
131
+
132
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
133
+**Returns**: <code>Object</code> - Must contain the properties `width` and `height`.  
134
+
135
+| Param | Type | Description |
136
+| --- | --- | --- |
137
+| dimensions | <code>Object</code> | Contains the properties `windowWidth`,   `windowHeight`, `imageDisplayWidth`, and `imageDisplayHeight`. |
138
+
139
+<a name="bootstrapLightbox.Lightbox.isVideo"></a>
140
+#### Lightbox.isVideo ⇒ <code>Boolean</code>
141
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
142
+**Returns**: <code>Boolean</code> - Whether the provided element is a video.  
143
+
144
+| Param | Type | Description |
145
+| --- | --- | --- |
146
+| image | <code>\*</code> | An element in the array of images. |
147
+
148
+<a name="bootstrapLightbox.Lightbox.isSharedVideo"></a>
149
+#### Lightbox.isSharedVideo ⇒ <code>Boolean</code>
150
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
151
+**Returns**: <code>Boolean</code> - Whether the provided element is a video that is to be
152
+  embedded with an external service like YouTube. By default, this is
153
+  determined by the url not ending in `.mp4`, `.ogg`, or `.webm`.  
154
+
155
+| Param | Type | Description |
156
+| --- | --- | --- |
157
+| image | <code>\*</code> | An element in the array of images. |
158
+
159
+<a name="bootstrapLightbox.Lightbox.images"></a>
160
+#### Lightbox.images : <code>Array</code>
161
+Array of all images to be shown in the lightbox (not `Image` objects).
162
+
163
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
164
+<a name="bootstrapLightbox.Lightbox.index"></a>
165
+#### Lightbox.index : <code>Number</code>
166
+The index in the `Lightbox.images` aray of the image that is currently
167
+  shown in the lightbox.
168
+
169
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
170
+<a name="bootstrapLightbox.Lightbox.keyboardNavEnabled"></a>
171
+#### Lightbox.keyboardNavEnabled : <code>Boolean</code>
172
+Whether keyboard navigation is currently enabled for navigating through
173
+  images in the lightbox.
174
+
175
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
176
+<a name="bootstrapLightbox.Lightbox.image"></a>
177
+#### Lightbox.image : <code>\*</code>
178
+The image currently shown in the lightbox.
179
+
180
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
181
+<a name="bootstrapLightbox.Lightbox.modalInstance"></a>
182
+#### Lightbox.modalInstance : <code>Object</code>
183
+The UI Bootstrap modal instance. See {@link
184
+  http://angular-ui.github.io/bootstrap/#/modal}.
185
+
186
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
187
+<a name="bootstrapLightbox.Lightbox.imageUrl"></a>
188
+#### Lightbox.imageUrl : <code>String</code>
189
+The URL of the current image. This is a property of the service rather
190
+  than of `Lightbox.image` because `Lightbox.image` need not be an
191
+  object, and besides it would be poor practice to alter the given
192
+  objects.
193
+
194
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
195
+<a name="bootstrapLightbox.Lightbox.imageCaption"></a>
196
+#### Lightbox.imageCaption : <code>String</code>
197
+The optional caption of the current image.
198
+
199
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
200
+<a name="bootstrapLightbox.Lightbox.loading"></a>
201
+#### Lightbox.loading : <code>Boolean</code>
202
+Whether an image is currently being loaded.
203
+
204
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
205
+<a name="bootstrapLightbox.Lightbox.openModal"></a>
206
+#### Lightbox.openModal ⇒ <code>Object</code>
207
+Open the lightbox modal.
208
+
209
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
210
+**Returns**: <code>Object</code> - The created UI Bootstrap modal instance.  
211
+
212
+| Param | Type | Description |
213
+| --- | --- | --- |
214
+| newImages | <code>Array</code> | An array of images. Each image may be of   any type. |
215
+| newIndex | <code>Number</code> | The index in `newImages` to set as the   current image. |
216
+| modalParams | <code>Object</code> | Custom params for the angular UI   bootstrap modal (in $uibModal.open()). |
217
+
218
+<a name="bootstrapLightbox.Lightbox.closeModal"></a>
219
+#### Lightbox.closeModal : <code>function</code>
220
+Close the lightbox modal.
221
+
222
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
223
+
224
+| Param | Type | Description |
225
+| --- | --- | --- |
226
+| result | <code>\*</code> | This argument can be useful if the modal promise   gets handler(s) attached to it. |
227
+
228
+<a name="bootstrapLightbox.Lightbox.setImage"></a>
229
+#### Lightbox.setImage : <code>function</code>
230
+This method can be used in all methods which navigate/change the
231
+  current image.
232
+
233
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
234
+
235
+| Param | Type | Description |
236
+| --- | --- | --- |
237
+| newIndex | <code>Number</code> | The index in the array of images to set as   the new current image. |
238
+
239
+<a name="bootstrapLightbox.Lightbox.firstImage"></a>
240
+#### Lightbox.firstImage : <code>function</code>
241
+Navigate to the first image.
242
+
243
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
244
+<a name="bootstrapLightbox.Lightbox.prevImage"></a>
245
+#### Lightbox.prevImage : <code>function</code>
246
+Navigate to the previous image.
247
+
248
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
249
+<a name="bootstrapLightbox.Lightbox.nextImage"></a>
250
+#### Lightbox.nextImage : <code>function</code>
251
+Navigate to the next image.
252
+
253
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
254
+<a name="bootstrapLightbox.Lightbox.lastImage"></a>
255
+#### Lightbox.lastImage : <code>function</code>
256
+Navigate to the last image.
257
+
258
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
259
+<a name="bootstrapLightbox.Lightbox.setImages"></a>
260
+#### Lightbox.setImages : <code>function</code>
261
+Call this method to set both the array of images and the current image
262
+  (based on the current index). A use case is when the image collection
263
+  gets changed dynamically in some way while the lightbox is still
264
+  open.
265
+
266
+**Kind**: static property of <code>[Lightbox](#bootstrapLightbox.Lightbox)</code>  
267
+
268
+| Param | Type | Description |
269
+| --- | --- | --- |
270
+| newImages | <code>Array</code> | The new array of images. |
271
+
272
+<a name="bootstrapLightbox.lightboxSrc"></a>
273
+### bootstrapLightbox.lightboxSrc
274
+This attribute directive is used in an `<img>` element in the
275
+  modal template in place of `src`. It handles resizing both the `<img>`
276
+  element and its relevant parent elements within the modal.
277
+
278
+**Kind**: static class of <code>[bootstrapLightbox](#bootstrapLightbox)</code>  

+ 27 - 0
static/bower_components/angular-bootstrap-lightbox/bower.json

@@ -0,0 +1,27 @@
1
+{
2
+  "name": "angular-bootstrap-lightbox",
3
+  "version": "0.12.0",
4
+  "main": [
5
+    "dist/angular-bootstrap-lightbox.js",
6
+    "dist/angular-bootstrap-lightbox.css"
7
+  ],
8
+  "ignore": [
9
+    "src",
10
+    ".*",
11
+    "Gruntfile.js",
12
+    "package.json"
13
+  ],
14
+  "dependencies": {
15
+    "angular": "^1.4.10",
16
+    "angular-bootstrap": "^1.3.1"
17
+  },
18
+  "devDependencies": {
19
+    "bootstrap":"^3.3.6",
20
+    "angular-loading-bar": "^0.8.0",
21
+    "angular-touch": "^1.4.10",
22
+    "ng-videosharing-embed": "^0.3.4"
23
+  },
24
+  "resolutions": {
25
+    "angular": "^1.4.10"
26
+  }
27
+}

+ 45 - 0
static/bower_components/angular-bootstrap-lightbox/dist/angular-bootstrap-lightbox.css

@@ -0,0 +1,45 @@
1
+.lightbox-nav {
2
+  position: relative;
3
+  margin-bottom: 12px; /* the font-size of .btn-xs */
4
+  height: 22px;
5
+  text-align: center;
6
+  font-size: 0; /* prevent the otherwise inherited font-size and line-height from adding extra space to the bottom of this div */
7
+}
8
+
9
+.lightbox-nav .btn-group {
10
+  vertical-align: top;
11
+}
12
+
13
+.lightbox-nav .close {
14
+  /* absolutely position this in order to center the nav buttons */
15
+  position: absolute;
16
+  top: 0;
17
+  right: 0;
18
+}
19
+
20
+.lightbox-image-container {
21
+  position: relative;
22
+  text-align: center; /* center the image */
23
+}
24
+
25
+/* the caption overlays the top left corner of the image */
26
+.lightbox-image-caption {
27
+  position: absolute;
28
+  top: 0;
29
+  left: 0;
30
+  margin: 0.5em 0.9em; /* the left and right margins are offset by 0.4em for the span box-shadow */
31
+  color: #000;
32
+  font-size: 1.5em;
33
+  font-weight: bold;
34
+  text-align: left;
35
+  text-shadow: 0.1em 0.1em 0.2em rgba(255, 255, 255, 0.5);
36
+}
37
+
38
+.lightbox-image-caption span {
39
+  padding-top: 0.1em;
40
+  padding-bottom: 0.1em;
41
+  background-color: rgba(255, 255, 255, 0.75);
42
+  /* pad the left and right of each line of text */
43
+  box-shadow: 0.4em 0 0 rgba(255, 255, 255, 0.75),
44
+    -0.4em 0 0 rgba(255, 255, 255, 0.75);
45
+}

File diff suppressed because it is too large
+ 728 - 0
static/bower_components/angular-bootstrap-lightbox/dist/angular-bootstrap-lightbox.js


File diff suppressed because it is too large
+ 1 - 0
static/bower_components/angular-bootstrap-lightbox/dist/angular-bootstrap-lightbox.min.css


File diff suppressed because it is too large
+ 2 - 0
static/bower_components/angular-bootstrap-lightbox/dist/angular-bootstrap-lightbox.min.js


+ 2 - 0
static/bower_components/angular-bootstrap-lightbox/index.js

@@ -0,0 +1,2 @@
1
+require('./dist/angular-bootstrap-lightbox');
2
+module.exports = 'angular-bootstrap-lightbox';

+ 31 - 0
static/bower_components/angular-bootstrap/.bower.json

@@ -0,0 +1,31 @@
1
+{
2
+  "author": {
3
+    "name": "https://github.com/angular-ui/bootstrap/graphs/contributors"
4
+  },
5
+  "name": "angular-bootstrap",
6
+  "keywords": [
7
+    "angular",
8
+    "angular-ui",
9
+    "bootstrap"
10
+  ],
11
+  "license": "MIT",
12
+  "ignore": [],
13
+  "description": "Native AngularJS (Angular) directives for Bootstrap.",
14
+  "version": "1.3.3",
15
+  "main": [
16
+    "./ui-bootstrap-tpls.js"
17
+  ],
18
+  "dependencies": {
19
+    "angular": ">=1.4.0"
20
+  },
21
+  "homepage": "https://github.com/angular-ui/bootstrap-bower",
22
+  "_release": "1.3.3",
23
+  "_resolution": {
24
+    "type": "version",
25
+    "tag": "1.3.3",
26
+    "commit": "d45246707f5bf9533e3824861a29abd36757db45"
27
+  },
28
+  "_source": "https://github.com/angular-ui/bootstrap-bower.git",
29
+  "_target": "^1.3.1",
30
+  "_originalSource": "angular-bootstrap"
31
+}

+ 1 - 0
static/bower_components/angular-bootstrap/.gitignore

@@ -0,0 +1 @@
1
+.DS_Store

+ 1 - 0
static/bower_components/angular-bootstrap/.npmignore

@@ -0,0 +1 @@
1
+bower.json

+ 120 - 0
static/bower_components/angular-bootstrap/README.md

@@ -0,0 +1,120 @@
1
+### UI Bootstrap - [AngularJS](http://angularjs.org/) directives specific to [Bootstrap](http://getbootstrap.com)
2
+
3
+[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/angular-ui/bootstrap?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4
+[![Build Status](https://secure.travis-ci.org/angular-ui/bootstrap.svg)](http://travis-ci.org/angular-ui/bootstrap)
5
+[![devDependency Status](https://david-dm.org/angular-ui/bootstrap/dev-status.svg?branch=master)](https://david-dm.org/angular-ui/bootstrap#info=devDependencies)
6
+
7
+### Quick links
8
+- [Demo](#demo)
9
+- [Installation](#installation)
10
+    - [NPM](#install-with-npm)
11
+    - [Bower](#install-with-bower)
12
+    - [NuGet](#install-with-nuget)
13
+    - [Custom](#custom-build)
14
+    - [Manual](#manual-download)
15
+- [Support](#support)
16
+    - [FAQ](#faq)
17
+    - [Supported browsers](#supported-browsers)
18
+    - [Need help?](#need-help)
19
+    - [Found a bug?](#found-a-bug)
20
+- [Contributing to the project](#contributing-to-the-project)
21
+- [Development, meeting minutes, roadmap and more.](#development-meeting-minutes-roadmap-and-more)
22
+
23
+
24
+# Demo
25
+
26
+Do you want to see directives in action? Visit http://angular-ui.github.io/bootstrap/!
27
+
28
+# Installation
29
+
30
+Installation is easy as UI Bootstrap has minimal dependencies - only the AngularJS and Twitter Bootstrap's CSS are required.
31
+Note: Since version 0.13.0, UI Bootstrap depends on [ngAnimate](https://docs.angularjs.org/api/ngAnimate) for transitions and animations, such as the accordion, carousel, etc. Include `ngAnimate` in the module dependencies for your app in order to enable animation.
32
+
33
+#### Install with NPM
34
+
35
+```sh
36
+$ npm install angular-ui-bootstrap
37
+```
38
+
39
+This will install AngularJS and Bootstrap NPM packages.
40
+
41
+#### Install with Bower
42
+```sh
43
+$ bower install angular-bootstrap
44
+```
45
+
46
+Note: do not install 'angular-ui-bootstrap'.  A separate repository - [bootstrap-bower](https://github.com/angular-ui/bootstrap-bower) - hosts the compiled javascript file and bower.json.
47
+
48
+#### Install with NuGet
49
+To install AngularJS UI Bootstrap, run the following command in the Package Manager Console
50
+
51
+```sh
52
+PM> Install-Package Angular.UI.Bootstrap
53
+```
54
+
55
+#### Custom build
56
+
57
+Head over to http://angular-ui.github.io/bootstrap/ and hit the *Custom build* button to create your own custom UI Bootstrap build, just the way you like it.
58
+
59
+#### Manual download
60
+
61
+After downloading dependencies (or better yet, referencing them from your favorite CDN) you need to download build version of this project. All the files and their purposes are described here:
62
+https://github.com/angular-ui/bootstrap/tree/gh-pages#build-files
63
+Don't worry, if you are not sure which file to take, opt for `ui-bootstrap-tpls-[version].min.js`.
64
+
65
+### Adding dependency to your project
66
+
67
+When you are done downloading all the dependencies and project files the only remaining part is to add dependencies on the `ui.bootstrap` AngularJS module:
68
+
69
+```js
70
+angular.module('myModule', ['ui.bootstrap']);
71
+```
72
+
73
+If you're a Browserify or Webpack user, you can do:
74
+
75
+```js
76
+var uibs = require('angular-ui-bootstrap');
77
+
78
+angular.module('myModule', [uibs]);
79
+```
80
+
81
+# Support
82
+
83
+## FAQ
84
+
85
+https://github.com/angular-ui/bootstrap/wiki/FAQ
86
+
87
+## Supported browsers
88
+
89
+Directives from this repository are automatically tested with the following browsers:
90
+* Chrome (stable and canary channel)
91
+* Firefox
92
+* IE 9 and 10
93
+* Opera
94
+* Safari
95
+
96
+Modern mobile browsers should work without problems.
97
+
98
+
99
+## Need help?
100
+Need help using UI Bootstrap?
101
+
102
+* Live help in the IRC (`#angularjs` channel at the `freenode` network). Use this [webchat](https://webchat.freenode.net/) or your own IRC client.
103
+* Ask a question in [StackOverflow](http://stackoverflow.com/) under the [angular-ui-bootstrap](http://stackoverflow.com/questions/tagged/angular-ui-bootstrap) tag.
104
+
105
+**Please do not create new issues in this repository to ask questions about using UI Bootstrap**
106
+
107
+## Found a bug?
108
+Please take a look at [CONTRIBUTING.md](CONTRIBUTING.md#you-think-youve-found-a-bug) and submit your issue [here](https://github.com/angular-ui/bootstrap/issues/new).
109
+
110
+
111
+----
112
+
113
+
114
+# Contributing to the project
115
+
116
+We are always looking for the quality contributions! Please check the [CONTRIBUTING.md](CONTRIBUTING.md) for the contribution guidelines.
117
+
118
+# Development, meeting minutes, roadmap and more.
119
+
120
+Head over to the [Wiki](https://github.com/angular-ui/bootstrap/wiki) for notes on development for UI Bootstrap, meeting minutes from the UI Bootstrap team, roadmap plans, project philosophy and more.

+ 19 - 0
static/bower_components/angular-bootstrap/bower.json

@@ -0,0 +1,19 @@
1
+{
2
+    "author": {
3
+        "name": "https://github.com/angular-ui/bootstrap/graphs/contributors"
4
+    },
5
+    "name": "angular-bootstrap",
6
+    "keywords": [
7
+        "angular",
8
+        "angular-ui",
9
+        "bootstrap"
10
+    ],
11
+    "license": "MIT",
12
+    "ignore": [],
13
+    "description": "Native AngularJS (Angular) directives for Bootstrap.",
14
+    "version": "1.3.3",
15
+    "main": ["./ui-bootstrap-tpls.js"],
16
+    "dependencies": {
17
+        "angular": ">=1.4.0"
18
+    }
19
+}

+ 2 - 0
static/bower_components/angular-bootstrap/index.js

@@ -0,0 +1,2 @@
1
+require('./ui-bootstrap-tpls');
2
+module.exports = 'ui.bootstrap';

+ 23 - 0
static/bower_components/angular-bootstrap/package.json

@@ -0,0 +1,23 @@
1
+{
2
+  "name": "angular-ui-bootstrap",
3
+  "version": "1.3.3",
4
+  "description": "Bootstrap widgets for Angular",
5
+  "main": "index.js",
6
+  "homepage": "http://angular-ui.github.io/bootstrap/",
7
+  "repository": {
8
+    "type": "git",
9
+    "url": "https://github.com/angular-ui/bootstrap.git"
10
+  },
11
+  "keywords": [
12
+    "angular",
13
+    "bootstrap",
14
+    "angular-ui",
15
+    "components",
16
+    "client-side"
17
+  ],
18
+  "author": "https://github.com/angular-ui/bootstrap/graphs/contributors",
19
+  "peerDependencies": {
20
+    "angular": ">= 1.4.0-beta.0 || >= 1.5.0-beta.0"
21
+  },
22
+  "license": "MIT"
23
+}

+ 115 - 0
static/bower_components/angular-bootstrap/ui-bootstrap-csp.css

@@ -0,0 +1,115 @@
1
+/* Include this file in your html if you are using the CSP mode. */
2
+
3
+.ng-animate.item:not(.left):not(.right) {
4
+  -webkit-transition: 0s ease-in-out left;
5
+  transition: 0s ease-in-out left
6
+}
7
+.uib-datepicker .uib-title {
8
+  width: 100%;
9
+}
10
+
11
+.uib-day button, .uib-month button, .uib-year button {
12
+  min-width: 100%;
13
+}
14
+
15
+.uib-left, .uib-right {
16
+  width: 100%
17
+}
18
+
19
+.uib-position-measure {
20
+  display: block !important;
21
+  visibility: hidden !important;
22
+  position: absolute !important;
23
+  top: -9999px !important;
24
+  left: -9999px !important;
25
+}
26
+
27
+.uib-position-scrollbar-measure {
28
+  position: absolute !important;
29
+  top: -9999px !important;
30
+  width: 50px !important;
31
+  height: 50px !important;
32
+  overflow: scroll !important;
33
+}
34
+
35
+.uib-position-body-scrollbar-measure {
36
+  overflow: scroll !important;
37
+}
38
+.uib-datepicker-popup.dropdown-menu {
39
+  display: block;
40
+  float: none;
41
+  margin: 0;
42
+}
43
+
44
+.uib-button-bar {
45
+  padding: 10px 9px 2px;
46
+}
47
+
48
+[uib-tooltip-popup].tooltip.top-left > .tooltip-arrow,
49
+[uib-tooltip-popup].tooltip.top-right > .tooltip-arrow,
50
+[uib-tooltip-popup].tooltip.bottom-left > .tooltip-arrow,
51
+[uib-tooltip-popup].tooltip.bottom-right > .tooltip-arrow,
52
+[uib-tooltip-popup].tooltip.left-top > .tooltip-arrow,
53
+[uib-tooltip-popup].tooltip.left-bottom > .tooltip-arrow,
54
+[uib-tooltip-popup].tooltip.right-top > .tooltip-arrow,
55
+[uib-tooltip-popup].tooltip.right-bottom > .tooltip-arrow,
56
+[uib-tooltip-html-popup].tooltip.top-left > .tooltip-arrow,
57
+[uib-tooltip-html-popup].tooltip.top-right > .tooltip-arrow,
58
+[uib-tooltip-html-popup].tooltip.bottom-left > .tooltip-arrow,
59
+[uib-tooltip-html-popup].tooltip.bottom-right > .tooltip-arrow,
60
+[uib-tooltip-html-popup].tooltip.left-top > .tooltip-arrow,
61
+[uib-tooltip-html-popup].tooltip.left-bottom > .tooltip-arrow,
62
+[uib-tooltip-html-popup].tooltip.right-top > .tooltip-arrow,
63
+[uib-tooltip-html-popup].tooltip.right-bottom > .tooltip-arrow,
64
+[uib-tooltip-template-popup].tooltip.top-left > .tooltip-arrow,
65
+[uib-tooltip-template-popup].tooltip.top-right > .tooltip-arrow,
66
+[uib-tooltip-template-popup].tooltip.bottom-left > .tooltip-arrow,
67
+[uib-tooltip-template-popup].tooltip.bottom-right > .tooltip-arrow,
68
+[uib-tooltip-template-popup].tooltip.left-top > .tooltip-arrow,
69
+[uib-tooltip-template-popup].tooltip.left-bottom > .tooltip-arrow,
70
+[uib-tooltip-template-popup].tooltip.right-top > .tooltip-arrow,
71
+[uib-tooltip-template-popup].tooltip.right-bottom > .tooltip-arrow,
72
+[uib-popover-popup].popover.top-left > .arrow,
73
+[uib-popover-popup].popover.top-right > .arrow,
74
+[uib-popover-popup].popover.bottom-left > .arrow,
75
+[uib-popover-popup].popover.bottom-right > .arrow,
76
+[uib-popover-popup].popover.left-top > .arrow,
77
+[uib-popover-popup].popover.left-bottom > .arrow,
78
+[uib-popover-popup].popover.right-top > .arrow,
79
+[uib-popover-popup].popover.right-bottom > .arrow,
80
+[uib-popover-html-popup].popover.top-left > .arrow,
81
+[uib-popover-html-popup].popover.top-right > .arrow,
82
+[uib-popover-html-popup].popover.bottom-left > .arrow,
83
+[uib-popover-html-popup].popover.bottom-right > .arrow,
84
+[uib-popover-html-popup].popover.left-top > .arrow,
85
+[uib-popover-html-popup].popover.left-bottom > .arrow,
86
+[uib-popover-html-popup].popover.right-top > .arrow,
87
+[uib-popover-html-popup].popover.right-bottom > .arrow,
88
+[uib-popover-template-popup].popover.top-left > .arrow,
89
+[uib-popover-template-popup].popover.top-right > .arrow,
90
+[uib-popover-template-popup].popover.bottom-left > .arrow,
91
+[uib-popover-template-popup].popover.bottom-right > .arrow,
92
+[uib-popover-template-popup].popover.left-top > .arrow,
93
+[uib-popover-template-popup].popover.left-bottom > .arrow,
94
+[uib-popover-template-popup].popover.right-top > .arrow,
95
+[uib-popover-template-popup].popover.right-bottom > .arrow {
96
+  top: auto;
97
+  bottom: auto;
98
+  left: auto;
99
+  right: auto;
100
+  margin: 0;
101
+}
102
+
103
+[uib-popover-popup].popover,
104
+[uib-popover-html-popup].popover,
105
+[uib-popover-template-popup].popover {
106
+  display: block !important;
107
+}
108
+
109
+.uib-time input {
110
+  width: 50px;
111
+}
112
+
113
+[uib-typeahead-popup].dropdown-menu {
114
+  display: block;
115
+}

File diff suppressed because it is too large
+ 7347 - 0
static/bower_components/angular-bootstrap/ui-bootstrap-tpls.js


File diff suppressed because it is too large
+ 10 - 0
static/bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js


File diff suppressed because it is too large
+ 6924 - 0
static/bower_components/angular-bootstrap/ui-bootstrap.js


File diff suppressed because it is too large
+ 10 - 0
static/bower_components/angular-bootstrap/ui-bootstrap.min.js


+ 21 - 0
static/bower_components/angular-sanitize/.bower.json

@@ -0,0 +1,21 @@
1
+{
2
+  "name": "angular-sanitize",
3
+  "version": "1.6.6",
4
+  "license": "MIT",
5
+  "main": "./angular-sanitize.js",
6
+  "ignore": [],
7
+  "dependencies": {
8
+    "angular": "1.6.6"
9
+  },
10
+  "homepage": "https://github.com/angular/bower-angular-sanitize",
11
+  "_release": "1.6.6",
12
+  "_resolution": {
13
+    "type": "version",
14
+    "tag": "v1.6.6",
15
+    "commit": "27b6da5578b99482330c6c38c5039a517e777c47"
16
+  },
17
+  "_source": "https://github.com/angular/bower-angular-sanitize.git",
18
+  "_target": "^1.6.6",
19
+  "_originalSource": "angular-sanitize",
20
+  "_direct": true
21
+}

+ 21 - 0
static/bower_components/angular-sanitize/LICENSE.md

@@ -0,0 +1,21 @@
1
+The MIT License (MIT)
2
+
3
+Copyright (c) 2016 Angular
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.

+ 68 - 0
static/bower_components/angular-sanitize/README.md

@@ -0,0 +1,68 @@
1
+# packaged angular-sanitize
2
+
3
+This repo is for distribution on `npm` and `bower`. The source for this module is in the
4
+[main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngSanitize).
5
+Please file issues and pull requests against that repo.
6
+
7
+## Install
8
+
9
+You can install this package either with `npm` or with `bower`.
10
+
11
+### npm
12
+
13
+```shell
14
+npm install angular-sanitize
15
+```
16
+
17
+Then add `ngSanitize` as a dependency for your app:
18
+
19
+```javascript
20
+angular.module('myApp', [require('angular-sanitize')]);
21
+```
22
+
23
+### bower
24
+
25
+```shell
26
+bower install angular-sanitize
27
+```
28
+
29
+Add a `<script>` to your `index.html`:
30
+
31
+```html
32
+<script src="/bower_components/angular-sanitize/angular-sanitize.js"></script>
33
+```
34
+
35
+Then add `ngSanitize` as a dependency for your app:
36
+
37
+```javascript
38
+angular.module('myApp', ['ngSanitize']);
39
+```
40
+
41
+## Documentation
42
+
43
+Documentation is available on the
44
+[AngularJS docs site](http://docs.angularjs.org/api/ngSanitize).
45
+
46
+## License
47
+
48
+The MIT License
49
+
50
+Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
51
+
52
+Permission is hereby granted, free of charge, to any person obtaining a copy
53
+of this software and associated documentation files (the "Software"), to deal
54
+in the Software without restriction, including without limitation the rights
55
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
56
+copies of the Software, and to permit persons to whom the Software is
57
+furnished to do so, subject to the following conditions:
58
+
59
+The above copyright notice and this permission notice shall be included in
60
+all copies or substantial portions of the Software.
61
+
62
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
63
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
64
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
65
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
66
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
67
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
68
+THE SOFTWARE.

+ 806 - 0
static/bower_components/angular-sanitize/angular-sanitize.js

@@ -0,0 +1,806 @@
1
+/**
2
+ * @license AngularJS v1.6.6
3
+ * (c) 2010-2017 Google, Inc. http://angularjs.org
4
+ * License: MIT
5
+ */
6
+(function(window, angular) {'use strict';
7
+
8
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
9
+ *     Any commits to this file should be reviewed with security in mind.  *
10
+ *   Changes to this file can potentially create security vulnerabilities. *
11
+ *          An approval from 2 Core members with history of modifying      *
12
+ *                         this file is required.                          *
13
+ *                                                                         *
14
+ *  Does the change somehow allow for arbitrary javascript to be executed? *
15
+ *    Or allows for someone to change the prototype of built-in objects?   *
16
+ *     Or gives undesired access to variables likes document or window?    *
17
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
18
+
19
+var $sanitizeMinErr = angular.$$minErr('$sanitize');
20
+var bind;
21
+var extend;
22
+var forEach;
23
+var isDefined;
24
+var lowercase;
25
+var noop;
26
+var nodeContains;
27
+var htmlParser;
28
+var htmlSanitizeWriter;
29
+
30
+/**
31
+ * @ngdoc module
32
+ * @name ngSanitize
33
+ * @description
34
+ *
35
+ * # ngSanitize
36
+ *
37
+ * The `ngSanitize` module provides functionality to sanitize HTML.
38
+ *
39
+ *
40
+ * <div doc-module-components="ngSanitize"></div>
41
+ *
42
+ * See {@link ngSanitize.$sanitize `$sanitize`} for usage.
43
+ */
44
+
45
+/**
46
+ * @ngdoc service
47
+ * @name $sanitize
48
+ * @kind function
49
+ *
50
+ * @description
51
+ *   Sanitizes an html string by stripping all potentially dangerous tokens.
52
+ *
53
+ *   The input is sanitized by parsing the HTML into tokens. All safe tokens (from a whitelist) are
54
+ *   then serialized back to properly escaped html string. This means that no unsafe input can make
55
+ *   it into the returned string.
56
+ *
57
+ *   The whitelist for URL sanitization of attribute values is configured using the functions
58
+ *   `aHrefSanitizationWhitelist` and `imgSrcSanitizationWhitelist` of {@link ng.$compileProvider
59
+ *   `$compileProvider`}.
60
+ *
61
+ *   The input may also contain SVG markup if this is enabled via {@link $sanitizeProvider}.
62
+ *
63
+ * @param {string} html HTML input.
64
+ * @returns {string} Sanitized HTML.
65
+ *
66
+ * @example
67
+   <example module="sanitizeExample" deps="angular-sanitize.js" name="sanitize-service">
68
+   <file name="index.html">
69
+     <script>
70
+         angular.module('sanitizeExample', ['ngSanitize'])
71
+           .controller('ExampleController', ['$scope', '$sce', function($scope, $sce) {
72
+             $scope.snippet =
73
+               '<p style="color:blue">an html\n' +
74
+               '<em onmouseover="this.textContent=\'PWN3D!\'">click here</em>\n' +
75
+               'snippet</p>';
76
+             $scope.deliberatelyTrustDangerousSnippet = function() {
77
+               return $sce.trustAsHtml($scope.snippet);
78
+             };
79
+           }]);
80
+     </script>
81
+     <div ng-controller="ExampleController">
82
+        Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
83
+       <table>
84
+         <tr>
85
+           <td>Directive</td>
86
+           <td>How</td>
87
+           <td>Source</td>
88
+           <td>Rendered</td>
89
+         </tr>
90
+         <tr id="bind-html-with-sanitize">
91
+           <td>ng-bind-html</td>
92
+           <td>Automatically uses $sanitize</td>
93
+           <td><pre>&lt;div ng-bind-html="snippet"&gt;<br/>&lt;/div&gt;</pre></td>
94
+           <td><div ng-bind-html="snippet"></div></td>
95
+         </tr>
96
+         <tr id="bind-html-with-trust">
97
+           <td>ng-bind-html</td>
98
+           <td>Bypass $sanitize by explicitly trusting the dangerous value</td>
99
+           <td>
100
+           <pre>&lt;div ng-bind-html="deliberatelyTrustDangerousSnippet()"&gt;
101
+&lt;/div&gt;</pre>
102
+           </td>
103
+           <td><div ng-bind-html="deliberatelyTrustDangerousSnippet()"></div></td>
104
+         </tr>
105
+         <tr id="bind-default">
106
+           <td>ng-bind</td>
107
+           <td>Automatically escapes</td>
108
+           <td><pre>&lt;div ng-bind="snippet"&gt;<br/>&lt;/div&gt;</pre></td>
109
+           <td><div ng-bind="snippet"></div></td>
110
+         </tr>
111
+       </table>
112
+       </div>
113
+   </file>
114
+   <file name="protractor.js" type="protractor">
115
+     it('should sanitize the html snippet by default', function() {
116
+       expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')).
117
+         toBe('<p>an html\n<em>click here</em>\nsnippet</p>');
118
+     });
119
+
120
+     it('should inline raw snippet if bound to a trusted value', function() {
121
+       expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')).
122
+         toBe("<p style=\"color:blue\">an html\n" +
123
+              "<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" +
124
+              "snippet</p>");
125
+     });
126
+
127
+     it('should escape snippet without any filter', function() {
128
+       expect(element(by.css('#bind-default div')).getAttribute('innerHTML')).
129
+         toBe("&lt;p style=\"color:blue\"&gt;an html\n" +
130
+              "&lt;em onmouseover=\"this.textContent='PWN3D!'\"&gt;click here&lt;/em&gt;\n" +
131
+              "snippet&lt;/p&gt;");
132
+     });
133
+
134
+     it('should update', function() {
135
+       element(by.model('snippet')).clear();
136
+       element(by.model('snippet')).sendKeys('new <b onclick="alert(1)">text</b>');
137
+       expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')).
138
+         toBe('new <b>text</b>');
139
+       expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')).toBe(
140
+         'new <b onclick="alert(1)">text</b>');
141
+       expect(element(by.css('#bind-default div')).getAttribute('innerHTML')).toBe(
142
+         "new &lt;b onclick=\"alert(1)\"&gt;text&lt;/b&gt;");
143
+     });
144
+   </file>
145
+   </example>
146
+ */
147
+
148
+
149
+/**
150
+ * @ngdoc provider
151
+ * @name $sanitizeProvider
152
+ * @this
153
+ *
154
+ * @description
155
+ * Creates and configures {@link $sanitize} instance.
156
+ */
157
+function $SanitizeProvider() {
158
+  var svgEnabled = false;
159
+
160
+  this.$get = ['$$sanitizeUri', function($$sanitizeUri) {
161
+    if (svgEnabled) {
162
+      extend(validElements, svgElements);
163
+    }
164
+    return function(html) {
165
+      var buf = [];
166
+      htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) {
167
+        return !/^unsafe:/.test($$sanitizeUri(uri, isImage));
168
+      }));
169
+      return buf.join('');
170
+    };
171
+  }];
172
+
173
+
174
+  /**
175
+   * @ngdoc method
176
+   * @name $sanitizeProvider#enableSvg
177
+   * @kind function
178
+   *
179
+   * @description
180
+   * Enables a subset of svg to be supported by the sanitizer.
181
+   *
182
+   * <div class="alert alert-warning">
183
+   *   <p>By enabling this setting without taking other precautions, you might expose your
184
+   *   application to click-hijacking attacks. In these attacks, sanitized svg elements could be positioned
185
+   *   outside of the containing element and be rendered over other elements on the page (e.g. a login
186
+   *   link). Such behavior can then result in phishing incidents.</p>
187
+   *
188
+   *   <p>To protect against these, explicitly setup `overflow: hidden` css rule for all potential svg
189
+   *   tags within the sanitized content:</p>
190
+   *
191
+   *   <br>
192
+   *
193
+   *   <pre><code>
194
+   *   .rootOfTheIncludedContent svg {
195
+   *     overflow: hidden !important;
196
+   *   }
197
+   *   </code></pre>
198
+   * </div>
199
+   *
200
+   * @param {boolean=} flag Enable or disable SVG support in the sanitizer.
201
+   * @returns {boolean|ng.$sanitizeProvider} Returns the currently configured value if called
202
+   *    without an argument or self for chaining otherwise.
203
+   */
204
+  this.enableSvg = function(enableSvg) {
205
+    if (isDefined(enableSvg)) {
206
+      svgEnabled = enableSvg;
207
+      return this;
208
+    } else {
209
+      return svgEnabled;
210
+    }
211
+  };
212
+
213
+  //////////////////////////////////////////////////////////////////////////////////////////////////
214
+  // Private stuff
215
+  //////////////////////////////////////////////////////////////////////////////////////////////////
216
+
217
+  bind = angular.bind;
218
+  extend = angular.extend;
219
+  forEach = angular.forEach;
220
+  isDefined = angular.isDefined;
221
+  lowercase = angular.lowercase;
222
+  noop = angular.noop;
223
+
224
+  htmlParser = htmlParserImpl;
225
+  htmlSanitizeWriter = htmlSanitizeWriterImpl;
226
+
227
+  nodeContains = window.Node.prototype.contains || /** @this */ function(arg) {
228
+    // eslint-disable-next-line no-bitwise
229
+    return !!(this.compareDocumentPosition(arg) & 16);
230
+  };
231
+
232
+  // Regular Expressions for parsing tags and attributes
233
+  var SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
234
+    // Match everything outside of normal chars and " (quote character)
235
+    NON_ALPHANUMERIC_REGEXP = /([^#-~ |!])/g;
236
+
237
+
238
+  // Good source of info about elements and attributes
239
+  // http://dev.w3.org/html5/spec/Overview.html#semantics
240
+  // http://simon.html5.org/html-elements
241
+
242
+  // Safe Void Elements - HTML5
243
+  // http://dev.w3.org/html5/spec/Overview.html#void-elements
244
+  var voidElements = toMap('area,br,col,hr,img,wbr');
245
+
246
+  // Elements that you can, intentionally, leave open (and which close themselves)
247
+  // http://dev.w3.org/html5/spec/Overview.html#optional-tags
248
+  var optionalEndTagBlockElements = toMap('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr'),
249
+      optionalEndTagInlineElements = toMap('rp,rt'),
250
+      optionalEndTagElements = extend({},
251
+                                              optionalEndTagInlineElements,
252
+                                              optionalEndTagBlockElements);
253
+
254
+  // Safe Block Elements - HTML5
255
+  var blockElements = extend({}, optionalEndTagBlockElements, toMap('address,article,' +
256
+          'aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' +
257
+          'h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul'));
258
+
259
+  // Inline Elements - HTML5
260
+  var inlineElements = extend({}, optionalEndTagInlineElements, toMap('a,abbr,acronym,b,' +
261
+          'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,' +
262
+          'samp,small,span,strike,strong,sub,sup,time,tt,u,var'));
263
+
264
+  // SVG Elements
265
+  // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements
266
+  // Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted.
267
+  // They can potentially allow for arbitrary javascript to be executed. See #11290
268
+  var svgElements = toMap('circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,' +
269
+          'hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,' +
270
+          'radialGradient,rect,stop,svg,switch,text,title,tspan');
271
+
272
+  // Blocked Elements (will be stripped)
273
+  var blockedElements = toMap('script,style');
274
+
275
+  var validElements = extend({},
276
+                                     voidElements,
277
+                                     blockElements,
278
+                                     inlineElements,
279
+                                     optionalEndTagElements);
280
+
281
+  //Attributes that have href and hence need to be sanitized
282
+  var uriAttrs = toMap('background,cite,href,longdesc,src,xlink:href');
283
+
284
+  var htmlAttrs = toMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' +
285
+      'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' +
286
+      'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' +
287
+      'scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,' +
288
+      'valign,value,vspace,width');
289
+
290
+  // SVG attributes (without "id" and "name" attributes)
291
+  // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes
292
+  var svgAttrs = toMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' +
293
+      'baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,' +
294
+      'cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,' +
295
+      'font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,' +
296
+      'height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,' +
297
+      'marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,' +
298
+      'max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,' +
299
+      'path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,' +
300
+      'requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,' +
301
+      'stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,' +
302
+      'stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,' +
303
+      'stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,' +
304
+      'underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,' +
305
+      'width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,' +
306
+      'xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan', true);
307
+
308
+  var validAttrs = extend({},
309
+                                  uriAttrs,
310
+                                  svgAttrs,
311
+                                  htmlAttrs);
312
+
313
+  function toMap(str, lowercaseKeys) {
314
+    var obj = {}, items = str.split(','), i;
315
+    for (i = 0; i < items.length; i++) {
316
+      obj[lowercaseKeys ? lowercase(items[i]) : items[i]] = true;
317
+    }
318
+    return obj;
319
+  }
320
+
321
+  /**
322
+   * Create an inert document that contains the dirty HTML that needs sanitizing
323
+   * Depending upon browser support we use one of three strategies for doing this.
324
+   * Support: Safari 10.x -> XHR strategy
325
+   * Support: Firefox -> DomParser strategy
326
+   */
327
+  var getInertBodyElement /* function(html: string): HTMLBodyElement */ = (function(window, document) {
328
+    var inertDocument;
329
+    if (document && document.implementation) {
330
+      inertDocument = document.implementation.createHTMLDocument('inert');
331
+    } else {
332
+      throw $sanitizeMinErr('noinert', 'Can\'t create an inert html document');
333
+    }
334
+    var inertBodyElement = (inertDocument.documentElement || inertDocument.getDocumentElement()).querySelector('body');
335
+
336
+    // Check for the Safari 10.1 bug - which allows JS to run inside the SVG G element
337
+    inertBodyElement.innerHTML = '<svg><g onload="this.parentNode.remove()"></g></svg>';
338
+    if (!inertBodyElement.querySelector('svg')) {
339
+      return getInertBodyElement_XHR;
340
+    } else {
341
+      // Check for the Firefox bug - which prevents the inner img JS from being sanitized
342
+      inertBodyElement.innerHTML = '<svg><p><style><img src="</style><img src=x onerror=alert(1)//">';
343
+      if (inertBodyElement.querySelector('svg img')) {
344
+        return getInertBodyElement_DOMParser;
345
+      } else {
346
+        return getInertBodyElement_InertDocument;
347
+      }
348
+    }
349
+
350
+    function getInertBodyElement_XHR(html) {
351
+      // We add this dummy element to ensure that the rest of the content is parsed as expected
352
+      // e.g. leading whitespace is maintained and tags like `<meta>` do not get hoisted to the `<head>` tag.
353
+      html = '<remove></remove>' + html;
354
+      try {
355
+        html = encodeURI(html);
356
+      } catch (e) {
357
+        return undefined;
358
+      }
359
+      var xhr = new window.XMLHttpRequest();
360
+      xhr.responseType = 'document';
361
+      xhr.open('GET', 'data:text/html;charset=utf-8,' + html, false);
362
+      xhr.send(null);
363
+      var body = xhr.response.body;
364
+      body.firstChild.remove();
365
+      return body;
366
+    }
367
+
368
+    function getInertBodyElement_DOMParser(html) {
369
+      // We add this dummy element to ensure that the rest of the content is parsed as expected
370
+      // e.g. leading whitespace is maintained and tags like `<meta>` do not get hoisted to the `<head>` tag.
371
+      html = '<remove></remove>' + html;
372
+      try {
373
+        var body = new window.DOMParser().parseFromString(html, 'text/html').body;
374
+        body.firstChild.remove();
375
+        return body;
376
+      } catch (e) {
377
+        return undefined;
378
+      }
379
+    }
380
+
381
+    function getInertBodyElement_InertDocument(html) {
382
+      inertBodyElement.innerHTML = html;
383
+
384
+      // Support: IE 9-11 only
385
+      // strip custom-namespaced attributes on IE<=11
386
+      if (document.documentMode) {
387
+        stripCustomNsAttrs(inertBodyElement);
388
+      }
389
+
390
+      return inertBodyElement;
391
+    }
392
+  })(window, window.document);
393
+
394
+  /**
395
+   * @example
396
+   * htmlParser(htmlString, {
397
+   *     start: function(tag, attrs) {},
398
+   *     end: function(tag) {},
399
+   *     chars: function(text) {},
400
+   *     comment: function(text) {}
401
+   * });
402
+   *
403
+   * @param {string} html string
404
+   * @param {object} handler
405
+   */
406
+  function htmlParserImpl(html, handler) {
407
+    if (html === null || html === undefined) {
408
+      html = '';
409
+    } else if (typeof html !== 'string') {
410
+      html = '' + html;
411
+    }
412
+
413
+    var inertBodyElement = getInertBodyElement(html);
414
+    if (!inertBodyElement) return '';
415
+
416
+    //mXSS protection
417
+    var mXSSAttempts = 5;
418
+    do {
419
+      if (mXSSAttempts === 0) {
420
+        throw $sanitizeMinErr('uinput', 'Failed to sanitize html because the input is unstable');
421
+      }
422
+      mXSSAttempts--;
423
+
424
+      // trigger mXSS if it is going to happen by reading and writing the innerHTML
425
+      html = inertBodyElement.innerHTML;
426
+      inertBodyElement = getInertBodyElement(html);
427
+    } while (html !== inertBodyElement.innerHTML);
428
+
429
+    var node = inertBodyElement.firstChild;
430
+    while (node) {
431
+      switch (node.nodeType) {
432
+        case 1: // ELEMENT_NODE
433
+          handler.start(node.nodeName.toLowerCase(), attrToMap(node.attributes));
434
+          break;
435
+        case 3: // TEXT NODE
436
+          handler.chars(node.textContent);
437
+          break;
438
+      }
439
+
440
+      var nextNode;
441
+      if (!(nextNode = node.firstChild)) {
442
+        if (node.nodeType === 1) {
443
+          handler.end(node.nodeName.toLowerCase());
444
+        }
445
+        nextNode = getNonDescendant('nextSibling', node);
446
+        if (!nextNode) {
447
+          while (nextNode == null) {
448
+            node = getNonDescendant('parentNode', node);
449
+            if (node === inertBodyElement) break;
450
+            nextNode = getNonDescendant('nextSibling', node);
451
+            if (node.nodeType === 1) {
452
+              handler.end(node.nodeName.toLowerCase());
453
+            }
454
+          }
455
+        }
456
+      }
457
+      node = nextNode;
458
+    }
459
+
460
+    while ((node = inertBodyElement.firstChild)) {
461
+      inertBodyElement.removeChild(node);
462
+    }
463
+  }
464
+
465
+  function attrToMap(attrs) {
466
+    var map = {};
467
+    for (var i = 0, ii = attrs.length; i < ii; i++) {
468
+      var attr = attrs[i];
469
+      map[attr.name] = attr.value;
470
+    }
471
+    return map;
472
+  }
473
+
474
+
475
+  /**
476
+   * Escapes all potentially dangerous characters, so that the
477
+   * resulting string can be safely inserted into attribute or
478
+   * element text.
479
+   * @param value
480
+   * @returns {string} escaped text
481
+   */
482
+  function encodeEntities(value) {
483
+    return value.
484
+      replace(/&/g, '&amp;').
485
+      replace(SURROGATE_PAIR_REGEXP, function(value) {
486
+        var hi = value.charCodeAt(0);
487
+        var low = value.charCodeAt(1);
488
+        return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';
489
+      }).
490
+      replace(NON_ALPHANUMERIC_REGEXP, function(value) {
491
+        return '&#' + value.charCodeAt(0) + ';';
492
+      }).
493
+      replace(/</g, '&lt;').
494
+      replace(/>/g, '&gt;');
495
+  }
496
+
497
+  /**
498
+   * create an HTML/XML writer which writes to buffer
499
+   * @param {Array} buf use buf.join('') to get out sanitized html string
500
+   * @returns {object} in the form of {
501
+   *     start: function(tag, attrs) {},
502
+   *     end: function(tag) {},
503
+   *     chars: function(text) {},
504
+   *     comment: function(text) {}
505
+   * }
506
+   */
507
+  function htmlSanitizeWriterImpl(buf, uriValidator) {
508
+    var ignoreCurrentElement = false;
509
+    var out = bind(buf, buf.push);
510
+    return {
511
+      start: function(tag, attrs) {
512
+        tag = lowercase(tag);
513
+        if (!ignoreCurrentElement && blockedElements[tag]) {
514
+          ignoreCurrentElement = tag;
515
+        }
516
+        if (!ignoreCurrentElement && validElements[tag] === true) {
517
+          out('<');
518
+          out(tag);
519
+          forEach(attrs, function(value, key) {
520
+            var lkey = lowercase(key);
521
+            var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background');
522
+            if (validAttrs[lkey] === true &&
523
+              (uriAttrs[lkey] !== true || uriValidator(value, isImage))) {
524
+              out(' ');
525
+              out(key);
526
+              out('="');
527
+              out(encodeEntities(value));
528
+              out('"');
529
+            }
530
+          });
531
+          out('>');
532
+        }
533
+      },
534
+      end: function(tag) {
535
+        tag = lowercase(tag);
536
+        if (!ignoreCurrentElement && validElements[tag] === true && voidElements[tag] !== true) {
537
+          out('</');
538
+          out(tag);
539
+          out('>');
540
+        }
541
+        // eslint-disable-next-line eqeqeq
542
+        if (tag == ignoreCurrentElement) {
543
+          ignoreCurrentElement = false;
544
+        }
545
+      },
546
+      chars: function(chars) {
547
+        if (!ignoreCurrentElement) {
548
+          out(encodeEntities(chars));
549
+        }
550
+      }
551
+    };
552
+  }
553
+
554
+
555
+  /**
556
+   * When IE9-11 comes across an unknown namespaced attribute e.g. 'xlink:foo' it adds 'xmlns:ns1' attribute to declare
557
+   * ns1 namespace and prefixes the attribute with 'ns1' (e.g. 'ns1:xlink:foo'). This is undesirable since we don't want
558
+   * to allow any of these custom attributes. This method strips them all.
559
+   *
560
+   * @param node Root element to process
561
+   */
562
+  function stripCustomNsAttrs(node) {
563
+    while (node) {
564
+      if (node.nodeType === window.Node.ELEMENT_NODE) {
565
+        var attrs = node.attributes;
566
+        for (var i = 0, l = attrs.length; i < l; i++) {
567
+          var attrNode = attrs[i];
568
+          var attrName = attrNode.name.toLowerCase();
569
+          if (attrName === 'xmlns:ns1' || attrName.lastIndexOf('ns1:', 0) === 0) {
570
+            node.removeAttributeNode(attrNode);
571
+            i--;
572
+            l--;
573
+          }
574
+        }
575
+      }
576
+
577
+      var nextNode = node.firstChild;
578
+      if (nextNode) {
579
+        stripCustomNsAttrs(nextNode);
580
+      }
581
+
582
+      node = getNonDescendant('nextSibling', node);
583
+    }
584
+  }
585
+
586
+  function getNonDescendant(propName, node) {
587
+    // An element is clobbered if its `propName` property points to one of its descendants
588
+    var nextNode = node[propName];
589
+    if (nextNode && nodeContains.call(node, nextNode)) {
590
+      throw $sanitizeMinErr('elclob', 'Failed to sanitize html because the element is clobbered: {0}', node.outerHTML || node.outerText);
591
+    }
592
+    return nextNode;
593
+  }
594
+}
595
+
596
+function sanitizeText(chars) {
597
+  var buf = [];
598
+  var writer = htmlSanitizeWriter(buf, noop);
599
+  writer.chars(chars);
600
+  return buf.join('');
601
+}
602
+
603
+
604
+// define ngSanitize module and register $sanitize service
605
+angular.module('ngSanitize', [])
606
+  .provider('$sanitize', $SanitizeProvider)
607
+  .info({ angularVersion: '1.6.6' });
608
+
609
+/**
610
+ * @ngdoc filter
611
+ * @name linky
612
+ * @kind function
613
+ *
614
+ * @description
615
+ * Finds links in text input and turns them into html links. Supports `http/https/ftp/mailto` and
616
+ * plain email address links.
617
+ *
618
+ * Requires the {@link ngSanitize `ngSanitize`} module to be installed.
619
+ *
620
+ * @param {string} text Input text.
621
+ * @param {string} target Window (`_blank|_self|_parent|_top`) or named frame to open links in.
622
+ * @param {object|function(url)} [attributes] Add custom attributes to the link element.
623
+ *
624
+ *    Can be one of:
625
+ *
626
+ *    - `object`: A map of attributes
627
+ *    - `function`: Takes the url as a parameter and returns a map of attributes
628
+ *
629
+ *    If the map of attributes contains a value for `target`, it overrides the value of
630
+ *    the target parameter.
631
+ *
632
+ *
633
+ * @returns {string} Html-linkified and {@link $sanitize sanitized} text.
634
+ *
635
+ * @usage
636
+   <span ng-bind-html="linky_expression | linky"></span>
637
+ *
638
+ * @example
639
+   <example module="linkyExample" deps="angular-sanitize.js" name="linky-filter">
640
+     <file name="index.html">
641
+       <div ng-controller="ExampleController">
642
+       Snippet: <textarea ng-model="snippet" cols="60" rows="3"></textarea>
643
+       <table>
644
+         <tr>
645
+           <th>Filter</th>
646
+           <th>Source</th>
647
+           <th>Rendered</th>
648
+         </tr>
649
+         <tr id="linky-filter">
650
+           <td>linky filter</td>
651
+           <td>
652
+             <pre>&lt;div ng-bind-html="snippet | linky"&gt;<br>&lt;/div&gt;</pre>
653
+           </td>
654
+           <td>
655
+             <div ng-bind-html="snippet | linky"></div>
656
+           </td>
657
+         </tr>
658
+         <tr id="linky-target">
659
+          <td>linky target</td>
660
+          <td>
661
+            <pre>&lt;div ng-bind-html="snippetWithSingleURL | linky:'_blank'"&gt;<br>&lt;/div&gt;</pre>
662
+          </td>
663
+          <td>
664
+            <div ng-bind-html="snippetWithSingleURL | linky:'_blank'"></div>
665
+          </td>
666
+         </tr>
667
+         <tr id="linky-custom-attributes">
668
+          <td>linky custom attributes</td>
669
+          <td>
670
+            <pre>&lt;div ng-bind-html="snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}"&gt;<br>&lt;/div&gt;</pre>
671
+          </td>
672
+          <td>
673
+            <div ng-bind-html="snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}"></div>
674
+          </td>
675
+         </tr>
676
+         <tr id="escaped-html">
677
+           <td>no filter</td>
678
+           <td><pre>&lt;div ng-bind="snippet"&gt;<br>&lt;/div&gt;</pre></td>
679
+           <td><div ng-bind="snippet"></div></td>
680
+         </tr>
681
+       </table>
682
+     </file>
683
+     <file name="script.js">
684
+       angular.module('linkyExample', ['ngSanitize'])
685
+         .controller('ExampleController', ['$scope', function($scope) {
686
+           $scope.snippet =
687
+             'Pretty text with some links:\n' +
688
+             'http://angularjs.org/,\n' +
689
+             'mailto:us@somewhere.org,\n' +
690
+             'another@somewhere.org,\n' +
691
+             'and one more: ftp://127.0.0.1/.';
692
+           $scope.snippetWithSingleURL = 'http://angularjs.org/';
693
+         }]);
694
+     </file>
695
+     <file name="protractor.js" type="protractor">
696
+       it('should linkify the snippet with urls', function() {
697
+         expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).
698
+             toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' +
699
+                  'another@somewhere.org, and one more: ftp://127.0.0.1/.');
700
+         expect(element.all(by.css('#linky-filter a')).count()).toEqual(4);
701
+       });
702
+
703
+       it('should not linkify snippet without the linky filter', function() {
704
+         expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()).
705
+             toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' +
706
+                  'another@somewhere.org, and one more: ftp://127.0.0.1/.');
707
+         expect(element.all(by.css('#escaped-html a')).count()).toEqual(0);
708
+       });
709
+
710
+       it('should update', function() {
711
+         element(by.model('snippet')).clear();
712
+         element(by.model('snippet')).sendKeys('new http://link.');
713
+         expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()).
714
+             toBe('new http://link.');
715
+         expect(element.all(by.css('#linky-filter a')).count()).toEqual(1);
716
+         expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText())
717
+             .toBe('new http://link.');
718
+       });
719
+
720
+       it('should work with the target property', function() {
721
+        expect(element(by.id('linky-target')).
722
+            element(by.binding("snippetWithSingleURL | linky:'_blank'")).getText()).
723
+            toBe('http://angularjs.org/');
724
+        expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank');
725
+       });
726
+
727
+       it('should optionally add custom attributes', function() {
728
+        expect(element(by.id('linky-custom-attributes')).
729
+            element(by.binding("snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}")).getText()).
730
+            toBe('http://angularjs.org/');
731
+        expect(element(by.css('#linky-custom-attributes a')).getAttribute('rel')).toEqual('nofollow');
732
+       });
733
+     </file>
734
+   </example>
735
+ */
736
+angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
737
+  var LINKY_URL_REGEXP =
738
+        /((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i,
739
+      MAILTO_REGEXP = /^mailto:/i;
740
+
741
+  var linkyMinErr = angular.$$minErr('linky');
742
+  var isDefined = angular.isDefined;
743
+  var isFunction = angular.isFunction;
744
+  var isObject = angular.isObject;
745
+  var isString = angular.isString;
746
+
747
+  return function(text, target, attributes) {
748
+    if (text == null || text === '') return text;
749
+    if (!isString(text)) throw linkyMinErr('notstring', 'Expected string but received: {0}', text);
750
+
751
+    var attributesFn =
752
+      isFunction(attributes) ? attributes :
753
+      isObject(attributes) ? function getAttributesObject() {return attributes;} :
754
+      function getEmptyAttributesObject() {return {};};
755
+
756
+    var match;
757
+    var raw = text;
758
+    var html = [];
759
+    var url;
760
+    var i;
761
+    while ((match = raw.match(LINKY_URL_REGEXP))) {
762
+      // We can not end in these as they are sometimes found at the end of the sentence
763
+      url = match[0];
764
+      // if we did not match ftp/http/www/mailto then assume mailto
765
+      if (!match[2] && !match[4]) {
766
+        url = (match[3] ? 'http://' : 'mailto:') + url;
767
+      }
768
+      i = match.index;
769
+      addText(raw.substr(0, i));
770
+      addLink(url, match[0].replace(MAILTO_REGEXP, ''));
771
+      raw = raw.substring(i + match[0].length);
772
+    }
773
+    addText(raw);
774
+    return $sanitize(html.join(''));
775
+
776
+    function addText(text) {
777
+      if (!text) {
778
+        return;
779
+      }
780
+      html.push(sanitizeText(text));
781
+    }
782
+
783
+    function addLink(url, text) {
784
+      var key, linkAttributes = attributesFn(url);
785
+      html.push('<a ');
786
+
787
+      for (key in linkAttributes) {
788
+        html.push(key + '="' + linkAttributes[key] + '" ');
789
+      }
790
+
791
+      if (isDefined(target) && !('target' in linkAttributes)) {
792
+        html.push('target="',
793
+                  target,
794
+                  '" ');
795
+      }
796
+      html.push('href="',
797
+                url.replace(/"/g, '&quot;'),
798
+                '">');
799
+      addText(text);
800
+      html.push('</a>');
801
+    }
802
+  };
803
+}]);
804
+
805
+
806
+})(window, window.angular);

File diff suppressed because it is too large
+ 17 - 0
static/bower_components/angular-sanitize/angular-sanitize.min.js


File diff suppressed because it is too large
+ 8 - 0
static/bower_components/angular-sanitize/angular-sanitize.min.js.map


+ 10 - 0
static/bower_components/angular-sanitize/bower.json

@@ -0,0 +1,10 @@
1
+{
2
+  "name": "angular-sanitize",
3
+  "version": "1.6.6",
4
+  "license": "MIT",
5
+  "main": "./angular-sanitize.js",
6
+  "ignore": [],
7
+  "dependencies": {
8
+    "angular": "1.6.6"
9
+  }
10
+}

+ 2 - 0
static/bower_components/angular-sanitize/index.js

@@ -0,0 +1,2 @@
1
+require('./angular-sanitize');
2
+module.exports = 'ngSanitize';

+ 33 - 0
static/bower_components/angular-sanitize/package.json

@@ -0,0 +1,33 @@
1
+{
2
+  "name": "angular-sanitize",
3
+  "version": "1.6.6",
4
+  "description": "AngularJS module for sanitizing HTML",
5
+  "main": "index.js",
6
+  "scripts": {
7
+    "test": "echo \"Error: no test specified\" && exit 1"
8
+  },
9
+  "repository": {
10
+    "type": "git",
11
+    "url": "https://github.com/angular/angular.js.git"
12
+  },
13
+  "keywords": [
14
+    "angular",
15
+    "framework",
16
+    "browser",
17
+    "html",
18
+    "client-side"
19
+  ],
20
+  "author": "Angular Core Team <angular-core+npm@google.com>",
21
+  "license": "MIT",
22
+  "bugs": {
23
+    "url": "https://github.com/angular/angular.js/issues"
24
+  },
25
+  "homepage": "http://angularjs.org",
26
+  "jspm": {
27
+    "shim": {
28
+      "angular-sanitize": {
29
+        "deps": ["angular"]
30
+      }
31
+    }
32
+  }
33
+}

+ 32 - 0
static/bower_components/angular-ui-router/.bower.json

@@ -0,0 +1,32 @@
1
+{
2
+  "name": "angular-ui-router",
3
+  "description": "State-based routing for AngularJS",
4
+  "license": "MIT",
5
+  "main": "./release/angular-ui-router.js",
6
+  "dependencies": {
7
+    "angular": ">= 1.2.0"
8
+  },
9
+  "ignore": [
10
+    "**/.*",
11
+    "**/tsconfig.json",
12
+    "**/tsconfig.typedoc.json",
13
+    "**/webpack.config.js",
14
+    "**/node_modules",
15
+    "package.json",
16
+    "scripts",
17
+    "test",
18
+    "src"
19
+  ],
20
+  "version": "1.0.10",
21
+  "homepage": "https://github.com/angular-ui/angular-ui-router-bower",
22
+  "_release": "1.0.10",
23
+  "_resolution": {
24
+    "type": "version",
25
+    "tag": "1.0.10",
26
+    "commit": "50430a313fba39526de6031662acae0e254f7948"
27
+  },
28
+  "_source": "https://github.com/angular-ui/angular-ui-router-bower.git",
29
+  "_target": "^1.0.10",
30
+  "_originalSource": "angular-ui-router",
31
+  "_direct": true
32
+}

File diff suppressed because it is too large
+ 1600 - 0
static/bower_components/angular-ui-router/CHANGELOG.md


+ 113 - 0
static/bower_components/angular-ui-router/CONTRIBUTING.md

@@ -0,0 +1,113 @@
1
+
2
+# Report an Issue
3
+
4
+Help us make UI-Router better! If you think you might have found a bug, or some other weirdness, start by making sure
5
+it hasn't already been reported. You can [search through existing issues](https://github.com/angular-ui/ui-router/search?q=wat%3F&type=Issues)
6
+to see if someone's reported one similar to yours.
7
+
8
+If not, then [create a plunkr](http://bit.ly/UIR-Plunk) that demonstrates the problem (try to use as little code
9
+as possible: the more minimalist, the faster we can debug it).
10
+
11
+Next, [create a new issue](https://github.com/angular-ui/ui-router/issues/new) that briefly explains the problem,
12
+and provides a bit of background as to the circumstances that triggered it. Don't forget to include the link to
13
+that plunkr you created!
14
+
15
+**Note**: If you're unsure how a feature is used, or are encountering some unexpected behavior that you aren't sure
16
+is a bug, it's best to talk it out on
17
+[StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) before reporting it. This
18
+keeps development streamlined, and helps us focus on building great software.
19
+
20
+
21
+Issues only! |
22
+-------------|
23
+Please keep in mind that the issue tracker is for *issues*. Please do *not* post an issue if you need help or support. Instead, see one of the above-mentioned forums or [IRC](irc://irc.freenode.net/#angularjs). |
24
+
25
+#### Purple Labels
26
+A purple label means that **you** need to take some further action.
27
+ - ![Not Actionable - Need Info](https://angular-ui.github.io/ui-router/ngdoc_assets/incomplete.png): Your issue is not specific enough, or there is no clear action that we can take. Please clarify and refine your issue.
28
+ - ![Plunkr Please](https://angular-ui.github.io/ui-router/ngdoc_assets/example.png): Please [create a plunkr](http://bit.ly/UIR-Plunk)
29
+ - ![StackOverflow](https://angular-ui.github.io/ui-router/ngdoc_assets/so.png): We suspect your issue is really a help request, or could be answered by the community.  Please ask your question on [StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router).  If you determine that is an actual issue, please explain why.
30
+
31
+If your issue gets labeled with purple label, no further action will be taken until you respond to the label appropriately.
32
+
33
+# Contribute
34
+
35
+**(1)** See the **[Developing](#developing)** section below, to get the development version of UI-Router up and running on your local machine.
36
+
37
+**(2)** Check out the [roadmap](https://github.com/angular-ui/ui-router/milestones) to see where the project is headed, and if your feature idea fits with where we're headed.
38
+
39
+**(3)** If you're not sure, [open an RFC](https://github.com/angular-ui/ui-router/issues/new?title=RFC:%20My%20idea) to get some feedback on your idea.
40
+
41
+**(4)** Finally, commit some code and open a pull request. Code & commits should abide by the following rules:
42
+
43
+- *Always* have test coverage for new features (or regression tests for bug fixes), and *never* break existing tests
44
+- Commits should represent one logical change each; if a feature goes through multiple iterations, squash your commits down to one
45
+- Make sure to follow the [Angular commit message format](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format) so your change will appear in the changelog of the next release.
46
+- Changes should always respect the coding style of the project
47
+
48
+
49
+
50
+# Developing
51
+
52
+UI-Router uses <code>npm</code> and <code>Rollup</code>.
53
+
54
+## Fetch the source code
55
+
56
+The code for Angular UI-Router is split into two source repositories:
57
+
58
+* [UI-Router Core](https://github.com/ui-router/core) (`@uirouter/core` on npm)
59
+* [UI-Router for Angular 1](https://github.com/angular-ui/ui-router) (`@ui-router/angularjs` on npm)
60
+
61
+Clone both repositories into directories next to each other.
62
+
63
+```
64
+mkdir uirouter
65
+cd uirouter
66
+git clone https://github.com/angular-ui/ui-router.git angularjs
67
+git clone https://github.com/ui-router/core.git core
68
+```
69
+
70
+## Install dependencies
71
+
72
+Use `npm` to install the development dependencies for each repository.
73
+
74
+```
75
+cd core
76
+npm install
77
+cd ../angularjs
78
+npm install
79
+cd ..
80
+```
81
+
82
+## Link the directories
83
+
84
+This step is necessary if you need to modify any code in `@uirouter/core`.
85
+Using `npm`, link `@uirouter/core` into `@uirouter/angularjs`
86
+
87
+```
88
+cd core
89
+npm link
90
+cd ../angularjs
91
+npm link '@uirouter/core'
92
+```
93
+
94
+After executing these steps, `@uirouter/angularjs` will be depend on your local copy of `@uirouter/core` instead of the version listed in `package.json`.
95
+
96
+## Develop
97
+
98
+These scripts may be run in the `angularjs` directory:
99
+
100
+* `npm run build`: Compiles TypeScript source
101
+* `npm run package`: Compiles TypeScript source and creates the Rollup bundles.
102
+* `npm test`: Runs the test suite (against Angular 1.2 through 1.5).
103
+* `npm run watch`: Continuously compiles the source and runs the test suite (when either source or tests change).
104
+
105
+Scripts of the same name (in the `core` directory) can be used.
106
+
107
+* `npm run build`: Compiles `@uirouter/core` TypeScript source
108
+* `npm test`: Runs the `@uirouter/core` test suite
109
+* `npm run watch`: Continuously compiles the source and runs the `@uirouter/core` test suite (when core source or tests change).
110
+
111
+If you've followed the [linking instructions](#link-the-directories), it's useful to run both
112
+`npm run watch` tasks (each task from `@uirouter/core` *and* `@uirouter/angularjs`).
113
+This ensures that changes to either `@uirouter/core` and `@uirouter/angularjs` compile successfully and are run against their test suites.

+ 48 - 0
static/bower_components/angular-ui-router/DOCS.md

@@ -0,0 +1,48 @@
1
+# [UI Router for Angular 1](https://ui-router.github.io/ng1/docs/latest)
2
+
3
+#### The de-facto solution to flexible routing in angular 1
4
+
5
+<div style="display: flex;">
6
+
7
+<iframe style="display: inline-block;" src="https://ghbtns.com/github-btn.html?user=angular-ui&repo=ui-router&type=fork&count=true&size=medium" frameborder="0" scrolling="0" width="110px" height="20px"></iframe>
8
+<iframe style="display: inline-block;" src="https://ghbtns.com/github-btn.html?user=angular-ui&repo=ui-router&type=star&count=true&size=medium" frameborder="0" scrolling="0" width="110px" height="20px"></iframe>
9
+[![Build Status](https://travis-ci.org/angular-ui/ui-router.svg?branch=master)](https://travis-ci.org/angular-ui/ui-router)
10
+
11
+</div>
12
+
13
+
14
+Angular UI-Router is a client-side [Single Page Application](https://en.wikipedia.org/wiki/Single-page_application) 
15
+routing framework for [AngularJS](http://angularjs.org).  
16
+
17
+**[View on Github](http://github.com/angular-ui/ui-router) |**
18
+**[Tutorials](https://ui-router.github.io/ng1/tutorials/)** |
19
+**[Guides](https://ui-router.github.io/guide) |**
20
+**[Sample App](http://ui-router.github.io/resources/sampleapp/) |**
21
+**[Wiki](https://github.com/angular-ui/ui-router/wiki) |**
22
+**[FAQ](https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions)**
23
+  
24
+#### API Documentation Organization
25
+
26
+The documentation is arranged according to API concern, such as `url`, `resolve`, and `core`.
27
+For a list of services and objects that can be injectable, see the [`injectables` section](./injectables.html).
28
+
29
+By default, only the public UI-Router API is shown.
30
+To view both public API and the internal APIs, check the "Internal UI-Router API" checkbox.
31
+  
32
+#### Typescript
33
+
34
+UI-Router is written in Typescript.
35
+The API documentation is generated using [TypeDoc](https://github.com/TypeStrong/typedoc).
36
+The documentation reflects the Typescript classes, interfaces, and parameter types information embedded in the source code.
37
+
38
+#### Contributing
39
+
40
+Angular UI-Router depends on the framework agnostic `@uirouter/core`.
41
+To contribute to the documentation, please submit a PR to either 
42
+[@uirouter/angularjs](http://github.com/angular-ui/ui-router)
43
+or
44
+[@uirouter/core](http://github.com/ui-router/core).
45
+To find where a specific piece of documentation is written, follow the links that say:
46
+ > _Defined in ui-router/somedir/somefile.ts_
47
+
48
+

+ 53 - 0
static/bower_components/angular-ui-router/ISSUE_TEMPLATE.md

@@ -0,0 +1,53 @@
1
+This issue tracker is for Bug Reports and Feature Requests only.
2
+Please direct requests for help to StackOverflow.  See http://bit.ly/UIR-SOF for details.
3
+
4
+This is a:
5
+
6
+- [ ] Bug Report
7
+- [ ] Feature Request
8
+- [ ] General Query 
9
+
10
+My version of UI-Router is: (version)
11
+
12
+
13
+
14
+# Bug Report
15
+
16
+#### Current Behavior:
17
+
18
+(current behavior here)
19
+
20
+#### Expected Behavior:
21
+
22
+(expected behavior here)
23
+
24
+#### Link to Plunker that reproduces the issue:
25
+
26
+http://bit.ly/UIR-Plunk
27
+
28
+
29
+
30
+
31
+# Feature Request
32
+
33
+(feature request here)
34
+
35
+
36
+
37
+
38
+# General Query
39
+
40
+Please direct general implementation questions to StackOverflow: 
41
+http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router
42
+
43
+Please review the Sample Application which highlights common approaches:
44
+https://github.com/ui-router/sample-app-ng1
45
+
46
+- [ ] I have already asked my question on StackOverflow and nobody could answer the question
47
+
48
+- [ ] I have already reviewed the sample application for examples of common approaches
49
+
50
+- [ ] I believe my question can only be answered by the UI-Router maintainers
51
+
52
+
53
+(general query here)

+ 21 - 0
static/bower_components/angular-ui-router/LICENSE

@@ -0,0 +1,21 @@
1
+The MIT License
2
+
3
+Copyright (c) 2013-2015 The AngularUI Team, Karsten Sperling
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
13
+all 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
21
+THE SOFTWARE.

+ 56 - 0
static/bower_components/angular-ui-router/README.md

@@ -0,0 +1,56 @@
1
+# AngularUI Router &nbsp;[![Build Status](https://travis-ci.org/angular-ui/ui-router.svg?branch=master)](https://travis-ci.org/angular-ui/ui-router)
2
+
3
+**Note: this is the Angular 1.x source for UI-Router version 1.0.  If you are looking for the source for UI-Router 
4
+version 0.2.x, it can be found [here](https://github.com/angular-ui/ui-router/tree/legacy)**
5
+
6
+---
7
+
8
+
9
+#### The de-facto solution to flexible routing in angular
10
+---
11
+**[Tutorials](https://ui-router.github.io/tutorials/)** |
12
+**[API Docs](https://ui-router.github.io/docs/latest/)** |
13
+**[Download stable](http://unpkg.com/@uirouter/angularjs@latest/release/angular-ui-router.js)** (or **[Minified](http://unpkg.com/@uirouter/angularjs@latest/release/angular-ui-router.min.js)**) **|**
14
+**[Guide](https://github.com/angular-ui/ui-router/wiki) |**
15
+**[Sample App](http://ui-router.github.io/resources/sampleapp/) |**
16
+**[FAQ](https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions) |**
17
+**[Report an Issue](https://github.com/angular-ui/ui-router/blob/master/CONTRIBUTING.md#report-an-issue) |**
18
+**[Contribute](https://github.com/angular-ui/ui-router/blob/master/CONTRIBUTING.md#contribute) |**
19
+**[Help!](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) |**
20
+
21
+---
22
+
23
+Angular UI-Router is a client-side [Single Page Application](https://en.wikipedia.org/wiki/Single-page_application) 
24
+routing framework for [AngularJS](http://angularjs.org).  
25
+  
26
+Routing frameworks for SPAs update the browser's URL as the user navigates through the app.  Conversely, this allows 
27
+changes to the browser's URL to drive navigation through the app, thus allowing the user to create a bookmark to a 
28
+location deep within the SPA.
29
+
30
+UI-Router applications are modeled as a hierarchical tree of states. UI-Router provides a 
31
+[*state machine*](https://en.wikipedia.org/wiki/Finite-state_machine) to manage the transitions between those 
32
+application states in a transaction-like manner. 
33
+
34
+## Get Started
35
+
36
+
37
+- [UI-Router for Angular 1](https://ui-router.github.io/ng1)
38
+- [UI-Router for Angular 2](https://ui-router.github.io/ng2)
39
+- [UI-Router for React](https://ui-router.github.io/react)
40
+
41
+## Resources
42
+
43
+* [In-Depth Guide](https://github.com/angular-ui/ui-router/wiki)
44
+* [Slides comparing ngRoute to ui-router](http://slid.es/timkindberg/ui-router#/)
45
+* [UI-Router Extras / Addons for legacy (0.x)](http://christopherthielen.github.io/ui-router-extras/#/home) (@christopherthielen)
46
+ 
47
+### Videos
48
+
49
+* [Introduction Video](https://egghead.io/lessons/angularjs-introduction-ui-router) (egghead.io)
50
+* [Tim Kindberg on Angular UI-Router](https://www.youtube.com/watch?v=lBqiZSemrqg)
51
+* [Activating States](https://egghead.io/lessons/angularjs-ui-router-activating-states) (egghead.io)
52
+* [Learn Angular.js using UI-Router](http://youtu.be/QETUuZ27N0w) (LearnCode.academy)
53
+
54
+## Reporting issues and Contributing
55
+
56
+Please read our [Contributor guidelines](CONTRIBUTING.md) before reporting an issue or creating a pull request.

+ 8 - 0
static/bower_components/angular-ui-router/artifacts.json

@@ -0,0 +1,8 @@
1
+{
2
+  "ARTIFACTS": [
3
+    "lib",
4
+    "lib-esm",
5
+    "release",
6
+    "package.json"
7
+  ]
8
+}

+ 1 - 0
static/bower_components/angular-ui-router/bower.json

@@ -0,0 +1 @@
1
+{"name":"angular-ui-router","description":"State-based routing for AngularJS","license":"MIT","main":"./release/angular-ui-router.js","dependencies":{"angular":">= 1.2.0"},"ignore":["**/.*","**/tsconfig.json","**/tsconfig.typedoc.json","**/webpack.config.js","**/node_modules","package.json","scripts","test","src"],"version":"1.0.8"}

+ 105 - 0
static/bower_components/angular-ui-router/karma.conf.js

@@ -0,0 +1,105 @@
1
+// Karma configuration file
2
+var karma = require("karma");
3
+var ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
4
+var DEFAULT_NG_VERSION = "1.6";
5
+
6
+/**
7
+ * This returns a Karma 'files configuration'.
8
+ * http://karma-runner.github.io/0.8/config/files.html
9
+ *
10
+ * Specifies which files can be served by the Karma web server
11
+ *
12
+ * included: true -- files that are always served to the browser (like <script> tag)
13
+ * included: false -- files *available to be served* by karma, for instance via require()
14
+ */
15
+function karmaServedFiles(ngVersion) {
16
+  // Returns necessary files for a specific version of angular
17
+  function angular(version) {
18
+    console.log('Using Angular ' + ngVersion + ' from test/angular/' + version + '/angular.js');
19
+
20
+    return [
21
+      'test/angular/' + version + '/angular.js',
22
+      'test/angular/' + version + '/angular-mocks.js',
23
+      'test/angular/' + version + '/angular-animate.js',
24
+    ];
25
+  }
26
+
27
+  var angularFiles = angular(ngVersion).map(function (pattern) {
28
+    return { watched: false, included: true, nocache: true, pattern: pattern };
29
+  });
30
+
31
+  return angularFiles.concat('test/index.js');
32
+}
33
+
34
+var webpackConfig = module.exports = {
35
+  resolve: {
36
+    modules: ['node_modules'],
37
+    extensions: ['.js', '.jsx', '.ts', '.tsx']
38
+  },
39
+
40
+  devtool: 'inline-source-map',
41
+
42
+  module: {
43
+    rules: [
44
+      { test: /\.tsx?$/, loader: 'ts-loader', options: { transpileOnly: true } }
45
+    ]
46
+  },
47
+
48
+  stats: false,
49
+
50
+  plugins: [
51
+    new ForkTsCheckerWebpackPlugin(),
52
+  ],
53
+
54
+  externals: [ 'angular' ]
55
+};
56
+
57
+module.exports = function(config) {
58
+  var ngVersion = config.ngversion || DEFAULT_NG_VERSION;
59
+
60
+  config.set({
61
+    singleRun: true,
62
+    autoWatch: false,
63
+    autoWatchInterval: 0,
64
+
65
+    // level of logging
66
+    // possible values: LOG_DISABLE, LOG_ERROR, LOG_WARN, LOG_INFO, LOG_DEBUG
67
+    logLevel: "warn",
68
+    // possible values: 'dots', 'progress'
69
+    reporters: 'dots',
70
+    colors: true,
71
+
72
+    port: 8080,
73
+
74
+    // base path, that will be used to resolve files and exclude
75
+    basePath: '.',
76
+
77
+    // Start these browsers, currently available:
78
+    // Chrome, ChromeCanary, Firefox, Opera, Safari, PhantomJS
79
+    browsers: ['PhantomJS'],
80
+
81
+    frameworks: ['jasmine'],
82
+
83
+    plugins: [
84
+      require('karma-webpack'),
85
+      require('karma-sourcemap-loader'),
86
+      require('karma-jasmine'),
87
+      require('karma-phantomjs-launcher'),
88
+      require('karma-chrome-launcher')
89
+    ],
90
+
91
+    webpack: webpackConfig,
92
+    webpackMiddleware: {
93
+      stats: { chunks: false },
94
+    },
95
+
96
+    /* Files *available to be served* by karma, i.e., anything that will be require()'d */
97
+    files: karmaServedFiles(ngVersion),
98
+
99
+    preprocessors: {
100
+      'test/index.js': ['webpack', 'sourcemap'],
101
+      '../src/ng1': ['webpack', 'sourcemap'],
102
+    },
103
+
104
+  });
105
+};

File diff suppressed because it is too large
+ 10075 - 0
static/bower_components/angular-ui-router/release/angular-ui-router.js


File diff suppressed because it is too large
+ 193 - 0
static/bower_components/angular-ui-router/release/angular-ui-router.js.map


File diff suppressed because it is too large
+ 12 - 0
static/bower_components/angular-ui-router/release/angular-ui-router.min.js


File diff suppressed because it is too large
+ 1679 - 0
static/bower_components/angular-ui-router/release/angular-ui-router.min.js.map


+ 83 - 0
static/bower_components/angular-ui-router/release/resolveService.js

@@ -0,0 +1,83 @@
1
+/**
2
+ * State-based routing for AngularJS 1.x
3
+ * @version v1.0.10
4
+ * @link https://ui-router.github.io
5
+ * @license MIT License, http://www.opensource.org/licenses/MIT
6
+ */
7
+(function (global, factory) {
8
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@uirouter/core'), require('angular')) :
9
+	typeof define === 'function' && define.amd ? define(['exports', '@uirouter/core', 'angular'], factory) :
10
+	(factory((global['@uirouter/angularjs-resolve-service'] = {}),global['@uirouter/core'],global.angular));
11
+}(this, (function (exports,core,angular) { 'use strict';
12
+
13
+/** @module ng1 */ /** */
14
+/**
15
+ * Implementation of the legacy `$resolve` service for angular 1.
16
+ */
17
+var $resolve = {
18
+    /**
19
+     * Asynchronously injects a resolve block.
20
+     *
21
+     * This emulates most of the behavior of the ui-router 0.2.x $resolve.resolve() service API.
22
+     *
23
+    * ### Not bundled by default
24
+     *
25
+     * This API is no longer not part of the standard `@uirouter/angularjs` bundle.
26
+     * For users of the prebuilt bundles, add the `release/resolveService.min.js` UMD bundle.
27
+     * For bundlers (webpack, browserify, etc), add `@uirouter/angularjs/lib/legacy/resolveService`.
28
+     *
29
+     * ---
30
+     *
31
+     * Given an object `invocables`, where keys are strings and values are injectable functions,
32
+     * injects each function, and waits for the resulting promise to resolve.
33
+     * When all resulting promises are resolved, returns the results as an object.
34
+     *
35
+     * #### Example:
36
+     * ```js
37
+     * let invocables = {
38
+     *   foo: [ '$http', ($http) =>
39
+     *            $http.get('/api/foo').then(resp => resp.data) ],
40
+     *   bar: [ 'foo', '$http', (foo, $http) =>
41
+     *            $http.get('/api/bar/' + foo.barId).then(resp => resp.data) ]
42
+     * }
43
+     * $resolve.resolve(invocables)
44
+     *     .then(results => console.log(results.foo, results.bar))
45
+     * // Logs foo and bar:
46
+     * // { id: 123, barId: 456, fooData: 'foo data' }
47
+     * // { id: 456, barData: 'bar data' }
48
+     * ```
49
+     *
50
+     * @param invocables an object which looks like an [[StateDeclaration.resolve]] object; keys are resolve names and values are injectable functions
51
+     * @param locals key/value pre-resolved data (locals)
52
+     * @param parent a promise for a "parent resolve"
53
+     */
54
+    resolve: function (invocables, locals, parent) {
55
+        if (locals === void 0) { locals = {}; }
56
+        var parentNode = new core.PathNode(new core.StateObject({ params: {}, resolvables: [] }));
57
+        var node = new core.PathNode(new core.StateObject({ params: {}, resolvables: [] }));
58
+        var context = new core.ResolveContext([parentNode, node]);
59
+        context.addResolvables(core.resolvablesBuilder({ resolve: invocables }), node.state);
60
+        var resolveData = function (parentLocals) {
61
+            var rewrap = function (_locals) { return core.resolvablesBuilder({ resolve: core.mapObj(_locals, function (local) { return function () { return local; }; }) }); };
62
+            context.addResolvables(rewrap(parentLocals), parentNode.state);
63
+            context.addResolvables(rewrap(locals), node.state);
64
+            var tuples2ObjR = function (acc, tuple) {
65
+                acc[tuple.token] = tuple.value;
66
+                return acc;
67
+            };
68
+            return context.resolvePath().then(function (results) { return results.reduce(tuples2ObjR, {}); });
69
+        };
70
+        return parent ? parent.then(resolveData) : resolveData({});
71
+    }
72
+};
73
+/** @hidden */
74
+var resolveFactory = function () { return $resolve; };
75
+// The old $resolve service
76
+angular.module('ui.router').factory('$resolve', resolveFactory);
77
+
78
+exports.resolveFactory = resolveFactory;
79
+
80
+Object.defineProperty(exports, '__esModule', { value: true });
81
+
82
+})));
83
+//# sourceMappingURL=resolveService.js.map

File diff suppressed because it is too large
+ 19 - 0
static/bower_components/angular-ui-router/release/resolveService.js.map


File diff suppressed because it is too large
+ 8 - 0
static/bower_components/angular-ui-router/release/resolveService.min.js


File diff suppressed because it is too large
+ 47 - 0
static/bower_components/angular-ui-router/release/resolveService.min.js.map


+ 294 - 0
static/bower_components/angular-ui-router/release/stateEvents.js

@@ -0,0 +1,294 @@
1
+/**
2
+ * State-based routing for AngularJS 1.x
3
+ * @version v1.0.10
4
+ * @link https://ui-router.github.io
5
+ * @license MIT License, http://www.opensource.org/licenses/MIT
6
+ */
7
+(function (global, factory) {
8
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('angular')) :
9
+	typeof define === 'function' && define.amd ? define(['exports', 'angular'], factory) :
10
+	(factory((global['@uirouter/angularjs-state-events'] = {}),global.angular));
11
+}(this, (function (exports,ng_from_import) { 'use strict';
12
+
13
+var ng_from_global = angular;
14
+var ng = (ng_from_import && ng_from_import.module) ? ng_from_import : ng_from_global;
15
+
16
+/**
17
+ * # Legacy state events
18
+ *
19
+ * Polyfill implementation of the UI-Router 0.2.x state events.
20
+ *
21
+ * The 0.2.x state events are deprecated.  We recommend moving to Transition Hooks instead, as they
22
+ * provide much more flexibility, support async, and provide the context (the Transition, etc) necessary
23
+ * to implement meaningful application behaviors.
24
+ *
25
+ * To enable these state events, include the `stateEvents.js` file in your project, e.g.,
26
+ * ```
27
+ * <script src="stateEvents.js"></script>
28
+ * ```
29
+ * and also make sure you depend on the `ui.router.state.events` angular module, e.g.,
30
+ * ```
31
+ * angular.module("myApplication", ['ui.router', 'ui.router.state.events']
32
+ * ```
33
+ *
34
+ * @module ng1_state_events
35
+ */ /** */
36
+/**
37
+ * An event broadcast on `$rootScope` when the state transition **begins**.
38
+ *
39
+ * ### Deprecation warning: use [[TransitionService.onStart]] instead
40
+ *
41
+ * You can use `event.preventDefault()`
42
+ * to prevent the transition from happening and then the transition promise will be
43
+ * rejected with a `'transition prevented'` value.
44
+ *
45
+ * Additional arguments to the event handler are provided:
46
+ * - `toState`: the Transition Target state
47
+ * - `toParams`: the Transition Target Params
48
+ * - `fromState`: the state the transition is coming from
49
+ * - `fromParams`: the parameters from the state the transition is coming from
50
+ * - `options`: any Transition Options
51
+ * - `$transition$`: the [[Transition]]
52
+ *
53
+ * #### Example:
54
+ * ```js
55
+ * $rootScope.$on('$stateChangeStart', function(event, transition) {
56
+ *   event.preventDefault();
57
+ *   // transitionTo() promise will be rejected with
58
+ *   // a 'transition prevented' error
59
+ * })
60
+ * ```
61
+ *
62
+ * @event $stateChangeStart
63
+ * @deprecated
64
+ */
65
+var $stateChangeStart;
66
+/**
67
+ * An event broadcast on `$rootScope` if a transition is **cancelled**.
68
+ *
69
+ * ### Deprecation warning: use [[TransitionService.onStart]] instead
70
+ *
71
+ * Additional arguments to the event handler are provided:
72
+ * - `toState`: the Transition Target state
73
+ * - `toParams`: the Transition Target Params
74
+ * - `fromState`: the state the transition is coming from
75
+ * - `fromParams`: the parameters from the state the transition is coming from
76
+ * - `options`: any Transition Options
77
+ * - `$transition$`: the [[Transition]] that was cancelled
78
+ *
79
+ * @event $stateChangeCancel
80
+ * @deprecated
81
+ */
82
+var $stateChangeCancel;
83
+/**
84
+ * An event broadcast on `$rootScope` once the state transition is **complete**.
85
+ *
86
+ * ### Deprecation warning: use [[TransitionService.onStart]] and [[Transition.promise]], or [[Transition.onSuccess]]
87
+ *
88
+ * Additional arguments to the event handler are provided:
89
+ * - `toState`: the Transition Target state
90
+ * - `toParams`: the Transition Target Params
91
+ * - `fromState`: the state the transition is coming from
92
+ * - `fromParams`: the parameters from the state the transition is coming from
93
+ * - `options`: any Transition Options
94
+ * - `$transition$`: the [[Transition]] that just succeeded
95
+ *
96
+ * @event $stateChangeSuccess
97
+ * @deprecated
98
+ */
99
+var $stateChangeSuccess;
100
+/**
101
+ * An event broadcast on `$rootScope` when an **error occurs** during transition.
102
+ *
103
+ * ### Deprecation warning: use [[TransitionService.onStart]] and [[Transition.promise]], or [[Transition.onError]]
104
+ *
105
+ * It's important to note that if you
106
+ * have any errors in your resolve functions (javascript errors, non-existent services, etc)
107
+ * they will not throw traditionally. You must listen for this $stateChangeError event to
108
+ * catch **ALL** errors.
109
+ *
110
+ * Additional arguments to the event handler are provided:
111
+ * - `toState`: the Transition Target state
112
+ * - `toParams`: the Transition Target Params
113
+ * - `fromState`: the state the transition is coming from
114
+ * - `fromParams`: the parameters from the state the transition is coming from
115
+ * - `error`: The reason the transition errored.
116
+ * - `options`: any Transition Options
117
+ * - `$transition$`: the [[Transition]] that errored
118
+ *
119
+ * @event $stateChangeError
120
+ * @deprecated
121
+ */
122
+var $stateChangeError;
123
+/**
124
+ * An event broadcast on `$rootScope` when a requested state **cannot be found** using the provided state name.
125
+ *
126
+ * ### Deprecation warning: use [[StateService.onInvalid]] instead
127
+ *
128
+ * The event is broadcast allowing any handlers a single chance to deal with the error (usually by
129
+ * lazy-loading the unfound state). A `TargetState` object is passed to the listener handler,
130
+ * you can see its properties in the example. You can use `event.preventDefault()` to abort the
131
+ * transition and the promise returned from `transitionTo()` will be rejected with a
132
+ * `'transition aborted'` error.
133
+ *
134
+ * Additional arguments to the event handler are provided:
135
+ * - `unfoundState` Unfound State information. Contains: `to, toParams, options` properties.
136
+ * - `fromState`: the state the transition is coming from
137
+ * - `fromParams`: the parameters from the state the transition is coming from
138
+ * - `options`: any Transition Options
139
+ *
140
+ * #### Example:
141
+ * ```js
142
+ * // somewhere, assume lazy.state has not been defined
143
+ * $state.go("lazy.state", { a: 1, b: 2 }, { inherit: false });
144
+ *
145
+ * // somewhere else
146
+ * $scope.$on('$stateNotFound', function(event, transition) {
147
+ * function(event, unfoundState, fromState, fromParams){
148
+ *     console.log(unfoundState.to); // "lazy.state"
149
+ *     console.log(unfoundState.toParams); // {a:1, b:2}
150
+ *     console.log(unfoundState.options); // {inherit:false} + default options
151
+ * });
152
+ * ```
153
+ *
154
+ * @event $stateNotFound
155
+ * @deprecated
156
+ */
157
+var $stateNotFound;
158
+(function () {
159
+    var isFunction = ng.isFunction, isString = ng.isString;
160
+    function applyPairs(memo, keyValTuple) {
161
+        var key, value;
162
+        if (Array.isArray(keyValTuple))
163
+            key = keyValTuple[0], value = keyValTuple[1];
164
+        if (!isString(key))
165
+            throw new Error("invalid parameters to applyPairs");
166
+        memo[key] = value;
167
+        return memo;
168
+    }
169
+    function stateChangeStartHandler($transition$) {
170
+        if (!$transition$.options().notify || !$transition$.valid() || $transition$.ignored())
171
+            return;
172
+        var $injector = $transition$.injector();
173
+        var $stateEvents = $injector.get('$stateEvents');
174
+        var $rootScope = $injector.get('$rootScope');
175
+        var $state = $injector.get('$state');
176
+        var $urlRouter = $injector.get('$urlRouter');
177
+        var enabledEvents = $stateEvents.provider.enabled();
178
+        var toParams = $transition$.params("to");
179
+        var fromParams = $transition$.params("from");
180
+        if (enabledEvents.$stateChangeSuccess) {
181
+            var startEvent = $rootScope.$broadcast('$stateChangeStart', $transition$.to(), toParams, $transition$.from(), fromParams, $transition$.options(), $transition$);
182
+            if (startEvent.defaultPrevented) {
183
+                if (enabledEvents.$stateChangeCancel) {
184
+                    $rootScope.$broadcast('$stateChangeCancel', $transition$.to(), toParams, $transition$.from(), fromParams, $transition$.options(), $transition$);
185
+                }
186
+                //Don't update and resync url if there's been a new transition started. see issue #2238, #600
187
+                if ($state.transition == null)
188
+                    $urlRouter.update();
189
+                return false;
190
+            }
191
+            // right after global state is updated
192
+            var successOpts = { priority: 9999 };
193
+            $transition$.onSuccess({}, function () {
194
+                $rootScope.$broadcast('$stateChangeSuccess', $transition$.to(), toParams, $transition$.from(), fromParams, $transition$.options(), $transition$);
195
+            }, successOpts);
196
+        }
197
+        if (enabledEvents.$stateChangeError) {
198
+            $transition$.promise["catch"](function (error) {
199
+                if (error && (error.type === 2 /* RejectType.SUPERSEDED */ || error.type === 3 /* RejectType.ABORTED */))
200
+                    return;
201
+                var evt = $rootScope.$broadcast('$stateChangeError', $transition$.to(), toParams, $transition$.from(), fromParams, error, $transition$.options(), $transition$);
202
+                if (!evt.defaultPrevented) {
203
+                    $urlRouter.update();
204
+                }
205
+            });
206
+        }
207
+    }
208
+    stateNotFoundHandler.$inject = ['$to$', '$from$', '$state', '$rootScope', '$urlRouter'];
209
+    function stateNotFoundHandler($to$, $from$, injector) {
210
+        var $state = injector.get('$state');
211
+        var $rootScope = injector.get('$rootScope');
212
+        var $urlRouter = injector.get('$urlRouter');
213
+        var redirect = { to: $to$.identifier(), toParams: $to$.params(), options: $to$.options() };
214
+        var e = $rootScope.$broadcast('$stateNotFound', redirect, $from$.state(), $from$.params());
215
+        if (e.defaultPrevented || e.retry)
216
+            $urlRouter.update();
217
+        function redirectFn() {
218
+            return $state.target(redirect.to, redirect.toParams, redirect.options);
219
+        }
220
+        if (e.defaultPrevented) {
221
+            return false;
222
+        }
223
+        else if (e.retry || !!$state.get(redirect.to)) {
224
+            return e.retry && isFunction(e.retry.then) ? e.retry.then(redirectFn) : redirectFn();
225
+        }
226
+    }
227
+    $StateEventsProvider.$inject = ['$stateProvider'];
228
+    function $StateEventsProvider($stateProvider) {
229
+        $StateEventsProvider.prototype.instance = this;
230
+        var runtime = false;
231
+        var allEvents = ['$stateChangeStart', '$stateNotFound', '$stateChangeSuccess', '$stateChangeError'];
232
+        var enabledStateEvents = allEvents.map(function (e) { return [e, true]; }).reduce(applyPairs, {});
233
+        function assertNotRuntime() {
234
+            if (runtime)
235
+                throw new Error("Cannot enable events at runtime (use $stateEventsProvider");
236
+        }
237
+        /**
238
+         * Enables the deprecated UI-Router 0.2.x State Events
239
+         * [ '$stateChangeStart', '$stateNotFound', '$stateChangeSuccess', '$stateChangeError' ]
240
+         */
241
+        this.enable = function () {
242
+            var events = [];
243
+            for (var _i = 0; _i < arguments.length; _i++) {
244
+                events[_i] = arguments[_i];
245
+            }
246
+            assertNotRuntime();
247
+            if (!events || !events.length)
248
+                events = allEvents;
249
+            events.forEach(function (event) { return enabledStateEvents[event] = true; });
250
+        };
251
+        /**
252
+         * Disables the deprecated UI-Router 0.2.x State Events
253
+         * [ '$stateChangeStart', '$stateNotFound', '$stateChangeSuccess', '$stateChangeError' ]
254
+         */
255
+        this.disable = function () {
256
+            var events = [];
257
+            for (var _i = 0; _i < arguments.length; _i++) {
258
+                events[_i] = arguments[_i];
259
+            }
260
+            assertNotRuntime();
261
+            if (!events || !events.length)
262
+                events = allEvents;
263
+            events.forEach(function (event) { return delete enabledStateEvents[event]; });
264
+        };
265
+        this.enabled = function () { return enabledStateEvents; };
266
+        this.$get = $get;
267
+        $get.$inject = ['$transitions'];
268
+        function $get($transitions) {
269
+            runtime = true;
270
+            if (enabledStateEvents["$stateNotFound"])
271
+                $stateProvider.onInvalid(stateNotFoundHandler);
272
+            if (enabledStateEvents.$stateChangeStart)
273
+                $transitions.onBefore({}, stateChangeStartHandler, { priority: 1000 });
274
+            return {
275
+                provider: $StateEventsProvider.prototype.instance
276
+            };
277
+        }
278
+    }
279
+    ng.module('ui.router.state.events', ['ui.router.state'])
280
+        .provider("$stateEvents", $StateEventsProvider)
281
+        .run(['$stateEvents', function ($stateEvents) {
282
+        }]);
283
+})();
284
+
285
+exports.$stateChangeStart = $stateChangeStart;
286
+exports.$stateChangeCancel = $stateChangeCancel;
287
+exports.$stateChangeSuccess = $stateChangeSuccess;
288
+exports.$stateChangeError = $stateChangeError;
289
+exports.$stateNotFound = $stateNotFound;
290
+
291
+Object.defineProperty(exports, '__esModule', { value: true });
292
+
293
+})));
294
+//# sourceMappingURL=stateEvents.js.map

File diff suppressed because it is too large
+ 17 - 0
static/bower_components/angular-ui-router/release/stateEvents.js.map


File diff suppressed because it is too large
+ 8 - 0
static/bower_components/angular-ui-router/release/stateEvents.min.js


File diff suppressed because it is too large
+ 102 - 0
static/bower_components/angular-ui-router/release/stateEvents.min.js.map


File diff suppressed because it is too large
+ 2014 - 0
static/bower_components/angular-ui-router/release/ui-router-angularjs.js


File diff suppressed because it is too large
+ 70 - 0
static/bower_components/angular-ui-router/release/ui-router-angularjs.js.map


File diff suppressed because it is too large
+ 9 - 0
static/bower_components/angular-ui-router/release/ui-router-angularjs.min.js


File diff suppressed because it is too large
+ 541 - 0
static/bower_components/angular-ui-router/release/ui-router-angularjs.min.js.map


+ 116 - 0
static/bower_components/angular-ui-router/rollup.config.js

@@ -0,0 +1,116 @@
1
+import nodeResolve from 'rollup-plugin-node-resolve';
2
+import uglify from 'rollup-plugin-uglify';
3
+import progress from 'rollup-plugin-progress';
4
+import sourcemaps from 'rollup-plugin-sourcemaps';
5
+import visualizer from 'rollup-plugin-visualizer';
6
+
7
+const MINIFY = process.env.MINIFY;
8
+const MONOLITHIC = process.env.MONOLITHIC;
9
+const ROUTER = process.env.ROUTER;
10
+const EVENTS = process.env.EVENTS;
11
+const RESOLVE = process.env.RESOLVE;
12
+
13
+const pkg = require('./package.json');
14
+let banner =
15
+`/**
16
+ * ${pkg.description}`;
17
+if (ROUTER && MONOLITHIC) {
18
+  banner += `
19
+ * NOTICE: This monolithic bundle also bundles the @uirouter/core code.
20
+ *         This causes it to be incompatible with plugins that depend on @uirouter/core.
21
+ *         We recommend switching to the ui-router-core.js and ui-router-angularjs.js bundles instead.
22
+ *         For more information, see https://ui-router.github.io/blog/uirouter-for-angularjs-umd-bundles`
23
+} else if (ROUTER) {
24
+  banner += `
25
+ * This bundle requires the ui-router-core.js bundle from the @uirouter/core package.`
26
+}
27
+banner += `
28
+ * @version v${pkg.version}
29
+ * @link ${pkg.homepage}
30
+ * @license MIT License, http://www.opensource.org/licenses/MIT
31
+ */`;
32
+
33
+const uglifyOpts = { output: {} };
34
+// retain multiline comment with @license
35
+uglifyOpts.output.comments = (node, comment) =>
36
+comment.type === 'comment2' && /@license/i.test(comment.value);
37
+
38
+const onwarn = (warning) => {
39
+  // Suppress this error message... https://github.com/rollup/rollup/wiki/Troubleshooting#this-is-undefined
40
+  const ignores = ['THIS_IS_UNDEFINED'];
41
+  if (!ignores.some(code => code === warning.code)) {
42
+    console.error(warning.message);
43
+  }
44
+};
45
+
46
+const plugins = [
47
+  nodeResolve({jsnext: true}),
48
+  progress({ clearLine: false }),
49
+  sourcemaps(),
50
+];
51
+
52
+if (MINIFY) plugins.push(uglify(uglifyOpts));
53
+if (ROUTER && MINIFY) plugins.push(visualizer({ sourcemap: true }));
54
+
55
+const extension = MINIFY ? ".min.js" : ".js";
56
+
57
+const BASE_CONFIG = {
58
+  sourcemap: true,
59
+  exports: 'named',
60
+  plugins: plugins,
61
+  banner: banner,
62
+  onwarn: onwarn,
63
+};
64
+
65
+const ROUTER_CONFIG = Object.assign({
66
+  input: 'lib-esm/index.js',
67
+  external: ['angular', '@uirouter/core'],
68
+  output: {
69
+    file: 'release/ui-router-angularjs' + extension,
70
+    format: 'umd',
71
+    name: '@uirouter/angularjs',
72
+    globals: { angular: 'angular', '@uirouter/core': '@uirouter/core' },
73
+  },
74
+}, BASE_CONFIG);
75
+
76
+// Also bundles the code from @uirouter/core into the same bundle
77
+const MONOLITHIC_ROUTER_CONFIG = Object.assign({
78
+  input: 'lib-esm/index.js',
79
+  external: 'angular',
80
+  output: {
81
+    file: 'release/angular-ui-router' + extension,
82
+    format: 'umd',
83
+    name: '@uirouter/angularjs',
84
+    globals: { angular: 'angular' },
85
+  },
86
+}, BASE_CONFIG);
87
+
88
+const EVENTS_CONFIG = Object.assign({}, BASE_CONFIG, {
89
+  input: 'lib-esm/legacy/stateEvents.js',
90
+  external: ['angular', '@uirouter/core'],
91
+  output: {
92
+    file: 'release/stateEvents' + extension,
93
+    format: 'umd',
94
+    name: '@uirouter/angularjs-state-events',
95
+    globals: { angular: 'angular', '@uirouter/core': '@uirouter/core' },
96
+  },
97
+});
98
+
99
+const RESOLVE_CONFIG = Object.assign({}, BASE_CONFIG, {
100
+  input: 'lib-esm/legacy/resolveService.js',
101
+  external: ['angular', '@uirouter/core'],
102
+  output: {
103
+    file: 'release/resolveService' + extension,
104
+    format: 'umd',
105
+    name: '@uirouter/angularjs-resolve-service',
106
+    globals: { angular: 'angular', '@uirouter/core': '@uirouter/core' },
107
+  },
108
+});
109
+
110
+const CONFIG =
111
+    RESOLVE ? RESOLVE_CONFIG :
112
+    EVENTS ? EVENTS_CONFIG :
113
+    MONOLITHIC ? MONOLITHIC_ROUTER_CONFIG :
114
+    ROUTER ? ROUTER_CONFIG : ROUTER_CONFIG;
115
+
116
+export default CONFIG;

+ 60 - 0
static/bower_components/angular-ui-router/tslint.json

@@ -0,0 +1,60 @@
1
+{ 
2
+  "rules": {
3
+    "align": [true, "parameters", "statements"],
4
+    "ban": false,
5
+    "class-name": true,
6
+    "comment-format": [false, "check-space", "check-lowercase" ],
7
+    "curly": false,
8
+    "eofline": false,
9
+    "forin": true,
10
+    "indent": [true, "spaces"],
11
+    "interface-name": false,
12
+    "jsdoc-format": true,
13
+    "label-position": true,
14
+    "label-undefined": true,
15
+    "max-line-length": [true, 180],
16
+    "member-access": false,
17
+    "member-ordering": [false, "public-before-private", "static-before-instance", "variables-before-functions" ],
18
+    "no-any": false,
19
+    "no-arg": true,
20
+    "no-bitwise": true,
21
+    "no-conditional-assignment": true,
22
+    "no-console": [true, "debug", "info", "time", "timeEnd", "trace" ],
23
+    "no-construct": true,
24
+    "no-constructor-vars": false,
25
+    "no-debugger": true,
26
+    "no-duplicate-key": true,
27
+    "no-shadowed-variable": true,
28
+    "no-duplicate-variable": true,
29
+    "no-empty": false,
30
+    "no-eval": true,
31
+    "no-internal-module": true,
32
+    "no-require-imports": true,
33
+    "no-string-literal": false,
34
+    "no-switch-case-fall-through": true,
35
+    "no-trailing-comma": true,
36
+    "no-trailing-whitespace": false,
37
+    "no-unreachable": true,
38
+    "no-unused-expression": [true, "allow-fast-null-checks"],
39
+    "no-unused-variable": true,
40
+    "no-use-before-declare": true,
41
+    "no-var-keyword": true,
42
+    "no-var-requires": true,
43
+    "one-line": [true, "check-open-brace", "check-catch", "check-else", "check-whitespace" ],
44
+    "quotemark": [false, "double"],
45
+    "radix": true,
46
+    "semicolon": true,
47
+    "switch-default": true,
48
+    "triple-equals": [true, "allow-null-check"],
49
+    "typedef": [false, "call-signature", "parameter", "property-declaration", "variable-declaration", "member-variable-declaration" ],
50
+    "typedef-whitespace": [true, {
51
+        "call-signature": "nospace",
52
+        "index-signature": "nospace",
53
+        "parameter": "nospace",
54
+        "variable-declaration": "nospace"
55
+    }],
56
+    "use-strict": [false, "check-module", "check-function" ],
57
+    "variable-name": false,
58
+    "whitespace": [true, "check-branch", "check-decl", "check-operator", "check-separator", "check-type" ]
59
+}
60
+}

File diff suppressed because it is too large
+ 3984 - 0
static/bower_components/angular-ui-router/yarn.lock


+ 18 - 0
static/bower_components/angular/.bower.json

@@ -0,0 +1,18 @@
1
+{
2
+  "name": "angular",
3
+  "version": "1.6.6",
4
+  "license": "MIT",
5
+  "main": "./angular.js",
6
+  "ignore": [],
7
+  "dependencies": {},
8
+  "homepage": "https://github.com/angular/bower-angular",
9
+  "_release": "1.6.6",
10
+  "_resolution": {
11
+    "type": "version",
12
+    "tag": "v1.6.6",
13
+    "commit": "928fe478bd68d049ff9863dc51814eac24d33b9a"
14
+  },
15
+  "_source": "https://github.com/angular/bower-angular.git",
16
+  "_target": ">= 1.2.0",
17
+  "_originalSource": "angular"
18
+}

+ 21 - 0
static/bower_components/angular/LICENSE.md

@@ -0,0 +1,21 @@
1
+The MIT License (MIT)
2
+
3
+Copyright (c) 2016 Angular
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.

+ 64 - 0
static/bower_components/angular/README.md

@@ -0,0 +1,64 @@
1
+# packaged angular
2
+
3
+This repo is for distribution on `npm` and `bower`. The source for this module is in the
4
+[main AngularJS repo](https://github.com/angular/angular.js).
5
+Please file issues and pull requests against that repo.
6
+
7
+## Install
8
+
9
+You can install this package either with `npm` or with `bower`.
10
+
11
+### npm
12
+
13
+```shell
14
+npm install angular
15
+```
16
+
17
+Then add a `<script>` to your `index.html`:
18
+
19
+```html
20
+<script src="/node_modules/angular/angular.js"></script>
21
+```
22
+
23
+Or `require('angular')` from your code.
24
+
25
+### bower
26
+
27
+```shell
28
+bower install angular
29
+```
30
+
31
+Then add a `<script>` to your `index.html`:
32
+
33
+```html
34
+<script src="/bower_components/angular/angular.js"></script>
35
+```
36
+
37
+## Documentation
38
+
39
+Documentation is available on the
40
+[AngularJS docs site](http://docs.angularjs.org/).
41
+
42
+## License
43
+
44
+The MIT License
45
+
46
+Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
47
+
48
+Permission is hereby granted, free of charge, to any person obtaining a copy
49
+of this software and associated documentation files (the "Software"), to deal
50
+in the Software without restriction, including without limitation the rights
51
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
52
+copies of the Software, and to permit persons to whom the Software is
53
+furnished to do so, subject to the following conditions:
54
+
55
+The above copyright notice and this permission notice shall be included in
56
+all copies or substantial portions of the Software.
57
+
58
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
59
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
60
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
61
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
62
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
63
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
64
+THE SOFTWARE.

+ 21 - 0
static/bower_components/angular/angular-csp.css

@@ -0,0 +1,21 @@
1
+/* Include this file in your html if you are using the CSP mode. */
2
+
3
+@charset "UTF-8";
4
+
5
+[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],
6
+.ng-cloak, .x-ng-cloak,
7
+.ng-hide:not(.ng-hide-animate) {
8
+  display: none !important;
9
+}
10
+
11
+ng\:form {
12
+  display: block;
13
+}
14
+
15
+.ng-animate-shim {
16
+  visibility:hidden;
17
+}
18
+
19
+.ng-anchor {
20
+  position:absolute;
21
+}

File diff suppressed because it is too large
+ 33889 - 0
static/bower_components/angular/angular.js


File diff suppressed because it is too large
+ 335 - 0
static/bower_components/angular/angular.min.js


BIN
static/bower_components/angular/angular.min.js.gzip


File diff suppressed because it is too large
+ 8 - 0
static/bower_components/angular/angular.min.js.map


+ 9 - 0
static/bower_components/angular/bower.json

@@ -0,0 +1,9 @@
1
+{
2
+  "name": "angular",
3
+  "version": "1.6.6",
4
+  "license": "MIT",
5
+  "main": "./angular.js",
6
+  "ignore": [],
7
+  "dependencies": {
8
+  }
9
+}

+ 2 - 0
static/bower_components/angular/index.js

@@ -0,0 +1,2 @@
1
+require('./angular');
2
+module.exports = angular;

+ 25 - 0
static/bower_components/angular/package.json

@@ -0,0 +1,25 @@
1
+{
2
+  "name": "angular",
3
+  "version": "1.6.6",
4
+  "description": "HTML enhanced for web apps",
5
+  "main": "index.js",
6
+  "scripts": {
7
+    "test": "echo \"Error: no test specified\" && exit 1"
8
+  },
9
+  "repository": {
10
+    "type": "git",
11
+    "url": "https://github.com/angular/angular.js.git"
12
+  },
13
+  "keywords": [
14
+    "angular",
15
+    "framework",
16
+    "browser",
17
+    "client-side"
18
+  ],
19
+  "author": "Angular Core Team <angular-core+npm@google.com>",
20
+  "license": "MIT",
21
+  "bugs": {
22
+    "url": "https://github.com/angular/angular.js/issues"
23
+  },
24
+  "homepage": "http://angularjs.org"
25
+}

+ 25 - 0
static/bower_components/jquery/.bower.json

@@ -0,0 +1,25 @@
1
+{
2
+  "name": "jquery",
3
+  "main": "dist/jquery.js",
4
+  "license": "MIT",
5
+  "ignore": [
6
+    "package.json"
7
+  ],
8
+  "keywords": [
9
+    "jquery",
10
+    "javascript",
11
+    "browser",
12
+    "library"
13
+  ],
14
+  "homepage": "https://github.com/jquery/jquery-dist",
15
+  "version": "3.2.1",
16
+  "_release": "3.2.1",
17
+  "_resolution": {
18
+    "type": "version",
19
+    "tag": "3.2.1",
20
+    "commit": "77d2a51d0520d2ee44173afdf4e40a9201f5964e"
21
+  },
22
+  "_source": "https://github.com/jquery/jquery-dist.git",
23
+  "_target": ">=1.7",
24
+  "_originalSource": "jquery"
25
+}

+ 301 - 0
static/bower_components/jquery/AUTHORS.txt

@@ -0,0 +1,301 @@
1
+Authors ordered by first contribution.
2
+
3
+John Resig <jeresig@gmail.com>
4
+Gilles van den Hoven <gilles0181@gmail.com>
5
+Michael Geary <mike@geary.com>
6
+Stefan Petre <stefan.petre@gmail.com>
7
+Yehuda Katz <wycats@gmail.com>
8
+Corey Jewett <cj@syntheticplayground.com>
9
+Klaus Hartl <klaus.hartl@gmail.com>
10
+Franck Marcia <franck.marcia@gmail.com>
11
+Jörn Zaefferer <joern.zaefferer@gmail.com>
12
+Paul Bakaus <paul.bakaus@gmail.com>
13
+Brandon Aaron <brandon.aaron@gmail.com>
14
+Mike Alsup <malsup@gmail.com>
15
+Dave Methvin <dave.methvin@gmail.com>
16
+Ed Engelhardt <edengelhardt@gmail.com>
17
+Sean Catchpole <littlecooldude@gmail.com>
18
+Paul Mclanahan <pmclanahan@gmail.com>
19
+David Serduke <davidserduke@gmail.com>
20
+Richard D. Worth <rdworth@gmail.com>
21
+Scott González <scott.gonzalez@gmail.com>
22
+Ariel Flesler <aflesler@gmail.com>
23
+Jon Evans <jon@springyweb.com>
24
+TJ Holowaychuk <tj@vision-media.ca>
25
+Michael Bensoussan <mickey@seesmic.com>
26
+Robert Katić <robert.katic@gmail.com>
27
+Louis-Rémi Babé <lrbabe@gmail.com>
28
+Earle Castledine <mrspeaker@gmail.com>
29
+Damian Janowski <damian.janowski@gmail.com>
30
+Rich Dougherty <rich@rd.gen.nz>
31
+Kim Dalsgaard <kim@kimdalsgaard.com>
32
+Andrea Giammarchi <andrea.giammarchi@gmail.com>
33
+Mark Gibson <jollytoad@gmail.com>
34
+Karl Swedberg <kswedberg@gmail.com>
35
+Justin Meyer <justinbmeyer@gmail.com>
36
+Ben Alman <cowboy@rj3.net>
37
+James Padolsey <cla@padolsey.net>
38
+David Petersen <public@petersendidit.com>
39
+Batiste Bieler <batiste.bieler@gmail.com>
40
+Alexander Farkas <info@corrupt-system.de>
41
+Rick Waldron <waldron.rick@gmail.com>
42
+Filipe Fortes <filipe@fortes.com>
43
+Neeraj Singh <neerajdotname@gmail.com>
44
+Paul Irish <paul.irish@gmail.com>
45
+Iraê Carvalho <irae@irae.pro.br>
46
+Matt Curry <matt@pseudocoder.com>
47
+Michael Monteleone <michael@michaelmonteleone.net>
48
+Noah Sloan <noah.sloan@gmail.com>
49
+Tom Viner <github@viner.tv>
50
+Douglas Neiner <doug@dougneiner.com>
51
+Adam J. Sontag <ajpiano@ajpiano.com>
52
+Dave Reed <dareed@microsoft.com>
53
+Ralph Whitbeck <ralph.whitbeck@gmail.com>
54
+Carl Fürstenberg <azatoth@gmail.com>
55
+Jacob Wright <jacwright@gmail.com>
56
+J. Ryan Stinnett <jryans@gmail.com>
57
+unknown <Igen005@.upcorp.ad.uprr.com>
58
+temp01 <temp01irc@gmail.com>
59
+Heungsub Lee <h@subl.ee>
60
+Colin Snover <github.com@zetafleet.com>
61
+Ryan W Tenney <ryan@10e.us>
62
+Pinhook <contact@pinhooklabs.com>
63
+Ron Otten <r.j.g.otten@gmail.com>
64
+Jephte Clain <Jephte.Clain@univ-reunion.fr>
65
+Anton Matzneller <obhvsbypqghgc@gmail.com>
66
+Alex Sexton <AlexSexton@gmail.com>
67
+Dan Heberden <danheberden@gmail.com>
68
+Henri Wiechers <hwiechers@gmail.com>
69
+Russell Holbrook <russell.holbrook@patch.com>
70
+Julian Aubourg <aubourg.julian@gmail.com>
71
+Gianni Alessandro Chiappetta <gianni@runlevel6.org>
72
+Scott Jehl <scottjehl@gmail.com>
73
+James Burke <jrburke@gmail.com>
74
+Jonas Pfenniger <jonas@pfenniger.name>
75
+Xavi Ramirez <xavi.rmz@gmail.com>
76
+Jared Grippe <jared@deadlyicon.com>
77
+Sylvester Keil <sylvester@keil.or.at>
78
+Brandon Sterne <bsterne@mozilla.com>
79
+Mathias Bynens <mathias@qiwi.be>
80
+Timmy Willison <4timmywil@gmail.com>
81
+Corey Frang <gnarf37@gmail.com>
82
+Digitalxero <digitalxero>
83
+Anton Kovalyov <anton@kovalyov.net>
84
+David Murdoch <david@davidmurdoch.com>
85
+Josh Varner <josh.varner@gmail.com>
86
+Charles McNulty <cmcnulty@kznf.com>
87
+Jordan Boesch <jboesch26@gmail.com>
88
+Jess Thrysoee <jess@thrysoee.dk>
89
+Michael Murray <m@murz.net>
90
+Lee Carpenter <elcarpie@gmail.com>
91
+Alexis Abril <me@alexisabril.com>
92
+Rob Morgan <robbym@gmail.com>
93
+John Firebaugh <john_firebaugh@bigfix.com>
94
+Sam Bisbee <sam@sbisbee.com>
95
+Gilmore Davidson <gilmoreorless@gmail.com>
96
+Brian Brennan <me@brianlovesthings.com>
97
+Xavier Montillet <xavierm02.net@gmail.com>
98
+Daniel Pihlstrom <sciolist.se@gmail.com>
99
+Sahab Yazdani <sahab.yazdani+github@gmail.com>
100
+avaly <github-com@agachi.name>
101
+Scott Hughes <hi@scott-hughes.me>
102
+Mike Sherov <mike.sherov@gmail.com>
103
+Greg Hazel <ghazel@gmail.com>
104
+Schalk Neethling <schalk@ossreleasefeed.com>
105
+Denis Knauf <Denis.Knauf@gmail.com>
106
+Timo Tijhof <krinklemail@gmail.com>
107
+Steen Nielsen <swinedk@gmail.com>
108
+Anton Ryzhov <anton@ryzhov.me>
109
+Shi Chuan <shichuanr@gmail.com>
110
+Berker Peksag <berker.peksag@gmail.com>
111
+Toby Brain <tobyb@freshview.com>
112
+Matt Mueller <mattmuelle@gmail.com>
113
+Justin <drakefjustin@gmail.com>
114
+Daniel Herman <daniel.c.herman@gmail.com>
115
+Oleg Gaidarenko <markelog@gmail.com>
116
+Richard Gibson <richard.gibson@gmail.com>
117
+Rafaël Blais Masson <rafbmasson@gmail.com>
118
+cmc3cn <59194618@qq.com>
119
+Joe Presbrey <presbrey@gmail.com>
120
+Sindre Sorhus <sindresorhus@gmail.com>
121
+Arne de Bree <arne@bukkie.nl>
122
+Vladislav Zarakovsky <vlad.zar@gmail.com>
123
+Andrew E Monat <amonat@gmail.com>
124
+Oskari <admin@o-programs.com>
125
+Joao Henrique de Andrade Bruni <joaohbruni@yahoo.com.br>
126
+tsinha <tsinha@Anthonys-MacBook-Pro.local>
127
+Matt Farmer <matt@frmr.me>
128
+Trey Hunner <treyhunner@gmail.com>
129
+Jason Moon <jmoon@socialcast.com>
130
+Jeffery To <jeffery.to@gmail.com>
131
+Kris Borchers <kris.borchers@gmail.com>
132
+Vladimir Zhuravlev <private.face@gmail.com>
133
+Jacob Thornton <jacobthornton@gmail.com>
134
+Chad Killingsworth <chadkillingsworth@missouristate.edu>
135
+Nowres Rafid <nowres.rafed@gmail.com>
136
+David Benjamin <davidben@mit.edu>
137
+Uri Gilad <antishok@gmail.com>
138
+Chris Faulkner <thefaulkner@gmail.com>
139
+Elijah Manor <elijah.manor@gmail.com>
140
+Daniel Chatfield <chatfielddaniel@gmail.com>
141
+Nikita Govorov <nikita.govorov@gmail.com>
142
+Wesley Walser <waw325@gmail.com>
143
+Mike Pennisi <mike@mikepennisi.com>
144
+Markus Staab <markus.staab@redaxo.de>
145
+Dave Riddle <david@joyvuu.com>
146
+Callum Macrae <callum@lynxphp.com>
147
+Benjamin Truyman <bentruyman@gmail.com>
148
+James Huston <james@jameshuston.net>
149
+Erick Ruiz de Chávez <erickrdch@gmail.com>
150
+David Bonner <dbonner@cogolabs.com>
151
+Akintayo Akinwunmi <aakinwunmi@judge.com>
152
+MORGAN <morgan@morgangraphics.com>
153
+Ismail Khair <ismail.khair@gmail.com>
154
+Carl Danley <carldanley@gmail.com>
155
+Mike Petrovich <michael.c.petrovich@gmail.com>
156
+Greg Lavallee <greglavallee@wapolabs.com>
157
+Daniel Gálvez <dgalvez@editablething.com>
158
+Sai Lung Wong <sai.wong@huffingtonpost.com>
159
+Tom H Fuertes <TomFuertes@gmail.com>
160
+Roland Eckl <eckl.roland@googlemail.com>
161
+Jay Merrifield <fracmak@gmail.com>
162
+Allen J Schmidt Jr <cobrasoft@gmail.com>
163
+Jonathan Sampson <jjdsampson@gmail.com>
164
+Marcel Greter <marcel.greter@ocbnet.ch>
165
+Matthias Jäggli <matthias.jaeggli@gmail.com>
166
+David Fox <dfoxinator@gmail.com>
167
+Yiming He <yiminghe@gmail.com>
168
+Devin Cooper <cooper.semantics@gmail.com>
169
+Paul Ramos <paul.b.ramos@gmail.com>
170
+Rod Vagg <rod@vagg.org>
171
+Bennett Sorbo <bsorbo@gmail.com>
172
+Sebastian Burkhard <sebi.burkhard@gmail.com>
173
+Zachary Adam Kaplan <razic@viralkitty.com>
174
+nanto_vi <nanto@moon.email.ne.jp>
175
+nanto <nanto@moon.email.ne.jp>
176
+Danil Somsikov <danilasomsikov@gmail.com>
177
+Ryunosuke SATO <tricknotes.rs@gmail.com>
178
+Jean Boussier <jean.boussier@gmail.com>
179
+Adam Coulombe <me@adam.co>
180
+Andrew Plummer <plummer.andrew@gmail.com>
181
+Mark Raddatz <mraddatz@gmail.com>
182
+Isaac Z. Schlueter <i@izs.me>
183
+Karl Sieburg <ksieburg@yahoo.com>
184
+Pascal Borreli <pascal@borreli.com>
185
+Nguyen Phuc Lam <ruado1987@gmail.com>
186
+Dmitry Gusev <dmitry.gusev@gmail.com>
187
+Michał Gołębiowski <m.goleb@gmail.com>
188
+Li Xudong <istonelee@gmail.com>
189
+Steven Benner <admin@stevenbenner.com>
190
+Tom H Fuertes <tomfuertes@gmail.com>
191
+Renato Oliveira dos Santos <ros3@cin.ufpe.br>
192
+ros3cin <ros3@cin.ufpe.br>
193
+Jason Bedard <jason+jquery@jbedard.ca>
194
+Kyle Robinson Young <kyle@dontkry.com>
195
+Chris Talkington <chris@talkingtontech.com>
196
+Eddie Monge <eddie@eddiemonge.com>
197
+Terry Jones <terry@jon.es>
198
+Jason Merino <jasonmerino@gmail.com>
199
+Jeremy Dunck <jdunck@gmail.com>
200
+Chris Price <price.c@gmail.com>
201
+Guy Bedford <guybedford@gmail.com>
202
+Amey Sakhadeo <me@ameyms.com>
203
+Mike Sidorov <mikes.ekb@gmail.com>
204
+Anthony Ryan <anthonyryan1@gmail.com>
205
+Dominik D. Geyer <dominik.geyer@gmail.com>
206
+George Kats <katsgeorgeek@gmail.com>
207
+Lihan Li <frankieteardrop@gmail.com>
208
+Ronny Springer <springer.ronny@gmail.com>
209
+Chris Antaki <ChrisAntaki@gmail.com>
210
+Marian Sollmann <marian.sollmann@cargomedia.ch>
211
+njhamann <njhamann@gmail.com>
212
+Ilya Kantor <iliakan@gmail.com>
213
+David Hong <d.hong@me.com>
214
+John Paul <john@johnkpaul.com>
215
+Jakob Stoeck <jakob@pokermania.de>
216
+Christopher Jones <chris@cjqed.com>
217
+Forbes Lindesay <forbes@lindesay.co.uk>
218
+S. Andrew Sheppard <andrew@wq.io>
219
+Leonardo Balter <leonardo.balter@gmail.com>
220
+Roman Reiß <me@silverwind.io>
221
+Benjy Cui <benjytrys@gmail.com>
222
+Rodrigo Rosenfeld Rosas <rr.rosas@gmail.com>
223
+John Hoven <hovenj@gmail.com>
224
+Philip Jägenstedt <philip@foolip.org>
225
+Christian Kosmowski <ksmwsk@gmail.com>
226
+Liang Peng <poppinlp@gmail.com>
227
+TJ VanToll <tj.vantoll@gmail.com>
228
+Senya Pugach <upisfree@outlook.com>
229
+Aurelio De Rosa <aurelioderosa@gmail.com>
230
+Nazar Mokrynskyi <nazar@mokrynskyi.com>
231
+Amit Merchant <bullredeyes@gmail.com>
232
+Jason Bedard <jason+github@jbedard.ca>
233
+Arthur Verschaeve <contact@arthurverschaeve.be>
234
+Dan Hart <danhart@notonthehighstreet.com>
235
+Bin Xin <rhyzix@gmail.com>
236
+David Corbacho <davidcorbacho@gmail.com>
237
+Veaceslav Grimalschi <grimalschi@yandex.ru>
238
+Daniel Husar <dano.husar@gmail.com>
239
+Frederic Hemberger <mail@frederic-hemberger.de>
240
+Ben Toews <mastahyeti@gmail.com>
241
+Aditya Raghavan <araghavan3@gmail.com>
242
+Victor Homyakov <vkhomyackov@gmail.com>
243
+Shivaji Varma <contact@shivajivarma.com>
244
+Nicolas HENRY <icewil@gmail.com>
245
+Anne-Gaelle Colom <coloma@westminster.ac.uk>
246
+George Mauer <gmauer@gmail.com>
247
+Leonardo Braga <leonardo.braga@gmail.com>
248
+Stephen Edgar <stephen@netweb.com.au>
249
+Thomas Tortorini <thomastortorini@gmail.com>
250
+Winston Howes <winstonhowes@gmail.com>
251
+Jon Hester <jon.d.hester@gmail.com>
252
+Alexander O'Mara <me@alexomara.com>
253
+Bastian Buchholz <buchholz.bastian@googlemail.com>
254
+Arthur Stolyar <nekr.fabula@gmail.com>
255
+Calvin Metcalf <calvin.metcalf@gmail.com>
256
+Mu Haibao <mhbseal@163.com>
257
+Richard McDaniel <rm0026@uah.edu>
258
+Chris Rebert <github@rebertia.com>
259
+Gabriel Schulhof <gabriel.schulhof@intel.com>
260
+Gilad Peleg <giladp007@gmail.com>
261
+Martin Naumann <martin@geekonaut.de>
262
+Marek Lewandowski <m.lewandowski@cksource.com>
263
+Bruno Pérel <brunoperel@gmail.com>
264
+Reed Loden <reed@reedloden.com>
265
+Daniel Nill <daniellnill@gmail.com>
266
+Yongwoo Jeon <yongwoo.jeon@navercorp.com>
267
+Sean Henderson <seanh.za@gmail.com>
268
+Richard Kraaijenhagen <stdin+git@riichard.com>
269
+Connor Atherton <c.liam.atherton@gmail.com>
270
+Gary Ye <garysye@gmail.com>
271
+Christian Grete <webmaster@christiangrete.com>
272
+Liza Ramo <liza.h.ramo@gmail.com>
273
+Julian Alexander Murillo <julian.alexander.murillo@gmail.com>
274
+Joelle Fleurantin <joasqueeniebee@gmail.com>
275
+Jae Sung Park <alberto.park@gmail.com>
276
+Jun Sun <klsforever@gmail.com>
277
+Josh Soref <apache@soref.com>
278
+Henry Wong <henryw4k@gmail.com>
279
+Jon Dufresne <jon.dufresne@gmail.com>
280
+Martijn W. van der Lee <martijn@vanderlee.com>
281
+Devin Wilson <dwilson6.github@gmail.com>
282
+Steve Mao <maochenyan@gmail.com>
283
+Zack Hall <zackhall@outlook.com>
284
+Bernhard M. Wiedemann <jquerybmw@lsmod.de>
285
+Todor Prikumov <tono_pr@abv.bg>
286
+Jha Naman <createnaman@gmail.com>
287
+William Robinet <william.robinet@conostix.com>
288
+Alexander Lisianoi <all3fox@gmail.com>
289
+Vitaliy Terziev <vitaliyterziev@gmail.com>
290
+Joe Trumbull <trumbull.j@gmail.com>
291
+Alexander K <xpyro@ya.ru>
292
+Damian Senn <jquery@topaxi.codes>
293
+Ralin Chimev <ralin.chimev@gmail.com>
294
+Felipe Sateler <fsateler@gmail.com>
295
+Christophe Tafani-Dereeper <christophetd@hotmail.fr>
296
+Manoj Kumar <nithmanoj@gmail.com>
297
+David Broder-Rodgers <broder93@gmail.com>
298
+Alex Louden <alex@louden.com>
299
+Alex Padilla <alexonezero@outlook.com>
300
+南漂一卒 <shiy007@qq.com>
301
+karan-96 <karanbatra96@gmail.com>

+ 36 - 0
static/bower_components/jquery/LICENSE.txt

@@ -0,0 +1,36 @@
1
+Copyright JS Foundation and other contributors, https://js.foundation/
2
+
3
+This software consists of voluntary contributions made by many
4
+individuals. For exact contribution history, see the revision history
5
+available at https://github.com/jquery/jquery
6
+
7
+The following license applies to all parts of this software except as
8
+documented below:
9
+
10
+====
11
+
12
+Permission is hereby granted, free of charge, to any person obtaining
13
+a copy of this software and associated documentation files (the
14
+"Software"), to deal in the Software without restriction, including
15
+without limitation the rights to use, copy, modify, merge, publish,
16
+distribute, sublicense, and/or sell copies of the Software, and to
17
+permit persons to whom the Software is furnished to do so, subject to
18
+the following conditions:
19
+
20
+The above copyright notice and this permission notice shall be
21
+included in all copies or substantial portions of the Software.
22
+
23
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
+
31
+====
32
+
33
+All files located in the node_modules and external directories are
34
+externally maintained libraries used by this software which have their
35
+own licenses; we recommend you read them, as their terms may differ from
36
+the terms above.

+ 67 - 0
static/bower_components/jquery/README.md

@@ -0,0 +1,67 @@
1
+# jQuery
2
+
3
+> jQuery is a fast, small, and feature-rich JavaScript library.
4
+
5
+For information on how to get started and how to use jQuery, please see [jQuery's documentation](http://api.jquery.com/).
6
+For source files and issues, please visit the [jQuery repo](https://github.com/jquery/jquery).
7
+
8
+If upgrading, please see the [blog post for 3.2.1](https://blog.jquery.com/2017/03/20/jquery-3-2-1-now-available/). This includes notable differences from the previous version and a more readable changelog.
9
+
10
+## Including jQuery
11
+
12
+Below are some of the most common ways to include jQuery.
13
+
14
+### Browser
15
+
16
+#### Script tag
17
+
18
+```html
19
+<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
20
+```
21
+
22
+#### Babel
23
+
24
+[Babel](http://babeljs.io/) is a next generation JavaScript compiler. One of the features is the ability to use ES6/ES2015 modules now, even though browsers do not yet support this feature natively.
25
+
26
+```js
27
+import $ from "jquery";
28
+```
29
+
30
+#### Browserify/Webpack
31
+
32
+There are several ways to use [Browserify](http://browserify.org/) and [Webpack](https://webpack.github.io/). For more information on using these tools, please refer to the corresponding project's documention. In the script, including jQuery will usually look like this...
33
+
34
+```js
35
+var $ = require("jquery");
36
+```
37
+
38
+#### AMD (Asynchronous Module Definition)
39
+
40
+AMD is a module format built for the browser. For more information, we recommend [require.js' documentation](http://requirejs.org/docs/whyamd.html).
41
+
42
+```js
43
+define(["jquery"], function($) {
44
+
45
+});
46
+```
47
+
48
+### Node
49
+
50
+To include jQuery in [Node](nodejs.org), first install with npm.
51
+
52
+```sh
53
+npm install jquery
54
+```
55
+
56
+For jQuery to work in Node, a window with a document is required. Since no such window exists natively in Node, one can be mocked by tools such as [jsdom](https://github.com/tmpvar/jsdom). This can be useful for testing purposes.
57
+
58
+```js
59
+require("jsdom").env("", function(err, window) {
60
+	if (err) {
61
+		console.error(err);
62
+		return;
63
+	}
64
+
65
+	var $ = require("jquery")(window);
66
+});
67
+```

+ 14 - 0
static/bower_components/jquery/bower.json

@@ -0,0 +1,14 @@
1
+{
2
+  "name": "jquery",
3
+  "main": "dist/jquery.js",
4
+  "license": "MIT",
5
+  "ignore": [
6
+    "package.json"
7
+  ],
8
+  "keywords": [
9
+    "jquery",
10
+    "javascript",
11
+    "browser",
12
+    "library"
13
+  ]
14
+}

+ 476 - 0
static/bower_components/jquery/dist/core.js

@@ -0,0 +1,476 @@
1
+/* global Symbol */
2
+// Defining this global in .eslintrc.json would create a danger of using the global
3
+// unguarded in another place, it seems safer to define global only for this module
4
+
5
+define( [
6
+	"./var/arr",
7
+	"./var/document",
8
+	"./var/getProto",
9
+	"./var/slice",
10
+	"./var/concat",
11
+	"./var/push",
12
+	"./var/indexOf",
13
+	"./var/class2type",
14
+	"./var/toString",
15
+	"./var/hasOwn",
16
+	"./var/fnToString",
17
+	"./var/ObjectFunctionString",
18
+	"./var/support",
19
+	"./core/DOMEval"
20
+], function( arr, document, getProto, slice, concat, push, indexOf,
21
+	class2type, toString, hasOwn, fnToString, ObjectFunctionString,
22
+	support, DOMEval ) {
23
+
24
+"use strict";
25
+
26
+var
27
+	version = "3.2.1",
28
+
29
+	// Define a local copy of jQuery
30
+	jQuery = function( selector, context ) {
31
+
32
+		// The jQuery object is actually just the init constructor 'enhanced'
33
+		// Need init if jQuery is called (just allow error to be thrown if not included)
34
+		return new jQuery.fn.init( selector, context );
35
+	},
36
+
37
+	// Support: Android <=4.0 only
38
+	// Make sure we trim BOM and NBSP
39
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
40
+
41
+	// Matches dashed string for camelizing
42
+	rmsPrefix = /^-ms-/,
43
+	rdashAlpha = /-([a-z])/g,
44
+
45
+	// Used by jQuery.camelCase as callback to replace()
46
+	fcamelCase = function( all, letter ) {
47
+		return letter.toUpperCase();
48
+	};
49
+
50
+jQuery.fn = jQuery.prototype = {
51
+
52
+	// The current version of jQuery being used
53
+	jquery: version,
54
+
55
+	constructor: jQuery,
56
+
57
+	// The default length of a jQuery object is 0
58
+	length: 0,
59
+
60
+	toArray: function() {
61
+		return slice.call( this );
62
+	},
63
+
64
+	// Get the Nth element in the matched element set OR
65
+	// Get the whole matched element set as a clean array
66
+	get: function( num ) {
67
+
68
+		// Return all the elements in a clean array
69
+		if ( num == null ) {
70
+			return slice.call( this );
71
+		}
72
+
73
+		// Return just the one element from the set
74
+		return num < 0 ? this[ num + this.length ] : this[ num ];
75
+	},
76
+
77
+	// Take an array of elements and push it onto the stack
78
+	// (returning the new matched element set)
79
+	pushStack: function( elems ) {
80
+
81
+		// Build a new jQuery matched element set
82
+		var ret = jQuery.merge( this.constructor(), elems );
83
+
84
+		// Add the old object onto the stack (as a reference)
85
+		ret.prevObject = this;
86
+
87
+		// Return the newly-formed element set
88
+		return ret;
89
+	},
90
+
91
+	// Execute a callback for every element in the matched set.
92
+	each: function( callback ) {
93
+		return jQuery.each( this, callback );
94
+	},
95
+
96
+	map: function( callback ) {
97
+		return this.pushStack( jQuery.map( this, function( elem, i ) {
98
+			return callback.call( elem, i, elem );
99
+		} ) );
100
+	},
101
+
102
+	slice: function() {
103
+		return this.pushStack( slice.apply( this, arguments ) );
104
+	},
105
+
106
+	first: function() {
107
+		return this.eq( 0 );
108
+	},
109
+
110
+	last: function() {
111
+		return this.eq( -1 );
112
+	},
113
+
114
+	eq: function( i ) {
115
+		var len = this.length,
116
+			j = +i + ( i < 0 ? len : 0 );
117
+		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
118
+	},
119
+
120
+	end: function() {
121
+		return this.prevObject || this.constructor();
122
+	},
123
+
124
+	// For internal use only.
125
+	// Behaves like an Array's method, not like a jQuery method.
126
+	push: push,
127
+	sort: arr.sort,
128
+	splice: arr.splice
129
+};
130
+
131
+jQuery.extend = jQuery.fn.extend = function() {
132
+	var options, name, src, copy, copyIsArray, clone,
133
+		target = arguments[ 0 ] || {},
134
+		i = 1,
135
+		length = arguments.length,
136
+		deep = false;
137
+
138
+	// Handle a deep copy situation
139
+	if ( typeof target === "boolean" ) {
140
+		deep = target;
141
+
142
+		// Skip the boolean and the target
143
+		target = arguments[ i ] || {};
144
+		i++;
145
+	}
146
+
147
+	// Handle case when target is a string or something (possible in deep copy)
148
+	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
149
+		target = {};
150
+	}
151
+
152
+	// Extend jQuery itself if only one argument is passed
153
+	if ( i === length ) {
154
+		target = this;
155
+		i--;
156
+	}
157
+
158
+	for ( ; i < length; i++ ) {
159
+
160
+		// Only deal with non-null/undefined values
161
+		if ( ( options = arguments[ i ] ) != null ) {
162
+
163
+			// Extend the base object
164
+			for ( name in options ) {
165
+				src = target[ name ];
166
+				copy = options[ name ];
167
+
168
+				// Prevent never-ending loop
169
+				if ( target === copy ) {
170
+					continue;
171
+				}
172
+
173
+				// Recurse if we're merging plain objects or arrays
174
+				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
175
+					( copyIsArray = Array.isArray( copy ) ) ) ) {
176
+
177
+					if ( copyIsArray ) {
178
+						copyIsArray = false;
179
+						clone = src && Array.isArray( src ) ? src : [];
180
+
181
+					} else {
182
+						clone = src && jQuery.isPlainObject( src ) ? src : {};
183
+					}
184
+
185
+					// Never move original objects, clone them
186
+					target[ name ] = jQuery.extend( deep, clone, copy );
187
+
188
+				// Don't bring in undefined values
189
+				} else if ( copy !== undefined ) {
190
+					target[ name ] = copy;
191
+				}
192
+			}
193
+		}
194
+	}
195
+
196
+	// Return the modified object
197
+	return target;
198
+};
199
+
200
+jQuery.extend( {
201
+
202
+	// Unique for each copy of jQuery on the page
203
+	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
204
+
205
+	// Assume jQuery is ready without the ready module
206
+	isReady: true,
207
+
208
+	error: function( msg ) {
209
+		throw new Error( msg );
210
+	},
211
+
212
+	noop: function() {},
213
+
214
+	isFunction: function( obj ) {
215
+		return jQuery.type( obj ) === "function";
216
+	},
217
+
218
+	isWindow: function( obj ) {
219
+		return obj != null && obj === obj.window;
220
+	},
221
+
222
+	isNumeric: function( obj ) {
223
+
224
+		// As of jQuery 3.0, isNumeric is limited to
225
+		// strings and numbers (primitives or objects)
226
+		// that can be coerced to finite numbers (gh-2662)
227
+		var type = jQuery.type( obj );
228
+		return ( type === "number" || type === "string" ) &&
229
+
230
+			// parseFloat NaNs numeric-cast false positives ("")
231
+			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
232
+			// subtraction forces infinities to NaN
233
+			!isNaN( obj - parseFloat( obj ) );
234
+	},
235
+
236
+	isPlainObject: function( obj ) {
237
+		var proto, Ctor;
238
+
239
+		// Detect obvious negatives
240
+		// Use toString instead of jQuery.type to catch host objects
241
+		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
242
+			return false;
243
+		}
244
+
245
+		proto = getProto( obj );
246
+
247
+		// Objects with no prototype (e.g., `Object.create( null )`) are plain
248
+		if ( !proto ) {
249
+			return true;
250
+		}
251
+
252
+		// Objects with prototype are plain iff they were constructed by a global Object function
253
+		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
254
+		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
255
+	},
256
+
257
+	isEmptyObject: function( obj ) {
258
+
259
+		/* eslint-disable no-unused-vars */
260
+		// See https://github.com/eslint/eslint/issues/6125
261
+		var name;
262
+
263
+		for ( name in obj ) {
264
+			return false;
265
+		}
266
+		return true;
267
+	},
268
+
269
+	type: function( obj ) {
270
+		if ( obj == null ) {
271
+			return obj + "";
272
+		}
273
+
274
+		// Support: Android <=2.3 only (functionish RegExp)
275
+		return typeof obj === "object" || typeof obj === "function" ?
276
+			class2type[ toString.call( obj ) ] || "object" :
277
+			typeof obj;
278
+	},
279
+
280
+	// Evaluates a script in a global context
281
+	globalEval: function( code ) {
282
+		DOMEval( code );
283
+	},
284
+
285
+	// Convert dashed to camelCase; used by the css and data modules
286
+	// Support: IE <=9 - 11, Edge 12 - 13
287
+	// Microsoft forgot to hump their vendor prefix (#9572)
288
+	camelCase: function( string ) {
289
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
290
+	},
291
+
292
+	each: function( obj, callback ) {
293
+		var length, i = 0;
294
+
295
+		if ( isArrayLike( obj ) ) {
296
+			length = obj.length;
297
+			for ( ; i < length; i++ ) {
298
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
299
+					break;
300
+				}
301
+			}
302
+		} else {
303
+			for ( i in obj ) {
304
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
305
+					break;
306
+				}
307
+			}
308
+		}
309
+
310
+		return obj;
311
+	},
312
+
313
+	// Support: Android <=4.0 only
314
+	trim: function( text ) {
315
+		return text == null ?
316
+			"" :
317
+			( text + "" ).replace( rtrim, "" );
318
+	},
319
+
320
+	// results is for internal usage only
321
+	makeArray: function( arr, results ) {
322
+		var ret = results || [];
323
+
324
+		if ( arr != null ) {
325
+			if ( isArrayLike( Object( arr ) ) ) {
326
+				jQuery.merge( ret,
327
+					typeof arr === "string" ?
328
+					[ arr ] : arr
329
+				);
330
+			} else {
331
+				push.call( ret, arr );
332
+			}
333
+		}
334
+
335
+		return ret;
336
+	},
337
+
338
+	inArray: function( elem, arr, i ) {
339
+		return arr == null ? -1 : indexOf.call( arr, elem, i );
340
+	},
341
+
342
+	// Support: Android <=4.0 only, PhantomJS 1 only
343
+	// push.apply(_, arraylike) throws on ancient WebKit
344
+	merge: function( first, second ) {
345
+		var len = +second.length,
346
+			j = 0,
347
+			i = first.length;
348
+
349
+		for ( ; j < len; j++ ) {
350
+			first[ i++ ] = second[ j ];
351
+		}
352
+
353
+		first.length = i;
354
+
355
+		return first;
356
+	},
357
+
358
+	grep: function( elems, callback, invert ) {
359
+		var callbackInverse,
360
+			matches = [],
361
+			i = 0,
362
+			length = elems.length,
363
+			callbackExpect = !invert;
364
+
365
+		// Go through the array, only saving the items
366
+		// that pass the validator function
367
+		for ( ; i < length; i++ ) {
368
+			callbackInverse = !callback( elems[ i ], i );
369
+			if ( callbackInverse !== callbackExpect ) {
370
+				matches.push( elems[ i ] );
371
+			}
372
+		}
373
+
374
+		return matches;
375
+	},
376
+
377
+	// arg is for internal usage only
378
+	map: function( elems, callback, arg ) {
379
+		var length, value,
380
+			i = 0,
381
+			ret = [];
382
+
383
+		// Go through the array, translating each of the items to their new values
384
+		if ( isArrayLike( elems ) ) {
385
+			length = elems.length;
386
+			for ( ; i < length; i++ ) {
387
+				value = callback( elems[ i ], i, arg );
388
+
389
+				if ( value != null ) {
390
+					ret.push( value );
391
+				}
392
+			}
393
+
394
+		// Go through every key on the object,
395
+		} else {
396
+			for ( i in elems ) {
397
+				value = callback( elems[ i ], i, arg );
398
+
399
+				if ( value != null ) {
400
+					ret.push( value );
401
+				}
402
+			}
403
+		}
404
+
405
+		// Flatten any nested arrays
406
+		return concat.apply( [], ret );
407
+	},
408
+
409
+	// A global GUID counter for objects
410
+	guid: 1,
411
+
412
+	// Bind a function to a context, optionally partially applying any
413
+	// arguments.
414
+	proxy: function( fn, context ) {
415
+		var tmp, args, proxy;
416
+
417
+		if ( typeof context === "string" ) {
418
+			tmp = fn[ context ];
419
+			context = fn;
420
+			fn = tmp;
421
+		}
422
+
423
+		// Quick check to determine if target is callable, in the spec
424
+		// this throws a TypeError, but we will just return undefined.
425
+		if ( !jQuery.isFunction( fn ) ) {
426
+			return undefined;
427
+		}
428
+
429
+		// Simulated bind
430
+		args = slice.call( arguments, 2 );
431
+		proxy = function() {
432
+			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
433
+		};
434
+
435
+		// Set the guid of unique handler to the same of original handler, so it can be removed
436
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
437
+
438
+		return proxy;
439
+	},
440
+
441
+	now: Date.now,
442
+
443
+	// jQuery.support is not used in Core but other projects attach their
444
+	// properties to it so it needs to exist.
445
+	support: support
446
+} );
447
+
448
+if ( typeof Symbol === "function" ) {
449
+	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
450
+}
451
+
452
+// Populate the class2type map
453
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
454
+function( i, name ) {
455
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
456
+} );
457
+
458
+function isArrayLike( obj ) {
459
+
460
+	// Support: real iOS 8.2 only (not reproducible in simulator)
461
+	// `in` check used to prevent JIT error (gh-2145)
462
+	// hasOwn isn't used here due to false negatives
463
+	// regarding Nodelist length in IE
464
+	var length = !!obj && "length" in obj && obj.length,
465
+		type = jQuery.type( obj );
466
+
467
+	if ( type === "function" || jQuery.isWindow( obj ) ) {
468
+		return false;
469
+	}
470
+
471
+	return type === "array" || length === 0 ||
472
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
473
+}
474
+
475
+return jQuery;
476
+} );

File diff suppressed because it is too large
+ 10253 - 0
static/bower_components/jquery/dist/jquery.js


File diff suppressed because it is too large
+ 4 - 0
static/bower_components/jquery/dist/jquery.min.js


File diff suppressed because it is too large
+ 1 - 0
static/bower_components/jquery/dist/jquery.min.map


File diff suppressed because it is too large
+ 8160 - 0
static/bower_components/jquery/dist/jquery.slim.js


File diff suppressed because it is too large
+ 4 - 0
static/bower_components/jquery/dist/jquery.slim.min.js


File diff suppressed because it is too large
+ 1 - 0
static/bower_components/jquery/dist/jquery.slim.min.map


+ 36 - 0
static/bower_components/jquery/external/sizzle/LICENSE.txt

@@ -0,0 +1,36 @@
1
+Copyright jQuery Foundation and other contributors, https://jquery.org/
2
+
3
+This software consists of voluntary contributions made by many
4
+individuals. For exact contribution history, see the revision history
5
+available at https://github.com/jquery/sizzle
6
+
7
+The following license applies to all parts of this software except as
8
+documented below:
9
+
10
+====
11
+
12
+Permission is hereby granted, free of charge, to any person obtaining
13
+a copy of this software and associated documentation files (the
14
+"Software"), to deal in the Software without restriction, including
15
+without limitation the rights to use, copy, modify, merge, publish,
16
+distribute, sublicense, and/or sell copies of the Software, and to
17
+permit persons to whom the Software is furnished to do so, subject to
18
+the following conditions:
19
+
20
+The above copyright notice and this permission notice shall be
21
+included in all copies or substantial portions of the Software.
22
+
23
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
+
31
+====
32
+
33
+All files located in the node_modules and external directories are
34
+externally maintained libraries used by this software which have their
35
+own licenses; we recommend you read them, as their terms may differ from
36
+the terms above.

File diff suppressed because it is too large
+ 2272 - 0
static/bower_components/jquery/external/sizzle/dist/sizzle.js


File diff suppressed because it is too large
+ 3 - 0
static/bower_components/jquery/external/sizzle/dist/sizzle.min.js


File diff suppressed because it is too large
+ 1 - 0
static/bower_components/jquery/external/sizzle/dist/sizzle.min.map


+ 5 - 0
static/bower_components/jquery/src/.eslintrc.json

@@ -0,0 +1,5 @@
1
+{
2
+	"root": true,
3
+
4
+	"extends": "../.eslintrc-browser.json"
5
+}

+ 855 - 0
static/bower_components/jquery/src/ajax.js

@@ -0,0 +1,855 @@
1
+define( [
2
+	"./core",
3
+	"./var/document",
4
+	"./var/rnothtmlwhite",
5
+	"./ajax/var/location",
6
+	"./ajax/var/nonce",
7
+	"./ajax/var/rquery",
8
+
9
+	"./core/init",
10
+	"./ajax/parseXML",
11
+	"./event/trigger",
12
+	"./deferred",
13
+	"./serialize" // jQuery.param
14
+], function( jQuery, document, rnothtmlwhite, location, nonce, rquery ) {
15
+
16
+"use strict";
17
+
18
+var
19
+	r20 = /%20/g,
20
+	rhash = /#.*$/,
21
+	rantiCache = /([?&])_=[^&]*/,
22
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
23
+
24
+	// #7653, #8125, #8152: local protocol detection
25
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
26
+	rnoContent = /^(?:GET|HEAD)$/,
27
+	rprotocol = /^\/\//,
28
+
29
+	/* Prefilters
30
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
31
+	 * 2) These are called:
32
+	 *    - BEFORE asking for a transport
33
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
34
+	 * 3) key is the dataType
35
+	 * 4) the catchall symbol "*" can be used
36
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
37
+	 */
38
+	prefilters = {},
39
+
40
+	/* Transports bindings
41
+	 * 1) key is the dataType
42
+	 * 2) the catchall symbol "*" can be used
43
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
44
+	 */
45
+	transports = {},
46
+
47
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
48
+	allTypes = "*/".concat( "*" ),
49
+
50
+	// Anchor tag for parsing the document origin
51
+	originAnchor = document.createElement( "a" );
52
+	originAnchor.href = location.href;
53
+
54
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
55
+function addToPrefiltersOrTransports( structure ) {
56
+
57
+	// dataTypeExpression is optional and defaults to "*"
58
+	return function( dataTypeExpression, func ) {
59
+
60
+		if ( typeof dataTypeExpression !== "string" ) {
61
+			func = dataTypeExpression;
62
+			dataTypeExpression = "*";
63
+		}
64
+
65
+		var dataType,
66
+			i = 0,
67
+			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
68
+
69
+		if ( jQuery.isFunction( func ) ) {
70
+
71
+			// For each dataType in the dataTypeExpression
72
+			while ( ( dataType = dataTypes[ i++ ] ) ) {
73
+
74
+				// Prepend if requested
75
+				if ( dataType[ 0 ] === "+" ) {
76
+					dataType = dataType.slice( 1 ) || "*";
77
+					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
78
+
79
+				// Otherwise append
80
+				} else {
81
+					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
82
+				}
83
+			}
84
+		}
85
+	};
86
+}
87
+
88
+// Base inspection function for prefilters and transports
89
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
90
+
91
+	var inspected = {},
92
+		seekingTransport = ( structure === transports );
93
+
94
+	function inspect( dataType ) {
95
+		var selected;
96
+		inspected[ dataType ] = true;
97
+		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
98
+			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
99
+			if ( typeof dataTypeOrTransport === "string" &&
100
+				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
101
+
102
+				options.dataTypes.unshift( dataTypeOrTransport );
103
+				inspect( dataTypeOrTransport );
104
+				return false;
105
+			} else if ( seekingTransport ) {
106
+				return !( selected = dataTypeOrTransport );
107
+			}
108
+		} );
109
+		return selected;
110
+	}
111
+
112
+	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
113
+}
114
+
115
+// A special extend for ajax options
116
+// that takes "flat" options (not to be deep extended)
117
+// Fixes #9887
118
+function ajaxExtend( target, src ) {
119
+	var key, deep,
120
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
121
+
122
+	for ( key in src ) {
123
+		if ( src[ key ] !== undefined ) {
124
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
125
+		}
126
+	}
127
+	if ( deep ) {
128
+		jQuery.extend( true, target, deep );
129
+	}
130
+
131
+	return target;
132
+}
133
+
134
+/* Handles responses to an ajax request:
135
+ * - finds the right dataType (mediates between content-type and expected dataType)
136
+ * - returns the corresponding response
137
+ */
138
+function ajaxHandleResponses( s, jqXHR, responses ) {
139
+
140
+	var ct, type, finalDataType, firstDataType,
141
+		contents = s.contents,
142
+		dataTypes = s.dataTypes;
143
+
144
+	// Remove auto dataType and get content-type in the process
145
+	while ( dataTypes[ 0 ] === "*" ) {
146
+		dataTypes.shift();
147
+		if ( ct === undefined ) {
148
+			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
149
+		}
150
+	}
151
+
152
+	// Check if we're dealing with a known content-type
153
+	if ( ct ) {
154
+		for ( type in contents ) {
155
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
156
+				dataTypes.unshift( type );
157
+				break;
158
+			}
159
+		}
160
+	}
161
+
162
+	// Check to see if we have a response for the expected dataType
163
+	if ( dataTypes[ 0 ] in responses ) {
164
+		finalDataType = dataTypes[ 0 ];
165
+	} else {
166
+
167
+		// Try convertible dataTypes
168
+		for ( type in responses ) {
169
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
170
+				finalDataType = type;
171
+				break;
172
+			}
173
+			if ( !firstDataType ) {
174
+				firstDataType = type;
175
+			}
176
+		}
177
+
178
+		// Or just use first one
179
+		finalDataType = finalDataType || firstDataType;
180
+	}
181
+
182
+	// If we found a dataType
183
+	// We add the dataType to the list if needed
184
+	// and return the corresponding response
185
+	if ( finalDataType ) {
186
+		if ( finalDataType !== dataTypes[ 0 ] ) {
187
+			dataTypes.unshift( finalDataType );
188
+		}
189
+		return responses[ finalDataType ];
190
+	}
191
+}
192
+
193
+/* Chain conversions given the request and the original response
194
+ * Also sets the responseXXX fields on the jqXHR instance
195
+ */
196
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
197
+	var conv2, current, conv, tmp, prev,
198
+		converters = {},
199
+
200
+		// Work with a copy of dataTypes in case we need to modify it for conversion
201
+		dataTypes = s.dataTypes.slice();
202
+
203
+	// Create converters map with lowercased keys
204
+	if ( dataTypes[ 1 ] ) {
205
+		for ( conv in s.converters ) {
206
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
207
+		}
208
+	}
209
+
210
+	current = dataTypes.shift();
211
+
212
+	// Convert to each sequential dataType
213
+	while ( current ) {
214
+
215
+		if ( s.responseFields[ current ] ) {
216
+			jqXHR[ s.responseFields[ current ] ] = response;
217
+		}
218
+
219
+		// Apply the dataFilter if provided
220
+		if ( !prev && isSuccess && s.dataFilter ) {
221
+			response = s.dataFilter( response, s.dataType );
222
+		}
223
+
224
+		prev = current;
225
+		current = dataTypes.shift();
226
+
227
+		if ( current ) {
228
+
229
+			// There's only work to do if current dataType is non-auto
230
+			if ( current === "*" ) {
231
+
232
+				current = prev;
233
+
234
+			// Convert response if prev dataType is non-auto and differs from current
235
+			} else if ( prev !== "*" && prev !== current ) {
236
+
237
+				// Seek a direct converter
238
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
239
+
240
+				// If none found, seek a pair
241
+				if ( !conv ) {
242
+					for ( conv2 in converters ) {
243
+
244
+						// If conv2 outputs current
245
+						tmp = conv2.split( " " );
246
+						if ( tmp[ 1 ] === current ) {
247
+
248
+							// If prev can be converted to accepted input
249
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
250
+								converters[ "* " + tmp[ 0 ] ];
251
+							if ( conv ) {
252
+
253
+								// Condense equivalence converters
254
+								if ( conv === true ) {
255
+									conv = converters[ conv2 ];
256
+
257
+								// Otherwise, insert the intermediate dataType
258
+								} else if ( converters[ conv2 ] !== true ) {
259
+									current = tmp[ 0 ];
260
+									dataTypes.unshift( tmp[ 1 ] );
261
+								}
262
+								break;
263
+							}
264
+						}
265
+					}
266
+				}
267
+
268
+				// Apply converter (if not an equivalence)
269
+				if ( conv !== true ) {
270
+
271
+					// Unless errors are allowed to bubble, catch and return them
272
+					if ( conv && s.throws ) {
273
+						response = conv( response );
274
+					} else {
275
+						try {
276
+							response = conv( response );
277
+						} catch ( e ) {
278
+							return {
279
+								state: "parsererror",
280
+								error: conv ? e : "No conversion from " + prev + " to " + current
281
+							};
282
+						}
283
+					}
284
+				}
285
+			}
286
+		}
287
+	}
288
+
289
+	return { state: "success", data: response };
290
+}
291
+
292
+jQuery.extend( {
293
+
294
+	// Counter for holding the number of active queries
295
+	active: 0,
296
+
297
+	// Last-Modified header cache for next request
298
+	lastModified: {},
299
+	etag: {},
300
+
301
+	ajaxSettings: {
302
+		url: location.href,
303
+		type: "GET",
304
+		isLocal: rlocalProtocol.test( location.protocol ),
305
+		global: true,
306
+		processData: true,
307
+		async: true,
308
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
309
+
310
+		/*
311
+		timeout: 0,
312
+		data: null,
313
+		dataType: null,
314
+		username: null,
315
+		password: null,
316
+		cache: null,
317
+		throws: false,
318
+		traditional: false,
319
+		headers: {},
320
+		*/
321
+
322
+		accepts: {
323
+			"*": allTypes,
324
+			text: "text/plain",
325
+			html: "text/html",
326
+			xml: "application/xml, text/xml",
327
+			json: "application/json, text/javascript"
328
+		},
329
+
330
+		contents: {
331
+			xml: /\bxml\b/,
332
+			html: /\bhtml/,
333
+			json: /\bjson\b/
334
+		},
335
+
336
+		responseFields: {
337
+			xml: "responseXML",
338
+			text: "responseText",
339
+			json: "responseJSON"
340
+		},
341
+
342
+		// Data converters
343
+		// Keys separate source (or catchall "*") and destination types with a single space
344
+		converters: {
345
+
346
+			// Convert anything to text
347
+			"* text": String,
348
+
349
+			// Text to html (true = no transformation)
350
+			"text html": true,
351
+
352
+			// Evaluate text as a json expression
353
+			"text json": JSON.parse,
354
+
355
+			// Parse text as xml
356
+			"text xml": jQuery.parseXML
357
+		},
358
+
359
+		// For options that shouldn't be deep extended:
360
+		// you can add your own custom options here if
361
+		// and when you create one that shouldn't be
362
+		// deep extended (see ajaxExtend)
363
+		flatOptions: {
364
+			url: true,
365
+			context: true
366
+		}
367
+	},
368
+
369
+	// Creates a full fledged settings object into target
370
+	// with both ajaxSettings and settings fields.
371
+	// If target is omitted, writes into ajaxSettings.
372
+	ajaxSetup: function( target, settings ) {
373
+		return settings ?
374
+
375
+			// Building a settings object
376
+			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
377
+
378
+			// Extending ajaxSettings
379
+			ajaxExtend( jQuery.ajaxSettings, target );
380
+	},
381
+
382
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
383
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
384
+
385
+	// Main method
386
+	ajax: function( url, options ) {
387
+
388
+		// If url is an object, simulate pre-1.5 signature
389
+		if ( typeof url === "object" ) {
390
+			options = url;
391
+			url = undefined;
392
+		}
393
+
394
+		// Force options to be an object
395
+		options = options || {};
396
+
397
+		var transport,
398
+
399
+			// URL without anti-cache param
400
+			cacheURL,
401
+
402
+			// Response headers
403
+			responseHeadersString,
404
+			responseHeaders,
405
+
406
+			// timeout handle
407
+			timeoutTimer,
408
+
409
+			// Url cleanup var
410
+			urlAnchor,
411
+
412
+			// Request state (becomes false upon send and true upon completion)
413
+			completed,
414
+
415
+			// To know if global events are to be dispatched
416
+			fireGlobals,
417
+
418
+			// Loop variable
419
+			i,
420
+
421
+			// uncached part of the url
422
+			uncached,
423
+
424
+			// Create the final options object
425
+			s = jQuery.ajaxSetup( {}, options ),
426
+
427
+			// Callbacks context
428
+			callbackContext = s.context || s,
429
+
430
+			// Context for global events is callbackContext if it is a DOM node or jQuery collection
431
+			globalEventContext = s.context &&
432
+				( callbackContext.nodeType || callbackContext.jquery ) ?
433
+					jQuery( callbackContext ) :
434
+					jQuery.event,
435
+
436
+			// Deferreds
437
+			deferred = jQuery.Deferred(),
438
+			completeDeferred = jQuery.Callbacks( "once memory" ),
439
+
440
+			// Status-dependent callbacks
441
+			statusCode = s.statusCode || {},
442
+
443
+			// Headers (they are sent all at once)
444
+			requestHeaders = {},
445
+			requestHeadersNames = {},
446
+
447
+			// Default abort message
448
+			strAbort = "canceled",
449
+
450
+			// Fake xhr
451
+			jqXHR = {
452
+				readyState: 0,
453
+
454
+				// Builds headers hashtable if needed
455
+				getResponseHeader: function( key ) {
456
+					var match;
457
+					if ( completed ) {
458
+						if ( !responseHeaders ) {
459
+							responseHeaders = {};
460
+							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
461
+								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
462
+							}
463
+						}
464
+						match = responseHeaders[ key.toLowerCase() ];
465
+					}
466
+					return match == null ? null : match;
467
+				},
468
+
469
+				// Raw string
470
+				getAllResponseHeaders: function() {
471
+					return completed ? responseHeadersString : null;
472
+				},
473
+
474
+				// Caches the header
475
+				setRequestHeader: function( name, value ) {
476
+					if ( completed == null ) {
477
+						name = requestHeadersNames[ name.toLowerCase() ] =
478
+							requestHeadersNames[ name.toLowerCase() ] || name;
479
+						requestHeaders[ name ] = value;
480
+					}
481
+					return this;
482
+				},
483
+
484
+				// Overrides response content-type header
485
+				overrideMimeType: function( type ) {
486
+					if ( completed == null ) {
487
+						s.mimeType = type;
488
+					}
489
+					return this;
490
+				},
491
+
492
+				// Status-dependent callbacks
493
+				statusCode: function( map ) {
494
+					var code;
495
+					if ( map ) {
496
+						if ( completed ) {
497
+
498
+							// Execute the appropriate callbacks
499
+							jqXHR.always( map[ jqXHR.status ] );
500
+						} else {
501
+
502
+							// Lazy-add the new callbacks in a way that preserves old ones
503
+							for ( code in map ) {
504
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
505
+							}
506
+						}
507
+					}
508
+					return this;
509
+				},
510
+
511
+				// Cancel the request
512
+				abort: function( statusText ) {
513
+					var finalText = statusText || strAbort;
514
+					if ( transport ) {
515
+						transport.abort( finalText );
516
+					}
517
+					done( 0, finalText );
518
+					return this;
519
+				}
520
+			};
521
+
522
+		// Attach deferreds
523
+		deferred.promise( jqXHR );
524
+
525
+		// Add protocol if not provided (prefilters might expect it)
526
+		// Handle falsy url in the settings object (#10093: consistency with old signature)
527
+		// We also use the url parameter if available
528
+		s.url = ( ( url || s.url || location.href ) + "" )
529
+			.replace( rprotocol, location.protocol + "//" );
530
+
531
+		// Alias method option to type as per ticket #12004
532
+		s.type = options.method || options.type || s.method || s.type;
533
+
534
+		// Extract dataTypes list
535
+		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
536
+
537
+		// A cross-domain request is in order when the origin doesn't match the current origin.
538
+		if ( s.crossDomain == null ) {
539
+			urlAnchor = document.createElement( "a" );
540
+
541
+			// Support: IE <=8 - 11, Edge 12 - 13
542
+			// IE throws exception on accessing the href property if url is malformed,
543
+			// e.g. http://example.com:80x/
544
+			try {
545
+				urlAnchor.href = s.url;
546
+
547
+				// Support: IE <=8 - 11 only
548
+				// Anchor's host property isn't correctly set when s.url is relative
549
+				urlAnchor.href = urlAnchor.href;
550
+				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
551
+					urlAnchor.protocol + "//" + urlAnchor.host;
552
+			} catch ( e ) {
553
+
554
+				// If there is an error parsing the URL, assume it is crossDomain,
555
+				// it can be rejected by the transport if it is invalid
556
+				s.crossDomain = true;
557
+			}
558
+		}
559
+
560
+		// Convert data if not already a string
561
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
562
+			s.data = jQuery.param( s.data, s.traditional );
563
+		}
564
+
565
+		// Apply prefilters
566
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
567
+
568
+		// If request was aborted inside a prefilter, stop there
569
+		if ( completed ) {
570
+			return jqXHR;
571
+		}
572
+
573
+		// We can fire global events as of now if asked to
574
+		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
575
+		fireGlobals = jQuery.event && s.global;
576
+
577
+		// Watch for a new set of requests
578
+		if ( fireGlobals && jQuery.active++ === 0 ) {
579
+			jQuery.event.trigger( "ajaxStart" );
580
+		}
581
+
582
+		// Uppercase the type
583
+		s.type = s.type.toUpperCase();
584
+
585
+		// Determine if request has content
586
+		s.hasContent = !rnoContent.test( s.type );
587
+
588
+		// Save the URL in case we're toying with the If-Modified-Since
589
+		// and/or If-None-Match header later on
590
+		// Remove hash to simplify url manipulation
591
+		cacheURL = s.url.replace( rhash, "" );
592
+
593
+		// More options handling for requests with no content
594
+		if ( !s.hasContent ) {
595
+
596
+			// Remember the hash so we can put it back
597
+			uncached = s.url.slice( cacheURL.length );
598
+
599
+			// If data is available, append data to url
600
+			if ( s.data ) {
601
+				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
602
+
603
+				// #9682: remove data so that it's not used in an eventual retry
604
+				delete s.data;
605
+			}
606
+
607
+			// Add or update anti-cache param if needed
608
+			if ( s.cache === false ) {
609
+				cacheURL = cacheURL.replace( rantiCache, "$1" );
610
+				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
611
+			}
612
+
613
+			// Put hash and anti-cache on the URL that will be requested (gh-1732)
614
+			s.url = cacheURL + uncached;
615
+
616
+		// Change '%20' to '+' if this is encoded form body content (gh-2658)
617
+		} else if ( s.data && s.processData &&
618
+			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
619
+			s.data = s.data.replace( r20, "+" );
620
+		}
621
+
622
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
623
+		if ( s.ifModified ) {
624
+			if ( jQuery.lastModified[ cacheURL ] ) {
625
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
626
+			}
627
+			if ( jQuery.etag[ cacheURL ] ) {
628
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
629
+			}
630
+		}
631
+
632
+		// Set the correct header, if data is being sent
633
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
634
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
635
+		}
636
+
637
+		// Set the Accepts header for the server, depending on the dataType
638
+		jqXHR.setRequestHeader(
639
+			"Accept",
640
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
641
+				s.accepts[ s.dataTypes[ 0 ] ] +
642
+					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
643
+				s.accepts[ "*" ]
644
+		);
645
+
646
+		// Check for headers option
647
+		for ( i in s.headers ) {
648
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
649
+		}
650
+
651
+		// Allow custom headers/mimetypes and early abort
652
+		if ( s.beforeSend &&
653
+			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
654
+
655
+			// Abort if not done already and return
656
+			return jqXHR.abort();
657
+		}
658
+
659
+		// Aborting is no longer a cancellation
660
+		strAbort = "abort";
661
+
662
+		// Install callbacks on deferreds
663
+		completeDeferred.add( s.complete );
664
+		jqXHR.done( s.success );
665
+		jqXHR.fail( s.error );
666
+
667
+		// Get transport
668
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
669
+
670
+		// If no transport, we auto-abort
671
+		if ( !transport ) {
672
+			done( -1, "No Transport" );
673
+		} else {
674
+			jqXHR.readyState = 1;
675
+
676
+			// Send global event
677
+			if ( fireGlobals ) {
678
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
679
+			}
680
+
681
+			// If request was aborted inside ajaxSend, stop there
682
+			if ( completed ) {
683
+				return jqXHR;
684
+			}
685
+
686
+			// Timeout
687
+			if ( s.async && s.timeout > 0 ) {
688
+				timeoutTimer = window.setTimeout( function() {
689
+					jqXHR.abort( "timeout" );
690
+				}, s.timeout );
691
+			}
692
+
693
+			try {
694
+				completed = false;
695
+				transport.send( requestHeaders, done );
696
+			} catch ( e ) {
697
+
698
+				// Rethrow post-completion exceptions
699
+				if ( completed ) {
700
+					throw e;
701
+				}
702
+
703
+				// Propagate others as results
704
+				done( -1, e );
705
+			}
706
+		}
707
+
708
+		// Callback for when everything is done
709
+		function done( status, nativeStatusText, responses, headers ) {
710
+			var isSuccess, success, error, response, modified,
711
+				statusText = nativeStatusText;
712
+
713
+			// Ignore repeat invocations
714
+			if ( completed ) {
715
+				return;
716
+			}
717
+
718
+			completed = true;
719
+
720
+			// Clear timeout if it exists
721
+			if ( timeoutTimer ) {
722
+				window.clearTimeout( timeoutTimer );
723
+			}
724
+
725
+			// Dereference transport for early garbage collection
726
+			// (no matter how long the jqXHR object will be used)
727
+			transport = undefined;
728
+
729
+			// Cache response headers
730
+			responseHeadersString = headers || "";
731
+
732
+			// Set readyState
733
+			jqXHR.readyState = status > 0 ? 4 : 0;
734
+
735
+			// Determine if successful
736
+			isSuccess = status >= 200 && status < 300 || status === 304;
737
+
738
+			// Get response data
739
+			if ( responses ) {
740
+				response = ajaxHandleResponses( s, jqXHR, responses );
741
+			}
742
+
743
+			// Convert no matter what (that way responseXXX fields are always set)
744
+			response = ajaxConvert( s, response, jqXHR, isSuccess );
745
+
746
+			// If successful, handle type chaining
747
+			if ( isSuccess ) {
748
+
749
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
750
+				if ( s.ifModified ) {
751
+					modified = jqXHR.getResponseHeader( "Last-Modified" );
752
+					if ( modified ) {
753
+						jQuery.lastModified[ cacheURL ] = modified;
754
+					}
755
+					modified = jqXHR.getResponseHeader( "etag" );
756
+					if ( modified ) {
757
+						jQuery.etag[ cacheURL ] = modified;
758
+					}
759
+				}
760
+
761
+				// if no content
762
+				if ( status === 204 || s.type === "HEAD" ) {
763
+					statusText = "nocontent";
764
+
765
+				// if not modified
766
+				} else if ( status === 304 ) {
767
+					statusText = "notmodified";
768
+
769
+				// If we have data, let's convert it
770
+				} else {
771
+					statusText = response.state;
772
+					success = response.data;
773
+					error = response.error;
774
+					isSuccess = !error;
775
+				}
776
+			} else {
777
+
778
+				// Extract error from statusText and normalize for non-aborts
779
+				error = statusText;
780
+				if ( status || !statusText ) {
781
+					statusText = "error";
782
+					if ( status < 0 ) {
783
+						status = 0;
784
+					}
785
+				}
786
+			}
787
+
788
+			// Set data for the fake xhr object
789
+			jqXHR.status = status;
790
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
791
+
792
+			// Success/Error
793
+			if ( isSuccess ) {
794
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
795
+			} else {
796
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
797
+			}
798
+
799
+			// Status-dependent callbacks
800
+			jqXHR.statusCode( statusCode );
801
+			statusCode = undefined;
802
+
803
+			if ( fireGlobals ) {
804
+				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
805
+					[ jqXHR, s, isSuccess ? success : error ] );
806
+			}
807
+
808
+			// Complete
809
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
810
+
811
+			if ( fireGlobals ) {
812
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
813
+
814
+				// Handle the global AJAX counter
815
+				if ( !( --jQuery.active ) ) {
816
+					jQuery.event.trigger( "ajaxStop" );
817
+				}
818
+			}
819
+		}
820
+
821
+		return jqXHR;
822
+	},
823
+
824
+	getJSON: function( url, data, callback ) {
825
+		return jQuery.get( url, data, callback, "json" );
826
+	},
827
+
828
+	getScript: function( url, callback ) {
829
+		return jQuery.get( url, undefined, callback, "script" );
830
+	}
831
+} );
832
+
833
+jQuery.each( [ "get", "post" ], function( i, method ) {
834
+	jQuery[ method ] = function( url, data, callback, type ) {
835
+
836
+		// Shift arguments if data argument was omitted
837
+		if ( jQuery.isFunction( data ) ) {
838
+			type = type || callback;
839
+			callback = data;
840
+			data = undefined;
841
+		}
842
+
843
+		// The url can be an options object (which then must have .url)
844
+		return jQuery.ajax( jQuery.extend( {
845
+			url: url,
846
+			type: method,
847
+			dataType: type,
848
+			data: data,
849
+			success: callback
850
+		}, jQuery.isPlainObject( url ) && url ) );
851
+	};
852
+} );
853
+
854
+return jQuery;
855
+} );

+ 102 - 0
static/bower_components/jquery/src/ajax/jsonp.js

@@ -0,0 +1,102 @@
1
+define( [
2
+	"../core",
3
+	"./var/nonce",
4
+	"./var/rquery",
5
+	"../ajax"
6
+], function( jQuery, nonce, rquery ) {
7
+
8
+"use strict";
9
+
10
+var oldCallbacks = [],
11
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
12
+
13
+// Default jsonp settings
14
+jQuery.ajaxSetup( {
15
+	jsonp: "callback",
16
+	jsonpCallback: function() {
17
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
18
+		this[ callback ] = true;
19
+		return callback;
20
+	}
21
+} );
22
+
23
+// Detect, normalize options and install callbacks for jsonp requests
24
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
25
+
26
+	var callbackName, overwritten, responseContainer,
27
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
28
+			"url" :
29
+			typeof s.data === "string" &&
30
+				( s.contentType || "" )
31
+					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
32
+				rjsonp.test( s.data ) && "data"
33
+		);
34
+
35
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
36
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
37
+
38
+		// Get callback name, remembering preexisting value associated with it
39
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
40
+			s.jsonpCallback() :
41
+			s.jsonpCallback;
42
+
43
+		// Insert callback into url or form data
44
+		if ( jsonProp ) {
45
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
46
+		} else if ( s.jsonp !== false ) {
47
+			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
48
+		}
49
+
50
+		// Use data converter to retrieve json after script execution
51
+		s.converters[ "script json" ] = function() {
52
+			if ( !responseContainer ) {
53
+				jQuery.error( callbackName + " was not called" );
54
+			}
55
+			return responseContainer[ 0 ];
56
+		};
57
+
58
+		// Force json dataType
59
+		s.dataTypes[ 0 ] = "json";
60
+
61
+		// Install callback
62
+		overwritten = window[ callbackName ];
63
+		window[ callbackName ] = function() {
64
+			responseContainer = arguments;
65
+		};
66
+
67
+		// Clean-up function (fires after converters)
68
+		jqXHR.always( function() {
69
+
70
+			// If previous value didn't exist - remove it
71
+			if ( overwritten === undefined ) {
72
+				jQuery( window ).removeProp( callbackName );
73
+
74
+			// Otherwise restore preexisting value
75
+			} else {
76
+				window[ callbackName ] = overwritten;
77
+			}
78
+
79
+			// Save back as free
80
+			if ( s[ callbackName ] ) {
81
+
82
+				// Make sure that re-using the options doesn't screw things around
83
+				s.jsonpCallback = originalSettings.jsonpCallback;
84
+
85
+				// Save the callback name for future use
86
+				oldCallbacks.push( callbackName );
87
+			}
88
+
89
+			// Call if it was a function and we have a response
90
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
91
+				overwritten( responseContainer[ 0 ] );
92
+			}
93
+
94
+			responseContainer = overwritten = undefined;
95
+		} );
96
+
97
+		// Delegate to script
98
+		return "script";
99
+	}
100
+} );
101
+
102
+} );

+ 76 - 0
static/bower_components/jquery/src/ajax/load.js

@@ -0,0 +1,76 @@
1
+define( [
2
+	"../core",
3
+	"../core/stripAndCollapse",
4
+	"../core/parseHTML",
5
+	"../ajax",
6
+	"../traversing",
7
+	"../manipulation",
8
+	"../selector"
9
+], function( jQuery, stripAndCollapse ) {
10
+
11
+"use strict";
12
+
13
+/**
14
+ * Load a url into a page
15
+ */
16
+jQuery.fn.load = function( url, params, callback ) {
17
+	var selector, type, response,
18
+		self = this,
19
+		off = url.indexOf( " " );
20
+
21
+	if ( off > -1 ) {
22
+		selector = stripAndCollapse( url.slice( off ) );
23
+		url = url.slice( 0, off );
24
+	}
25
+
26
+	// If it's a function
27
+	if ( jQuery.isFunction( params ) ) {
28
+
29
+		// We assume that it's the callback
30
+		callback = params;
31
+		params = undefined;
32
+
33
+	// Otherwise, build a param string
34
+	} else if ( params && typeof params === "object" ) {
35
+		type = "POST";
36
+	}
37
+
38
+	// If we have elements to modify, make the request
39
+	if ( self.length > 0 ) {
40
+		jQuery.ajax( {
41
+			url: url,
42
+
43
+			// If "type" variable is undefined, then "GET" method will be used.
44
+			// Make value of this field explicit since
45
+			// user can override it through ajaxSetup method
46
+			type: type || "GET",
47
+			dataType: "html",
48
+			data: params
49
+		} ).done( function( responseText ) {
50
+
51
+			// Save response for use in complete callback
52
+			response = arguments;
53
+
54
+			self.html( selector ?
55
+
56
+				// If a selector was specified, locate the right elements in a dummy div
57
+				// Exclude scripts to avoid IE 'Permission Denied' errors
58
+				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
59
+
60
+				// Otherwise use the full result
61
+				responseText );
62
+
63
+		// If the request succeeds, this function gets "data", "status", "jqXHR"
64
+		// but they are ignored because response was set above.
65
+		// If it fails, this function gets "jqXHR", "status", "error"
66
+		} ).always( callback && function( jqXHR, status ) {
67
+			self.each( function() {
68
+				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
69
+			} );
70
+		} );
71
+	}
72
+
73
+	return this;
74
+};
75
+
76
+} );

+ 30 - 0
static/bower_components/jquery/src/ajax/parseXML.js

@@ -0,0 +1,30 @@
1
+define( [
2
+	"../core"
3
+], function( jQuery ) {
4
+
5
+"use strict";
6
+
7
+// Cross-browser xml parsing
8
+jQuery.parseXML = function( data ) {
9
+	var xml;
10
+	if ( !data || typeof data !== "string" ) {
11
+		return null;
12
+	}
13
+
14
+	// Support: IE 9 - 11 only
15
+	// IE throws on parseFromString with invalid input.
16
+	try {
17
+		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
18
+	} catch ( e ) {
19
+		xml = undefined;
20
+	}
21
+
22
+	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
23
+		jQuery.error( "Invalid XML: " + data );
24
+	}
25
+	return xml;
26
+};
27
+
28
+return jQuery.parseXML;
29
+
30
+} );

+ 77 - 0
static/bower_components/jquery/src/ajax/script.js

@@ -0,0 +1,77 @@
1
+define( [
2
+	"../core",
3
+	"../var/document",
4
+	"../ajax"
5
+], function( jQuery, document ) {
6
+
7
+"use strict";
8
+
9
+// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
10
+jQuery.ajaxPrefilter( function( s ) {
11
+	if ( s.crossDomain ) {
12
+		s.contents.script = false;
13
+	}
14
+} );
15
+
16
+// Install script dataType
17
+jQuery.ajaxSetup( {
18
+	accepts: {
19
+		script: "text/javascript, application/javascript, " +
20
+			"application/ecmascript, application/x-ecmascript"
21
+	},
22
+	contents: {
23
+		script: /\b(?:java|ecma)script\b/
24
+	},
25
+	converters: {
26
+		"text script": function( text ) {
27
+			jQuery.globalEval( text );
28
+			return text;
29
+		}
30
+	}
31
+} );
32
+
33
+// Handle cache's special case and crossDomain
34
+jQuery.ajaxPrefilter( "script", function( s ) {
35
+	if ( s.cache === undefined ) {
36
+		s.cache = false;
37
+	}
38
+	if ( s.crossDomain ) {
39
+		s.type = "GET";
40
+	}
41
+} );
42
+
43
+// Bind script tag hack transport
44
+jQuery.ajaxTransport( "script", function( s ) {
45
+
46
+	// This transport only deals with cross domain requests
47
+	if ( s.crossDomain ) {
48
+		var script, callback;
49
+		return {
50
+			send: function( _, complete ) {
51
+				script = jQuery( "<script>" ).prop( {
52
+					charset: s.scriptCharset,
53
+					src: s.url
54
+				} ).on(
55
+					"load error",
56
+					callback = function( evt ) {
57
+						script.remove();
58
+						callback = null;
59
+						if ( evt ) {
60
+							complete( evt.type === "error" ? 404 : 200, evt.type );
61
+						}
62
+					}
63
+				);
64
+
65
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
66
+				document.head.appendChild( script[ 0 ] );
67
+			},
68
+			abort: function() {
69
+				if ( callback ) {
70
+					callback();
71
+				}
72
+			}
73
+		};
74
+	}
75
+} );
76
+
77
+} );

+ 5 - 0
static/bower_components/jquery/src/ajax/var/location.js

@@ -0,0 +1,5 @@
1
+define( function() {
2
+	"use strict";
3
+
4
+	return window.location;
5
+} );

+ 0 - 0
static/bower_components/jquery/src/ajax/var/nonce.js


Some files were not shown because too many files changed in this diff

tum/ecoloop - Gogs: Simplico Git Service

No Description

views.py 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. from django.shortcuts import render, redirect, get_object_or_404
  2. from django.contrib.admin.views.decorators import staff_member_required
  3. from django.contrib import messages
  4. from django.views.decorators.http import require_POST
  5. from django.urls import reverse
  6. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  7. import django_filters as filters
  8. from admin_frontend.templatetags.public_urls import public_route
  9. from admin_frontend.nav import _nav_items
  10. from cms.views import breadcrumbs
  11. from orgs.models import Organization
  12. from recycle_core.models import Customer
  13. from recycle_core.forms import PaymentForm
  14. from .models import Invoice, Payment, Payout
  15. from django.db.models import Sum, F, ExpressionWrapper, DecimalField, Value
  16. from django.db.models.functions import Coalesce
  17. from decimal import Decimal
  18. from django.http import HttpResponse
  19. import csv
  20. # Invoices UI ---------------------------------------------------------------
  21. @staff_member_required
  22. @public_route(label="Invoices", order=50, icon="receipt-percent")
  23. @breadcrumbs(label="Invoices", name="re_invoices")
  24. def invoices_list(request):
  25. class InvoiceFilter(filters.FilterSet):
  26. organization = filters.ModelChoiceFilter(queryset=Organization.objects.all())
  27. customer = filters.ModelChoiceFilter(queryset=Customer.objects.all())
  28. status = filters.ChoiceFilter(field_name="status", choices=Invoice.STATUS_CHOICES)
  29. issued_at = filters.DateFromToRangeFilter(field_name="issued_at", label="Issued between")
  30. class Meta:
  31. model = Invoice
  32. fields = ["organization", "customer", "status", "issued_at"]
  33. base_qs = (
  34. Invoice.objects.select_related("organization", "customer")
  35. .annotate(
  36. payments_total=Coalesce(
  37. Sum("payments__amount"),
  38. Value(Decimal("0.00")),
  39. output_field=DecimalField(max_digits=14, decimal_places=2),
  40. ),
  41. )
  42. .annotate(
  43. balance=ExpressionWrapper(
  44. F("total_amount") - F("payments_total"),
  45. output_field=DecimalField(max_digits=14, decimal_places=2),
  46. )
  47. )
  48. .order_by("-issued_at", "-id")
  49. )
  50. i_filter = InvoiceFilter(request.GET, queryset=base_qs)
  51. qs = i_filter.qs
  52. org = getattr(request, "org", None)
  53. if org is not None:
  54. qs = qs.filter(organization=org)
  55. paginator = Paginator(qs, 10)
  56. page = request.GET.get("page")
  57. try:
  58. page_obj = paginator.page(page)
  59. except PageNotAnInteger:
  60. page_obj = paginator.page(1)
  61. except EmptyPage:
  62. page_obj = paginator.page(paginator.num_pages)
  63. pay_form = PaymentForm()
  64. context = {
  65. "nav": _nav_items(),
  66. "invoices": page_obj.object_list,
  67. "page_obj": page_obj,
  68. "filter": i_filter,
  69. "pay_form": pay_form,
  70. }
  71. return render(request, "recycle_core/invoices_list.html", context)
  72. @staff_member_required
  73. def invoice_add_payment(request, pk: int):
  74. invoice = get_object_or_404(Invoice, pk=pk)
  75. form = PaymentForm(request.POST)
  76. if form.is_valid():
  77. Payment.objects.create(
  78. invoice=invoice,
  79. amount=form.cleaned_data["amount"],
  80. currency_code=invoice.currency_code,
  81. received_at=form.cleaned_data.get("received_at") or None,
  82. reference=form.cleaned_data.get("reference", ""),
  83. )
  84. messages.success(request, f"Payment recorded for invoice #{invoice.id}.")
  85. else:
  86. messages.error(request, "Invalid payment data.")
  87. return redirect("billing:invoices_list")
  88. @staff_member_required
  89. @breadcrumbs(label="Invoice Detail", parent="re_invoices")
  90. def invoice_detail(request, pk: int):
  91. inv = get_object_or_404(
  92. Invoice.objects.select_related("organization", "customer").prefetch_related("lines", "payments"), pk=pk
  93. )
  94. # Scope check to current org if applicable
  95. org = getattr(request, "org", None)
  96. if org is not None and inv.organization_id != org.id:
  97. messages.error(request, "Invoice not in this organization.")
  98. return redirect("billing:invoices_list")
  99. # Totals
  100. payments_total = inv.payments.aggregate(s=Coalesce(Sum("amount"), Value(Decimal("0.00"))))["s"] or Decimal("0.00")
  101. balance = (Decimal(inv.total_amount) - Decimal(payments_total)).quantize(Decimal("0.01"))
  102. pay_form = PaymentForm()
  103. context = {
  104. "nav": _nav_items(),
  105. "invoice": inv,
  106. "payments_total": payments_total,
  107. "balance": balance,
  108. "pay_form": pay_form,
  109. "status_choices": Invoice.STATUS_CHOICES,
  110. }
  111. return render(request, "recycle_core/invoice_detail.html", context)
  112. @staff_member_required
  113. @require_POST
  114. def invoice_set_status(request, pk: int):
  115. inv = get_object_or_404(Invoice, pk=pk)
  116. new_status = (request.POST.get("status") or "").strip()
  117. valid = {k for k, _ in Invoice.STATUS_CHOICES}
  118. if new_status not in valid:
  119. messages.error(request, "Invalid status selection.")
  120. return redirect("billing:invoice_detail", pk=inv.id)
  121. inv.status = new_status
  122. inv.save(update_fields=["status", "updated_at"])
  123. messages.success(request, f"Invoice status updated to '{new_status}'.")
  124. return redirect("billing:invoice_detail", pk=inv.id)
  125. # Payouts UI + CSV ----------------------------------------------------------
  126. @staff_member_required
  127. @public_route(label="Payouts", order=52, icon="banknotes")
  128. @breadcrumbs(label="Payouts", name="re_payouts")
  129. def payouts_list(request):
  130. class PayoutFilter(filters.FilterSet):
  131. organization = filters.ModelChoiceFilter(queryset=Organization.objects.all())
  132. customer = filters.ModelChoiceFilter(queryset=Customer.objects.all())
  133. paid_at = filters.DateFromToRangeFilter(field_name="paid_at", label="Paid between")
  134. class Meta:
  135. model = Payout
  136. fields = ["organization", "customer", "paid_at"]
  137. base_qs = Payout.objects.select_related("organization", "customer").order_by("-paid_at", "-id")
  138. p_filter = PayoutFilter(request.GET, queryset=base_qs)
  139. qs = p_filter.qs
  140. org = getattr(request, "org", None)
  141. if org is not None:
  142. qs = qs.filter(organization=org)
  143. paginator = Paginator(qs, 10)
  144. page = request.GET.get("page")
  145. try:
  146. page_obj = paginator.page(page)
  147. except PageNotAnInteger:
  148. page_obj = paginator.page(1)
  149. except EmptyPage:
  150. page_obj = paginator.page(paginator.num_pages)
  151. context = {
  152. "nav": _nav_items(),
  153. "payouts": page_obj.object_list,
  154. "page_obj": page_obj,
  155. "filter": p_filter,
  156. }
  157. return render(request, "recycle_core/payouts_list.html", context)
  158. @staff_member_required
  159. def payouts_export_csv(request):
  160. qs = Payout.objects.select_related("organization", "customer").all()
  161. org_obj = getattr(request, "org", None)
  162. if org_obj is not None:
  163. qs = qs.filter(organization=org_obj)
  164. org = request.GET.get("organization")
  165. cust = request.GET.get("customer")
  166. start = request.GET.get("paid_at_after") or request.GET.get("paid_at_min")
  167. end = request.GET.get("paid_at_before") or request.GET.get("paid_at_max")
  168. from django.utils.dateparse import parse_datetime
  169. if org:
  170. qs = qs.filter(organization_id=org)
  171. if cust:
  172. qs = qs.filter(customer_id=cust)
  173. if start:
  174. dt = parse_datetime(start)
  175. if dt:
  176. qs = qs.filter(paid_at__gte=dt)
  177. if end:
  178. dt = parse_datetime(end)
  179. if dt:
  180. qs = qs.filter(paid_at__lte=dt)
  181. response = HttpResponse(content_type="text/csv")
  182. response["Content-Disposition"] = "attachment; filename=payouts.csv"
  183. writer = csv.writer(response)
  184. writer.writerow(["organization", "customer", "amount", "currency", "paid_at", "reference", "pickup_id"])
  185. for p in qs.iterator():
  186. writer.writerow([
  187. p.organization.code,
  188. p.customer.name,
  189. p.amount,
  190. p.currency_code,
  191. p.paid_at.isoformat(),
  192. p.reference,
  193. p.pickup_id or "",
  194. ])
  195. return response