ua-parser-js 2.0.0-alpha.3 → 2.0.0-beta.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,11 @@
1
- // Generated ESM version of UAParser.js
1
+ // Generated ESM version of ua-parser-js
2
2
  // DO NOT EDIT THIS FILE!
3
3
  // Source: /src/main/ua-parser.js
4
4
 
5
5
  /////////////////////////////////////////////////////////////////////////////////
6
- /* UAParser.js v2.0.0-alpha.3
6
+ /* UAParser.js v2.0.0-beta.2
7
7
  Copyright © 2012-2023 Faisal Salman <f@faisalman.com>
8
- MIT License *//*
8
+ AGPLv3 License *//*
9
9
  Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
10
10
  Supports browser & node.js environment.
11
11
  Demo : https://faisalman.github.io/ua-parser-js
@@ -21,8 +21,7 @@
21
21
  // Constants
22
22
  /////////////
23
23
 
24
-
25
- var LIBVERSION = '2.0.0-alpha.3',
24
+ var LIBVERSION = '2.0.0-beta.2',
26
25
  EMPTY = '',
27
26
  UNKNOWN = '?',
28
27
  FUNC_TYPE = 'function',
@@ -43,8 +42,9 @@
43
42
  WEARABLE = 'wearable',
44
43
  EMBEDDED = 'embedded',
45
44
  USER_AGENT = 'user-agent',
46
- UA_MAX_LENGTH = 350,
45
+ UA_MAX_LENGTH = 500,
47
46
  BRANDS = 'brands',
47
+ FORMFACTOR = 'formFactor',
48
48
  FULLVERLIST = 'fullVersionList',
49
49
  PLATFORM = 'platform',
50
50
  PLATFORMVER = 'platformVersion',
@@ -53,11 +53,12 @@
53
53
  CH_HEADER_FULL_VER_LIST = CH_HEADER + '-full-version-list',
54
54
  CH_HEADER_ARCH = CH_HEADER + '-arch',
55
55
  CH_HEADER_BITNESS = CH_HEADER + '-' + BITNESS,
56
+ CH_HEADER_FORM_FACTOR = CH_HEADER + '-form-factor',
56
57
  CH_HEADER_MOBILE = CH_HEADER + '-' + MOBILE,
57
58
  CH_HEADER_MODEL = CH_HEADER + '-' + MODEL,
58
59
  CH_HEADER_PLATFORM = CH_HEADER + '-' + PLATFORM,
59
60
  CH_HEADER_PLATFORM_VER = CH_HEADER_PLATFORM + '-version',
60
- CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, BITNESS],
61
+ CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTOR, BITNESS],
61
62
  UA_BROWSER = 'browser',
62
63
  UA_CPU = 'cpu',
63
64
  UA_DEVICE = 'device',
@@ -70,6 +71,7 @@
70
71
  BLACKBERRY = 'BlackBerry',
71
72
  GOOGLE = 'Google',
72
73
  HUAWEI = 'Huawei',
74
+ LENOVO = 'Lenovo',
73
75
  LG = 'LG',
74
76
  MICROSOFT = 'Microsoft',
75
77
  MOTOROLA = 'Motorola',
@@ -85,9 +87,11 @@
85
87
  FIREFOX = 'Firefox',
86
88
  OPERA = 'Opera',
87
89
  FACEBOOK = 'Facebook',
90
+ SOGOU = 'Sogou',
88
91
  WINDOWS = 'Windows';
89
92
 
90
- var NAVIGATOR = (typeof window !== UNDEF_TYPE && window.navigator) ?
93
+ var isWindow = typeof window !== UNDEF_TYPE,
94
+ NAVIGATOR = (isWindow && window.navigator) ?
91
95
  window.navigator :
92
96
  undefined,
93
97
  NAVIGATOR_UADATA = (NAVIGATOR && NAVIGATOR.userAgentData) ?
@@ -119,28 +123,35 @@
119
123
  }
120
124
  return false;
121
125
  }
122
- return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;
126
+ return isString(str1) ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;
123
127
  },
124
128
  isExtensions = function (obj) {
125
129
  for (var prop in obj) {
126
130
  return /^(browser|cpu|device|engine|os)$/.test(prop);
127
131
  }
128
132
  },
133
+ isString = function (val) {
134
+ return typeof val === STR_TYPE;
135
+ },
129
136
  itemListToArray = function (header) {
130
137
  if (!header) return undefined;
131
138
  var arr = [];
132
- var tokens = strip(/\\?\"/g, header).split(', ');
139
+ var tokens = strip(/\\?\"/g, header).split(',');
133
140
  for (var i = 0; i < tokens.length; i++) {
134
- var token = tokens[i].split(';v=');
135
- arr[i] = { brand : token[0], version : token[1] };
141
+ if (tokens[i].indexOf(';') > -1) {
142
+ var token = trim(tokens[i]).split(';v=');
143
+ arr[i] = { brand : token[0], version : token[1] };
144
+ } else {
145
+ arr[i] = trim(tokens[i]);
146
+ }
136
147
  }
137
148
  return arr;
138
149
  },
139
150
  lowerize = function (str) {
140
- return typeof(str) === STR_TYPE ? str.toLowerCase() : str;
151
+ return isString(str) ? str.toLowerCase() : str;
141
152
  },
142
153
  majorize = function (version) {
143
- return typeof(version) === STR_TYPE ? strip(/[^\d\.]/g, version).split('.')[0] : undefined;
154
+ return isString(version) ? strip(/[^\d\.]/g, version).split('.')[0] : undefined;
144
155
  },
145
156
  setProps = function (arr) {
146
157
  for (var i in arr) {
@@ -154,15 +165,15 @@
154
165
  return this;
155
166
  },
156
167
  strip = function (pattern, str) {
157
- return str.replace(pattern, EMPTY);
168
+ return isString(str) ? str.replace(pattern, EMPTY) : str;
158
169
  },
159
- stripQuotes = function (val) {
160
- return typeof val === STR_TYPE ? strip(/\"/g, val) : val;
170
+ stripQuotes = function (str) {
171
+ return strip(/\\?\"/g, str);
161
172
  },
162
173
  trim = function (str, len) {
163
- if (typeof(str) === STR_TYPE) {
174
+ if (isString(str)) {
164
175
  str = strip(/^\s\s*/, str);
165
- return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
176
+ return typeof len === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
166
177
  }
167
178
  };
168
179
 
@@ -239,7 +250,7 @@
239
250
  return (i === UNKNOWN) ? undefined : i;
240
251
  }
241
252
  }
242
- return str;
253
+ return map.hasOwnProperty('*') ? map['*'] : str;
243
254
  };
244
255
 
245
256
  ///////////////
@@ -258,6 +269,16 @@
258
269
  '8.1' : 'NT 6.3',
259
270
  '10' : ['NT 6.4', 'NT 10.0'],
260
271
  'RT' : 'ARM'
272
+ },
273
+
274
+ formFactorMap = {
275
+ 'embedded' : 'Automotive',
276
+ 'mobile' : 'Mobile',
277
+ 'tablet' : ['Tablet', 'EInk'],
278
+ 'smarttv' : 'TV',
279
+ 'wearable' : ['VR', 'XR', 'Watch'],
280
+ '?' : ['Desktop', 'Unknown'],
281
+ '*' : undefined
261
282
  };
262
283
 
263
284
  //////////////
@@ -281,15 +302,18 @@
281
302
  ], [NAME, VERSION], [
282
303
  /opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
283
304
  ], [VERSION, [NAME, OPERA+' Mini']], [
305
+ /\bop(?:rg)?x\/([\w\.]+)/i // Opera GX
306
+ ], [VERSION, [NAME, OPERA+' GX']], [
284
307
  /\bopr\/([\w\.]+)/i // Opera Webkit
285
308
  ], [VERSION, [NAME, OPERA]], [
286
309
 
287
310
  // Mixed
311
+ /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i // Baidu
312
+ ], [VERSION, [NAME, 'Baidu']], [
288
313
  /(kindle)\/([\w\.]+)/i, // Kindle
289
314
  /(lunascape|maxthon|netfront|jasmine|blazer)[\/ ]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer
290
315
  // Trident based
291
- /(avant |iemobile|slim)(?:browser)?[\/ ]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
292
- /(ba?idubrowser)[\/ ]?([\w\.]+)/i, // Baidu Browser
316
+ /(avant|iemobile|slim)\s?(?:browser)?[\/ ]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
293
317
  /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
294
318
 
295
319
  // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
@@ -301,8 +325,7 @@
301
325
  /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
302
326
  ], [VERSION, [NAME, 'UCBrowser']], [
303
327
  /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
304
- /\bqbcore\/([\w\.]+).+microm/i
305
- ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [
328
+ /\bqbcore\/([\w\.]+).+microm/i,
306
329
  /micromessenger\/([\w\.]+)/i // WeChat
307
330
  ], [VERSION, [NAME, 'WeChat']], [
308
331
  /konqueror\/([\w\.]+)/i // Konqueror
@@ -311,6 +334,8 @@
311
334
  ], [VERSION, [NAME, 'IE']], [
312
335
  /ya(?:search)?browser\/([\w\.]+)/i // Yandex
313
336
  ], [VERSION, [NAME, 'Yandex']], [
337
+ /slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
338
+ ], [VERSION, [NAME, 'Smart ' + LENOVO + SUFFIX_BROWSER]], [
314
339
  /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
315
340
  ], [[NAME, /(.+)/, '$1 Secure' + SUFFIX_BROWSER], VERSION], [
316
341
  /\bfocus\/([\w\.]+)/i // Firefox Focus
@@ -329,15 +354,20 @@
329
354
  ], [VERSION, [NAME, PREFIX_MOBILE + FIREFOX]], [
330
355
  /\bqihu|(qi?ho?o?|360)browser/i // 360
331
356
  ], [[NAME, '360' + SUFFIX_BROWSER]], [
332
- /(oculus|samsung|sailfish|huawei)browser\/([\w\.]+)/i
333
- ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Samsung/Sailfish/Huawei Browser
357
+ /(oculus|sailfish|huawei|vivo)browser\/([\w\.]+)/i
358
+ ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser
359
+ /samsungbrowser\/([\w\.]+)/i // Samsung Internet
360
+ ], [VERSION, [NAME, SAMSUNG + ' Internet']], [
334
361
  /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
335
362
  ], [[NAME, /_/g, ' '], VERSION], [
363
+ /metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
364
+ ], [VERSION, [NAME, SOGOU + ' Explorer']], [
365
+ /(sogou)mo\w+\/([\d\.]+)/i // Sogou Mobile
366
+ ], [[NAME, SOGOU + ' Mobile'], VERSION], [
336
367
  /(electron)\/([\w\.]+) safari/i, // Electron-based App
337
368
  /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
338
- /m?(qqbrowser|baiduboxapp|2345Explorer)[\/ ]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
369
+ /m?(qqbrowser|2345Explorer)[\/ ]?([\w\.]+)/i // QQBrowser/2345 Browser
339
370
  ], [NAME, VERSION], [
340
- /(metasr)[\/ ]?([\w\.]+)/i, // SouGouBrowser
341
371
  /(lbbrowser)/i, // LieBao Browser
342
372
  /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
343
373
  ], [NAME], [
@@ -345,10 +375,12 @@
345
375
  // WebView
346
376
  /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
347
377
  ], [[NAME, FACEBOOK], VERSION], [
378
+ /(Klarna)\/([\w\.]+)/i, // Klarna Shopping Browser for iOS & Android
348
379
  /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
349
380
  /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
350
381
  /safari (line)\/([\w\.]+)/i, // Line App for iOS
351
382
  /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
383
+ /(alipay)client\/([\w\.]+)/i, // Alipay
352
384
  /(chromium|instagram|snapchat)[\/ ]([-\w\.]+)/i // Chromium/Instagram/Snapchat
353
385
  ], [NAME, VERSION], [
354
386
  /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
@@ -480,8 +512,10 @@
480
512
  /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
481
513
  /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
482
514
  /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
515
+ /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
483
516
  /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\))/i // Xiaomi Mi
484
517
  ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
518
+ /oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, // Redmi Pad
485
519
  /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
486
520
  ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
487
521
 
@@ -496,7 +530,7 @@
496
530
  ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
497
531
 
498
532
  // Realme
499
- /\b(rmx[12]\d{3})(?: bui|;|\))/i
533
+ /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
500
534
  ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
501
535
 
502
536
  // Motorola
@@ -518,7 +552,7 @@
518
552
  // Lenovo
519
553
  /(ideatab[-\w ]+)/i,
520
554
  /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i
521
- ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
555
+ ], [MODEL, [VENDOR, LENOVO], [TYPE, TABLET]], [
522
556
 
523
557
  // Nokia
524
558
  /(?:maemo|nokia).*(n900|lumia \d+)/i,
@@ -582,6 +616,10 @@
582
616
  /droid.+; (m[1-5] note) bui/i,
583
617
  /\bmz-([-\w]{2,})/i
584
618
  ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
619
+
620
+ // Ulefone
621
+ /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
622
+ ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
585
623
 
586
624
  // MIXED
587
625
  /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\w]*)/i,
@@ -688,7 +726,7 @@
688
726
  // MIXED (GENERIC)
689
727
  ///////////////////
690
728
 
691
- /droid .+?; ([^;]+?)(?: bui|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
729
+ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
692
730
  ], [MODEL, [TYPE, MOBILE]], [
693
731
  /droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
694
732
  ], [MODEL, [TYPE, TABLET]], [
@@ -725,12 +763,12 @@
725
763
  // Windows
726
764
  /microsoft (windows) (vista|xp)/i // Windows (iTunes)
727
765
  ], [NAME, VERSION], [
728
- /(windows) nt 6\.2; (arm)/i, // Windows RT
729
- /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i, // Windows Phone
730
- /(windows)[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i
766
+ /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i // Windows Phone
731
767
  ], [NAME, [VERSION, strMapper, windowsVersionMap]], [
732
- /(win(?=3|9|n)|win 9x )([nt\d\.]+)/i
733
- ], [[NAME, WINDOWS], [VERSION, strMapper, windowsVersionMap]], [
768
+ /windows nt 6\.2; (arm)/i, // Windows RT
769
+ /windows[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i,
770
+ /(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i
771
+ ], [[VERSION, strMapper, windowsVersionMap], [NAME, WINDOWS]], [
734
772
 
735
773
  // iOS/macOS
736
774
  /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
@@ -932,6 +970,7 @@
932
970
  [PLATFORM, stripQuotes(uach[CH_HEADER_PLATFORM])],
933
971
  [PLATFORMVER, stripQuotes(uach[CH_HEADER_PLATFORM_VER])],
934
972
  [ARCHITECTURE, stripQuotes(uach[CH_HEADER_ARCH])],
973
+ [FORMFACTOR, itemListToArray(uach[CH_HEADER_FORM_FACTOR])],
935
974
  [BITNESS, stripQuotes(uach[CH_HEADER_BITNESS])]
936
975
  ]);
937
976
  } else {
@@ -1013,21 +1052,21 @@
1013
1052
  };
1014
1053
 
1015
1054
  this.parseCH = function () {
1016
- var ua = this.ua,
1017
- uaCH = this.uaCH,
1055
+ var uaCH = this.uaCH,
1018
1056
  rgxMap = this.rgxMap;
1019
1057
 
1020
1058
  switch (this.itemType) {
1021
1059
  case UA_BROWSER:
1022
- var brands = uaCH[FULLVERLIST] || uaCH[BRANDS];
1060
+ var brands = uaCH[FULLVERLIST] || uaCH[BRANDS], prevName;
1023
1061
  if (brands) {
1024
1062
  for (var i in brands) {
1025
- var brandName = brands[i].brand,
1063
+ var brandName = strip(/(Google|Microsoft) /, brands[i].brand || brands[i]),
1026
1064
  brandVersion = brands[i].version;
1027
- if (!/not.a.brand/i.test(brandName) && (i < 1 || /chromi/i.test(this.get(NAME)))) {
1028
- this.set(NAME, strip(GOOGLE+' ', brandName))
1065
+ if (!/not.a.brand/i.test(brandName) && (!prevName || (/chrom/i.test(prevName) && !/chromi/i.test(brandName)))) {
1066
+ this.set(NAME, brandName)
1029
1067
  .set(VERSION, brandVersion)
1030
1068
  .set(MAJOR, majorize(brandVersion));
1069
+ prevName = brandName;
1031
1070
  }
1032
1071
  }
1033
1072
  }
@@ -1046,6 +1085,23 @@
1046
1085
  if (uaCH[MODEL]) {
1047
1086
  this.set(MODEL, uaCH[MODEL]);
1048
1087
  }
1088
+ // Xbox-Specific Detection
1089
+ if (uaCH[MODEL] == 'Xbox') {
1090
+ this.set(TYPE, CONSOLE)
1091
+ .set(VENDOR, MICROSOFT);
1092
+ }
1093
+ if (uaCH[FORMFACTOR]) {
1094
+ var ff;
1095
+ if (typeof uaCH[FORMFACTOR] !== 'string') {
1096
+ var idx = 0;
1097
+ while (!ff && idx < uaCH[FORMFACTOR].length) {
1098
+ ff = strMapper(uaCH[FORMFACTOR][idx++], formFactorMap);
1099
+ }
1100
+ } else {
1101
+ ff = strMapper(uaCH[FORMFACTOR], formFactorMap);
1102
+ }
1103
+ this.set(TYPE, ff);
1104
+ }
1049
1105
  break;
1050
1106
  case UA_OS:
1051
1107
  var osName = uaCH[PLATFORM];
@@ -1055,6 +1111,11 @@
1055
1111
  this.set(NAME, osName)
1056
1112
  .set(VERSION, osVersion);
1057
1113
  }
1114
+ // Xbox-Specific Detection
1115
+ if (this.get(NAME) == WINDOWS && uaCH[MODEL] == 'Xbox') {
1116
+ this.set(NAME, 'Xbox')
1117
+ .set(VERSION, undefined);
1118
+ }
1058
1119
  break;
1059
1120
  case UA_RESULT:
1060
1121
  var data = this.data;
@@ -1148,7 +1209,7 @@
1148
1209
  ['getResult', createItemFunc(UA_RESULT)],
1149
1210
  ['getUA', function () { return userAgent; }],
1150
1211
  ['setUA', function (ua) {
1151
- if (typeof ua === STR_TYPE)
1212
+ if (isString(ua))
1152
1213
  userAgent = ua.length > UA_MAX_LENGTH ? trim(ua, UA_MAX_LENGTH) : ua;
1153
1214
  return this;
1154
1215
  }]
package/license.md DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2012-2023 Faisal Salman <<f@faisalman.com>>
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.