videomail-client 6.0.2 → 6.0.6

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "videomail-client",
3
- "version": "6.0.2",
3
+ "version": "6.0.6",
4
4
  "description": "A wicked npm package to record videos directly in the browser, wohooo!",
5
5
  "author": "Michael Heuberger <michael.heuberger@binarykitchen.com>",
6
6
  "contributors": [
@@ -66,14 +66,14 @@
66
66
  "canvas-to-buffer": "3.0.1",
67
67
  "classlist.js": "1.1.20150312",
68
68
  "contains": "0.1.1",
69
- "core-js": "3.29.0",
69
+ "core-js": "3.30.1",
70
70
  "create-error": "0.3.1",
71
- "deepmerge": "4.3.0",
71
+ "deepmerge": "4.3.1",
72
72
  "defined": "1.0.1",
73
73
  "despot": "1.1.3",
74
74
  "document-visibility": "1.0.1",
75
75
  "element-closest": "3.0.2",
76
- "filesize": "10.0.6",
76
+ "filesize": "10.0.7",
77
77
  "get-form-data": "3.0.0",
78
78
  "hidden": "1.1.1",
79
79
  "humanize-duration": "3.28.0",
@@ -87,24 +87,24 @@
87
87
  "request-frame": "1.5.3",
88
88
  "safe-json-stringify": "1.2.0",
89
89
  "superagent": "8.0.9",
90
- "ua-parser-js": "1.0.34",
90
+ "ua-parser-js": "1.0.35",
91
91
  "websocket-stream": "5.5.2"
92
92
  },
93
93
  "devDependencies": {
94
- "@babel/core": "7.21.0",
95
- "@babel/eslint-parser": "7.19.1",
96
- "@babel/plugin-transform-runtime": "7.21.0",
97
- "@babel/preset-env": "7.20.2",
94
+ "@babel/core": "7.21.4",
95
+ "@babel/eslint-parser": "7.21.3",
96
+ "@babel/plugin-transform-runtime": "7.21.4",
97
+ "@babel/preset-env": "7.21.4",
98
98
  "audit-ci": "6.6.1",
99
- "autoprefixer": "10.4.13",
99
+ "autoprefixer": "10.4.14",
100
100
  "babelify": "10.0.0",
101
101
  "body-parser": "1.20.2",
102
102
  "browserify": "17.0.0",
103
103
  "connect-send-json": "1.0.0",
104
104
  "cssnano": "5.1.15",
105
105
  "del": "6.1.1",
106
- "eslint": "8.35.0",
107
- "eslint-config-prettier": "8.6.0",
106
+ "eslint": "8.38.0",
107
+ "eslint-config-prettier": "8.8.0",
108
108
  "eslint-plugin-import": "2.27.5",
109
109
  "eslint-plugin-node": "11.1.0",
110
110
  "eslint-plugin-promise": "6.1.1",
@@ -128,8 +128,8 @@
128
128
  "gulp-todo": "7.1.1",
129
129
  "minimist": "1.2.8",
130
130
  "nib": "1.2.0",
131
- "postcss": "8.4.21",
132
- "prettier": "2.8.4",
131
+ "postcss": "8.4.23",
132
+ "prettier": "2.8.7",
133
133
  "router": "1.3.8",
134
134
  "tape": "5.6.3",
135
135
  "tape-catch": "1.0.6",
@@ -6938,10 +6938,10 @@ var store = _dereq_('../internals/shared-store');
6938
6938
  (module.exports = function (key, value) {
6939
6939
  return store[key] || (store[key] = value !== undefined ? value : {});
6940
6940
  })('versions', []).push({
6941
- version: '3.29.0',
6941
+ version: '3.30.1',
6942
6942
  mode: IS_PURE ? 'pure' : 'global',
6943
6943
  copyright: '© 2014-2023 Denis Pushkarev (zloirock.ru)',
6944
- license: 'https://github.com/zloirock/core-js/blob/v3.29.0/LICENSE',
6944
+ license: 'https://github.com/zloirock/core-js/blob/v3.30.1/LICENSE',
6945
6945
  source: 'https://github.com/zloirock/core-js'
6946
6946
  });
6947
6947
 
@@ -12662,17 +12662,15 @@ function replaceGetterValues (replacer) {
12662
12662
  }
12663
12663
 
12664
12664
  },{}],278:[function(_dereq_,module,exports){
12665
- /**
12666
- * filesize
12667
- *
12668
- * @copyright 2022 Jason Mulligan <jason.mulligan@avoidwork.com>
12669
- * @license BSD-3-Clause
12670
- * @version 10.0.6
12671
- */
12672
- 'use strict';
12673
-
12674
- Object.defineProperty(exports, '__esModule', { value: true });
12675
-
12665
+ /**
12666
+ * filesize
12667
+ *
12668
+ * @copyright 2023 Jason Mulligan <jason.mulligan@avoidwork.com>
12669
+ * @license BSD-3-Clause
12670
+ * @version 10.0.7
12671
+ */
12672
+ 'use strict';
12673
+
12676
12674
  const ARRAY = "array";
12677
12675
  const BIT = "bit";
12678
12676
  const BITS = "bits";
@@ -12709,8 +12707,8 @@ const STRINGS = {
12709
12707
  iec: ["", "kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi"],
12710
12708
  jedec: ["", "kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta"]
12711
12709
  }
12712
- };
12713
-
12710
+ };
12711
+
12714
12712
  function filesize (arg, {
12715
12713
  bits = false,
12716
12714
  pad = false,
@@ -12895,10 +12893,10 @@ function partial ({
12895
12893
  roundingMethod,
12896
12894
  precision
12897
12895
  });
12898
- }
12899
-
12900
- exports.filesize = filesize;
12901
- exports.partial = partial;
12896
+ }
12897
+
12898
+ exports.filesize = filesize;
12899
+ exports.partial = partial;
12902
12900
 
12903
12901
  },{}],279:[function(_dereq_,module,exports){
12904
12902
  'use strict';
@@ -23828,7 +23826,7 @@ module.exports = function typedarrayToBuffer (arr) {
23828
23826
  }).call(this)}).call(this,_dereq_("buffer").Buffer)
23829
23827
  },{"buffer":11}],347:[function(_dereq_,module,exports){
23830
23828
  /////////////////////////////////////////////////////////////////////////////////
23831
- /* UAParser.js v1.0.34
23829
+ /* UAParser.js v1.0.35
23832
23830
  Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
23833
23831
  MIT License *//*
23834
23832
  Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
@@ -23846,7 +23844,7 @@ module.exports = function typedarrayToBuffer (arr) {
23846
23844
  /////////////
23847
23845
 
23848
23846
 
23849
- var LIBVERSION = '1.0.34',
23847
+ var LIBVERSION = '1.0.35',
23850
23848
  EMPTY = '',
23851
23849
  UNKNOWN = '?',
23852
23850
  FUNC_TYPE = 'function',
@@ -24065,8 +24063,9 @@ module.exports = function typedarrayToBuffer (arr) {
24065
24063
  /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
24066
24064
 
24067
24065
  // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
24068
- /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,
24066
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\/([-\w\.]+)/i,
24069
24067
  // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
24068
+ /(heytap|ovi)browser\/([\d\.]+)/i, // Heytap/Ovi
24070
24069
  /(weibo)__([\d\.]+)/i // Weibo
24071
24070
  ], [NAME, VERSION], [
24072
24071
  /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
@@ -24080,7 +24079,7 @@ module.exports = function typedarrayToBuffer (arr) {
24080
24079
  ], [VERSION, [NAME, 'Konqueror']], [
24081
24080
  /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
24082
24081
  ], [VERSION, [NAME, 'IE']], [
24083
- /yabrowser\/([\w\.]+)/i // Yandex
24082
+ /ya(?:search)?browser\/([\w\.]+)/i // Yandex
24084
24083
  ], [VERSION, [NAME, 'Yandex']], [
24085
24084
  /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
24086
24085
  ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [
@@ -24124,6 +24123,8 @@ module.exports = function typedarrayToBuffer (arr) {
24124
24123
  ], [NAME, VERSION], [
24125
24124
  /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
24126
24125
  ], [VERSION, [NAME, 'GSA']], [
24126
+ /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
24127
+ ], [VERSION, [NAME, 'TikTok']], [
24127
24128
 
24128
24129
  /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
24129
24130
  ], [VERSION, [NAME, CHROME+' Headless']], [
@@ -24219,7 +24220,7 @@ module.exports = function typedarrayToBuffer (arr) {
24219
24220
  ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
24220
24221
 
24221
24222
  // Apple
24222
- /\((ip(?:hone|od)[\w ]*);/i // iPod/iPhone
24223
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i // iPod/iPhone
24223
24224
  ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
24224
24225
  /\((ipad);[-\w\),; ]+apple/i, // iPad
24225
24226
  /applecoremedia\/[\w\.]+ \((ipad)/i,
@@ -24309,7 +24310,7 @@ module.exports = function typedarrayToBuffer (arr) {
24309
24310
 
24310
24311
  // Amazon
24311
24312
  /(alexa)webm/i,
24312
- /(kf[a-z]{2}wi)( bui|\))/i, // Kindle Fire without Silk
24313
+ /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\))/i, // Kindle Fire without Silk / Echo Show
24313
24314
  /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
24314
24315
  ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
24315
24316
  /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
@@ -24494,6 +24495,8 @@ module.exports = function typedarrayToBuffer (arr) {
24494
24495
 
24495
24496
  /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
24496
24497
  ], [VENDOR, [TYPE, EMBEDDED]], [
24498
+ /(aeobc)\b/i // Echo Dot
24499
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
24497
24500
 
24498
24501
  ////////////////////
24499
24502
  // MIXED (GENERIC)
@@ -24523,7 +24526,8 @@ module.exports = function typedarrayToBuffer (arr) {
24523
24526
  /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
24524
24527
  /ekioh(flow)\/([\w\.]+)/i, // Flow
24525
24528
  /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
24526
- /(icab)[\/ ]([23]\.[\d\.]+)/i // iCab
24529
+ /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
24530
+ /\b(libweb)/i
24527
24531
  ], [NAME, VERSION], [
24528
24532
 
24529
24533
  /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
@@ -24544,6 +24548,7 @@ module.exports = function typedarrayToBuffer (arr) {
24544
24548
 
24545
24549
  // iOS/macOS
24546
24550
  /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
24551
+ /ios;fbsv\/([\d\.]+)/i,
24547
24552
  /cfnetwork\/.+darwin/i
24548
24553
  ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
24549
24554
  /(mac os x) ?([\w\. ]*)/i,
@@ -24600,7 +24605,7 @@ module.exports = function typedarrayToBuffer (arr) {
24600
24605
  ], [[NAME, 'Solaris'], VERSION], [
24601
24606
  /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
24602
24607
  /(aix) ((\d)(?=\.|\)| )[\w\.])*/i, // AIX
24603
- /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX
24608
+ /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS
24604
24609
  /(unix) ?([\w\.]*)/i // UNIX
24605
24610
  ], [NAME, VERSION]
24606
24611
  ]
@@ -24625,6 +24630,7 @@ module.exports = function typedarrayToBuffer (arr) {
24625
24630
  var _ua = ua || ((_navigator && _navigator.userAgent) ? _navigator.userAgent : EMPTY);
24626
24631
  var _uach = (_navigator && _navigator.userAgentData) ? _navigator.userAgentData : undefined;
24627
24632
  var _rgxmap = extensions ? extend(regexes, extensions) : regexes;
24633
+ var _isSelfNav = _navigator && _navigator.userAgent == _ua;
24628
24634
 
24629
24635
  this.getBrowser = function () {
24630
24636
  var _browser = {};
@@ -24633,7 +24639,7 @@ module.exports = function typedarrayToBuffer (arr) {
24633
24639
  rgxMapper.call(_browser, _ua, _rgxmap.browser);
24634
24640
  _browser[MAJOR] = majorize(_browser[VERSION]);
24635
24641
  // Brave-specific detection
24636
- if (_navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {
24642
+ if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {
24637
24643
  _browser[NAME] = 'Brave';
24638
24644
  }
24639
24645
  return _browser;
@@ -24650,11 +24656,11 @@ module.exports = function typedarrayToBuffer (arr) {
24650
24656
  _device[MODEL] = undefined;
24651
24657
  _device[TYPE] = undefined;
24652
24658
  rgxMapper.call(_device, _ua, _rgxmap.device);
24653
- if (!_device[TYPE] && _uach && _uach.mobile) {
24659
+ if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {
24654
24660
  _device[TYPE] = MOBILE;
24655
24661
  }
24656
24662
  // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
24657
- if (_device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {
24663
+ if (_isSelfNav && _device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {
24658
24664
  _device[MODEL] = 'iPad';
24659
24665
  _device[TYPE] = TABLET;
24660
24666
  }
@@ -24672,7 +24678,7 @@ module.exports = function typedarrayToBuffer (arr) {
24672
24678
  _os[NAME] = undefined;
24673
24679
  _os[VERSION] = undefined;
24674
24680
  rgxMapper.call(_os, _ua, _rgxmap.os);
24675
- if (!_os[NAME] && _uach && _uach.platform != 'Unknown') {
24681
+ if (_isSelfNav && !_os[NAME] && _uach && _uach.platform != 'Unknown') {
24676
24682
  _os[NAME] = _uach.platform
24677
24683
  .replace(/chrome os/i, CHROMIUM_OS)
24678
24684
  .replace(/macos/i, MAC_OS); // backward compatibility
@@ -26453,7 +26459,7 @@ function wrappy (fn, cb) {
26453
26459
  },{}],358:[function(_dereq_,module,exports){
26454
26460
  module.exports={
26455
26461
  "name": "videomail-client",
26456
- "version": "6.0.2",
26462
+ "version": "6.0.6",
26457
26463
  "description": "A wicked npm package to record videos directly in the browser, wohooo!",
26458
26464
  "author": "Michael Heuberger <michael.heuberger@binarykitchen.com>",
26459
26465
  "contributors": [
@@ -26519,14 +26525,14 @@ module.exports={
26519
26525
  "canvas-to-buffer": "3.0.1",
26520
26526
  "classlist.js": "1.1.20150312",
26521
26527
  "contains": "0.1.1",
26522
- "core-js": "3.29.0",
26528
+ "core-js": "3.30.1",
26523
26529
  "create-error": "0.3.1",
26524
- "deepmerge": "4.3.0",
26530
+ "deepmerge": "4.3.1",
26525
26531
  "defined": "1.0.1",
26526
26532
  "despot": "1.1.3",
26527
26533
  "document-visibility": "1.0.1",
26528
26534
  "element-closest": "3.0.2",
26529
- "filesize": "10.0.6",
26535
+ "filesize": "10.0.7",
26530
26536
  "get-form-data": "3.0.0",
26531
26537
  "hidden": "1.1.1",
26532
26538
  "humanize-duration": "3.28.0",
@@ -26540,24 +26546,24 @@ module.exports={
26540
26546
  "request-frame": "1.5.3",
26541
26547
  "safe-json-stringify": "1.2.0",
26542
26548
  "superagent": "8.0.9",
26543
- "ua-parser-js": "1.0.34",
26549
+ "ua-parser-js": "1.0.35",
26544
26550
  "websocket-stream": "5.5.2"
26545
26551
  },
26546
26552
  "devDependencies": {
26547
- "@babel/core": "7.21.0",
26548
- "@babel/eslint-parser": "7.19.1",
26549
- "@babel/plugin-transform-runtime": "7.21.0",
26550
- "@babel/preset-env": "7.20.2",
26553
+ "@babel/core": "7.21.4",
26554
+ "@babel/eslint-parser": "7.21.3",
26555
+ "@babel/plugin-transform-runtime": "7.21.4",
26556
+ "@babel/preset-env": "7.21.4",
26551
26557
  "audit-ci": "6.6.1",
26552
- "autoprefixer": "10.4.13",
26558
+ "autoprefixer": "10.4.14",
26553
26559
  "babelify": "10.0.0",
26554
26560
  "body-parser": "1.20.2",
26555
26561
  "browserify": "17.0.0",
26556
26562
  "connect-send-json": "1.0.0",
26557
26563
  "cssnano": "5.1.15",
26558
26564
  "del": "6.1.1",
26559
- "eslint": "8.35.0",
26560
- "eslint-config-prettier": "8.6.0",
26565
+ "eslint": "8.38.0",
26566
+ "eslint-config-prettier": "8.8.0",
26561
26567
  "eslint-plugin-import": "2.27.5",
26562
26568
  "eslint-plugin-node": "11.1.0",
26563
26569
  "eslint-plugin-promise": "6.1.1",
@@ -26581,8 +26587,8 @@ module.exports={
26581
26587
  "gulp-todo": "7.1.1",
26582
26588
  "minimist": "1.2.8",
26583
26589
  "nib": "1.2.0",
26584
- "postcss": "8.4.21",
26585
- "prettier": "2.8.4",
26590
+ "postcss": "8.4.23",
26591
+ "prettier": "2.8.7",
26586
26592
  "router": "1.3.8",
26587
26593
  "tape": "5.6.3",
26588
26594
  "tape-catch": "1.0.6",
@@ -27435,6 +27441,7 @@ var Browser = function Browser(options) {
27435
27441
  var isIOS = uaParser.os.name === 'iOS';
27436
27442
  var browserVersion = parseFloat(uaParser.browser.version);
27437
27443
  var isChrome = uaParser.browser.name === 'Chrome';
27444
+ var isBrave = uaParser.browser.name === 'Brave';
27438
27445
  var isChromium = uaParser.browser.name === 'Chromium';
27439
27446
  var firefox = uaParser.browser.name === 'Firefox';
27440
27447
  var osVersion = parseFloat(uaParser.os.version);
@@ -27453,7 +27460,7 @@ var Browser = function Browser(options) {
27453
27460
  var isBadIOS = isIOS && osVersion < 11;
27454
27461
  // unfortunately need to be able to fake https because tape-run can't run on https
27455
27462
  var isHTTPS = options.fakeHttps || window.location.protocol === 'https:';
27456
- var okBrowser = chromeBased || firefox || isAndroid || isOpera || isEdge || isOkSafari || isOkIOS;
27463
+ var okBrowser = chromeBased || firefox || isAndroid || isOpera || isEdge || isOkSafari || isOkIOS || isBrave;
27457
27464
  var self = this;
27458
27465
  var videoType;
27459
27466
  function getRecommendation() {
@@ -31326,19 +31333,31 @@ var Recorder = function Recorder(visuals, replay) {
31326
31333
  }
31327
31334
  });
31328
31335
  stream.on('error', function (err) {
31329
- debug(PIPE_SYMBOL + 'Stream *error* event emitted', err);
31330
- connecting = connected = false;
31331
- var videomailError;
31332
- if (browser.isIOS()) {
31333
- // setting custom text since that err object isn't really an error
31334
- // on iphones when locked, and unlocked, this err is actually
31335
- // an event object with stuff we can't use at all (an external bug)
31336
- videomailError = _videomailError["default"].create('Sorry, connection has timed out', 'iPhones cannot maintain a websocket longer than three minutes.', options);
31337
- } else {
31338
- // or else it could be a poor wifi connection...
31339
- videomailError = _videomailError["default"].create('Data exchange interrupted', 'Please check your network connection and reload.', options);
31340
- }
31341
- self.emit(_events["default"].ERROR, videomailError);
31336
+ debug(PIPE_SYMBOL + 'Stream *error* event emitted: ' + (0, _pretty["default"])(err));
31337
+
31338
+ // connecting = connected = false
31339
+
31340
+ // let videomailError
31341
+
31342
+ // if (browser.isIOS()) {
31343
+ // // setting custom text since that err object isn't really an error
31344
+ // // on iphones when locked, and unlocked, this err is actually
31345
+ // // an event object with stuff we can't use at all (an external bug)
31346
+ // videomailError = VideomailError.create(
31347
+ // 'Sorry, connection has timed out',
31348
+ // 'iPhones cannot maintain a live connection for too long.',
31349
+ // options
31350
+ // )
31351
+ // } else {
31352
+ // // or else it could be a poor wifi connection...
31353
+ // videomailError = VideomailError.create(
31354
+ // 'Data exchange interrupted',
31355
+ // 'Please check your network connection and reload.',
31356
+ // options
31357
+ // )
31358
+ // }
31359
+
31360
+ // self.emit(Events.ERROR, videomailError)
31342
31361
  });
31343
31362
 
31344
31363
  // just experimental