angularjs-rails 1.3.2 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/lib/angularjs-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/angular-animate.js +2 -2
  4. data/vendor/assets/javascripts/angular-aria.js +83 -23
  5. data/vendor/assets/javascripts/angular-cookies.js +1 -1
  6. data/vendor/assets/javascripts/angular-loader.js +6 -23
  7. data/vendor/assets/javascripts/angular-messages.js +1 -1
  8. data/vendor/assets/javascripts/angular-mocks.js +21 -17
  9. data/vendor/assets/javascripts/angular-resource.js +1 -1
  10. data/vendor/assets/javascripts/angular-route.js +19 -5
  11. data/vendor/assets/javascripts/angular-sanitize.js +20 -20
  12. data/vendor/assets/javascripts/angular-scenario.js +298 -269
  13. data/vendor/assets/javascripts/angular-touch.js +3 -3
  14. data/vendor/assets/javascripts/angular.js +292 -263
  15. data/vendor/assets/javascripts/unstable/angular-animate.js +2 -2
  16. data/vendor/assets/javascripts/unstable/angular-aria.js +83 -23
  17. data/vendor/assets/javascripts/unstable/angular-cookies.js +1 -1
  18. data/vendor/assets/javascripts/unstable/angular-loader.js +6 -23
  19. data/vendor/assets/javascripts/unstable/angular-messages.js +1 -1
  20. data/vendor/assets/javascripts/unstable/angular-mocks.js +21 -17
  21. data/vendor/assets/javascripts/unstable/angular-resource.js +1 -1
  22. data/vendor/assets/javascripts/unstable/angular-route.js +19 -5
  23. data/vendor/assets/javascripts/unstable/angular-sanitize.js +20 -20
  24. data/vendor/assets/javascripts/unstable/angular-scenario.js +298 -269
  25. data/vendor/assets/javascripts/unstable/angular-touch.js +3 -3
  26. data/vendor/assets/javascripts/unstable/angular.js +292 -263
  27. metadata +2 -2
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1889,7 +1889,7 @@ angular.module('ngAnimate', ['ng'])
1889
1889
  //the jqLite object, so we're safe to use a single variable to house
1890
1890
  //the styles since there is always only one element being animated
1891
1891
  var oldStyle = node.getAttribute('style') || '';
1892
- if (oldStyle.charAt(oldStyle.length-1) !== ';') {
1892
+ if (oldStyle.charAt(oldStyle.length - 1) !== ';') {
1893
1893
  oldStyle += ';';
1894
1894
  }
1895
1895
  node.setAttribute('style', oldStyle + ' ' + style);
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -10,33 +10,49 @@
10
10
  * @name ngAria
11
11
  * @description
12
12
  *
13
- * The `ngAria` module provides support for adding <abbr title="Accessible Rich Internet Applications">ARIA</abbr>
14
- * attributes that convey state or semantic information about the application in order to allow assistive technologies
15
- * to convey appropriate information to persons with disabilities.
13
+ * The `ngAria` module provides support for common
14
+ * [<abbr title="Accessible Rich Internet Applications">ARIA</abbr>](http://www.w3.org/TR/wai-aria/)
15
+ * attributes that convey state or semantic information about the application for users
16
+ * of assistive technologies, such as screen readers.
16
17
  *
17
18
  * <div doc-module-components="ngAria"></div>
18
19
  *
19
- * # Usage
20
- * To enable the addition of the ARIA tags, just require the module into your application and the tags will
21
- * hook into your ng-show/ng-hide, input, textarea, button, select and ng-required directives and adds the
22
- * appropriate ARIA attributes.
20
+ * ## Usage
23
21
  *
24
- * Currently, the following ARIA attributes are implemented:
22
+ * For ngAria to do its magic, simply include the module as a dependency. The directives supported
23
+ * by ngAria are:
24
+ * `ngModel`, `ngDisabled`, `ngShow`, `ngHide`, `ngClick`, `ngDblClick`, and `ngMessages`.
25
25
  *
26
- * + aria-hidden
27
- * + aria-checked
28
- * + aria-disabled
29
- * + aria-required
30
- * + aria-invalid
31
- * + aria-multiline
32
- * + aria-valuenow
33
- * + aria-valuemin
34
- * + aria-valuemax
35
- * + tabindex
26
+ * Below is a more detailed breakdown of the attributes handled by ngAria:
36
27
  *
37
- * You can disable individual ARIA attributes by using the {@link ngAria.$ariaProvider#config config} method.
28
+ * | Directive | Supported Attributes |
29
+ * |---------------------------------------------|----------------------------------------------------------------------------------------|
30
+ * | {@link ng.directive:ngModel ngModel} | aria-checked, aria-valuemin, aria-valuemax, aria-valuenow, aria-invalid, aria-required |
31
+ * | {@link ng.directive:ngDisabled ngDisabled} | aria-disabled |
32
+ * | {@link ng.directive:ngShow ngShow} | aria-hidden |
33
+ * | {@link ng.directive:ngHide ngHide} | aria-hidden |
34
+ * | {@link ng.directive:ngClick ngClick} | tabindex |
35
+ * | {@link ng.directive:ngDblclick ngDblclick} | tabindex |
36
+ * | {@link module:ngMessages ngMessages} | aria-live |
37
+ *
38
+ * Find out more information about each directive by reading the
39
+ * {@link guide/accessibility ngAria Developer Guide}.
40
+ *
41
+ * ##Example
42
+ * Using ngDisabled with ngAria:
43
+ * ```html
44
+ * <md-checkbox ng-disabled="disabled">
45
+ * ```
46
+ * Becomes:
47
+ * ```html
48
+ * <md-checkbox ng-disabled="disabled" aria-disabled="true">
49
+ * ```
50
+ *
51
+ * ##Disabling Attributes
52
+ * It's possible to disable individual attributes added by ngAria with the
53
+ * {@link ngAria.$ariaProvider#config config} method. For more details, see the
54
+ * {@link guide/accessibility Developer Guide}.
38
55
  */
39
-
40
56
  /* global -ngAriaModule */
41
57
  var ngAriaModule = angular.module('ngAria', ['ng']).
42
58
  provider('$aria', $AriaProvider);
@@ -47,10 +63,20 @@ var ngAriaModule = angular.module('ngAria', ['ng']).
47
63
  *
48
64
  * @description
49
65
  *
50
- * Used for configuring ARIA attributes.
66
+ * Used for configuring the ARIA attributes injected and managed by ngAria.
67
+ *
68
+ * ```js
69
+ * angular.module('myApp', ['ngAria'], function config($ariaProvider) {
70
+ * $ariaProvider.config({
71
+ * ariaValue: true,
72
+ * tabindex: false
73
+ * });
74
+ * });
75
+ *```
51
76
  *
52
77
  * ## Dependencies
53
78
  * Requires the {@link ngAria} module to be installed.
79
+ *
54
80
  */
55
81
  function $AriaProvider() {
56
82
  var config = {
@@ -113,7 +139,41 @@ function $AriaProvider() {
113
139
  *
114
140
  * @description
115
141
  *
116
- * Contains helper methods for applying ARIA attributes to HTML
142
+ * The $aria service contains helper methods for applying common
143
+ * [ARIA](http://www.w3.org/TR/wai-aria/) attributes to HTML directives.
144
+ *
145
+ * ngAria injects common accessibility attributes that tell assistive technologies when HTML
146
+ * elements are enabled, selected, hidden, and more. To see how this is performed with ngAria,
147
+ * let's review a code snippet from ngAria itself:
148
+ *
149
+ *```js
150
+ * ngAriaModule.directive('ngDisabled', ['$aria', function($aria) {
151
+ * return $aria.$$watchExpr('ngDisabled', 'aria-disabled');
152
+ * }])
153
+ *```
154
+ * Shown above, the ngAria module creates a directive with the same signature as the
155
+ * traditional `ng-disabled` directive. But this ngAria version is dedicated to
156
+ * solely managing accessibility attributes. The internal `$aria` service is used to watch the
157
+ * boolean attribute `ngDisabled`. If it has not been explicitly set by the developer,
158
+ * `aria-disabled` is injected as an attribute with its value synchronized to the value in
159
+ * `ngDisabled`.
160
+ *
161
+ * Because ngAria hooks into the `ng-disabled` directive, developers do not have to do
162
+ * anything to enable this feature. The `aria-disabled` attribute is automatically managed
163
+ * simply as a silent side-effect of using `ng-disabled` with the ngAria module.
164
+ *
165
+ * The full list of directives that interface with ngAria:
166
+ * * **ngModel**
167
+ * * **ngShow**
168
+ * * **ngHide**
169
+ * * **ngClick**
170
+ * * **ngDblclick**
171
+ * * **ngMessages**
172
+ * * **ngDisabled**
173
+ *
174
+ * Read the {@link guide/accessibility ngAria Developer Guide} for a thorough explanation of each
175
+ * directive.
176
+ *
117
177
  *
118
178
  * ## Dependencies
119
179
  * Requires the {@link ngAria} module to be installed.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -43,40 +43,23 @@ function minErr(module, ErrorConstructor) {
43
43
  prefix = '[' + (module ? module + ':' : '') + code + '] ',
44
44
  template = arguments[1],
45
45
  templateArgs = arguments,
46
- stringify = function(obj) {
47
- if (typeof obj === 'function') {
48
- return obj.toString().replace(/ \{[\s\S]*$/, '');
49
- } else if (typeof obj === 'undefined') {
50
- return 'undefined';
51
- } else if (typeof obj !== 'string') {
52
- return JSON.stringify(obj);
53
- }
54
- return obj;
55
- },
46
+
56
47
  message, i;
57
48
 
58
49
  message = prefix + template.replace(/\{\d+\}/g, function(match) {
59
50
  var index = +match.slice(1, -1), arg;
60
51
 
61
52
  if (index + 2 < templateArgs.length) {
62
- arg = templateArgs[index + 2];
63
- if (typeof arg === 'function') {
64
- return arg.toString().replace(/ ?\{[\s\S]*$/, '');
65
- } else if (typeof arg === 'undefined') {
66
- return 'undefined';
67
- } else if (typeof arg !== 'string') {
68
- return toJson(arg);
69
- }
70
- return arg;
53
+ return toDebugString(templateArgs[index + 2]);
71
54
  }
72
55
  return match;
73
56
  });
74
57
 
75
- message = message + '\nhttp://errors.angularjs.org/1.3.2/' +
58
+ message = message + '\nhttp://errors.angularjs.org/1.3.3/' +
76
59
  (module ? module + '/' : '') + code;
77
60
  for (i = 2; i < arguments.length; i++) {
78
- message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
79
- encodeURIComponent(stringify(arguments[i]));
61
+ message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
62
+ encodeURIComponent(toDebugString(arguments[i]));
80
63
  }
81
64
  return new ErrorConstructor(message);
82
65
  };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -117,7 +117,7 @@ angular.mock.$Browser = function() {
117
117
  self.defer.now += delay;
118
118
  } else {
119
119
  if (self.deferredFns.length) {
120
- self.defer.now = self.deferredFns[self.deferredFns.length-1].time;
120
+ self.defer.now = self.deferredFns[self.deferredFns.length - 1].time;
121
121
  } else {
122
122
  throw new Error('No deferred tasks to be flushed');
123
123
  }
@@ -428,7 +428,7 @@ angular.mock.$LogProvider = function() {
428
428
  });
429
429
  });
430
430
  if (errors.length) {
431
- errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or "+
431
+ errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or " +
432
432
  "an expected log message was not checked and removed:");
433
433
  errors.push('');
434
434
  throw new Error(errors.join('\n---------\n'));
@@ -461,17 +461,17 @@ angular.mock.$LogProvider = function() {
461
461
  * @returns {promise} A promise which will be notified on each iteration.
462
462
  */
463
463
  angular.mock.$IntervalProvider = function() {
464
- this.$get = ['$rootScope', '$q',
465
- function($rootScope, $q) {
464
+ this.$get = ['$browser', '$rootScope', '$q', '$$q',
465
+ function($browser, $rootScope, $q, $$q) {
466
466
  var repeatFns = [],
467
467
  nextRepeatId = 0,
468
468
  now = 0;
469
469
 
470
470
  var $interval = function(fn, delay, count, invokeApply) {
471
- var deferred = $q.defer(),
472
- promise = deferred.promise,
473
- iteration = 0,
474
- skipApply = (angular.isDefined(invokeApply) && !invokeApply);
471
+ var iteration = 0,
472
+ skipApply = (angular.isDefined(invokeApply) && !invokeApply),
473
+ deferred = (skipApply ? $$q : $q).defer(),
474
+ promise = deferred.promise;
475
475
 
476
476
  count = (angular.isDefined(count)) ? count : 0;
477
477
  promise.then(null, null, fn);
@@ -494,7 +494,11 @@ angular.mock.$IntervalProvider = function() {
494
494
  }
495
495
  }
496
496
 
497
- if (!skipApply) $rootScope.$apply();
497
+ if (skipApply) {
498
+ $browser.defer.flush();
499
+ } else {
500
+ $rootScope.$apply();
501
+ }
498
502
  }
499
503
 
500
504
  repeatFns.push({
@@ -581,10 +585,10 @@ function jsonStringToDate(string) {
581
585
  tzMin = int(match[9] + match[11]);
582
586
  }
583
587
  date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
584
- date.setUTCHours(int(match[4]||0) - tzHour,
585
- int(match[5]||0) - tzMin,
586
- int(match[6]||0),
587
- int(match[7]||0));
588
+ date.setUTCHours(int(match[4] || 0) - tzHour,
589
+ int(match[5] || 0) - tzMin,
590
+ int(match[6] || 0),
591
+ int(match[7] || 0));
588
592
  return date;
589
593
  }
590
594
  return string;
@@ -663,7 +667,7 @@ angular.mock.TzDate = function(offset, timestamp) {
663
667
  }
664
668
 
665
669
  var localOffset = new Date(timestamp).getTimezoneOffset();
666
- self.offsetDiff = localOffset*60*1000 - offset*1000*60*60;
670
+ self.offsetDiff = localOffset * 60 * 1000 - offset * 1000 * 60 * 60;
667
671
  self.date = new Date(timestamp + self.offsetDiff);
668
672
 
669
673
  self.getTime = function() {
@@ -815,7 +819,7 @@ angular.mock.animate = angular.module('ngAnimateMock', ['ng'])
815
819
  animate.queue.push({
816
820
  event: method,
817
821
  element: arguments[0],
818
- options: arguments[arguments.length-1],
822
+ options: arguments[arguments.length - 1],
819
823
  args: arguments
820
824
  });
821
825
  return $delegate[method].apply($delegate, arguments);
@@ -1770,7 +1774,7 @@ angular.mock.$RAFDecorator = ['$delegate', function($delegate) {
1770
1774
  }
1771
1775
 
1772
1776
  var length = queue.length;
1773
- for (var i=0;i<length;i++) {
1777
+ for (var i = 0; i < length; i++) {
1774
1778
  queue[i]();
1775
1779
  }
1776
1780
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -151,6 +151,9 @@ function $RouteProvider() {
151
151
  if (angular.isUndefined(routeCopy.reloadOnSearch)) {
152
152
  routeCopy.reloadOnSearch = true;
153
153
  }
154
+ if (angular.isUndefined(routeCopy.caseInsensitiveMatch)) {
155
+ routeCopy.caseInsensitiveMatch = this.caseInsensitiveMatch;
156
+ }
154
157
  routes[path] = angular.extend(
155
158
  routeCopy,
156
159
  path && pathRegExp(path, routeCopy)
@@ -158,9 +161,9 @@ function $RouteProvider() {
158
161
 
159
162
  // create redirection for trailing slashes
160
163
  if (path) {
161
- var redirectPath = (path[path.length-1] == '/')
162
- ? path.substr(0, path.length-1)
163
- : path +'/';
164
+ var redirectPath = (path[path.length - 1] == '/')
165
+ ? path.substr(0, path.length - 1)
166
+ : path + '/';
164
167
 
165
168
  routes[redirectPath] = angular.extend(
166
169
  {redirectTo: path},
@@ -171,6 +174,17 @@ function $RouteProvider() {
171
174
  return this;
172
175
  };
173
176
 
177
+ /**
178
+ * @ngdoc property
179
+ * @name $routeProvider#caseInsensitiveMatch
180
+ * @description
181
+ *
182
+ * A boolean property indicating if routes defined
183
+ * using this provider should be matched using a case sensitive
184
+ * algorithm. Defaults to `false`.
185
+ */
186
+ this.caseInsensitiveMatch = false;
187
+
174
188
  /**
175
189
  * @param path {string} path
176
190
  * @param opts {Object} options
@@ -639,7 +653,7 @@ function $RouteProvider() {
639
653
  */
640
654
  function interpolate(string, params) {
641
655
  var result = [];
642
- angular.forEach((string||'').split(':'), function(segment, i) {
656
+ angular.forEach((string || '').split(':'), function(segment, i) {
643
657
  if (i === 0) {
644
658
  result.push(segment);
645
659
  } else {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.2
2
+ * @license AngularJS v1.3.3
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -218,29 +218,29 @@ var validElements = angular.extend({},
218
218
  //Attributes that have href and hence need to be sanitized
219
219
  var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap,xlink:href");
220
220
 
221
- var htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+
222
- 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+
223
- 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+
224
- 'scope,scrolling,shape,size,span,start,summary,target,title,type,'+
221
+ var htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' +
222
+ 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' +
223
+ 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' +
224
+ 'scope,scrolling,shape,size,span,start,summary,target,title,type,' +
225
225
  'valign,value,vspace,width');
226
226
 
227
227
  // SVG attributes (without "id" and "name" attributes)
228
228
  // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes
229
- var svgAttrs = makeMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,'+
230
- 'attributeName,attributeType,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,'+
231
- 'color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,'+
232
- 'font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,'+
233
- 'gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,'+
234
- 'keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,'+
235
- 'markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,'+
236
- 'overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,'+
237
- 'repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,'+
238
- 'stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,'+
239
- 'stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,'+
240
- 'stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,'+
241
- 'underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,'+
242
- 'viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,'+
243
- 'xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,'+
229
+ var svgAttrs = makeMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' +
230
+ 'attributeName,attributeType,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,' +
231
+ 'color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,' +
232
+ 'font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,' +
233
+ 'gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,' +
234
+ 'keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,' +
235
+ 'markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,' +
236
+ 'overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,' +
237
+ 'repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,' +
238
+ 'stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,' +
239
+ 'stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,' +
240
+ 'stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,' +
241
+ 'underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,' +
242
+ 'viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,' +
243
+ 'xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,' +
244
244
  'zoomAndPan');
245
245
 
246
246
  var validAttrs = angular.extend({},
@@ -9190,7 +9190,7 @@ return jQuery;
9190
9190
  }));
9191
9191
 
9192
9192
  /**
9193
- * @license AngularJS v1.3.2
9193
+ * @license AngularJS v1.3.3
9194
9194
  * (c) 2010-2014 Google, Inc. http://angularjs.org
9195
9195
  * License: MIT
9196
9196
  */
@@ -9234,40 +9234,23 @@ function minErr(module, ErrorConstructor) {
9234
9234
  prefix = '[' + (module ? module + ':' : '') + code + '] ',
9235
9235
  template = arguments[1],
9236
9236
  templateArgs = arguments,
9237
- stringify = function(obj) {
9238
- if (typeof obj === 'function') {
9239
- return obj.toString().replace(/ \{[\s\S]*$/, '');
9240
- } else if (typeof obj === 'undefined') {
9241
- return 'undefined';
9242
- } else if (typeof obj !== 'string') {
9243
- return JSON.stringify(obj);
9244
- }
9245
- return obj;
9246
- },
9237
+
9247
9238
  message, i;
9248
9239
 
9249
9240
  message = prefix + template.replace(/\{\d+\}/g, function(match) {
9250
9241
  var index = +match.slice(1, -1), arg;
9251
9242
 
9252
9243
  if (index + 2 < templateArgs.length) {
9253
- arg = templateArgs[index + 2];
9254
- if (typeof arg === 'function') {
9255
- return arg.toString().replace(/ ?\{[\s\S]*$/, '');
9256
- } else if (typeof arg === 'undefined') {
9257
- return 'undefined';
9258
- } else if (typeof arg !== 'string') {
9259
- return toJson(arg);
9260
- }
9261
- return arg;
9244
+ return toDebugString(templateArgs[index + 2]);
9262
9245
  }
9263
9246
  return match;
9264
9247
  });
9265
9248
 
9266
- message = message + '\nhttp://errors.angularjs.org/1.3.2/' +
9249
+ message = message + '\nhttp://errors.angularjs.org/1.3.3/' +
9267
9250
  (module ? module + '/' : '') + code;
9268
9251
  for (i = 2; i < arguments.length; i++) {
9269
- message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
9270
- encodeURIComponent(stringify(arguments[i]));
9252
+ message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
9253
+ encodeURIComponent(toDebugString(arguments[i]));
9271
9254
  }
9272
9255
  return new ErrorConstructor(message);
9273
9256
  };
@@ -9907,7 +9890,7 @@ function includes(array, obj) {
9907
9890
 
9908
9891
  function arrayRemove(array, value) {
9909
9892
  var index = array.indexOf(value);
9910
- if (index >=0)
9893
+ if (index >= 0)
9911
9894
  array.splice(index, 1);
9912
9895
  return value;
9913
9896
  }
@@ -10108,7 +10091,7 @@ function equals(o1, o2) {
10108
10091
  if (isArray(o1)) {
10109
10092
  if (!isArray(o2)) return false;
10110
10093
  if ((length = o1.length) == o2.length) {
10111
- for (key=0; key<length; key++) {
10094
+ for (key = 0; key < length; key++) {
10112
10095
  if (!equals(o1[key], o2[key])) return false;
10113
10096
  }
10114
10097
  return true;
@@ -10194,7 +10177,7 @@ function bind(self, fn) {
10194
10177
  return curryArgs.length
10195
10178
  ? function() {
10196
10179
  return arguments.length
10197
- ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))
10180
+ ? fn.apply(self, concat(curryArgs, arguments, 0))
10198
10181
  : fn.apply(self, curryArgs);
10199
10182
  }
10200
10183
  : function() {
@@ -10394,7 +10377,7 @@ var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];
10394
10377
  function getNgAttribute(element, ngAttr) {
10395
10378
  var attr, i, ii = ngAttrPrefixes.length;
10396
10379
  element = jqLite(element);
10397
- for (i=0; i<ii; ++i) {
10380
+ for (i = 0; i < ii; ++i) {
10398
10381
  attr = ngAttrPrefixes[i] + ngAttr;
10399
10382
  if (isString(attr = element.attr(attr))) {
10400
10383
  return attr;
@@ -11179,6 +11162,34 @@ function setupModuleLoader(window) {
11179
11162
 
11180
11163
  }
11181
11164
 
11165
+ /* global: toDebugString: true */
11166
+
11167
+ function serializeObject(obj) {
11168
+ var seen = [];
11169
+
11170
+ return JSON.stringify(obj, function(key, val) {
11171
+ val = toJsonReplacer(key, val);
11172
+ if (isObject(val)) {
11173
+
11174
+ if (seen.indexOf(val) >= 0) return '<<already seen>>';
11175
+
11176
+ seen.push(val);
11177
+ }
11178
+ return val;
11179
+ });
11180
+ }
11181
+
11182
+ function toDebugString(obj) {
11183
+ if (typeof obj === 'function') {
11184
+ return obj.toString().replace(/ \{[\s\S]*$/, '');
11185
+ } else if (typeof obj === 'undefined') {
11186
+ return 'undefined';
11187
+ } else if (typeof obj !== 'string') {
11188
+ return serializeObject(obj);
11189
+ }
11190
+ return obj;
11191
+ }
11192
+
11182
11193
  /* global angularModule: true,
11183
11194
  version: true,
11184
11195
 
@@ -11281,11 +11292,11 @@ function setupModuleLoader(window) {
11281
11292
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
11282
11293
  */
11283
11294
  var version = {
11284
- full: '1.3.2', // all of these placeholder strings will be replaced by grunt's
11295
+ full: '1.3.3', // all of these placeholder strings will be replaced by grunt's
11285
11296
  major: 1, // package task
11286
11297
  minor: 3,
11287
- dot: 2,
11288
- codeName: 'cardiovasculatory-magnification'
11298
+ dot: 3,
11299
+ codeName: 'undersea-arithmetic'
11289
11300
  };
11290
11301
 
11291
11302
 
@@ -12018,7 +12029,7 @@ forEach({
12018
12029
  }
12019
12030
  } else {
12020
12031
  return (element[name] ||
12021
- (element.attributes.getNamedItem(name)|| noop).specified)
12032
+ (element.attributes.getNamedItem(name) || noop).specified)
12022
12033
  ? lowercasedName
12023
12034
  : undefined;
12024
12035
  }
@@ -13354,7 +13365,7 @@ function $AnchorScrollProvider() {
13354
13365
  * @name $anchorScrollProvider#disableAutoScrolling
13355
13366
  *
13356
13367
  * @description
13357
- * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically will detect changes to
13368
+ * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to
13358
13369
  * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.<br />
13359
13370
  * Use this method to disable automatic scrolling.
13360
13371
  *
@@ -14003,8 +14014,7 @@ function $$AsyncCallbackProvider() {
14003
14014
  /**
14004
14015
  * @param {object} window The global window object.
14005
14016
  * @param {object} document jQuery wrapped document.
14006
- * @param {function()} XHR XMLHttpRequest constructor.
14007
- * @param {object} $log console.log or an object with the same interface.
14017
+ * @param {object} $log window.console or an object with the same interface.
14008
14018
  * @param {object} $sniffer $sniffer service
14009
14019
  */
14010
14020
  function Browser(window, document, $log, $sniffer) {
@@ -14354,8 +14364,8 @@ function Browser(window, document, $log, $sniffer) {
14354
14364
  // - 20 cookies per unique domain
14355
14365
  // - 4096 bytes per cookie
14356
14366
  if (cookieLength > 4096) {
14357
- $log.warn("Cookie '"+ name +
14358
- "' possibly not set or overflowed because it was too large ("+
14367
+ $log.warn("Cookie '" + name +
14368
+ "' possibly not set or overflowed because it was too large (" +
14359
14369
  cookieLength + " > 4096 bytes)!");
14360
14370
  }
14361
14371
  }
@@ -15020,7 +15030,7 @@ function $TemplateCacheProvider() {
15020
15030
  *
15021
15031
  *
15022
15032
  * #### `bindToController`
15023
- * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController` will
15033
+ * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController: true` will
15024
15034
  * allow a component to have its properties bound to the controller, rather than to scope. When the controller
15025
15035
  * is instantiated, the initial values of the isolate scope bindings are already available.
15026
15036
  *
@@ -15869,16 +15879,16 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
15869
15879
 
15870
15880
  // for each tuples
15871
15881
  var nbrUrisWith2parts = Math.floor(rawUris.length / 2);
15872
- for (var i=0; i<nbrUrisWith2parts; i++) {
15873
- var innerIdx = i*2;
15882
+ for (var i = 0; i < nbrUrisWith2parts; i++) {
15883
+ var innerIdx = i * 2;
15874
15884
  // sanitize the uri
15875
15885
  result += $$sanitizeUri(trim(rawUris[innerIdx]), true);
15876
15886
  // add the descriptor
15877
- result += (" " + trim(rawUris[innerIdx+1]));
15887
+ result += (" " + trim(rawUris[innerIdx + 1]));
15878
15888
  }
15879
15889
 
15880
15890
  // split the last item into uri and descriptor
15881
- var lastTuple = trim(rawUris[i*2]).split(/\s/);
15891
+ var lastTuple = trim(rawUris[i * 2]).split(/\s/);
15882
15892
 
15883
15893
  // sanitize the last uri
15884
15894
  result += $$sanitizeUri(trim(lastTuple[0]), true);
@@ -16072,7 +16082,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16072
16082
  if (!node) {
16073
16083
  return 'html';
16074
16084
  } else {
16075
- return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg': 'html';
16085
+ return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg' : 'html';
16076
16086
  }
16077
16087
  }
16078
16088
 
@@ -16885,7 +16895,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16885
16895
  var match = null;
16886
16896
  if (hasDirectives.hasOwnProperty(name)) {
16887
16897
  for (var directive, directives = $injector.get(name + Suffix),
16888
- i = 0, ii = directives.length; i<ii; i++) {
16898
+ i = 0, ii = directives.length; i < ii; i++) {
16889
16899
  try {
16890
16900
  directive = directives[i];
16891
16901
  if ((maxPriority === undefined || maxPriority > directive.priority) &&
@@ -16914,7 +16924,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
16914
16924
  function directiveIsMultiElement(name) {
16915
16925
  if (hasDirectives.hasOwnProperty(name)) {
16916
16926
  for (var directive, directives = $injector.get(name + Suffix),
16917
- i = 0, ii = directives.length; i<ii; i++) {
16927
+ i = 0, ii = directives.length; i < ii; i++) {
16918
16928
  directive = directives[i];
16919
16929
  if (directive.multiElement) {
16920
16930
  return true;
@@ -17133,7 +17143,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
17133
17143
  case 'svg':
17134
17144
  case 'math':
17135
17145
  var wrapper = document.createElement('div');
17136
- wrapper.innerHTML = '<'+type+'>'+template+'</'+type+'>';
17146
+ wrapper.innerHTML = '<' + type + '>' + template + '</' + type + '>';
17137
17147
  return wrapper.childNodes[0].childNodes;
17138
17148
  default:
17139
17149
  return template;
@@ -17490,6 +17500,10 @@ function $ControllerProvider() {
17490
17500
  * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global
17491
17501
  * `window` object (not recommended)
17492
17502
  *
17503
+ * The string can use the `controller as property` syntax, where the controller instance is published
17504
+ * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this
17505
+ * to work correctly.
17506
+ *
17493
17507
  * @param {Object} locals Injection locals for Controller.
17494
17508
  * @return {Object} Instance of given controller.
17495
17509
  *
@@ -17664,7 +17678,7 @@ function defaultHttpResponseTransform(data, headers) {
17664
17678
  // strip json vulnerability protection prefix
17665
17679
  data = data.replace(JSON_PROTECTION_PREFIX, '');
17666
17680
  var contentType = headers('Content-Type');
17667
- if ((contentType && contentType.indexOf(APPLICATION_JSON) === 0) ||
17681
+ if ((contentType && contentType.indexOf(APPLICATION_JSON) === 0 && data.trim()) ||
17668
17682
  (JSON_START.test(data) && JSON_END.test(data))) {
17669
17683
  data = fromJson(data);
17670
17684
  }
@@ -19235,7 +19249,8 @@ function $InterpolateProvider() {
19235
19249
 
19236
19250
  function parseStringifyInterceptor(value) {
19237
19251
  try {
19238
- return stringify(getValue(value));
19252
+ value = getValue(value);
19253
+ return allOrNothing && !isDefined(value) ? value : stringify(value);
19239
19254
  } catch (err) {
19240
19255
  var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text,
19241
19256
  err.toString());
@@ -19559,8 +19574,8 @@ function encodePath(path) {
19559
19574
  return segments.join('/');
19560
19575
  }
19561
19576
 
19562
- function parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {
19563
- var parsedUrl = urlResolve(absoluteUrl, appBase);
19577
+ function parseAbsoluteUrl(absoluteUrl, locationObj) {
19578
+ var parsedUrl = urlResolve(absoluteUrl);
19564
19579
 
19565
19580
  locationObj.$$protocol = parsedUrl.protocol;
19566
19581
  locationObj.$$host = parsedUrl.hostname;
@@ -19568,12 +19583,12 @@ function parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {
19568
19583
  }
19569
19584
 
19570
19585
 
19571
- function parseAppUrl(relativeUrl, locationObj, appBase) {
19586
+ function parseAppUrl(relativeUrl, locationObj) {
19572
19587
  var prefixed = (relativeUrl.charAt(0) !== '/');
19573
19588
  if (prefixed) {
19574
19589
  relativeUrl = '/' + relativeUrl;
19575
19590
  }
19576
- var match = urlResolve(relativeUrl, appBase);
19591
+ var match = urlResolve(relativeUrl);
19577
19592
  locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?
19578
19593
  match.pathname.substring(1) : match.pathname);
19579
19594
  locationObj.$$search = parseKeyValue(match.search);
@@ -19628,7 +19643,7 @@ function LocationHtml5Url(appBase, basePrefix) {
19628
19643
  this.$$html5 = true;
19629
19644
  basePrefix = basePrefix || '';
19630
19645
  var appBaseNoFile = stripFile(appBase);
19631
- parseAbsoluteUrl(appBase, this, appBase);
19646
+ parseAbsoluteUrl(appBase, this);
19632
19647
 
19633
19648
 
19634
19649
  /**
@@ -19643,7 +19658,7 @@ function LocationHtml5Url(appBase, basePrefix) {
19643
19658
  appBaseNoFile);
19644
19659
  }
19645
19660
 
19646
- parseAppUrl(pathUrl, this, appBase);
19661
+ parseAppUrl(pathUrl, this);
19647
19662
 
19648
19663
  if (!this.$$path) {
19649
19664
  this.$$path = '/';
@@ -19706,7 +19721,7 @@ function LocationHtml5Url(appBase, basePrefix) {
19706
19721
  function LocationHashbangUrl(appBase, hashPrefix) {
19707
19722
  var appBaseNoFile = stripFile(appBase);
19708
19723
 
19709
- parseAbsoluteUrl(appBase, this, appBase);
19724
+ parseAbsoluteUrl(appBase, this);
19710
19725
 
19711
19726
 
19712
19727
  /**
@@ -19726,7 +19741,7 @@ function LocationHashbangUrl(appBase, hashPrefix) {
19726
19741
  throw $locationMinErr('ihshprfx', 'Invalid url "{0}", missing hash prefix "{1}".', url,
19727
19742
  hashPrefix);
19728
19743
  }
19729
- parseAppUrl(withoutHashUrl, this, appBase);
19744
+ parseAppUrl(withoutHashUrl, this);
19730
19745
 
19731
19746
  this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);
19732
19747
 
@@ -20366,11 +20381,19 @@ function $LocationProvider() {
20366
20381
  $rootScope.$evalAsync(function() {
20367
20382
  var oldUrl = $location.absUrl();
20368
20383
  var oldState = $location.$$state;
20384
+ var defaultPrevented;
20369
20385
 
20370
20386
  $location.$$parse(newUrl);
20371
20387
  $location.$$state = newState;
20372
- if ($rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
20373
- newState, oldState).defaultPrevented) {
20388
+
20389
+ defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
20390
+ newState, oldState).defaultPrevented;
20391
+
20392
+ // if the location was changed by a `$locationChangeStart` handler then stop
20393
+ // processing this location change
20394
+ if ($location.absUrl() !== newUrl) return;
20395
+
20396
+ if (defaultPrevented) {
20374
20397
  $location.$$parse(oldUrl);
20375
20398
  $location.$$state = oldState;
20376
20399
  setBrowserUrlWithFallback(oldUrl, false, oldState);
@@ -20394,13 +20417,20 @@ function $LocationProvider() {
20394
20417
  initializing = false;
20395
20418
 
20396
20419
  $rootScope.$evalAsync(function() {
20397
- if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl,
20398
- $location.$$state, oldState).defaultPrevented) {
20420
+ var newUrl = $location.absUrl();
20421
+ var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
20422
+ $location.$$state, oldState).defaultPrevented;
20423
+
20424
+ // if the location was changed by a `$locationChangeStart` handler then stop
20425
+ // processing this location change
20426
+ if ($location.absUrl() !== newUrl) return;
20427
+
20428
+ if (defaultPrevented) {
20399
20429
  $location.$$parse(oldUrl);
20400
20430
  $location.$$state = oldState;
20401
20431
  } else {
20402
20432
  if (urlOrStateChanged) {
20403
- setBrowserUrlWithFallback($location.absUrl(), currentReplace,
20433
+ setBrowserUrlWithFallback(newUrl, currentReplace,
20404
20434
  oldState === $location.$$state ? null : $location.$$state);
20405
20435
  }
20406
20436
  afterLocationChange(oldUrl, oldState);
@@ -20590,7 +20620,7 @@ var $parseMinErr = minErr('$parse');
20590
20620
  // Sandboxing Angular Expressions
20591
20621
  // ------------------------------
20592
20622
  // Angular expressions are generally considered safe because these expressions only have direct
20593
- // access to $scope and locals. However, one can obtain the ability to execute arbitrary JS code by
20623
+ // access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by
20594
20624
  // obtaining a reference to native JS functions such as the Function constructor.
20595
20625
  //
20596
20626
  // As an example, consider the following Angular expression:
@@ -20599,7 +20629,7 @@ var $parseMinErr = minErr('$parse');
20599
20629
  //
20600
20630
  // This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits
20601
20631
  // against the expression language, but not to prevent exploits that were enabled by exposing
20602
- // sensitive JavaScript or browser apis on Scope. Exposing such objects on a Scope is never a good
20632
+ // sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good
20603
20633
  // practice and therefore we are not even trying to protect against interaction with an object
20604
20634
  // explicitly exposed in this way.
20605
20635
  //
@@ -20607,6 +20637,8 @@ var $parseMinErr = minErr('$parse');
20607
20637
  // window or some DOM object that has a reference to window is published onto a Scope.
20608
20638
  // Similarly we prevent invocations of function known to be dangerous, as well as assignments to
20609
20639
  // native objects.
20640
+ //
20641
+ // See https://docs.angularjs.org/guide/security
20610
20642
 
20611
20643
 
20612
20644
  function ensureSafeMemberName(name, fullExpression) {
@@ -20615,7 +20647,7 @@ function ensureSafeMemberName(name, fullExpression) {
20615
20647
  || name === "__proto__") {
20616
20648
  throw $parseMinErr('isecfld',
20617
20649
  'Attempting to access a disallowed field in Angular expressions! '
20618
- +'Expression: {0}', fullExpression);
20650
+ + 'Expression: {0}', fullExpression);
20619
20651
  }
20620
20652
  return name;
20621
20653
  }
@@ -20692,24 +20724,24 @@ var OPERATORS = extend(createMap(), {
20692
20724
  }
20693
20725
  return a;
20694
20726
  }
20695
- return isDefined(b)?b:undefined;},
20727
+ return isDefined(b) ? b : undefined;},
20696
20728
  '-':function(self, locals, a, b) {
20697
20729
  a=a(self, locals); b=b(self, locals);
20698
- return (isDefined(a)?a:0)-(isDefined(b)?b:0);
20730
+ return (isDefined(a) ? a : 0) - (isDefined(b) ? b : 0);
20699
20731
  },
20700
- '*':function(self, locals, a, b) {return a(self, locals)*b(self, locals);},
20701
- '/':function(self, locals, a, b) {return a(self, locals)/b(self, locals);},
20702
- '%':function(self, locals, a, b) {return a(self, locals)%b(self, locals);},
20703
- '===':function(self, locals, a, b) {return a(self, locals)===b(self, locals);},
20704
- '!==':function(self, locals, a, b) {return a(self, locals)!==b(self, locals);},
20705
- '==':function(self, locals, a, b) {return a(self, locals)==b(self, locals);},
20706
- '!=':function(self, locals, a, b) {return a(self, locals)!=b(self, locals);},
20707
- '<':function(self, locals, a, b) {return a(self, locals)<b(self, locals);},
20708
- '>':function(self, locals, a, b) {return a(self, locals)>b(self, locals);},
20709
- '<=':function(self, locals, a, b) {return a(self, locals)<=b(self, locals);},
20710
- '>=':function(self, locals, a, b) {return a(self, locals)>=b(self, locals);},
20711
- '&&':function(self, locals, a, b) {return a(self, locals)&&b(self, locals);},
20712
- '||':function(self, locals, a, b) {return a(self, locals)||b(self, locals);},
20732
+ '*':function(self, locals, a, b) {return a(self, locals) * b(self, locals);},
20733
+ '/':function(self, locals, a, b) {return a(self, locals) / b(self, locals);},
20734
+ '%':function(self, locals, a, b) {return a(self, locals) % b(self, locals);},
20735
+ '===':function(self, locals, a, b) {return a(self, locals) === b(self, locals);},
20736
+ '!==':function(self, locals, a, b) {return a(self, locals) !== b(self, locals);},
20737
+ '==':function(self, locals, a, b) {return a(self, locals) == b(self, locals);},
20738
+ '!=':function(self, locals, a, b) {return a(self, locals) != b(self, locals);},
20739
+ '<':function(self, locals, a, b) {return a(self, locals) < b(self, locals);},
20740
+ '>':function(self, locals, a, b) {return a(self, locals) > b(self, locals);},
20741
+ '<=':function(self, locals, a, b) {return a(self, locals) <= b(self, locals);},
20742
+ '>=':function(self, locals, a, b) {return a(self, locals) >= b(self, locals);},
20743
+ '&&':function(self, locals, a, b) {return a(self, locals) && b(self, locals);},
20744
+ '||':function(self, locals, a, b) {return a(self, locals) || b(self, locals);},
20713
20745
  '!':function(self, locals, a) {return !a(self, locals);},
20714
20746
 
20715
20747
  //Tokenized as operators but parsed as assignment/filters
@@ -20735,44 +20767,31 @@ Lexer.prototype = {
20735
20767
  lex: function(text) {
20736
20768
  this.text = text;
20737
20769
  this.index = 0;
20738
- this.ch = undefined;
20739
20770
  this.tokens = [];
20740
20771
 
20741
20772
  while (this.index < this.text.length) {
20742
- this.ch = this.text.charAt(this.index);
20743
- if (this.is('"\'')) {
20744
- this.readString(this.ch);
20745
- } else if (this.isNumber(this.ch) || this.is('.') && this.isNumber(this.peek())) {
20773
+ var ch = this.text.charAt(this.index);
20774
+ if (ch === '"' || ch === "'") {
20775
+ this.readString(ch);
20776
+ } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) {
20746
20777
  this.readNumber();
20747
- } else if (this.isIdent(this.ch)) {
20778
+ } else if (this.isIdent(ch)) {
20748
20779
  this.readIdent();
20749
- } else if (this.is('(){}[].,;:?')) {
20750
- this.tokens.push({
20751
- index: this.index,
20752
- text: this.ch
20753
- });
20780
+ } else if (this.is(ch, '(){}[].,;:?')) {
20781
+ this.tokens.push({index: this.index, text: ch});
20754
20782
  this.index++;
20755
- } else if (this.isWhitespace(this.ch)) {
20783
+ } else if (this.isWhitespace(ch)) {
20756
20784
  this.index++;
20757
20785
  } else {
20758
- var ch2 = this.ch + this.peek();
20786
+ var ch2 = ch + this.peek();
20759
20787
  var ch3 = ch2 + this.peek(2);
20760
- var fn = OPERATORS[this.ch];
20761
- var fn2 = OPERATORS[ch2];
20762
- var fn3 = OPERATORS[ch3];
20763
- if (fn3) {
20764
- this.tokens.push({index: this.index, text: ch3, fn: fn3});
20765
- this.index += 3;
20766
- } else if (fn2) {
20767
- this.tokens.push({index: this.index, text: ch2, fn: fn2});
20768
- this.index += 2;
20769
- } else if (fn) {
20770
- this.tokens.push({
20771
- index: this.index,
20772
- text: this.ch,
20773
- fn: fn
20774
- });
20775
- this.index += 1;
20788
+ var op1 = OPERATORS[ch];
20789
+ var op2 = OPERATORS[ch2];
20790
+ var op3 = OPERATORS[ch3];
20791
+ if (op1 || op2 || op3) {
20792
+ var token = op3 ? ch3 : (op2 ? ch2 : ch);
20793
+ this.tokens.push({index: this.index, text: token, operator: true});
20794
+ this.index += token.length;
20776
20795
  } else {
20777
20796
  this.throwError('Unexpected next character ', this.index, this.index + 1);
20778
20797
  }
@@ -20781,8 +20800,8 @@ Lexer.prototype = {
20781
20800
  return this.tokens;
20782
20801
  },
20783
20802
 
20784
- is: function(chars) {
20785
- return chars.indexOf(this.ch) !== -1;
20803
+ is: function(ch, chars) {
20804
+ return chars.indexOf(ch) !== -1;
20786
20805
  },
20787
20806
 
20788
20807
  peek: function(i) {
@@ -20791,7 +20810,7 @@ Lexer.prototype = {
20791
20810
  },
20792
20811
 
20793
20812
  isNumber: function(ch) {
20794
- return ('0' <= ch && ch <= '9');
20813
+ return ('0' <= ch && ch <= '9') && typeof ch === "string";
20795
20814
  },
20796
20815
 
20797
20816
  isWhitespace: function(ch) {
@@ -20844,79 +20863,28 @@ Lexer.prototype = {
20844
20863
  }
20845
20864
  this.index++;
20846
20865
  }
20847
- number = 1 * number;
20848
20866
  this.tokens.push({
20849
20867
  index: start,
20850
20868
  text: number,
20851
20869
  constant: true,
20852
- fn: function() { return number; }
20870
+ value: Number(number)
20853
20871
  });
20854
20872
  },
20855
20873
 
20856
20874
  readIdent: function() {
20857
- var expression = this.text;
20858
-
20859
- var ident = '';
20860
20875
  var start = this.index;
20861
-
20862
- var lastDot, peekIndex, methodName, ch;
20863
-
20864
20876
  while (this.index < this.text.length) {
20865
- ch = this.text.charAt(this.index);
20866
- if (ch === '.' || this.isIdent(ch) || this.isNumber(ch)) {
20867
- if (ch === '.') lastDot = this.index;
20868
- ident += ch;
20869
- } else {
20877
+ var ch = this.text.charAt(this.index);
20878
+ if (!(this.isIdent(ch) || this.isNumber(ch))) {
20870
20879
  break;
20871
20880
  }
20872
20881
  this.index++;
20873
20882
  }
20874
-
20875
- //check if the identifier ends with . and if so move back one char
20876
- if (lastDot && ident[ident.length - 1] === '.') {
20877
- this.index--;
20878
- ident = ident.slice(0, -1);
20879
- lastDot = ident.lastIndexOf('.');
20880
- if (lastDot === -1) {
20881
- lastDot = undefined;
20882
- }
20883
- }
20884
-
20885
- //check if this is not a method invocation and if it is back out to last dot
20886
- if (lastDot) {
20887
- peekIndex = this.index;
20888
- while (peekIndex < this.text.length) {
20889
- ch = this.text.charAt(peekIndex);
20890
- if (ch === '(') {
20891
- methodName = ident.substr(lastDot - start + 1);
20892
- ident = ident.substr(0, lastDot - start);
20893
- this.index = peekIndex;
20894
- break;
20895
- }
20896
- if (this.isWhitespace(ch)) {
20897
- peekIndex++;
20898
- } else {
20899
- break;
20900
- }
20901
- }
20902
- }
20903
-
20904
20883
  this.tokens.push({
20905
20884
  index: start,
20906
- text: ident,
20907
- fn: CONSTANTS[ident] || getterFn(ident, this.options, expression)
20885
+ text: this.text.slice(start, this.index),
20886
+ identifier: true
20908
20887
  });
20909
-
20910
- if (methodName) {
20911
- this.tokens.push({
20912
- index: lastDot,
20913
- text: '.'
20914
- });
20915
- this.tokens.push({
20916
- index: lastDot + 1,
20917
- text: methodName
20918
- });
20919
- }
20920
20888
  },
20921
20889
 
20922
20890
  readString: function(quote) {
@@ -20947,9 +20915,8 @@ Lexer.prototype = {
20947
20915
  this.tokens.push({
20948
20916
  index: start,
20949
20917
  text: rawString,
20950
- string: string,
20951
20918
  constant: true,
20952
- fn: function() { return string; }
20919
+ value: string
20953
20920
  });
20954
20921
  return;
20955
20922
  } else {
@@ -21010,16 +20977,12 @@ Parser.prototype = {
21010
20977
  primary = this.arrayDeclaration();
21011
20978
  } else if (this.expect('{')) {
21012
20979
  primary = this.object();
20980
+ } else if (this.peek().identifier) {
20981
+ primary = this.identifier();
20982
+ } else if (this.peek().constant) {
20983
+ primary = this.constant();
21013
20984
  } else {
21014
- var token = this.expect();
21015
- primary = token.fn;
21016
- if (!primary) {
21017
- this.throwError('not a primary expression', token);
21018
- }
21019
- if (token.constant) {
21020
- primary.constant = true;
21021
- primary.literal = true;
21022
- }
20985
+ this.throwError('not a primary expression', this.peek());
21023
20986
  }
21024
20987
 
21025
20988
  var next, context;
@@ -21053,8 +21016,11 @@ Parser.prototype = {
21053
21016
  },
21054
21017
 
21055
21018
  peek: function(e1, e2, e3, e4) {
21056
- if (this.tokens.length > 0) {
21057
- var token = this.tokens[0];
21019
+ return this.peekAhead(0, e1, e2, e3, e4);
21020
+ },
21021
+ peekAhead: function(i, e1, e2, e3, e4) {
21022
+ if (this.tokens.length > i) {
21023
+ var token = this.tokens[i];
21058
21024
  var t = token.text;
21059
21025
  if (t === e1 || t === e2 || t === e3 || t === e4 ||
21060
21026
  (!e1 && !e2 && !e3 && !e4)) {
@@ -21074,12 +21040,19 @@ Parser.prototype = {
21074
21040
  },
21075
21041
 
21076
21042
  consume: function(e1) {
21077
- if (!this.expect(e1)) {
21043
+ if (this.tokens.length === 0) {
21044
+ throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);
21045
+ }
21046
+
21047
+ var token = this.expect(e1);
21048
+ if (!token) {
21078
21049
  this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());
21079
21050
  }
21051
+ return token;
21080
21052
  },
21081
21053
 
21082
- unaryFn: function(fn, right) {
21054
+ unaryFn: function(op, right) {
21055
+ var fn = OPERATORS[op];
21083
21056
  return extend(function $parseUnaryFn(self, locals) {
21084
21057
  return fn(self, locals, right);
21085
21058
  }, {
@@ -21088,7 +21061,8 @@ Parser.prototype = {
21088
21061
  });
21089
21062
  },
21090
21063
 
21091
- binaryFn: function(left, fn, right, isBranching) {
21064
+ binaryFn: function(left, op, right, isBranching) {
21065
+ var fn = OPERATORS[op];
21092
21066
  return extend(function $parseBinaryFn(self, locals) {
21093
21067
  return fn(self, locals, left, right);
21094
21068
  }, {
@@ -21097,6 +21071,28 @@ Parser.prototype = {
21097
21071
  });
21098
21072
  },
21099
21073
 
21074
+ identifier: function() {
21075
+ var id = this.consume().text;
21076
+
21077
+ //Continue reading each `.identifier` unless it is a method invocation
21078
+ while (this.peek('.') && this.peekAhead(1).identifier && !this.peekAhead(2, '(')) {
21079
+ id += this.consume().text + this.consume().text;
21080
+ }
21081
+
21082
+ return CONSTANTS[id] || getterFn(id, this.options, this.text);
21083
+ },
21084
+
21085
+ constant: function() {
21086
+ var value = this.consume().value;
21087
+
21088
+ return extend(function $parseConstant() {
21089
+ return value;
21090
+ }, {
21091
+ constant: true,
21092
+ literal: true
21093
+ });
21094
+ },
21095
+
21100
21096
  statements: function() {
21101
21097
  var statements = [];
21102
21098
  while (true) {
@@ -21128,8 +21124,7 @@ Parser.prototype = {
21128
21124
  },
21129
21125
 
21130
21126
  filter: function(inputFn) {
21131
- var token = this.expect();
21132
- var fn = this.$filter(token.text);
21127
+ var fn = this.$filter(this.consume().text);
21133
21128
  var argsFn;
21134
21129
  var args;
21135
21130
 
@@ -21192,7 +21187,7 @@ Parser.prototype = {
21192
21187
  var token;
21193
21188
  if ((token = this.expect('?'))) {
21194
21189
  middle = this.assignment();
21195
- if ((token = this.expect(':'))) {
21190
+ if (this.consume(':')) {
21196
21191
  var right = this.assignment();
21197
21192
 
21198
21193
  return extend(function $parseTernary(self, locals) {
@@ -21200,9 +21195,6 @@ Parser.prototype = {
21200
21195
  }, {
21201
21196
  constant: left.constant && middle.constant && right.constant
21202
21197
  });
21203
-
21204
- } else {
21205
- this.throwError('expected :', token);
21206
21198
  }
21207
21199
  }
21208
21200
 
@@ -21213,7 +21205,7 @@ Parser.prototype = {
21213
21205
  var left = this.logicalAND();
21214
21206
  var token;
21215
21207
  while ((token = this.expect('||'))) {
21216
- left = this.binaryFn(left, token.fn, this.logicalAND(), true);
21208
+ left = this.binaryFn(left, token.text, this.logicalAND(), true);
21217
21209
  }
21218
21210
  return left;
21219
21211
  },
@@ -21222,7 +21214,7 @@ Parser.prototype = {
21222
21214
  var left = this.equality();
21223
21215
  var token;
21224
21216
  if ((token = this.expect('&&'))) {
21225
- left = this.binaryFn(left, token.fn, this.logicalAND(), true);
21217
+ left = this.binaryFn(left, token.text, this.logicalAND(), true);
21226
21218
  }
21227
21219
  return left;
21228
21220
  },
@@ -21231,7 +21223,7 @@ Parser.prototype = {
21231
21223
  var left = this.relational();
21232
21224
  var token;
21233
21225
  if ((token = this.expect('==','!=','===','!=='))) {
21234
- left = this.binaryFn(left, token.fn, this.equality());
21226
+ left = this.binaryFn(left, token.text, this.equality());
21235
21227
  }
21236
21228
  return left;
21237
21229
  },
@@ -21240,7 +21232,7 @@ Parser.prototype = {
21240
21232
  var left = this.additive();
21241
21233
  var token;
21242
21234
  if ((token = this.expect('<', '>', '<=', '>='))) {
21243
- left = this.binaryFn(left, token.fn, this.relational());
21235
+ left = this.binaryFn(left, token.text, this.relational());
21244
21236
  }
21245
21237
  return left;
21246
21238
  },
@@ -21249,7 +21241,7 @@ Parser.prototype = {
21249
21241
  var left = this.multiplicative();
21250
21242
  var token;
21251
21243
  while ((token = this.expect('+','-'))) {
21252
- left = this.binaryFn(left, token.fn, this.multiplicative());
21244
+ left = this.binaryFn(left, token.text, this.multiplicative());
21253
21245
  }
21254
21246
  return left;
21255
21247
  },
@@ -21258,7 +21250,7 @@ Parser.prototype = {
21258
21250
  var left = this.unary();
21259
21251
  var token;
21260
21252
  while ((token = this.expect('*','/','%'))) {
21261
- left = this.binaryFn(left, token.fn, this.unary());
21253
+ left = this.binaryFn(left, token.text, this.unary());
21262
21254
  }
21263
21255
  return left;
21264
21256
  },
@@ -21268,9 +21260,9 @@ Parser.prototype = {
21268
21260
  if (this.expect('+')) {
21269
21261
  return this.primary();
21270
21262
  } else if ((token = this.expect('-'))) {
21271
- return this.binaryFn(Parser.ZERO, token.fn, this.unary());
21263
+ return this.binaryFn(Parser.ZERO, token.text, this.unary());
21272
21264
  } else if ((token = this.expect('!'))) {
21273
- return this.unaryFn(token.fn, this.unary());
21265
+ return this.unaryFn(token.text, this.unary());
21274
21266
  } else {
21275
21267
  return this.primary();
21276
21268
  }
@@ -21278,7 +21270,7 @@ Parser.prototype = {
21278
21270
 
21279
21271
  fieldAccess: function(object) {
21280
21272
  var expression = this.text;
21281
- var field = this.expect().text;
21273
+ var field = this.consume().text;
21282
21274
  var getter = getterFn(field, this.options, expression);
21283
21275
 
21284
21276
  return extend(function $parseFieldAccess(scope, locals, self) {
@@ -21363,8 +21355,7 @@ Parser.prototype = {
21363
21355
  // Support trailing commas per ES5.1.
21364
21356
  break;
21365
21357
  }
21366
- var elementFn = this.expression();
21367
- elementFns.push(elementFn);
21358
+ elementFns.push(this.expression());
21368
21359
  } while (this.expect(','));
21369
21360
  }
21370
21361
  this.consume(']');
@@ -21390,11 +21381,16 @@ Parser.prototype = {
21390
21381
  // Support trailing commas per ES5.1.
21391
21382
  break;
21392
21383
  }
21393
- var token = this.expect();
21394
- keys.push(token.string || token.text);
21384
+ var token = this.consume();
21385
+ if (token.constant) {
21386
+ keys.push(token.value);
21387
+ } else if (token.identifier) {
21388
+ keys.push(token.text);
21389
+ } else {
21390
+ this.throwError("invalid key", token);
21391
+ }
21395
21392
  this.consume(':');
21396
- var value = this.expression();
21397
- valueFns.push(value);
21393
+ valueFns.push(this.expression());
21398
21394
  } while (this.expect(','));
21399
21395
  }
21400
21396
  this.consume('}');
@@ -21836,13 +21832,21 @@ function $ParseProvider() {
21836
21832
 
21837
21833
  function addInterceptor(parsedExpression, interceptorFn) {
21838
21834
  if (!interceptorFn) return parsedExpression;
21835
+ var watchDelegate = parsedExpression.$$watchDelegate;
21839
21836
 
21840
- var fn = function interceptedExpression(scope, locals) {
21837
+ var regularWatch =
21838
+ watchDelegate !== oneTimeLiteralWatchDelegate &&
21839
+ watchDelegate !== oneTimeWatchDelegate;
21840
+
21841
+ var fn = regularWatch ? function regularInterceptedExpression(scope, locals) {
21842
+ var value = parsedExpression(scope, locals);
21843
+ return interceptorFn(value, scope, locals);
21844
+ } : function oneTimeInterceptedExpression(scope, locals) {
21841
21845
  var value = parsedExpression(scope, locals);
21842
21846
  var result = interceptorFn(value, scope, locals);
21843
21847
  // we only return the interceptor's result if the
21844
21848
  // initial value is defined (for bind-once)
21845
- return isDefined(value) || interceptorFn.$stateful ? result : value;
21849
+ return isDefined(value) ? result : value;
21846
21850
  };
21847
21851
 
21848
21852
  // Propagate $$watchDelegates other then inputsWatchDelegate
@@ -21867,7 +21871,11 @@ function $ParseProvider() {
21867
21871
  * @requires $rootScope
21868
21872
  *
21869
21873
  * @description
21870
- * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).
21874
+ * A service that helps you run functions asynchronously, and use their return values (or exceptions)
21875
+ * when they are done processing.
21876
+ *
21877
+ * This is an implementation of promises/deferred objects inspired by
21878
+ * [Kris Kowal's Q](https://github.com/kriskowal/q).
21871
21879
  *
21872
21880
  * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred
21873
21881
  * implementations, and the other which resembles ES6 promises to some degree.
@@ -22003,16 +22011,12 @@ function $ParseProvider() {
22003
22011
  *
22004
22012
  * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`
22005
22013
  *
22006
- * - `finally(callback)` – allows you to observe either the fulfillment or rejection of a promise,
22014
+ * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise,
22007
22015
  * but to do so without modifying the final value. This is useful to release resources or do some
22008
22016
  * clean-up that needs to be done whether the promise was rejected or resolved. See the [full
22009
22017
  * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for
22010
22018
  * more information.
22011
22019
  *
22012
- * Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as
22013
- * property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to
22014
- * make your code IE8 and Android 2.x compatible.
22015
- *
22016
22020
  * # Chaining promises
22017
22021
  *
22018
22022
  * Because calling the `then` method of a promise returns a new derived promise, it is easily
@@ -23235,11 +23239,11 @@ function $RootScopeProvider() {
23235
23239
  if (ttl < 5) {
23236
23240
  logIdx = 4 - ttl;
23237
23241
  if (!watchLog[logIdx]) watchLog[logIdx] = [];
23238
- logMsg = (isFunction(watch.exp))
23239
- ? 'fn: ' + (watch.exp.name || watch.exp.toString())
23240
- : watch.exp;
23241
- logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);
23242
- watchLog[logIdx].push(logMsg);
23242
+ watchLog[logIdx].push({
23243
+ msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp,
23244
+ newVal: value,
23245
+ oldVal: last
23246
+ });
23243
23247
  }
23244
23248
  } else if (watch === lastDirtyWatch) {
23245
23249
  // If the most recently dirty watcher is now clean, short circuit since the remaining watchers
@@ -23272,7 +23276,7 @@ function $RootScopeProvider() {
23272
23276
  throw $rootScopeMinErr('infdig',
23273
23277
  '{0} $digest() iterations reached. Aborting!\n' +
23274
23278
  'Watchers fired in the last 5 iterations: {1}',
23275
- TTL, toJson(watchLog));
23279
+ TTL, watchLog);
23276
23280
  }
23277
23281
 
23278
23282
  } while (dirty || asyncQueue.length);
@@ -23623,7 +23627,7 @@ function $RootScopeProvider() {
23623
23627
  do {
23624
23628
  namedListeners = scope.$$listeners[name] || empty;
23625
23629
  event.currentScope = scope;
23626
- for (i=0, length=namedListeners.length; i<length; i++) {
23630
+ for (i = 0, length = namedListeners.length; i < length; i++) {
23627
23631
 
23628
23632
  // if listeners were deregistered, defragment the array
23629
23633
  if (!namedListeners[i]) {
@@ -23697,7 +23701,7 @@ function $RootScopeProvider() {
23697
23701
  while ((current = next)) {
23698
23702
  event.currentScope = current;
23699
23703
  listeners = current.$$listeners[name] || [];
23700
- for (i=0, length = listeners.length; i<length; i++) {
23704
+ for (i = 0, length = listeners.length; i < length; i++) {
23701
23705
  // if listeners were deregistered, defragment the array
23702
23706
  if (!listeners[i]) {
23703
23707
  listeners.splice(i, 1);
@@ -23853,7 +23857,7 @@ function $$SanitizeUriProvider() {
23853
23857
  var normalizedVal;
23854
23858
  normalizedVal = urlResolve(uri).href;
23855
23859
  if (normalizedVal !== '' && !normalizedVal.match(regex)) {
23856
- return 'unsafe:'+normalizedVal;
23860
+ return 'unsafe:' + normalizedVal;
23857
23861
  }
23858
23862
  return uri;
23859
23863
  };
@@ -24952,7 +24956,7 @@ function $SnifferProvider() {
24952
24956
  transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle));
24953
24957
  animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle));
24954
24958
 
24955
- if (android && (!transitions||!animations)) {
24959
+ if (android && (!transitions || !animations)) {
24956
24960
  transitions = isString(document.body.style.webkitTransition);
24957
24961
  animations = isString(document.body.style.webkitAnimation);
24958
24962
  }
@@ -25023,7 +25027,7 @@ function $TemplateRequestProvider() {
25023
25027
  if (isArray(transformResponse)) {
25024
25028
  var original = transformResponse;
25025
25029
  transformResponse = [];
25026
- for (var i=0; i<original.length; ++i) {
25030
+ for (var i = 0; i < original.length; ++i) {
25027
25031
  var transformer = original[i];
25028
25032
  if (transformer !== defaultHttpResponseTransform) {
25029
25033
  transformResponse.push(transformer);
@@ -25267,7 +25271,7 @@ function $TimeoutProvider() {
25267
25271
  // exactly the behavior needed here. There is little value is mocking these out for this
25268
25272
  // service.
25269
25273
  var urlParsingNode = document.createElement("a");
25270
- var originUrl = urlResolve(window.location.href, true);
25274
+ var originUrl = urlResolve(window.location.href);
25271
25275
 
25272
25276
 
25273
25277
  /**
@@ -25322,7 +25326,7 @@ var originUrl = urlResolve(window.location.href, true);
25322
25326
  * | pathname | The pathname, beginning with "/"
25323
25327
  *
25324
25328
  */
25325
- function urlResolve(url, base) {
25329
+ function urlResolve(url) {
25326
25330
  var href = url;
25327
25331
 
25328
25332
  if (msie) {
@@ -25702,8 +25706,8 @@ function filterFilter() {
25702
25706
  }
25703
25707
  return false;
25704
25708
  }
25705
- text = (''+text).toLowerCase();
25706
- return (''+obj).toLowerCase().indexOf(text) > -1;
25709
+ text = ('' + text).toLowerCase();
25710
+ return ('' + obj).toLowerCase().indexOf(text) > -1;
25707
25711
  };
25708
25712
  }
25709
25713
  }
@@ -25963,7 +25967,7 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
25963
25967
  if (whole.length >= (lgroup + group)) {
25964
25968
  pos = whole.length - lgroup;
25965
25969
  for (i = 0; i < pos; i++) {
25966
- if ((pos - i)%group === 0 && i !== 0) {
25970
+ if ((pos - i) % group === 0 && i !== 0) {
25967
25971
  formatedText += groupSep;
25968
25972
  }
25969
25973
  formatedText += whole.charAt(i);
@@ -25971,7 +25975,7 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
25971
25975
  }
25972
25976
 
25973
25977
  for (i = pos; i < whole.length; i++) {
25974
- if ((whole.length - i)%lgroup === 0 && i !== 0) {
25978
+ if ((whole.length - i) % lgroup === 0 && i !== 0) {
25975
25979
  formatedText += groupSep;
25976
25980
  }
25977
25981
  formatedText += whole.charAt(i);
@@ -26211,10 +26215,10 @@ function dateFilter($locale) {
26211
26215
  tzMin = int(match[9] + match[11]);
26212
26216
  }
26213
26217
  dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));
26214
- var h = int(match[4]||0) - tzHour;
26215
- var m = int(match[5]||0) - tzMin;
26216
- var s = int(match[6]||0);
26217
- var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000);
26218
+ var h = int(match[4] || 0) - tzHour;
26219
+ var m = int(match[5] || 0) - tzMin;
26220
+ var s = int(match[6] || 0);
26221
+ var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);
26218
26222
  timeSetter.call(date, h, m, s, ms);
26219
26223
  return date;
26220
26224
  }
@@ -26446,7 +26450,7 @@ function limitToFilter() {
26446
26450
  n = input.length;
26447
26451
  }
26448
26452
 
26449
- for (; i<n; i++) {
26453
+ for (; i < n; i++) {
26450
26454
  out.push(input[i]);
26451
26455
  }
26452
26456
 
@@ -26573,7 +26577,7 @@ orderByFilter.$inject = ['$parse'];
26573
26577
  function orderByFilter($parse) {
26574
26578
  return function(array, sortPredicate, reverseOrder) {
26575
26579
  if (!(isArrayLike(array))) return array;
26576
- sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate];
26580
+ sortPredicate = isArray(sortPredicate) ? sortPredicate : [sortPredicate];
26577
26581
  if (sortPredicate.length === 0) { sortPredicate = ['+']; }
26578
26582
  sortPredicate = sortPredicate.map(function(predicate) {
26579
26583
  var descending = false, get = predicate || identity;
@@ -26600,9 +26604,7 @@ function orderByFilter($parse) {
26600
26604
  return compare(get(a),get(b));
26601
26605
  }, descending);
26602
26606
  });
26603
- var arrayCopy = [];
26604
- for (var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }
26605
- return arrayCopy.sort(reverseComparator(comparator, reverseOrder));
26607
+ return slice.call(array).sort(reverseComparator(comparator, reverseOrder));
26606
26608
 
26607
26609
  function comparator(o1, o2) {
26608
26610
  for (var i = 0; i < sortPredicate.length; i++) {
@@ -27664,9 +27666,14 @@ var inputType = {
27664
27666
  * minlength.
27665
27667
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
27666
27668
  * maxlength.
27667
- * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
27668
- * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
27669
- * patterns defined as scope expressions.
27669
+ * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
27670
+ * that contains the regular expression body that will be converted to a regular expression
27671
+ * as in the ngPattern directive.
27672
+ * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
27673
+ * a RegExp found by evaluating the Angular expression given in the attribute value.
27674
+ * If the expression evaluates to a RegExp object then this is used directly.
27675
+ * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
27676
+ * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
27670
27677
  * @param {string=} ngChange Angular expression to be executed when input changes due to user
27671
27678
  * interaction with the input element.
27672
27679
  * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
@@ -28207,9 +28214,14 @@ var inputType = {
28207
28214
  * minlength.
28208
28215
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
28209
28216
  * maxlength.
28210
- * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
28211
- * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
28212
- * patterns defined as scope expressions.
28217
+ * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
28218
+ * that contains the regular expression body that will be converted to a regular expression
28219
+ * as in the ngPattern directive.
28220
+ * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
28221
+ * a RegExp found by evaluating the Angular expression given in the attribute value.
28222
+ * If the expression evaluates to a RegExp object then this is used directly.
28223
+ * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
28224
+ * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
28213
28225
  * @param {string=} ngChange Angular expression to be executed when input changes due to user
28214
28226
  * interaction with the input element.
28215
28227
  *
@@ -28289,9 +28301,14 @@ var inputType = {
28289
28301
  * minlength.
28290
28302
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
28291
28303
  * maxlength.
28292
- * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
28293
- * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
28294
- * patterns defined as scope expressions.
28304
+ * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
28305
+ * that contains the regular expression body that will be converted to a regular expression
28306
+ * as in the ngPattern directive.
28307
+ * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
28308
+ * a RegExp found by evaluating the Angular expression given in the attribute value.
28309
+ * If the expression evaluates to a RegExp object then this is used directly.
28310
+ * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
28311
+ * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
28295
28312
  * @param {string=} ngChange Angular expression to be executed when input changes due to user
28296
28313
  * interaction with the input element.
28297
28314
  *
@@ -28372,9 +28389,14 @@ var inputType = {
28372
28389
  * minlength.
28373
28390
  * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
28374
28391
  * maxlength.
28375
- * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
28376
- * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
28377
- * patterns defined as scope expressions.
28392
+ * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
28393
+ * that contains the regular expression body that will be converted to a regular expression
28394
+ * as in the ngPattern directive.
28395
+ * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
28396
+ * a RegExp found by evaluating the Angular expression given in the attribute value.
28397
+ * If the expression evaluates to a RegExp object then this is used directly.
28398
+ * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
28399
+ * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
28378
28400
  * @param {string=} ngChange Angular expression to be executed when input changes due to user
28379
28401
  * interaction with the input element.
28380
28402
  *
@@ -28685,8 +28707,8 @@ function createDateParser(regexp, mapping) {
28685
28707
  // When a date is JSON'ified to wraps itself inside of an extra
28686
28708
  // set of double quotes. This makes the date parsing code unable
28687
28709
  // to match the date string and parse it as a date.
28688
- if (iso.charAt(0) == '"' && iso.charAt(iso.length-1) == '"') {
28689
- iso = iso.substring(1, iso.length-1);
28710
+ if (iso.charAt(0) == '"' && iso.charAt(iso.length - 1) == '"') {
28711
+ iso = iso.substring(1, iso.length - 1);
28690
28712
  }
28691
28713
  if (ISO_DATE_REGEXP.test(iso)) {
28692
28714
  return new Date(iso);
@@ -29133,12 +29155,17 @@ var VALID_CLASS = 'ng-valid',
29133
29155
  * @property {string} $viewValue Actual string value in the view.
29134
29156
  * @property {*} $modelValue The value in the model that the control is bound to.
29135
29157
  * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever
29136
- the control reads value from the DOM. The functions are called in array order, each passing the value
29137
- through to the next. The last return value is forwarded to the $validators collection.
29138
- Used to sanitize / convert the value.
29139
- Returning undefined from a parser means a parse error occurred. No $validators will
29140
- run and the 'ngModel' will not be updated until the parse error is resolved. The parse error is stored
29141
- in 'ngModel.$error.parse'.
29158
+ the control reads value from the DOM. The functions are called in array order, each passing
29159
+ its return value through to the next. The last return value is forwarded to the
29160
+ {@link ngModel.NgModelController#$validators `$validators`} collection.
29161
+
29162
+ Parsers are used to sanitize / convert the {@link ngModel.NgModelController#$viewValue
29163
+ `$viewValue`}.
29164
+
29165
+ Returning `undefined` from a parser means a parse error occurred. In that case,
29166
+ no {@link ngModel.NgModelController#$validators `$validators`} will run and the `ngModel`
29167
+ will be set to `undefined` unless {@link ngModelOptions `ngModelOptions.allowInvalid`}
29168
+ is set to `true`. The parse error is stored in `ngModel.$error.parse`.
29142
29169
 
29143
29170
  *
29144
29171
  * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever
@@ -29263,7 +29290,7 @@ var VALID_CLASS = 'ng-valid',
29263
29290
 
29264
29291
  // Listen for change events to enable binding
29265
29292
  element.on('blur keyup change', function() {
29266
- scope.$apply(read);
29293
+ scope.$evalAsync(read);
29267
29294
  });
29268
29295
  read(); // initialize
29269
29296
 
@@ -30199,7 +30226,7 @@ var patternDirective = function() {
30199
30226
  var regexp, patternExp = attr.ngPattern || attr.pattern;
30200
30227
  attr.$observe('pattern', function(regex) {
30201
30228
  if (isString(regex) && regex.length > 0) {
30202
- regex = new RegExp(regex);
30229
+ regex = new RegExp('^' + regex + '$');
30203
30230
  }
30204
30231
 
30205
30232
  if (regex && !regex.test) {
@@ -30490,7 +30517,7 @@ var ngValueDirective = function() {
30490
30517
  * `ngModelOptions` has an effect on the element it's declared on and its descendants.
30491
30518
  *
30492
30519
  * @param {Object} ngModelOptions options to apply to the current model. Valid keys are:
30493
- * - `updateOn`: string specifying which event should be the input bound to. You can set several
30520
+ * - `updateOn`: string specifying which event should the input be bound to. You can set several
30494
30521
  * events using an space delimited list. There is a special event called `default` that
30495
30522
  * matches the default events belonging of the control.
30496
30523
  * - `debounce`: integer value which contains the debounce model update value in milliseconds. A
@@ -33358,7 +33385,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
33358
33385
  });
33359
33386
  throw ngRepeatMinErr('dupes',
33360
33387
  "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}",
33361
- expression, trackById, toJson(value));
33388
+ expression, trackById, value);
33362
33389
  } else {
33363
33390
  // new never before seen block
33364
33391
  nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined};
@@ -34164,7 +34191,7 @@ var ngOptionsMinErr = minErr('ngOptions');
34164
34191
  * In many cases, `ngRepeat` can be used on `<option>` elements instead of `ngOptions` to achieve a
34165
34192
  * similar result. However, the `ngOptions` provides some benefits such as reducing memory and
34166
34193
  * increasing speed by not creating a new scope for each repeated instance, as well as providing
34167
- * more flexibility in how the `select`'s model is assigned via `select as`. `ngOptions should be
34194
+ * more flexibility in how the `select`'s model is assigned via `select as`. `ngOptions` should be
34168
34195
  * used when the `select` model needs to be bound to a non-string value. This is because an option
34169
34196
  * element can only be bound to string values at present.
34170
34197
  *
@@ -34762,13 +34789,14 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
34762
34789
  lastElement = null; // start at the beginning
34763
34790
  for (index = 0, length = optionGroup.length; index < length; index++) {
34764
34791
  option = optionGroup[index];
34765
- if ((existingOption = existingOptions[index+1])) {
34792
+ if ((existingOption = existingOptions[index + 1])) {
34766
34793
  // reuse elements
34767
34794
  lastElement = existingOption.element;
34768
34795
  if (existingOption.label !== option.label) {
34769
34796
  updateLabelMap(labelMap, existingOption.label, false);
34770
34797
  updateLabelMap(labelMap, option.label, true);
34771
34798
  lastElement.text(existingOption.label = option.label);
34799
+ lastElement.prop('label', existingOption.label);
34772
34800
  }
34773
34801
  if (existingOption.id !== option.id) {
34774
34802
  lastElement.val(existingOption.id = option.id);
@@ -34798,6 +34826,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
34798
34826
  .val(option.id)
34799
34827
  .prop('selected', option.selected)
34800
34828
  .attr('selected', option.selected)
34829
+ .prop('label', option.label)
34801
34830
  .text(option.label);
34802
34831
  }
34803
34832
 
@@ -35109,10 +35138,10 @@ function callerFile(offset) {
35109
35138
  if (line) {
35110
35139
  if (line.indexOf('@') !== -1) {
35111
35140
  // Firefox
35112
- line = line.substring(line.indexOf('@')+1);
35141
+ line = line.substring(line.indexOf('@') + 1);
35113
35142
  } else {
35114
35143
  // Chrome
35115
- line = line.substring(line.indexOf('(')+1).replace(')', '');
35144
+ line = line.substring(line.indexOf('(') + 1).replace(')', '');
35116
35145
  }
35117
35146
  }
35118
35147
 
@@ -35196,7 +35225,7 @@ _jQuery.fn.bindings = function(windowJquery, bindExp) {
35196
35225
  var element = windowJquery(this),
35197
35226
  bindings;
35198
35227
  if (bindings = element.data('$binding')) {
35199
- for (var expressions = [], binding, j=0, jj=bindings.length; j<jj; j++) {
35228
+ for (var expressions = [], binding, j=0, jj=bindings.length; j < jj; j++) {
35200
35229
  binding = bindings[j];
35201
35230
 
35202
35231
  if (binding.expressions) {
@@ -35572,7 +35601,7 @@ angular.scenario.Describe.prototype.it = function(name, body) {
35572
35601
  */
35573
35602
  angular.scenario.Describe.prototype.iit = function(name, body) {
35574
35603
  this.it.apply(this, arguments);
35575
- this.its[this.its.length-1].only = true;
35604
+ this.its[this.its.length - 1].only = true;
35576
35605
  };
35577
35606
 
35578
35607
  /**
@@ -35884,7 +35913,7 @@ angular.scenario.ObjectModel.Spec.prototype.addStep = function(name) {
35884
35913
  * @return {Object} the step
35885
35914
  */
35886
35915
  angular.scenario.ObjectModel.Spec.prototype.getLastStep = function() {
35887
- return this.steps[this.steps.length-1];
35916
+ return this.steps[this.steps.length - 1];
35888
35917
  };
35889
35918
 
35890
35919
  /**
@@ -36459,7 +36488,7 @@ angular.scenario.dsl('expect', function() {
36459
36488
  */
36460
36489
  angular.scenario.dsl('using', function() {
36461
36490
  return function(selector, label) {
36462
- this.selector = _jQuery.trim((this.selector||'') + ' ' + selector);
36491
+ this.selector = _jQuery.trim((this.selector || '') + ' ' + selector);
36463
36492
  if (angular.isString(label) && label.length) {
36464
36493
  this.label = label + ' ( ' + this.selector + ' )';
36465
36494
  } else {