From bc6a0be048ab35bc62ba6c9713222e8f830ab97f Mon Sep 17 00:00:00 2001 From: Nicolas Bland Date: Sun, 19 Feb 2017 19:42:12 +0100 Subject: [PATCH 01/83] creation of plugin that handle paste multi row mail addresses into a single email field --- plugins/contact-group-excel-paste/LICENCE | 20 +++++++++++++++++++ plugins/contact-group-excel-paste/README | 4 ++++ plugins/contact-group-excel-paste/VERSION | 1 + plugins/contact-group-excel-paste/index.php | 9 +++++++++ .../js/excel_contact_group.js | 20 +++++++++++++++++++ 5 files changed, 54 insertions(+) create mode 100644 plugins/contact-group-excel-paste/LICENCE create mode 100644 plugins/contact-group-excel-paste/README create mode 100644 plugins/contact-group-excel-paste/VERSION create mode 100644 plugins/contact-group-excel-paste/index.php create mode 100644 plugins/contact-group-excel-paste/js/excel_contact_group.js diff --git a/plugins/contact-group-excel-paste/LICENCE b/plugins/contact-group-excel-paste/LICENCE new file mode 100644 index 000000000..7e42eb0f8 --- /dev/null +++ b/plugins/contact-group-excel-paste/LICENCE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2017 https://github.com/korukugashi/ + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/plugins/contact-group-excel-paste/README b/plugins/contact-group-excel-paste/README new file mode 100644 index 000000000..667dc4046 --- /dev/null +++ b/plugins/contact-group-excel-paste/README @@ -0,0 +1,4 @@ +Add ability to paste multi row email addresses (from Excel for instance) to a contact in a single row, in order to create a contact group. + +Usage : open address book, paste your emails separated by line breaks in an email field. Emails will be collapsed with "," separator. +Then, when you write an email, select the email group and all addresses will be added. diff --git a/plugins/contact-group-excel-paste/VERSION b/plugins/contact-group-excel-paste/VERSION new file mode 100644 index 000000000..ceab6e11e --- /dev/null +++ b/plugins/contact-group-excel-paste/VERSION @@ -0,0 +1 @@ +0.1 \ No newline at end of file diff --git a/plugins/contact-group-excel-paste/index.php b/plugins/contact-group-excel-paste/index.php new file mode 100644 index 000000000..81fc9037c --- /dev/null +++ b/plugins/contact-group-excel-paste/index.php @@ -0,0 +1,9 @@ +addJs('js/excel_contact_group.js'); + } +} diff --git a/plugins/contact-group-excel-paste/js/excel_contact_group.js b/plugins/contact-group-excel-paste/js/excel_contact_group.js new file mode 100644 index 000000000..e29a9f293 --- /dev/null +++ b/plugins/contact-group-excel-paste/js/excel_contact_group.js @@ -0,0 +1,20 @@ +(function(window, $) { + $(function() { + $(window.document).on('paste', '.RL-PopupsContacts .contactValueInput', function() { + // trigger the process on click and paste + var $this = $(this); + + setTimeout(function () { + $this.trigger('keyup'); + }); + }).on('keyup', '.RL-PopupsContacts .contactValueInput', function() { + var $this = $(this), + value = $this.val(), + match = value && value.match(/@/ig); + + if (match && match.length > 1) { + $this.val($this.val().replace(/\n| /ig, ',')); + } + }); + }); +}(window, $)); From d52baf4a8cb13a4aeca2f42ad34ddc56172f2fcd Mon Sep 17 00:00:00 2001 From: Pierre-Alain Bandinelli Date: Sun, 19 Mar 2017 15:00:32 +0100 Subject: [PATCH 02/83] Fixing #1284, conflict in headers creation when loading images in body message, "Cannot modify header information - headers already sent" --- rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 2b5c33058..2e2cb3c75 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -8663,12 +8663,14 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack if ($bDownload || $sLoadedData) { - \header('Content-Type: '.$sContentTypeOut); - \header('Content-Disposition: '.($bDownload ? 'attachment' : 'inline').'; '. + if (!headers_sent()) { + \header('Content-Type: '.$sContentTypeOut); + \header('Content-Disposition: '.($bDownload ? 'attachment' : 'inline').'; '. \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileNameOut)), true); - \header('Accept-Ranges: bytes'); - \header('Content-Transfer-Encoding: binary'); + \header('Accept-Ranges: bytes'); + \header('Content-Transfer-Encoding: binary'); + } if ($bIsRangeRequest && !$sLoadedData) { From 4b312a4f357b0ef1faa186c20503cc1f8660b238 Mon Sep 17 00:00:00 2001 From: Oxymoron Date: Sat, 22 Jul 2017 16:28:52 -0500 Subject: [PATCH 03/83] =?UTF-8?q?=C2=83Corrected=20mispelling=20of=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rainloop/v/0.0.0/app/libraries/PHP-OAuth2/Client.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/Client.php b/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/Client.php index 0b59cf6b7..6fae0925d 100644 --- a/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/Client.php +++ b/rainloop/v/0.0.0/app/libraries/PHP-OAuth2/Client.php @@ -148,7 +148,7 @@ class Client public function __construct($client_id, $client_secret, $client_auth = self::AUTH_TYPE_URI, $certificate_file = null) { if (!extension_loaded('curl')) { - throw new Exception('The PHP exention curl must be installed to use this library.', Exception::CURL_NOT_FOUND); + throw new Exception('The PHP extension curl must be installed to use this library.', Exception::CURL_NOT_FOUND); } $this->client_id = $client_id; From 3bc9c5403935dc37d2202df0316e8a14bb4b6934 Mon Sep 17 00:00:00 2001 From: Oxymoron Date: Sat, 22 Jul 2017 16:29:33 -0500 Subject: [PATCH 04/83] Corrected more mispellings of the word --- plugins/hmailserver-change-password/index.php | 2 +- plugins/ispconfig-change-password/index.php | 4 ++-- plugins/ispmail-change-password/index.php | 4 ++-- plugins/ldap-change-password/index.php | 2 +- plugins/ldap-contacts-suggestions/index.php | 2 +- plugins/mailcow-change-password/index.php | 4 ++-- plugins/postfixadmin-change-password/index.php | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/plugins/hmailserver-change-password/index.php b/plugins/hmailserver-change-password/index.php index 4bd153135..c499450e2 100644 --- a/plugins/hmailserver-change-password/index.php +++ b/plugins/hmailserver-change-password/index.php @@ -14,7 +14,7 @@ class HmailserverChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin { if (!class_exists('COM')) { - return 'The PHP exention COM must be installed to use this plugin'; + return 'The PHP extension COM must be installed to use this plugin'; } return ''; diff --git a/plugins/ispconfig-change-password/index.php b/plugins/ispconfig-change-password/index.php index 1c45e37fc..34906074f 100644 --- a/plugins/ispconfig-change-password/index.php +++ b/plugins/ispconfig-change-password/index.php @@ -14,13 +14,13 @@ class IspconfigChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin { if (!extension_loaded('pdo') || !class_exists('PDO')) { - return 'The PHP exention PDO (mysql) must be installed to use this plugin'; + return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } $aDrivers = \PDO::getAvailableDrivers(); if (!is_array($aDrivers) || !in_array('mysql', $aDrivers)) { - return 'The PHP exention PDO (mysql) must be installed to use this plugin'; + return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } return ''; diff --git a/plugins/ispmail-change-password/index.php b/plugins/ispmail-change-password/index.php index 5a924622c..5dceae56e 100755 --- a/plugins/ispmail-change-password/index.php +++ b/plugins/ispmail-change-password/index.php @@ -14,13 +14,13 @@ class IspmailChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin { if (!extension_loaded('pdo') || !class_exists('PDO')) { - return 'The PHP exention PDO (mysql) must be installed to use this plugin'; + return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } $aDrivers = \PDO::getAvailableDrivers(); if (!is_array($aDrivers) || !in_array('mysql', $aDrivers)) { - return 'The PHP exention PDO (mysql) must be installed to use this plugin'; + return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } return ''; diff --git a/plugins/ldap-change-password/index.php b/plugins/ldap-change-password/index.php index af201cedf..546249e2d 100644 --- a/plugins/ldap-change-password/index.php +++ b/plugins/ldap-change-password/index.php @@ -14,7 +14,7 @@ class LdapChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin { if (!\function_exists('ldap_connect')) { - return 'The LDAP PHP exention must be installed to use this plugin'; + return 'The LDAP PHP extension must be installed to use this plugin'; } return ''; diff --git a/plugins/ldap-contacts-suggestions/index.php b/plugins/ldap-contacts-suggestions/index.php index 7e77f2790..b02fc1c37 100644 --- a/plugins/ldap-contacts-suggestions/index.php +++ b/plugins/ldap-contacts-suggestions/index.php @@ -14,7 +14,7 @@ class LdapContactsSuggestionsPlugin extends \RainLoop\Plugins\AbstractPlugin { if (!\function_exists('ldap_connect')) { - return 'The LDAP PHP exention must be installed to use this plugin'; + return 'The LDAP PHP extension must be installed to use this plugin'; } return ''; diff --git a/plugins/mailcow-change-password/index.php b/plugins/mailcow-change-password/index.php index fdd58cf09..ae6c0443f 100644 --- a/plugins/mailcow-change-password/index.php +++ b/plugins/mailcow-change-password/index.php @@ -14,13 +14,13 @@ class MailcowChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin { if (!extension_loaded('pdo') || !class_exists('PDO')) { - return 'The PHP exention PDO (mysql) must be installed to use this plugin'; + return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } $aDrivers = \PDO::getAvailableDrivers(); if (!is_array($aDrivers) || !in_array('mysql', $aDrivers)) { - return 'The PHP exention PDO (mysql) must be installed to use this plugin'; + return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } return ''; diff --git a/plugins/postfixadmin-change-password/index.php b/plugins/postfixadmin-change-password/index.php index 1068d4ee2..3e1223d4b 100755 --- a/plugins/postfixadmin-change-password/index.php +++ b/plugins/postfixadmin-change-password/index.php @@ -14,13 +14,13 @@ class PostfixadminChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin { if (!extension_loaded('pdo') || !class_exists('PDO')) { - return 'The PHP exention PDO (mysql) must be installed to use this plugin'; + return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } $aDrivers = \PDO::getAvailableDrivers(); if (!is_array($aDrivers) || !in_array('mysql', $aDrivers)) { - return 'The PHP exention PDO (mysql) must be installed to use this plugin'; + return 'The PHP extension PDO (mysql) must be installed to use this plugin'; } return ''; From 425f0ee3f6bc2d0bf53249e5d8cb2f7a3d2a1f32 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Mon, 7 Aug 2017 18:09:14 +0300 Subject: [PATCH 05/83] Small fixes --- dev/Common/Utils.js | 9 + dev/Screen/AbstractSettings.js | 6 +- dev/View/Popup/FolderSystem.js | 12 +- dev/View/User/MailBox/MessageView.js | 12 +- package.json | 18 +- .../v/0.0.0/app/localization/admin/da_DK.yml | 36 +- .../v/0.0.0/app/localization/admin/zh_CN.yml | 28 + .../0.0.0/app/localization/webmail/da_DK.yml | 73 +- .../0.0.0/app/localization/webmail/sk_SK.yml | 43 +- .../0.0.0/app/localization/webmail/sv_SE.yml | 70 +- yarn.lock | 10758 ++++++++-------- 11 files changed, 5608 insertions(+), 5457 deletions(-) diff --git a/dev/Common/Utils.js b/dev/Common/Utils.js index 1c10cf23d..7382a1f16 100644 --- a/dev/Common/Utils.js +++ b/dev/Common/Utils.js @@ -1455,6 +1455,15 @@ export function mimeContentType(fileName) return result; } +/** + * @param {string} color + * @returns {boolean} + */ +export function isTransparent(color) +{ + return 'rgba(0, 0, 0, 0)' === color || 'transparent' === color; +} + /** * @param {Object} $el * @returns {number} diff --git a/dev/Screen/AbstractSettings.js b/dev/Screen/AbstractSettings.js index 340102404..479cd233e 100644 --- a/dev/Screen/AbstractSettings.js +++ b/dev/Screen/AbstractSettings.js @@ -168,9 +168,9 @@ class AbstractSettingsScreen extends AbstractScreen routes() { const DefaultViewModel = _.find( - VIEW_MODELS.settings, - (SettingsViewModel) => SettingsViewModel && SettingsViewModel.__rlSettingsData && SettingsViewModel.__rlSettingsData.IsDefault - ), + VIEW_MODELS.settings, + (SettingsViewModel) => SettingsViewModel && SettingsViewModel.__rlSettingsData && SettingsViewModel.__rlSettingsData.IsDefault + ), defaultRoute = DefaultViewModel && DefaultViewModel.__rlSettingsData ? DefaultViewModel.__rlSettingsData.Route : 'general', rules = { subname: /^(.*)$/, diff --git a/dev/View/Popup/FolderSystem.js b/dev/View/Popup/FolderSystem.js index 3330da300..e400ccab9 100644 --- a/dev/View/Popup/FolderSystem.js +++ b/dev/View/Popup/FolderSystem.js @@ -48,12 +48,12 @@ class FolderSystemPopupView extends AbstractViewNext const fSetSystemFolders = () => { - Settings.settingsSet('SentFolder', FolderStore.sentFolder()); - Settings.settingsSet('DraftFolder', FolderStore.draftFolder()); - Settings.settingsSet('SpamFolder', FolderStore.spamFolder()); - Settings.settingsSet('TrashFolder', FolderStore.trashFolder()); - Settings.settingsSet('ArchiveFolder', FolderStore.archiveFolder()); - }, + Settings.settingsSet('SentFolder', FolderStore.sentFolder()); + Settings.settingsSet('DraftFolder', FolderStore.draftFolder()); + Settings.settingsSet('SpamFolder', FolderStore.spamFolder()); + Settings.settingsSet('TrashFolder', FolderStore.trashFolder()); + Settings.settingsSet('ArchiveFolder', FolderStore.archiveFolder()); + }, fSaveSystemFolders = _.debounce( () => { fSetSystemFolders(); diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index 4f9bfc623..7731b8f79 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -23,7 +23,7 @@ import { import { inArray, isArray, isNonEmptyArray, trim, noop, windowResize, windowResizeCallback, inFocus, - removeSelection, removeInFocus, mailToHelper + removeSelection, removeInFocus, mailToHelper, isTransparent } from 'Common/Utils'; import Audio from 'Common/Audio'; @@ -438,9 +438,9 @@ class MessageViewMailBoxUserView extends AbstractViewNext const fFindDom = function(inputDom) { - const children = inputDom ? inputDom.children() : null; - return (children && 1 === children.length && children.is('table,div,center')) ? children : null; - }, + const children = inputDom ? inputDom.children() : null; + return (children && 1 === children.length && children.is('table,div,center')) ? children : null; + }, fFindColor = function(inputDom) { let color = ''; if (inputDom) @@ -448,7 +448,7 @@ class MessageViewMailBoxUserView extends AbstractViewNext color = inputDom.css('background-color') || ''; if (!inputDom.is('table')) { - color = 'rgba(0, 0, 0, 0)' === color || 'transparent' === color ? '' : color; + color = isTransparent(color) ? '' : color; } } @@ -477,7 +477,7 @@ class MessageViewMailBoxUserView extends AbstractViewNext } } - result = 'rgba(0, 0, 0, 0)' === result || 'transparent' === result ? '' : result; + result = isTransparent(result) ? '' : result; } return result; diff --git a/package.json b/package.json index ec254809e..ad5f327d9 100644 --- a/package.json +++ b/package.json @@ -61,23 +61,23 @@ "babel-plugin-transform-runtime": "6.23.0", "babel-preset-env": "1.6.0", "babel-preset-stage-0": "6.24.1", - "babel-runtime": "6.23.0", + "babel-runtime": "6.25.0", "classnames": "2.2.5", "copy-webpack-plugin": "4.0.1", "es6-promise-polyfill": "1.2.0", - "eslint": "4.1.1", + "eslint": "4.4.0", "eslint-plugin-compat": "1.0.4", "gulp": "3.9.1", "gulp-autoprefixer": "4.0.0", "gulp-cached": "1.1.1", "gulp-chmod": "2.0.0", - "gulp-clean-css": "3.5.0", + "gulp-clean-css": "3.7.0", "gulp-concat-util": "0.5.5", "gulp-eol": "0.1.2", "gulp-eslint": "4.0.0", "gulp-expect-file": "0.0.7", - "gulp-filter": "5.0.0", - "gulp-header": "1.8.8", + "gulp-filter": "5.0.1", + "gulp-header": "1.8.9", "gulp-if": "2.0.2", "gulp-less": "3.3.2", "gulp-livereload": "3.8.1", @@ -99,7 +99,7 @@ "jquery-scrollstop": "1.2.0", "jquery.backstretch": "2.1.15", "js-cookie": "2.1.4", - "json-loader": "0.5.4", + "json-loader": "0.5.7", "json3": "3.3.2", "knockout": "3.4.2", "knockout-projections": "github:stevesanderson/knockout-projections#v1.1.0", @@ -110,17 +110,17 @@ "node-fs": "0.1.7", "node-notifier": "5.1.2", "normalize.css": "7.0.0", - "openpgp": "2.5.5", + "openpgp": "2.5.8", "opentip": "2.4.3", "pikaday": "1.6.1", "raw-loader": "0.5.1", "rifraf": "2.0.3", "rimraf": "2.6.1", - "run-sequence": "2.0.0", + "run-sequence": "2.1.0", "simplestatemanager": "3.4.0", "style-loader": "0.18.2", "underscore": "1.8.3", - "webpack": "3.1.0", + "webpack": "3.4.1", "webpack-notifier": "1.5.0" } } diff --git a/rainloop/v/0.0.0/app/localization/admin/da_DK.yml b/rainloop/v/0.0.0/app/localization/admin/da_DK.yml index b13f314f1..e9a78593a 100644 --- a/rainloop/v/0.0.0/app/localization/admin/da_DK.yml +++ b/rainloop/v/0.0.0/app/localization/admin/da_DK.yml @@ -30,7 +30,7 @@ da_DK: LABEL_SHOW_THUMBNAILS: "Vis miniaturer (vedhæftede filer)" LABEL_ALLOW_GRAVATAR: "Tillad Gravatar" LEGEND_MAIN: "Primære" - LABEL_ATTACHMENT_SIZE_LIMIT: "Vedhæftet filers størrelsesgrænse" + LABEL_ATTACHMENT_SIZE_LIMIT: "Vedhæftede filers størrelsesgrænse" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Tillad flere konti" LABEL_ALLOW_IDENTITIES: "Tillad flere identiteter" LABEL_ALLOW_TEMPLATES: "Tillad skabeloner" @@ -61,7 +61,7 @@ da_DK: LEGEND_USER: "Bruger" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Logotitel" - LABEL_USER_LOGO_MESSAGE: "Logo (Beskedvisning)" + LABEL_USER_LOGO_MESSAGE: "Logo (meddelelsesvisning)" LABEL_USER_CUSTOM_CSS: "Brugerdefinerede CSS" LEGEND_WELCOME_PAGE: "Velkomstside" LABEL_WELCOME_PAGE_TITLE: "Titel" @@ -74,7 +74,7 @@ da_DK: TAB_CONTACTS: LEGEND_CONTACTS: "Kontakter" LEGEND_STORAGE: "Lagring (PDO)" - LABEL_ENABLE_CONTACTS: "Aktiver kontakter" + LABEL_ENABLE_CONTACTS: "Aktivér kontakter" LABEL_ALLOW_SYNC: "Tillad kontaktsynkronisering (med ektern CardDAV server)" LABEL_STORAGE_TYPE: "Type" LABEL_STORAGE_DSN: "Dsn" @@ -98,8 +98,8 @@ da_DK: Klik på navnet for at konfigurere domænet. TAB_SECURITY: LEGEND_SECURITY: "Sikkerhed" - LABEL_ALLOW_TWO_STEP: "Tillad 2-trins verificering" - LABEL_FORCE_TWO_STEP: "Gennemtving 2-trins verificering" + LABEL_ALLOW_TWO_STEP: "Tillad 2-trins verifikation" + LABEL_FORCE_TWO_STEP: "Gennemtving 2-trins verifikation" LABEL_USE_IMAGE_PROXY: "Brug lokal proxy til eksterne billeder" LABEL_ALLOW_OPEN_PGP: "Tillad OpenPGP" LABEL_SHOW_PHP_INFO: "Vis PHP informationer" @@ -110,8 +110,8 @@ da_DK: LABEL_REPEAT_PASSWORD: "Gentag" BUTTON_UPDATE_PASSWORD: "Opdater adgangskode" LEGEND_SSL: "SSL" - LABEL_REQUIRE_VERIFICATION: "Kræv verificering af brugte SSL certifikat (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Tillad selvsigneret certifikater" + LABEL_REQUIRE_VERIFICATION: "Kræv verifikation af brugt SSL certifikat (IMAP/SMTP)" + LABEL_ALLOW_SELF_SIGNED: "Tillad selvsignerede certifikater" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Aktiver Google integration" @@ -218,7 +218,7 @@ da_DK: BUTTON_TEST: "Test" BUTTON_WHITE_LIST: "Whitelist" BUTTON_SIEVE_CONFIGURATION: "Sieve opsætning" - BUTTON_BACK_TO_IMAP: "Tilbage til IMAP instillinger" + BUTTON_BACK_TO_IMAP: "Tilbage til IMAP indstillinger" BUTTON_BACK: "Tilbage" BUTTON_CLOSE: "Luk" BUTTON_ADD: "Tilføj" @@ -263,15 +263,15 @@ da_DK: af e-mail og tilføj ID'et under konto indstillinger. DOMAIN_NOT_ALLOWED: "Domæne ikke tilladt" ACCOUNT_NOT_ALLOWED: "Konto ikke tilladt" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-faktor verificering påbudt." - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-faktor verifikations fejl" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-faktor verifikation påbudt." + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "2-faktor verifikationsfejl" COULD_NOT_SAVE_NEW_PASSWORD: "Kunne ikke gemme ny adgangskode" CURRENT_PASSWORD_INCORRECT: "Nuværende adgangskode forkert" NEW_PASSWORD_SHORT: "Adgangskoden for kort" NEW_PASSWORD_WEAK: "Adgangskoden for simpel" - NEW_PASSWORD_FORBIDDENT: "Adgangskode indenholder forbudte tegn" + NEW_PASSWORD_FORBIDDENT: "Adgangskode indeholder forbudte tegn" CONTACTS_SYNC_ERROR: "Fejl ved synkronisering af kontakter" - CANT_GET_MESSAGE_LIST: "Kan ikke indlæse meddelelses oversigt " + CANT_GET_MESSAGE_LIST: "Kan ikke indlæse meddelelsesoversigt " CANT_GET_MESSAGE: "Kan ikke indlæse meddelelse" CANT_DELETE_MESSAGE: "Kan ikke slette meddelelse" CANT_MOVE_MESSAGE: "Kan ikke flytte meddelelse" @@ -292,22 +292,22 @@ da_DK: DOMAIN_ALREADY_EXISTS: "Domæne eksisterer allerede" CANT_INSTALL_PACKAGE: "Installation af pakke mislykkedes" CANT_DELETE_PACKAGE: "Fjernelse af pakke mislykkedes" - INVALID_PLUGIN_PACKAGE: "Ugyldig tilføjelses pakke" - UNSUPPORTED_PLUGIN_PACKAGE: "Tilføjelses pakke ikke understøttet" - LICENSING_SERVER_IS_UNAVAILABLE: "Abonnomentsserver ikke tilgængelig" + INVALID_PLUGIN_PACKAGE: "Ugyldig tilføjelsespakke" + UNSUPPORTED_PLUGIN_PACKAGE: "Tilføjelsespakke ikke understøttet" + LICENSING_SERVER_IS_UNAVAILABLE: "Abonnementsserver ikke tilgængelig" LICENSING_DOMAIN_EXPIRED: "Abonnement på domæne udløbet." LICENSING_DOMAIN_BANNED: "Abonnement på domæne forbudt." DEMO_SEND_MESSAGE_ERROR: "Denne konto kan af sikkerheds hensyn ikke sende e-mails til eksterne adresser!" DEMO_ACCOUNT_ERROR: "Denne konto kan af sikkerheds hensyn ikke udføre denne handling!" - ACCOUNT_ALREADY_EXISTS: "Kontoen eksistere allerede" - ACCOUNT_DOES_NOT_EXIST: "Kontoen eksiterer ikke" + ACCOUNT_ALREADY_EXISTS: "Kontoen eksisterer allerede" + ACCOUNT_DOES_NOT_EXIST: "Kontoen eksisterer ikke" MAIL_SERVER_ERROR: "Der skete en fejl under adgang til e-mail serveren" INVALID_INPUT_ARGUMENT: "Ugyldigt argument" UNKNOWN_ERROR: "Ukendt fejl" STATIC: BACK_LINK: "Genindlæs" DOMAIN_LIST_DESC: "Liste over domæner webmail er tilladt adgang til." - PHP_EXSTENSIONS_ERROR_DESC: "Nødvendige PHP udvidelser er ikke tilgengænlige!" + PHP_EXSTENSIONS_ERROR_DESC: "Nødvendige PHP udvidelser er ikke tilgængelige!" PHP_VERSION_ERROR_DESC: "PHP versionen (%VERSION%) er for gammel. Minimum 5.3.0 er nødvendig!" NO_SCRIPT_TITLE: "JavaScript er nødvendig for dette program." NO_SCRIPT_DESC: | diff --git a/rainloop/v/0.0.0/app/localization/admin/zh_CN.yml b/rainloop/v/0.0.0/app/localization/admin/zh_CN.yml index 7fc874a26..c6be31350 100644 --- a/rainloop/v/0.0.0/app/localization/admin/zh_CN.yml +++ b/rainloop/v/0.0.0/app/localization/admin/zh_CN.yml @@ -91,6 +91,10 @@ zh_CN: BUTTON_ADD_DOMAIN: "添加域名" BUTTON_ADD_ALIAS: "添加别名" DELETE_ARE_YOU_SURE: "你确定吗?" + HTML_DOMAINS_HELPER: | + 允许访问的域。 +
+ 点击域名进行设置。 TAB_SECURITY: LEGEND_SECURITY: "安全" LABEL_ALLOW_TWO_STEP: "允许2步验证" @@ -105,11 +109,14 @@ zh_CN: LABEL_REPEAT_PASSWORD: "重复" BUTTON_UPDATE_PASSWORD: "更新密码" LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "要求验证SSL证书(IMAP/SMTP)" LABEL_ALLOW_SELF_SIGNED: "允许自签署的证书" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "启用Google整合" LABEL_GOOGLE_AUTH: "认证" + LABEL_GOOGLE_DRIVE: "Google Drive 整合(撰写视图)" + LABEL_GOOGLE_PREVIEW: "Google Viewer 整合(预览Microsoft Word,Excel,和Powerpoint文档)" LABEL_GOOGLE_CLIENT_ID: "用户ID" LABEL_GOOGLE_CLIENT_SECRET: "用户密码" LABEL_GOOGLE_API_KEY: "Api密钥" @@ -120,6 +127,8 @@ zh_CN: LABEL_FACEBOOK_APP_SECRET: "应用密钥" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "启用Twitter整合(认证)" + LABEL_TWITTER_CONSUMER_KEY: "用户Key" + LABEL_TWITTER_CONSUMER_SECRET: "用户Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "启用Dropbox整合" LABEL_DROPBOX_API_KEY: "Api密钥" @@ -143,6 +152,8 @@ zh_CN: TYPE_BASIC_HINT_2: "此域名无法被许可" HTML_ALERT_TOP_1: "RainLoop Webmail位于的许可证下" HTML_ALERT_TOP_2: "你可以自由地将它用于你的 私人 项目." + HTML_ALERT_TOP_3: | + 商业版的RainLoop Webmail自带更多功能,需要订阅。 TYPE_PREMIUM_LIFETIME: "永久" LABEL_SUB_EXPIRES: "订阅失效" BUTTON_ACTIVATE: "为此域名启用订阅密钥" @@ -169,6 +180,11 @@ zh_CN: LABEL_ACTIVATED: "已激活" ERROR_INVALID_SUBS_KEY: "无效的订阅密钥" SUBS_KEY_ACTIVATED: "订阅密钥成功启用" + HTML_DESC: | + 激活后,域%DOMAIN%的订阅时间将会续展。 + 请注意,订阅密匙只可用于一个域。 +

+ 激活开始后,激活过程中不可被中断或取消。 POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "添加别名" LABEL_ALIAS: "别名" @@ -180,6 +196,7 @@ zh_CN: TITLE_ADD_DOMAIN_WITH_NAME: "添加域名 \"%NAME%\"" TITLE_EDIT_DOMAIN: "编辑域名 \"%NAME%\"" LABEL_NAME: "名字" + NAME_HELPER: "可使用通配符" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" @@ -190,18 +207,23 @@ zh_CN: SECURE_OPTION_NONE: "无" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "可使用筛选脚本" LABEL_ALLOW_USER_SCRIPT: "允许用户自定义脚本" LABEL_USE_SHORT_LOGIN: "使用短用户名登录" LABEL_USE_AUTH: "使用认证" LABEL_USE_PHP_MAIL: "使用 php mail() 函数" BUTTON_TEST: "测试" BUTTON_WHITE_LIST: "白名单" + BUTTON_SIEVE_CONFIGURATION: "筛选设置" BUTTON_BACK_TO_IMAP: "回到IMAP设置" BUTTON_BACK: "返回" BUTTON_CLOSE: "关闭" BUTTON_ADD: "添加" BUTTON_UPDATE: "更新" NEW_DOMAIN_DESC: "此域名配置将允许你
%NAME%电子邮件地址一起工作." + WHITE_LIST_ALERT: | + 允许访问的域用户。 + 使用空格分隔。 POPUPS_PLUGIN: TITLE_PLUGIN: "插件" DESC_NOTHING_TO_CONFIGURE: "无可用配置" @@ -227,6 +249,12 @@ zh_CN: ACCESS_ERROR: "访问错误" CONNECTION_ERROR: "无法连接到服务器" CAPTCHA_ERROR: "验证码不正确。" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + 这个社交媒体ID并未与任何电邮账户关联。请使用电邮登录然后再在账户设置用启用此功能。 + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + 这个社交媒体ID并未与任何电邮账户关联。请使用电邮登录然后再在账户设置用启用此功能。 + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + 这个社交媒体ID并未与任何电邮账户关联。请使用电邮登录然后再在账户设置用启用此功能。 DOMAIN_NOT_ALLOWED: "域名不被允许。" ACCOUNT_NOT_ALLOWED: "账户不允许" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "需要两步验证" diff --git a/rainloop/v/0.0.0/app/localization/webmail/da_DK.yml b/rainloop/v/0.0.0/app/localization/webmail/da_DK.yml index 5981d8547..772593989 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/da_DK.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/da_DK.yml @@ -88,10 +88,10 @@ da_DK: EMPTY_LIST: "Ingen meddelelser." EMPTY_SEARCH_LIST: "Ingen meddelelser passede på søgningen." SEARCH_RESULT_FOR: "Resultat for søgningen på \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "Tilbage til meddelelsesoversigt." - LIST_LOADING: "Indlæser..." + BACK_TO_MESSAGE_LIST: "Tilbage til meddelelsesoversigt" + LIST_LOADING: "Indlæser" EMPTY_SUBJECT_TEXT: "(Intet emne)" - PUT_MESSAGE_HERE: "Træk meddelelser her for visning i oversigten" + PUT_MESSAGE_HERE: "Slip meddelelse her for visning i oversigten" TODAY_AT: "i dag klokken %TIME%" YESTERDAY_AT: "i går klokken %TIME%" SEARCH_PLACEHOLDER: "Søg" @@ -145,8 +145,9 @@ da_DK: PRINT_LABEL_ATTACHMENTS: "Vedhæftninger" MESSAGE_LOADING: "Indlæser" MESSAGE_VIEW_DESC: "Vælg meddelelse i oversigten for visning." + MESSAGE_VIEW_MOVE_DESC: "Vælg modtagemappe i panelet til venstre." PGP_PASSWORD_INPUT_PLACEHOLDER: "Adgangskode" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP signeret meddelelse (tryk for at verificere)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP krypteret meddelelse (tryk for at dekryptere)" LINK_DOWNLOAD_AS_ZIP: "Hent som zip-fil" LINK_SAVE_TO_OWNCLOUD: "Gem til ownCloud" @@ -156,7 +157,7 @@ da_DK: BODY: | Kvittering for læsning af %READ-RECEIPT%. - Bemærk: "Dette bekræfter bare at meddelelsen er blevet op modtageren." + Bemærk: "Dette bekræfter bare at meddelelsen er blevet vist på modtagerens computer." Der er ingen garanti for at modtager har læst meddelelsen. SUGGESTIONS: SEARCHING_DESC: "Søger..." @@ -175,7 +176,7 @@ da_DK: EMPTY_SEARCH: "Ingen kontakter fundet" CLEAR_SEARCH: "Fjern søgning" CONTACT_VIEW_DESC: "Vælg kontakt i oversigten for visning." - LABEL_DISPLAY_NAME: "Kaldenavn" + LABEL_DISPLAY_NAME: "Visningsnavn" LABEL_EMAIL: "E-mail" LABEL_PHONE: "Telefon" LABEL_WEB: "Hjemmeside" @@ -197,10 +198,10 @@ da_DK: ADD_MENU_URL: "URL" ADD_MENU_ADDRESS: "Adresse" ADD_MENU_BIRTHDAY: "Fødselsdag" - ADD_MENU_TAGS: "Mærkat" + ADD_MENU_TAGS: "Mærkater" BUTTON_SHARE_NONE: "Ingen" BUTTON_SHARE_ALL: "Alle" - BUTTON_SYNC: "Synkroniser (CardDAV)" + BUTTON_SYNC: "Synkronisering (CardDAV)" COMPOSE: TITLE_FROM: "Fra" TITLE_TO: "Til" @@ -214,11 +215,11 @@ da_DK: BUTTON_DELETE: "Slet" BUTTON_CANCEL: "Annuller" BUTTON_MINIMIZE: "Minimer" - SAVED_TIME: "Gemt klokken " - SAVED_ERROR_ON_SEND: "Meddelelse blev afsendt, men ikke gemt i sendt post" + SAVED_TIME: "Gemt klokken %TIME%" + SAVED_ERROR_ON_SEND: "Meddelelse blev afsendt, men ikke gemt i mappen for sendte meddelelser" DISCARD_UNSAVED_DATA: "Slet ikke gemt data?" - ATTACH_FILES: "Vedhæft fil" - ATTACH_DROP_FILES_DESC: "Træk filer her" + ATTACH_FILES: "Vedhæft filer" + ATTACH_DROP_FILES_DESC: "Slip filer her" ATTACH_ITEM_CANCEL: "Annuller" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drev" @@ -243,7 +244,7 @@ da_DK: BUTTON_YES: "Ja" BUTTON_NO: "Nej" DESC_WANT_CLOSE_THIS_WINDOW: "Vil du lukke vinduet?" - DESC_WANT_DELETE_MESSAGES: "Vil du slette denne/disse meddelelse(r)" + DESC_WANT_DELETE_MESSAGES: "Vil du slette denne/disse meddelelse(r)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Vælg sprog" POPUPS_ADD_ACCOUNT: @@ -288,14 +289,14 @@ da_DK: BUTTON_SELECT: "Vælg" BUTTON_CLOSE: "Luk" POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Lav OpenPGP nøgler" + TITLE_GENERATE_OPEN_PGP_KEYS: "Generér OpenPGP nøgler" LABEL_EMAIL: "E-mail" LABEL_NAME: "Navn" LABEL_PASSWORD: "Adgangskode" LABEL_KEY_BIT_LENGTH: "Nøglelængde" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generér" POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Signer/Krypter" + TITLE_COMPOSE_OPEN_PGP: "OpenPGP signér/krypter" LABEL_SIGN: "Signér" LABEL_ENCRYPT: "Krypter" LABEL_PASSWORD: "Adgangskode" @@ -303,7 +304,7 @@ da_DK: BUTTON_ENCRYPT: "Krypter" BUTTON_SIGN_AND_ENCRYPT: "Signér og krypter" POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Dekrypter" + TITLE_MESSAGE_OPEN_PGP: "OpenPGP dekrypter" LABEL_KEY: "Privat nøgle" LABEL_PASSWORD: "Adgangskode" BUTTON_DECRYPT: "Dekrypter" @@ -316,7 +317,7 @@ da_DK: TITLE_EDIT_FILTER: "Opdater filter?" FILTER_NAME: "Navn" LEGEND_CONDITIONS: "Betingelser" - LEGEND_ACTIONS: "Handling" + LEGEND_ACTIONS: "Handlinger" BUTTON_DONE: "Færdig" BUTTON_ADD_CONDITION: "Tilføj betingelse" SELECT_ACTION_NONE: "Ingen" @@ -335,7 +336,7 @@ da_DK: SELECT_TYPE_MATCHES: "Svarer til (* og ? kan bruges)" SELECT_TYPE_NOT_MATCHES: "Svarer ikke til (* og ? kan bruges)" SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Ikke Regexp" + SELECT_TYPE_NOT_REGEXP: "Ikke regexp" SELECT_TYPE_EQUAL_TO: "Lig med" SELECT_TYPE_NOT_EQUAL_TO: "Ikke lige med" SELECT_TYPE_OVER: "Over" @@ -396,7 +397,7 @@ da_DK: TOTP klient) ved hjælp af QR koden herunder eller ved at indtaste koden manuelt. TWO_FACTOR_BACKUP_CODES_DESC: > Hvis du ikke kan modtage koder ved hjælp af Google Autentificering appen (eller - en anden TOTP klient), kan du bruge backup kode til at logge ind med. Når + en anden TOTP klient), kan du bruge backup koder til at logge ind med. Når en backup kode er brugt en gang bliver den inaktiv. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Indstillingen kan ikke ændres før den er testet." TITLES: @@ -407,8 +408,8 @@ da_DK: COMPOSE: "Forfat" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Filen er for stor" - ERROR_FILE_PARTIALLY_UPLOADED: "Oploadning ufuldent, ukendt fejl." - ERROR_NO_FILE_UPLOADED: "Ingen file oploadet" + ERROR_FILE_PARTIALLY_UPLOADED: "Upload ufuldent, ukendt fejl." + ERROR_NO_FILE_UPLOADED: "Ingen fil uploaded" ERROR_MISSING_TEMP_FOLDER: "Midlertidig fil findes ikke" ERROR_ON_SAVING_FILE: "Ukendt upload fejl" ERROR_FILE_TYPE: "Forkert filtype" @@ -438,13 +439,13 @@ da_DK: BUTTON_SAVE: "Gem" BUTTON_ADD_FILTER: "Tilføj filter" BUTTON_DELETE: "Slet" - BUTTON_RAW_SCRIPT: "Brug brugerdefineret skript" + BUTTON_RAW_SCRIPT: "Anvend brugerdefineret script" SUBNAME_NONE: "Ingen" SUBNAME_MOVE_TO: "Flyt til \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Videresend til \"%EMAIL%\"" SUBNAME_REJECT: "Afvis" SUBNAME_VACATION_MESSAGE: "Feriemeddelelse" - SUBNAME_DISCARD: "Kasser" + SUBNAME_DISCARD: "Kassér" CAPABILITY_LABEL: "Evner" LOADING_PROCESS: "Opdater oversigten over filtre" DELETING_ASK: "Er du sikker?" @@ -460,7 +461,7 @@ da_DK: LABEL_CONFIGURE_TWO_FACTOR: "Opsæt 2-trins verifikation" LABEL_AUTOLOGOUT: "Automatisk log ud" AUTOLOGIN_NEVER_OPTION_NAME: "Aldrig" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut(er)" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut(ter)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% time(r)" SETTINGS_GENERAL: LEGEND_GENERAL: "Generelt" @@ -494,7 +495,7 @@ da_DK: SETTINGS_CONTACTS: LEGEND_CONTACTS: "Kontakter" LABEL_CONTACTS_AUTOSAVE: "Tilføj automatisk modtager til adressebog" - LEGEND_CONTACTS_SYNC: "Synkroniser (CardDAV)" + LEGEND_CONTACTS_SYNC: "Synkronisering (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Aktivér synkronisering" LABEL_CONTACTS_SYNC_SERVER: "Server" LABEL_CONTACTS_SYNC_AB_URL: "Adressebogs URL" @@ -515,29 +516,29 @@ da_DK: LEGEND_GOOGLE: "Google" BUTTON_GOOGLE_CONNECT: "Forbind til Google" BUTTON_GOOGLE_DISCONNECT: "Afbryd forbindelse til Google" - MAIN_GOOGLE_DESC: "Ved aktivering af log ind via Google. Kan der logges ind ved hjælp af Google knappen på log ind skærmen." + MAIN_GOOGLE_DESC: "Ved aktivering af log ind via Google, kan der logges ind ved hjælp af Google knappen på log ind skærmen." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Forbind til Facebook" BUTTON_FACEBOOK_DISCONNECT: "Afbryd forbindelse til Facebook" - MAIN_FACEBOOK_DESC: "Ved aktivering af log ind via Facebook. Kan der logges ind ved hjælp af Facebook knappen på log ind skærmen." + MAIN_FACEBOOK_DESC: "Ved aktivering af log ind via Facebook, kan der logges ind ved hjælp af Facebook knappen på log ind skærmen." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Forbind til Twitter" BUTTON_TWITTER_DISCONNECT: "Afbryd forbindelse til Twitter" - MAIN_TWITTER_DESC: "Ved aktivering af log ind via Twitter. Kan der logges ind ved hjælp af Twitter knappen på log ind skærmen." + MAIN_TWITTER_DESC: "Ved aktivering af log ind via Twitter, kan der logges ind ved hjælp af Twitter knappen på log ind skærmen." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Mappeoversigt" BUTTON_CREATE: "Opret ny mappe" BUTTON_SYSTEM: "Systemmapper" BUTTON_DELETE: "Slet" - BUTTON_SUBSCRIBE: "Abonnér" + BUTTON_SUBSCRIBE: "Tilmeld" BUTTON_UNSUBSCRIBE: "Afmeld" - LOADING_PROCESS: "Opdater mappeoversigt" + LOADING_PROCESS: "Opdaterer mappeoversigt" CREATING_PROCESS: "Opretter mappe" DELETING_PROCESS: "Sletter mappe" RENAMING_PROCESS: "Omdøber mappe" DELETING_ASK: "Er du sikker?" TO_MANY_FOLDERS_DESC_1: "For mange mapper!" - TO_MANY_FOLDERS_DESC_2: "Kun nogle mapper vises for at undgå problemer" + TO_MANY_FOLDERS_DESC_2: "Kun nogle mapper vises for at undgå problemer." HELP_DELETE_FOLDER: "Slet mappe" HELP_SHOW_HIDE_FOLDER: "Vis/skjul mappe" HELP_CHECK_FOR_NEW_MESSAGES: "Markér/fjern markering for nye meddelelser" @@ -573,7 +574,7 @@ da_DK: SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importer OpenPGP nøgle" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Lav OpenPGP nøgler" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Generer OpenPGP nøgler" TITLE_PRIVATE: "Privat" TITLE_PUBLIC: "Offentlig" DELETING_ASK: "Er du sikker?" @@ -626,7 +627,7 @@ da_DK: ADD_A_PUBLICK_KEY: "Tilføj privat nøgle" SELECT_A_PRIVATE_KEY: "Vælg privat nøgle" UNVERIFIRED_SIGNATURE: "Ikke verificeret signatur" - DECRYPTION_ERROR: "OpenPGP dekrypterings fejl" + DECRYPTION_ERROR: "OpenPGP dekrypteringsfejl" GOOD_SIGNATURE: "Accepteret signatur for %USER\"" PGP_ERROR: "OpenPGP fejl: %ERROR%" SPECIFY_FROM_EMAIL: "Udfyld afsenderadresse" @@ -639,13 +640,13 @@ da_DK: CAPTCHA_ERROR: "Forkert CAPTCHA" SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug - af e-mail og tilføj ID'et under konto indstillinger. + af e-mail og tilføj ID'et under kontoindstillinger. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug - af e-mail og tilføj ID'et under konto indstillinger. + af e-mail og tilføj ID'et under kontoindstillinger. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > Dette sociale ID er ikke knyttet til en e-mail konto endnu. Log ind ved brug - af e-mail og tilføj ID'et under konto indstillinger. + af e-mail og tilføj ID'et under kontoindstillinger. DOMAIN_NOT_ALLOWED: "Domæne ikke tilladt" ACCOUNT_NOT_ALLOWED: "Konto ikke tilladt" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "2-faktor verifikation påbudt." diff --git a/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml b/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml index 28a756301..6c894f9f1 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml @@ -4,7 +4,7 @@ sk_SK: LABEL_LOGIN: "Používateľské meno" LABEL_PASSWORD: "Heslo" LABEL_SIGN_ME: "Zapamätať" - LABEL_VERIFICATION_CODE: "Verification Code" + LABEL_VERIFICATION_CODE: "Verifikačný kód" LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" BUTTON_SIGN_IN: "Prihlásiť" TITLE_SIGN_IN_GOOGLE: "Prihlásiť pomocu Google" @@ -13,10 +13,13 @@ sk_SK: LABEL_FORGOT_PASSWORD: "Forgot password" LABEL_REGISTRATION: "Registration" TOP_TOOLBAR: - BUTTON_ADD_ACCOUNT: "Pridať Účet" + BUTTON_ADD_ACCOUNT: "Pridať účet" BUTTON_SETTINGS: "Nastavenia" - BUTTON_HELP: "Help" + BUTTON_HELP: "Pomoc" BUTTON_LOGOUT: "Odhlásiť" + MOBILE: + BUTTON_MOBILE_VERSION: "Verzia pre mobil" + BUTTON_DESKTOP_VERSION: "Verzia pre desktop" SEARCH: MAIN_INPUT_PLACEHOLDER: "Hľadať" TITLE_ADV: "Rozšírené hľadanie" @@ -24,7 +27,7 @@ sk_SK: LABEL_ADV_TO: "Príjemca" LABEL_ADV_SUBJECT: "Predmet" LABEL_ADV_TEXT: "Text" - LABEL_ADV_HAS_ATTACHMENT: "Has attachment" + LABEL_ADV_HAS_ATTACHMENT: "S prílohou" LABEL_ADV_HAS_ATTACHMENTS: "S prílohami" LABEL_ADV_FLAGGED: "Označené hviezdičkou" LABEL_ADV_UNSEEN: "Neprečítané" @@ -50,19 +53,20 @@ sk_SK: FOLDER_LIST: BUTTON_COMPOSE: "Vytvoriť" BUTTON_CONTACTS: "Adresár" + BUTTON_NEW_MESSAGE: "Nová správa" INBOX_NAME: "Prijaté" SENT_NAME: "Odoslané" DRAFTS_NAME: "Koncepty" SPAM_NAME: "Spam" TRASH_NAME: "Kôš" - ARCHIVE_NAME: "Archive" + ARCHIVE_NAME: "Archív" QUOTA: TITLE: "Využitie kvóty" MESSAGE_LIST: BUTTON_RELOAD: "Obnoviť zoznam správ" BUTTON_MOVE_TO: "Presunúť do" BUTTON_DELETE: "Odstrániť" - BUTTON_ARCHIVE: "Archive" + BUTTON_ARCHIVE: "Archív" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Not Spam" BUTTON_EMPTY_FOLDER: "Vyčistiť priečinok" @@ -84,12 +88,12 @@ sk_SK: EMPTY_LIST: "Zoznam je prázdny." EMPTY_SEARCH_LIST: "Vášmu vyhľadávaniu nezodpovedajú žiadne správy." SEARCH_RESULT_FOR: "Výsledky vyhľadávania pre \"%SEARCH%\"" - BACK_TO_MESSAGE_LIST: "back to message list" + BACK_TO_MESSAGE_LIST: "späť do zoznamu správ" LIST_LOADING: "Načítavam" EMPTY_SUBJECT_TEXT: "(Bez predmetu)" PUT_MESSAGE_HERE: "Pusťte správu tu pre jej zobrazenie v zozname" - TODAY_AT: "Dnes o %TIME%" - YESTERDAY_AT: "Včera o %TIME%" + TODAY_AT: "dnes o %TIME%" + YESTERDAY_AT: "včera o %TIME%" SEARCH_PLACEHOLDER: "Hľadať" NEW_MESSAGE_NOTIFICATION: "Máte %COUNT% nových správ!" QUOTA_SIZE: "Používate %SIZE% (%PROC%%) z vašich %LIMIT%" @@ -98,7 +102,8 @@ sk_SK: BUTTON_BACK: "Späť" BUTTON_CLOSE: "Zatvoriť" BUTTON_DELETE: "Odstrániť" - BUTTON_ARCHIVE: "Archive" + BUTTON_UNSUBSCRIBE: "Odhlásiť sa z mailing listu" + BUTTON_ARCHIVE: "Archív" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Not Spam" BUTTON_MOVE_TO: "Presunúť do" @@ -124,23 +129,24 @@ sk_SK: LABEL_SUBJECT: "Predmet" LABEL_DATE: "Dátum" LABEL_FROM: "Odosielateľ" - LABEL_FROM_SHORT: "from" + LABEL_FROM_SHORT: "od" LABEL_TO: "Príjemca" - LABEL_TO_SHORT: "to" + LABEL_TO_SHORT: "pre" LABEL_CC: "Kópia" LABEL_BCC: "Skrytá kópia" - LABEL_REPLY_TO: "Reply-To" + LABEL_REPLY_TO: "Adresa pre odpoveď" PRINT_LABEL_FROM: "Odosielateľ" PRINT_LABEL_TO: "Príjemca" PRINT_LABEL_CC: "Kópia" PRINT_LABEL_BCC: "Skrytá kópia" - PRINT_LABEL_REPLY_TO: "Reply-To" + PRINT_LABEL_REPLY_TO: "Adresa pre odpoveď" PRINT_LABEL_DATE: "Dátum" PRINT_LABEL_SUBJECT: "Predmet" PRINT_LABEL_ATTACHMENTS: "Prílohy" MESSAGE_LOADING: "Načítavam" MESSAGE_VIEW_DESC: "Vyberte správu zo zoznamu pre jej zobrazenie tu." - PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" + MESSAGE_VIEW_MOVE_DESC: "Zvoľte cieľ kliknutím na názov priečinka v ľavom stĺpci." + PGP_PASSWORD_INPUT_PLACEHOLDER: "Heslo" PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" LINK_DOWNLOAD_AS_ZIP: "Download as zip" @@ -410,6 +416,7 @@ sk_SK: ERROR_FILE_TYPE: "Nesprávny typ súboru" ERROR_UNKNOWN: "Nastala neznáma chyba pri nahrávaní" EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "Formátovaný text" TEXT_SWITCHER_CONFIRM: "Formátovanie textu a obrázky budú stratené. Želáte si pokračovať?" SETTINGS_LABELS: @@ -452,9 +459,11 @@ sk_SK: LABEL_ADD_SIGNATURE_TO_ALL: "Pripojiť podpis k všetkých odchádzajúcim správam" SETTINGS_SECURITY: LEGEND_SECURITY: "Security" + LABEL_CONFIGURE_TWO_FACTOR: "Nakonfigurovať 2-krokovú verifikáciu" LABEL_AUTOLOGOUT: "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME: "Never" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hodín" SETTINGS_GENERAL: LEGEND_GENERAL: "Všeobecné" LABEL_LANGUAGE: "Jazyk" @@ -520,6 +529,7 @@ sk_SK: SETTINGS_FOLDERS: LEGEND_FOLDERS: "Zoznam priečinkov" BUTTON_CREATE: "Vytvoriť priečinok" + BUTTON_SYSTEM: "Systémové priečinky" BUTTON_DELETE: "Odstrániť" BUTTON_SUBSCRIBE: "Prihlásiť sa" BUTTON_UNSUBSCRIBE: "Odhlásiť sa" @@ -589,6 +599,7 @@ sk_SK: LABEL_MOVE: "Move" LABEL_READ: "Read selected messages" LABEL_UNREAD: "Unread selected messages" + LABEL_IMPORTANT: "Označiť vybrané správy ako Dôležité" LABEL_SEARCH: "Search" LABEL_CANCEL_SEARCH: "Cancel search" LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" @@ -615,6 +626,7 @@ sk_SK: NO_PRIVATE_KEY_FOUND: "No private key found" NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" ADD_A_PUBLICK_KEY: "Add a public key" + SELECT_A_PRIVATE_KEY: "Vybrať súkromný kľúč" UNVERIFIRED_SIGNATURE: "Unverified signature" DECRYPTION_ERROR: "OpenPGP decryption error" GOOD_SIGNATURE: "Good signature from %USER%" @@ -675,6 +687,7 @@ sk_SK: DEMO_SEND_MESSAGE_ERROR: "For security purposes, this demo account is not allowed to send messages to external e-mail addresses!" DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" ACCOUNT_ALREADY_EXISTS: "účet už existuje" + ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" MAIL_SERVER_ERROR: "Nastala chyba počas prístupu na poštový server" INVALID_INPUT_ARGUMENT: "Invalid input argument" UNKNOWN_ERROR: "Neznáma chyba" diff --git a/rainloop/v/0.0.0/app/localization/webmail/sv_SE.yml b/rainloop/v/0.0.0/app/localization/webmail/sv_SE.yml index 5cef863cb..67a2cf3e0 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/sv_SE.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/sv_SE.yml @@ -68,7 +68,7 @@ sv_SE: BUTTON_DELETE: "Ta bort" BUTTON_ARCHIVE: "Arkivera" BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Inte Spam" + BUTTON_NOT_SPAM: "Inte spam" BUTTON_EMPTY_FOLDER: "Rensa mapp" BUTTON_MULTY_FORWARD: "Vidarebefodra som bilaga(or)" BUTTON_DELETE_WITHOUT_MOVE: "Ta bort permanent" @@ -105,7 +105,7 @@ sv_SE: BUTTON_UNSUBSCRIBE: "Avprenumerera från denna lista" BUTTON_ARCHIVE: "Arkivera" BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Inte Spam" + BUTTON_NOT_SPAM: "Inte spam" BUTTON_MOVE_TO: "Flytta till" BUTTON_MORE: "Mera" BUTTON_REPLY: "Svara" @@ -134,12 +134,12 @@ sv_SE: LABEL_TO_SHORT: "till" LABEL_CC: "CC" LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Svara till" + LABEL_REPLY_TO: "Svara-till" PRINT_LABEL_FROM: "Från" PRINT_LABEL_TO: "Till" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Svara till" + PRINT_LABEL_REPLY_TO: "Svara-till" PRINT_LABEL_DATE: "Datum" PRINT_LABEL_SUBJECT: "Ämne" PRINT_LABEL_ATTACHMENTS: "Bilagor" @@ -147,8 +147,8 @@ sv_SE: MESSAGE_VIEW_DESC: "Välj meddelande i listan att visa här." MESSAGE_VIEW_MOVE_DESC: "Klicka på mapp till vänster för att välja mål mapp." PGP_PASSWORD_INPUT_PLACEHOLDER: "Lösenord" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signerat meddelande (klicka för att verifiera)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP krypterat meddelande (klicka för att dekryptera)" + PGP_SIGNED_MESSAGE_DESC: "OpenPGP-signerat meddelande (klicka för att verifiera)" + PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP-krypterat meddelande (klicka för att dekryptera)" LINK_DOWNLOAD_AS_ZIP: "Ladda ner som ZIP-fil" LINK_SAVE_TO_OWNCLOUD: "Spara till ownCloud" LINK_SAVE_TO_DROPBOX: "Spara i Dropbox" @@ -166,7 +166,7 @@ sv_SE: SEARCH_INPUT_PLACEHOLDER: "Sök" BUTTON_ADD_CONTACT: "Lägg till" BUTTON_CREATE_CONTACT: "Ny" - BUTTON_UPDATE_CONTACT: "Updatera" + BUTTON_UPDATE_CONTACT: "Uppdatera" BUTTON_IMPORT: "Importera (csv, vcf, vCard)" BUTTON_EXPORT_VCARD: "Exportera (vcf, vCard)" BUTTON_EXPORT_CSV: "Exportera (csv)" @@ -207,7 +207,7 @@ sv_SE: TITLE_TO: "Till" TITLE_CC: "CC" TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Svara" + TITLE_REPLY_TO: "Svara-till" TITLE_SUBJECT: "Ämne" LINK_SHOW_INPUTS: "visa alla fält" BUTTON_SEND: "Skicka" @@ -259,7 +259,7 @@ sv_SE: BUTTON_UPDATE_IDENTITY: "Uppdatera" LABEL_EMAIL: "Epost" LABEL_NAME: "Namn" - LABEL_REPLY_TO: "Svara" + LABEL_REPLY_TO: "Svara-till" LABEL_SIGNATURE: "Signatur" LABEL_CC: "Cc" LABEL_BCC: "Bcc" @@ -282,21 +282,21 @@ sv_SE: DANGER_DESC_HTML_2: "När detta är startat kan det inte avbrytas." TITLE_CLEARING_PROCESS: "Rensar mappen..." POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Import av OpenPGP nyckel" + TITLE_IMPORT_OPEN_PGP_KEY: "Import av OpenPGP-nyckel" BUTTON_IMPORT_OPEN_PGP_KEY: "Importera" POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Visa OpenPGP nyckel" + TITLE_VIEW_OPEN_PGP_KEY: "Visa OpenPGP-nyckel" BUTTON_SELECT: "Välj" BUTTON_CLOSE: "Stäng" POPUPS_GENERATE_OPEN_PGP_KEYS: - TITLE_GENERATE_OPEN_PGP_KEYS: "Skapa OpenPGP nycklar" + TITLE_GENERATE_OPEN_PGP_KEYS: "Skapa OpenPGP-nycklar" LABEL_EMAIL: "Epost" LABEL_NAME: "Namn" LABEL_PASSWORD: "Lösenord" LABEL_KEY_BIT_LENGTH: "Nyckellängd" BUTTON_GENERATE_OPEN_PGP_KEYS: "Skapa" POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "OpenPGP Signering/Kryptering" + TITLE_COMPOSE_OPEN_PGP: "OpenPGP signera/kryptera" LABEL_SIGN: "Signera" LABEL_ENCRYPT: "Kryptera" LABEL_PASSWORD: "Lösenord" @@ -304,12 +304,12 @@ sv_SE: BUTTON_ENCRYPT: "Kryptera" BUTTON_SIGN_AND_ENCRYPT: "Signera och kryptera" POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + TITLE_MESSAGE_OPEN_PGP: "OpenPGP avkryptera" LABEL_KEY: "Privat Key" LABEL_PASSWORD: "Lösenord" BUTTON_DECRYPT: "Avkryptera" POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "2-Stegs verifikations test" + TITLE_TEST_CODE: "Tvåstegsverifieringstest" LABEL_CODE: "Kod" BUTTON_TEST: "Test" POPUPS_FILTER: @@ -369,15 +369,15 @@ sv_SE: Om du inte vill spara skickade meddelanden, välj då "Använd inte" valet. NOTIFICATION_DRAFTS: "Du har inte valt \"Drafts\" systemmapp, där meddelanden sparas medan det skrivs." NOTIFICATION_SPAM: | - Du har inte valt "Spam" systemmapp, där spam meddelanden ska sparas. - Om du vill tabort meddelanden permanent, välj då "Använd inte" valet. + Du har inte valt "Spam"-systemmapp, där spam-meddelanden ska sparas. + Om du vill ta bort meddelanden permanent, välj då "Använd inte"-valet. NOTIFICATION_TRASH: | Du har inte valt "Papperskorg" systemmapp, där borttagna meddelanden ska sparas. Om du vill ta meddelanden permanent, väl då "Använd inte" valet. NOTIFICATION_ARCHIVE: "Du har inte valt \"Arkiv\" systemmapp, där arkiverade meddelanden ska läggas." POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "2-Stegs Verifikation" - LABEL_ENABLE_TWO_FACTOR: "Aktivera 2-Stegs verifikation" + LEGEND_TWO_FACTOR_AUTH: "Tvåstegsverifiering (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "Aktivera tvåstegsverifiering" LABEL_TWO_FACTOR_USER: "Användare" LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Hemlig kod" @@ -391,7 +391,7 @@ sv_SE: LINK_TEST: "test" BUTTON_SHOW_SECRET: "Visa hemlig kod" BUTTON_HIDE_SECRET: "Göm hemlig kod" - TWO_FACTOR_REQUIRE_DESC: "Ditt konto kräver 2-stegs verifikation konfiguration." + TWO_FACTOR_REQUIRE_DESC: "Ditt konto kräver tvåstegsverifiering." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Konfigurerad" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Inte konfigurarad" TWO_FACTOR_SECRET_DESC: >- @@ -455,12 +455,12 @@ sv_SE: SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identitet" LABEL_DISPLAY_NAME: "Namn" - LABEL_REPLY_TO: "Svara till" + LABEL_REPLY_TO: "Svara-till" LABEL_SIGNATURE: "Signatur" LABEL_ADD_SIGNATURE_TO_ALL: "Lägg till din signatur på alla utgående meddelanden." SETTINGS_SECURITY: LEGEND_SECURITY: "Säkerhet" - LABEL_CONFIGURE_TWO_FACTOR: "Konfigurera två tvåstegsverifiering" + LABEL_CONFIGURE_TWO_FACTOR: "Konfigurera tvåstegsverifiering" LABEL_AUTOLOGOUT: "Logga ut automatiskt" AUTOLOGIN_NEVER_OPTION_NAME: "Aldrig" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut(er)" @@ -471,13 +471,13 @@ sv_SE: LABEL_IDENTITY: "Identitet" LABEL_LAYOUT: "Stil" LABEL_LAYOUT_NO_SPLIT: "Ingen Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "vertikal Split" + LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikal Split" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horisontell Split" LABEL_EDITOR: "Textredigerare" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Enkel" - LABEL_EDITOR_HTML_FORCED: "Html (tvinga)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (tvinga)" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "Oformaterad text" + LABEL_EDITOR_HTML_FORCED: "HTML (tvinga)" + LABEL_EDITOR_PLAIN_FORCED: "Oformaterad text (tvinga)" LABEL_ANIMATION: "Animerat utseende" LABEL_ANIMATION_FULL: "Full" LABEL_ANIMATION_NORMAL: "Normal" @@ -486,7 +486,7 @@ sv_SE: LABEL_USE_PREVIEW_PANE: "Avänd förhandsgranskningsfönster" LABEL_USE_CHECKBOXES_IN_LIST: "Visa kryssrutor i listan" LABEL_USE_THREADS: "Använd trådar" - LABEL_REPLY_SAME_FOLDER: "Placera svar i samma mapp som mottagna meddelandet." + LABEL_REPLY_SAME_FOLDER: "Placera svar i samma mapp som mottagna meddelandet" LABEL_SHOW_IMAGES: "Visa alltid bilder i mail" LABEL_SHOW_ANIMATION: "Visa animeringar" LABEL_MESSAGE_PER_PAGE: "Meddelanden per sida" @@ -559,7 +559,7 @@ sv_SE: LEGEND_IDENTITIES: "Ytterligare identiteter" LABEL_DEFAULT: "Standard" LABEL_DISPLAY_NAME: "Namn" - LABEL_REPLY_TO: "Svara till" + LABEL_REPLY_TO: "Svara-till" LABEL_SIGNATURE: "Signatur" LABEL_ADD_SIGNATURE_TO_ALL: "Lägg till din signatur på alla utgående meddelanden." BUTTON_ADD_IDENTITY: "Lägg till identitet" @@ -575,8 +575,8 @@ sv_SE: ERROR_PASSWORD_MISMATCH: "Lösenorden matchar inte, vänligen försök igen" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Importera OpenPGP nyckel" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Skapa OpenPGP nycklar" + BUTTON_ADD_OPEN_PGP_KEY: "Importera OpenPGP-nyckel" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Skapa OpenPGP-nycklar" TITLE_PRIVATE: "Privat" TITLE_PUBLIC: "Publik" DELETING_ASK: "Är du säker?" @@ -629,9 +629,9 @@ sv_SE: ADD_A_PUBLICK_KEY: "Lägg till en publicerad nyckel" SELECT_A_PRIVATE_KEY: "Välj en privat nyckel" UNVERIFIRED_SIGNATURE: "Overifierad signatur" - DECRYPTION_ERROR: "OpenPGP dekrypterings fel" + DECRYPTION_ERROR: "OpenPGP dekrypteringsfel" GOOD_SIGNATURE: "Godkänd signatur för %USER%" - PGP_ERROR: "OpenPGP fel: %ERROR%" + PGP_ERROR: "OpenPGP-fel: %ERROR%" SPECIFY_FROM_EMAIL: "Ange FRÅN epost adress" SPECIFY_AT_LEAST_ONE_RECIPIENT: "Ange minst en mottagare" NOTIFICATIONS: @@ -651,8 +651,8 @@ sv_SE: och aktivera detta i konto inställningarna. DOMAIN_NOT_ALLOWED: "Domän är inte tillåtet" ACCOUNT_NOT_ALLOWED: "Konto är inte tillåtet" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Tvåstegs-verifikation krävs" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Tvåstegs-verifikations fel" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Tvåstegsverifiering krävs" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Tvåstegsverifieringsfel" COULD_NOT_SAVE_NEW_PASSWORD: "Kunde inte spara lösenord" CURRENT_PASSWORD_INCORRECT: "Nuvarande lösenord är felaktigt" NEW_PASSWORD_SHORT: "Lösenordet är för kort" diff --git a/yarn.lock b/yarn.lock index f37db5f32..718a96fff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,5329 +1,5429 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"Progress.js@github:usablica/progress.js#v0.1.0": - version "0.1.0" - resolved "https://codeload.github.com/usablica/progress.js/tar.gz/acba45829bfea7ba073aedca7d70fcf47e22317b" - -abbrev@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" - -accord@^0.27.3: - version "0.27.3" - resolved "https://registry.yarnpkg.com/accord/-/accord-0.27.3.tgz#7fb9129709285caea84eb372c4e882031b7138e8" - dependencies: - convert-source-map "^1.5.0" - glob "^7.0.5" - indx "^0.2.3" - lodash.clone "^4.3.2" - lodash.defaults "^4.0.1" - lodash.flatten "^4.2.0" - lodash.merge "^4.4.0" - lodash.partialright "^4.1.4" - lodash.pick "^4.2.1" - lodash.uniq "^4.3.0" - resolve "^1.3.3" - semver "^5.3.0" - uglify-js "^2.8.22" - when "^3.7.8" - -acorn-dynamic-import@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" - dependencies: - acorn "^4.0.3" - -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" - -acorn@^5.0.0, acorn@^5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" - -ajv-keywords@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" - -ajv-keywords@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" - -ajv@^4.7.0, ajv@^4.9.1: - version "4.11.5" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.5.tgz#b6ee74657b993a01dce44b7944d56f485828d5bd" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -ajv@^5.0.0, ajv@^5.1.5: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.0.tgz#c1735024c5da2ef75cc190713073d44f098bf486" - dependencies: - co "^4.6.0" - fast-deep-equal "^0.1.0" - json-schema-traverse "^0.3.0" - json-stable-stringify "^1.0.1" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -ansi-escapes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" - -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansicolors@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" - -anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" - dependencies: - arrify "^1.0.0" - micromatch "^2.1.5" - -aproba@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - -are-we-there-yet@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.0 || ^1.1.13" - -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-flatten@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" - -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1, array-uniq@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asap@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" - -asn1.js@^4.0.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - dependencies: - util "0.10.3" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async@^0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" - -async@^2.1.2: - version "2.1.5" - resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc" - dependencies: - lodash "^4.14.0" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -autolinker@1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.4.3.tgz#2e615057c8e371399a6d77949a9a6af24fe46dfc" - -autoprefixer@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.1.tgz#97bc854c7d0b979f8d6489de547a0d17fb307f6d" - dependencies: - browserslist "^2.1.3" - caniuse-lite "^1.0.30000670" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^6.0.1" - postcss-value-parser "^3.2.3" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws4@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - -babel-code-frame@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" - dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -babel-core@6.25.0, babel-core@^6.24.1: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" - dependencies: - babel-code-frame "^6.22.0" - babel-generator "^6.25.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.25.0" - babel-traverse "^6.25.0" - babel-types "^6.25.0" - babylon "^6.17.2" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.5.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-is-absolute "^1.0.0" - private "^0.1.6" - slash "^1.0.0" - source-map "^0.5.0" - -babel-eslint@7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" - dependencies: - babel-code-frame "^6.22.0" - babel-traverse "^6.23.1" - babel-types "^6.23.0" - babylon "^6.17.0" - -babel-generator@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.25.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" - trim-right "^1.0.1" - -babel-helper-bindify-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz#119921b56120f17e9dae3f74b4f5cc7bcc1b37ef" - dependencies: - babel-helper-hoist-variables "^6.22.0" - babel-runtime "^6.22.0" - babel-traverse "^6.22.0" - babel-types "^6.22.0" - -babel-helper-define-map@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz#1444f960c9691d69a2ced6a205315f8fd00804e7" - dependencies: - babel-helper-function-name "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.23.0" - lodash "^4.2.0" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-explode-class@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" - dependencies: - babel-helper-bindify-decorators "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.22.0, babel-helper-function-name@^6.23.0, babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.22.0, babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz#3eacbf731d80705845dd2e9718f600cfb9b4ba72" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-helper-optimise-call-expression@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz#f3ee7eed355b4282138b33d02b78369e470622f5" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.23.0" - -babel-helper-regex@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz#79f532be1647b1f0ee3474b5f5c3da58001d247d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.22.0" - lodash "^4.2.0" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.22.0, babel-helper-replace-supers@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz#eeaf8ad9b58ec4337ca94223bacdca1f8d9b4bfd" - dependencies: - babel-helper-optimise-call-expression "^6.23.0" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-loader@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.1.tgz#b87134c8b12e3e4c2a94e0546085bc680a2b8488" - dependencies: - find-cache-dir "^1.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-async-generators@^6.5.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" - -babel-plugin-syntax-class-constructor-call@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - -babel-plugin-syntax-decorators@^6.1.18, babel-plugin-syntax-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" - -babel-plugin-syntax-do-expressions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" - -babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-export-extensions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" - -babel-plugin-syntax-function-bind@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-generator-functions@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-class-constructor-call@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" - dependencies: - babel-plugin-syntax-class-constructor-call "^6.18.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-decorators-legacy@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz#741b58f6c5bce9e6027e0882d9c994f04f366925" - dependencies: - babel-plugin-syntax-decorators "^6.1.18" - babel-runtime "^6.2.0" - babel-template "^6.3.0" - -babel-plugin-transform-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" - dependencies: - babel-helper-explode-class "^6.24.1" - babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-do-expressions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" - dependencies: - babel-plugin-syntax-do-expressions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz#e48895cf0b375be148cd7c8879b422707a053b51" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" - lodash "^4.2.0" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz#49b53f326202a2fd1b3bbaa5e2edd8a4f78643c1" - dependencies: - babel-helper-define-map "^6.23.0" - babel-helper-function-name "^6.23.0" - babel-helper-optimise-call-expression "^6.23.0" - babel-helper-replace-supers "^6.23.0" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz#7c383e9629bba4820c11b0425bdd6290f7f057e7" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.22.0" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz#672397031c21610d72dd2bbb0ba9fb6277e1c36b" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz#f5fcc8b09093f9a23c76ac3d9e392c3ec4b77104" - dependencies: - babel-helper-function-name "^6.22.0" - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.22.0.tgz#bf69cd34889a41c33d90dfb740e0091ccff52f21" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.22.0" - babel-runtime "^6.22.0" - babel-template "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.24.0: - version "6.24.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.0.tgz#a1911fb9b7ec7e05a43a63c5995007557bcf6a2e" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.0" - babel-runtime "^6.22.0" - babel-template "^6.22.0" - -babel-plugin-transform-es2015-modules-commonjs@^6.22.0, babel-plugin-transform-es2015-modules-commonjs@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.23.0.tgz#cba7aa6379fb7ec99250e6d46de2973aaffa7b92" - dependencies: - babel-plugin-transform-strict-mode "^6.22.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-types "^6.23.0" - -babel-plugin-transform-es2015-modules-commonjs@^6.24.0: - version "6.24.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.0.tgz#e921aefb72c2cc26cb03d107626156413222134f" - dependencies: - babel-plugin-transform-strict-mode "^6.22.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-types "^6.23.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz#ae3469227ffac39b0310d90fec73bfdc4f6317b0" - dependencies: - babel-helper-hoist-variables "^6.22.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.0.tgz#fd5fa63521cae8d273927c3958afd7c067733450" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz#daa60e114a042ea769dd53fe528fc82311eb98fc" - dependencies: - babel-helper-replace-supers "^6.22.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz#3a2aabb70c8af945d5ce386f1a4250625a83ae3b" - dependencies: - babel-helper-call-delegate "^6.22.0" - babel-helper-get-function-arity "^6.22.0" - babel-runtime "^6.22.0" - babel-template "^6.23.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz#8ba776e0affaa60bff21e921403b8a652a2ff723" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz#ab316829e866ee3f4b9eb96939757d19a5bc4593" - dependencies: - babel-helper-regex "^6.22.0" - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz#8d9cc27e7ee1decfe65454fb986452a04a613d20" - dependencies: - babel-helper-regex "^6.22.0" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-export-extensions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" - dependencies: - babel-plugin-syntax-export-extensions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-function-bind@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" - dependencies: - babel-plugin-syntax-function-bind "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz#65740593a319c44522157538d690b84094617ea6" - dependencies: - regenerator-transform "0.9.8" - -babel-plugin-transform-runtime@6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-strict-mode@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz#e008df01340fdc87e959da65991b7e05970c8c7c" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.22.0" - -babel-preset-env@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-stage-0@6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" - dependencies: - babel-plugin-transform-do-expressions "^6.22.0" - babel-plugin-transform-function-bind "^6.22.0" - babel-preset-stage-1 "^6.24.1" - -babel-preset-stage-1@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" - dependencies: - babel-plugin-transform-class-constructor-call "^6.24.1" - babel-plugin-transform-export-extensions "^6.22.0" - babel-preset-stage-2 "^6.24.1" - -babel-preset-stage-2@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-plugin-transform-class-properties "^6.24.1" - babel-plugin-transform-decorators "^6.24.1" - babel-preset-stage-3 "^6.24.1" - -babel-preset-stage-3@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" - dependencies: - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-generator-functions "^6.24.1" - babel-plugin-transform-async-to-generator "^6.24.1" - babel-plugin-transform-exponentiation-operator "^6.24.1" - babel-plugin-transform-object-rest-spread "^6.22.0" - -babel-register@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" - dependencies: - babel-core "^6.24.1" - babel-runtime "^6.22.0" - core-js "^2.4.0" - home-or-tmp "^2.0.0" - lodash "^4.2.0" - mkdirp "^0.5.1" - source-map-support "^0.4.2" - -babel-runtime@6.23.0, babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.10.0" - -babel-template@^6.22.0, babel-template@^6.23.0, babel-template@^6.24.1, babel-template@^6.25.0, babel-template@^6.3.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.25.0" - babel-types "^6.25.0" - babylon "^6.17.2" - lodash "^4.2.0" - -babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" - dependencies: - babel-code-frame "^6.22.0" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.25.0" - babylon "^6.17.2" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" - dependencies: - babel-runtime "^6.22.0" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babylon@^6.17.0, babylon@^6.17.2: - version "6.17.4" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" - -balanced-match@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base64-js@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -bean@0.x: - version "0.4.11" - resolved "https://registry.yarnpkg.com/bean/-/bean-0.4.11.tgz#544c2bcdb1223e451a0ce4d9b13ab59f75cbb1bb" - -beeper@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - -big.js@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" - -binary-extensions@^1.0.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" - -binaryextensions@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -bluebird@^2.10.2: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" - -bluebird@^3.0.6: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - -body-parser@~1.14.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9" - dependencies: - bytes "2.2.0" - content-type "~1.0.1" - debug "~2.2.0" - depd "~1.1.0" - http-errors "~1.3.1" - iconv-lite "0.4.13" - on-finished "~2.3.0" - qs "5.2.0" - raw-body "~2.1.5" - type-is "~1.6.10" - -bonzo@1.x: - version "1.4.0" - resolved "https://registry.yarnpkg.com/bonzo/-/bonzo-1.4.0.tgz#d7d2e06f6b6f67eb3b8fc18774f79058f4ab34df" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -brace-expansion@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" - dependencies: - balanced-match "^0.4.1" - concat-map "0.0.1" - -brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" - dependencies: - buffer-xor "^1.0.2" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - inherits "^2.0.1" - -browserify-cipher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.0.tgz#10773910c3c206d5420a46aad8694f820b85968f" - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" - dependencies: - pako "~0.2.0" - -browserslist@2.1.4, browserslist@^2.1.2, browserslist@^2.1.3: - version "2.1.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.1.4.tgz#cc526af4a1312b7d2e05653e56d0c8ab70c0e053" - dependencies: - caniuse-lite "^1.0.30000670" - electron-to-chromium "^1.3.11" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - -buffer-shims@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - -buffer-xor@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - -buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - -bytes@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588" - -bytes@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - -caniuse-db@1.0.30000671: - version "1.0.30000671" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000671.tgz#9f071bbc7b96994638ccbaf47829d58a1577a8ed" - -caniuse-lite@^1.0.30000670: - version "1.0.30000670" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000670.tgz#c94f7dbf0b68eaadc46d3d203f46e82e7801135e" - -cardinal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" - dependencies: - ansicolors "~0.2.1" - redeyed "~1.0.0" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^0.5.0, chalk@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chokidar@^1.4.3: - version "1.6.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -cipher-base@^1.0.0, cipher-base@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" - dependencies: - inherits "^2.0.1" - -circular-json@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" - -classnames@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" - -clean-css@4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.5.tgz#d09a87a02a5375117589796ae76a063cacdb541a" - dependencies: - source-map "0.5.x" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - dependencies: - restore-cursor "^2.0.0" - -cli-table@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" - dependencies: - colors "1.0.3" - -cli-usage@^0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" - dependencies: - marked "^0.3.6" - marked-terminal "^1.6.2" - -cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -clone-stats@^0.0.1, clone-stats@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - -clone@^1.0.0, clone@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" - -commander@~2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - dependencies: - graceful-readlink ">= 1.0.0" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -concat-with-sourcemaps@*, concat-with-sourcemaps@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz#f55b3be2aeb47601b10a2d5259ccfb70fd2f1dd6" - dependencies: - source-map "^0.5.1" - -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - dependencies: - date-now "^0.1.4" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - -content-type@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" - -convert-source-map@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.4.0.tgz#e3dad195bf61bfe13a7a3c73e9876ec14a0268f3" - -convert-source-map@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" - -copy-webpack-plugin@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.0.1.tgz#9728e383b94316050d0c7463958f2b85c0aa8200" - dependencies: - bluebird "^2.10.2" - fs-extra "^0.26.4" - glob "^6.0.4" - is-glob "^3.1.0" - loader-utils "^0.2.15" - lodash "^4.3.0" - minimatch "^3.0.0" - node-dir "^0.1.10" - -core-js@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -create-ecdh@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.2.tgz#51210062d7bb7479f6c65bb41a92208b1d61abad" - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - ripemd160 "^1.0.0" - sha.js "^2.3.6" - -create-hmac@^1.1.0, create-hmac@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.4.tgz#d3fb4ba253eb8b3f56e39ea2fbcb8af747bd3170" - dependencies: - create-hash "^1.1.0" - inherits "^2.0.1" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -crypto-browserify@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - -dateformat@^1.0.7-1.2.3: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - -dateformat@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" - -debug@^2.1.0, debug@^2.2.0, debug@^2.6.8: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - dependencies: - ms "2.0.0" - -debug@^2.1.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.2.tgz#dfa96a861ee9b8c2f29349b3bcc41aa599a71e0f" - dependencies: - ms "0.7.2" - -debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -deep-assign@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b" - dependencies: - is-obj "^1.0.0" - -deep-extend@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -defaults@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - dependencies: - clone "^1.0.2" - -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -depd@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" - -deprecated@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" - -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-file@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" - dependencies: - fs-exists-sync "^0.1.0" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -diffie-hellman@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -doctrine@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -domain-browser@^1.1.1: - version "1.1.7" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" - -domready@0.x: - version "0.3.0" - resolved "https://registry.yarnpkg.com/domready/-/domready-0.3.0.tgz#b3740facbd09163018152d12aec239383e102175" - -duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - dependencies: - readable-stream "~1.1.9" - -duplexer2@~0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - dependencies: - readable-stream "^2.0.2" - -duplexer@^0.1.1, duplexer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - -duplexify@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" - dependencies: - end-of-stream "1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -electron-to-chromium@^1.3.11: - version "1.3.11" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.11.tgz#744761df1d67b492b322ce9aa0aba5393260eb61" - -elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - dependencies: - iconv-lite "~0.4.13" - -end-of-stream@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" - dependencies: - once "~1.3.0" - -end-of-stream@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" - dependencies: - once "~1.3.0" - -enhanced-resolve@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz#950964ecc7f0332a42321b673b38dc8ff15535b3" - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.5" - -errno@^0.1.1, errno@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" - dependencies: - prr "~0.0.0" - -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - -es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.23" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.23.tgz#7578b51be974207a5487821b56538c224e4e7b38" - dependencies: - es6-iterator "2" - es6-symbol "~3.1" - -es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-symbol "^3.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-promise-polyfill@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz#f38925f23cb3e3e8ce6cda8ff774fcebbb090cde" - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-plugin-compat@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-1.0.4.tgz#76e52038119a5080e2612cc4141d687f4d140398" - dependencies: - babel-runtime "^6.23.0" - browserslist "2.1.4" - caniuse-db "1.0.30000671" - requireindex "^1.1.0" - -eslint-scope@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.1.1.tgz#facbdfcfe3e0facd3a8b80dc98c4e6c13ae582df" - dependencies: - babel-code-frame "^6.22.0" - chalk "^1.1.3" - concat-stream "^1.6.0" - debug "^2.6.8" - doctrine "^2.0.0" - eslint-scope "^3.7.1" - espree "^3.4.3" - esquery "^1.0.0" - estraverse "^4.2.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - glob "^7.1.2" - globals "^9.17.0" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-my-json-valid "^2.16.0" - is-resolvable "^1.0.0" - js-yaml "^3.8.4" - json-stable-stringify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^4.0.0" - progress "^2.0.0" - require-uncached "^1.0.3" - strip-json-comments "~2.0.1" - table "^4.0.1" - text-table "~0.2.0" - -eslint@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.1.0.tgz#bbb55a28220ee08b69da9554d45a6b2ebfd7d913" - dependencies: - babel-code-frame "^6.22.0" - chalk "^1.1.3" - concat-stream "^1.6.0" - debug "^2.6.8" - doctrine "^2.0.0" - eslint-scope "^3.7.1" - espree "^3.4.3" - esquery "^1.0.0" - estraverse "^4.2.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - glob "^7.1.2" - globals "^9.17.0" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-my-json-valid "^2.16.0" - is-resolvable "^1.0.0" - js-yaml "^3.8.4" - json-stable-stringify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^4.0.0" - progress "^2.0.0" - require-uncached "^1.0.3" - strip-json-comments "~2.0.1" - table "^4.0.1" - text-table "~0.2.0" - -espree@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" - dependencies: - acorn "^5.0.1" - acorn-jsx "^3.0.0" - -esprima@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - -esprima@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" - -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" - dependencies: - estraverse "~4.1.0" - object-assign "^4.0.1" - -estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -estraverse@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" - -event-stream@^3.1.7: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - -evp_bytestokey@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53" - dependencies: - create-hash "^1.1.1" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -expand-tilde@^1.2.1, expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - dependencies: - os-homedir "^1.0.1" - -extend@^3.0.0, extend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" - -external-editor@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" - dependencies: - iconv-lite "^0.4.17" - jschardet "^1.4.2" - tmp "^0.0.31" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" - -fancy-log@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" - dependencies: - chalk "^1.1.1" - time-stamp "^1.0.0" - -fast-deep-equal@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-0.1.0.tgz#5c6f4599aba6b333ee3342e2ed978672f1001f8d" - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -faye-websocket@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11" - dependencies: - websocket-driver ">=0.3.6" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - -filename-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - -find-index@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -findup-sync@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" - dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" - -fined@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.0.2.tgz#5b28424b760d7598960b7ef8480dff8ad3660e97" - dependencies: - expand-tilde "^1.2.1" - lodash.assignwith "^4.0.7" - lodash.isempty "^4.2.1" - lodash.isplainobject "^4.0.4" - lodash.isstring "^4.0.1" - lodash.pick "^4.2.1" - parse-filepath "^1.0.1" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - -flagged-respawn@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" - -flat-cache@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - -for-in@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -fork-stream@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70" - -form-data@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -from@~0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - -fs-extra@^0.26.4: - version "0.26.7" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.29" - -fstream-ignore@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -gauge@~2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.3.tgz#1c23855f962f17b3ad3d0dc7443f304542edfe09" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" - dependencies: - globule "~0.1.0" - -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -getpass@^0.1.1: - version "0.1.6" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" - dependencies: - assert-plus "^1.0.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob-stream@^3.1.5: - version "3.1.18" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" - dependencies: - glob "^4.3.1" - glob2base "^0.0.12" - minimatch "^2.0.1" - ordered-read-streams "^0.1.0" - through2 "^0.6.1" - unique-stream "^1.0.0" - -glob-watcher@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" - dependencies: - gaze "^0.5.1" - -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - dependencies: - find-index "^0.1.1" - -glob@^4.3.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - -glob@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@~3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" - -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" - -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - dependencies: - homedir-polyfill "^1.0.0" - ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" - -globals@^9.0.0, globals@^9.17.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globule@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" - dependencies: - glob "~3.1.21" - lodash "~1.0.1" - minimatch "~0.2.11" - -glogg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" - dependencies: - sparkles "^1.0.0" - -graceful-fs@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - dependencies: - natives "^1.1.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" - -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - -growly@^1.2.0, growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - -gulp-autoprefixer@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-4.0.0.tgz#e00a8c571b85d06516ac26341be90dfd9fc1eab0" - dependencies: - autoprefixer "^7.0.0" - gulp-util "^3.0.0" - postcss "^6.0.1" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-cached@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/gulp-cached/-/gulp-cached-1.1.1.tgz#fe7cd4f87f37601e6073cfedee5c2bdaf8b6acce" - dependencies: - lodash.defaults "^4.2.0" - through2 "^2.0.1" - -gulp-chmod@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/gulp-chmod/-/gulp-chmod-2.0.0.tgz#00c390b928a0799b251accf631aa09e01cc6299c" - dependencies: - deep-assign "^1.0.0" - stat-mode "^0.2.0" - through2 "^2.0.0" - -gulp-clean-css@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.5.0.tgz#d43e747c41957995ec49bb9612f862b64329f1b0" - dependencies: - clean-css "4.1.5" - gulp-util "3.0.8" - through2 "2.0.3" - vinyl-sourcemaps-apply "0.2.1" - -gulp-concat-util@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/gulp-concat-util/-/gulp-concat-util-0.5.5.tgz#c8f0633b4e6e950ff93c475b3c8d3b84be03b7dc" - dependencies: - concat-with-sourcemaps "^1.0.4" - gulp-if "^2.0.0" - gulp-util "^3.0.6" - lodash.assign "^3.2.0" - stream-combiner2 "^1.1.1" - through2 "^2.0.0" - -gulp-eol@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/gulp-eol/-/gulp-eol-0.1.2.tgz#a26818285cd554389d82e93be9b3d0e50d3dbea3" - dependencies: - gulp-util "~2.2" - through2 "~0.4" - -gulp-eslint@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gulp-eslint/-/gulp-eslint-4.0.0.tgz#16d9ea4d696e7b7a9d65eeb1aa5bc4ba0a22c7f7" - dependencies: - eslint "^4.0.0" - gulp-util "^3.0.8" - -gulp-expect-file@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/gulp-expect-file/-/gulp-expect-file-0.0.7.tgz#913e731db0dd6f5866149ba400ad835eb34623ad" - dependencies: - async "^0.9.0" - gulp-util "^2.2.16" - minimatch "^0.3.0" - through2 "^1.0.0" - xtend "^3.0.0" - -gulp-filter@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-5.0.0.tgz#cfa81966fb67884f2ba754b067152929428d59bc" - dependencies: - gulp-util "^3.0.6" - multimatch "^2.0.0" - streamfilter "^1.0.5" - -gulp-header@1.8.8: - version "1.8.8" - resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.8.tgz#4509c64677aab56b5ee8e4669a79b1655933a49e" - dependencies: - concat-with-sourcemaps "*" - gulp-util "*" - object-assign "*" - through2 "^2.0.0" - -gulp-if@2.0.2, gulp-if@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-2.0.2.tgz#a497b7e7573005041caa2bc8b7dda3c80444d629" - dependencies: - gulp-match "^1.0.3" - ternary-stream "^2.0.1" - through2 "^2.0.1" - -gulp-less@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/gulp-less/-/gulp-less-3.3.2.tgz#f6636adcc66150a8902719fa59963fc7f862a49a" - dependencies: - accord "^0.27.3" - gulp-util "^3.0.7" - less "2.6.x || ^2.7.1" - object-assign "^4.0.1" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-livereload@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/gulp-livereload/-/gulp-livereload-3.8.1.tgz#00f744b2d749d3e9e3746589c8a44acac779b50f" - dependencies: - chalk "^0.5.1" - debug "^2.1.0" - event-stream "^3.1.7" - gulp-util "^3.0.2" - lodash.assign "^3.0.0" - mini-lr "^0.1.8" - -gulp-match@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.0.3.tgz#91c7c0d7f29becd6606d57d80a7f8776a87aba8e" - dependencies: - minimatch "^3.0.3" - -gulp-notify@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gulp-notify/-/gulp-notify-3.0.0.tgz#a04b8af9acdbe4e63c845678ce0c3d30694c59a3" - dependencies: - gulp-util "^3.0.8" - lodash.template "^4.4.0" - node-notifier "^5.0.1" - node.extend "^1.1.6" - through2 "^2.0.3" - -gulp-plumber@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.1.0.tgz#f12176c2d0422f60306c242fff6a01a394faba09" - dependencies: - gulp-util "^3" - through2 "^2" - -gulp-rename@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817" - -gulp-replace@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-0.6.1.tgz#11bf8c8fce533e33e2f6a8f2f430b955ba0be066" - dependencies: - istextorbinary "1.0.2" - readable-stream "^2.0.1" - replacestream "^4.0.0" - -gulp-rimraf@0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/gulp-rimraf/-/gulp-rimraf-0.2.1.tgz#9f1783adc5d4890d8a1bedf834bc989e2a565030" - dependencies: - gulp-util "^3.0.7" - rimraf "^2.5.4" - through2 "^2.0.1" - -gulp-size@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/gulp-size/-/gulp-size-2.1.0.tgz#1c2b64f17f9071d5abd99d154b7b3481f8fba128" - dependencies: - chalk "^1.0.0" - gulp-util "^3.0.0" - gzip-size "^3.0.0" - object-assign "^4.0.1" - pretty-bytes "^3.0.1" - stream-counter "^1.0.0" - through2 "^2.0.0" - -gulp-stripbom@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/gulp-stripbom/-/gulp-stripbom-1.0.4.tgz#58c1d03e85e008a7aab47d81b1297c8c1bc828eb" - dependencies: - gulp-util "^3.0.0" - log-symbols "^1.0.0" - strip-bom "^1.0.0" - through2 "^0.5.1" - -gulp-through@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/gulp-through/-/gulp-through-0.4.0.tgz#6463b29f678c788540b63aa6a1bad5bd8552ae6d" - dependencies: - bluebird "^3.0.6" - chalk "^1.1.1" - gulp-util "^3.0.7" - through2 "^2.0.0" - xtend "^4.0.1" - -gulp-uglify@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca" - dependencies: - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash "^4.13.1" - make-error-cause "^1.1.1" - through2 "^2.0.0" - uglify-js "^3.0.5" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-util@*, gulp-util@3.0.8, gulp-util@^3, gulp-util@^3.0.0, gulp-util@^3.0.2, gulp-util@^3.0.6, gulp-util@^3.0.7, gulp-util@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp-util@^2.2.16, gulp-util@~2.2: - version "2.2.20" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" - dependencies: - chalk "^0.5.0" - dateformat "^1.0.7-1.2.3" - lodash._reinterpolate "^2.4.1" - lodash.template "^2.4.1" - minimist "^0.2.0" - multipipe "^0.1.0" - through2 "^0.5.0" - vinyl "^0.2.1" - -gulp-zip@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-4.0.0.tgz#1cefc08b4bf36df4b5b1e7c6b36ee55ebbe4a881" - dependencies: - get-stream "^3.0.0" - gulp-util "^3.0.0" - through2 "^2.0.1" - yazl "^2.1.0" - -gulp@3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" - dependencies: - archy "^1.0.0" - chalk "^1.0.0" - deprecated "^0.0.1" - gulp-util "^3.0.0" - interpret "^1.0.0" - liftoff "^2.1.0" - minimist "^1.1.0" - orchestrator "^0.3.0" - pretty-hrtime "^1.0.0" - semver "^4.1.0" - tildify "^1.0.0" - v8flags "^2.0.2" - vinyl-fs "^0.3.0" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - dependencies: - glogg "^1.0.0" - -gzip-size@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" - dependencies: - duplexer "^0.1.1" - -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - dependencies: - ansi-regex "^0.2.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - dependencies: - sparkles "^1.0.0" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573" - dependencies: - inherits "^2.0.1" - -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hmac-drbg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.0.tgz#3db471f45aae4a994a0688322171f51b8b91bee5" - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -homedir-polyfill@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.2.0.tgz#7a0d097863d886c0fabbdcd37bf1758d8becf8a5" - -http-errors@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" - dependencies: - inherits "~2.0.1" - statuses "1" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" - -iconv-lite@0.4.13: - version "0.4.13" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" - -iconv-lite@^0.4.17, iconv-lite@~0.4.13: - version "0.4.18" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" - -ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" - -ifvisible.js@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/ifvisible.js/-/ifvisible.js-1.0.6.tgz#52eb151ce89c56f15316226462e892d1f8451261" - -ignore@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" - -image-size@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.1.tgz#28eea8548a4b1443480ddddc1e083ae54652439f" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - -indx@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - -ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - -inquirer@^3.0.6: - version "3.1.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.1.1.tgz#87621c4fba4072f48a8dd71c9f9df6f100b2d534" - dependencies: - ansi-escapes "^2.0.0" - chalk "^1.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.0.0" - strip-ansi "^3.0.0" - through "^2.3.6" - -interpret@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" - -invariant@^2.2.0, invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -is-absolute@^0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" - dependencies: - is-relative "^0.2.1" - is-windows "^0.2.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.0.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-dotfile@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-extglob@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-my-json-valid@^2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - -is-number@^2.0.2, is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - dependencies: - path-is-inside "^1.0.1" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - -is-relative@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" - dependencies: - is-unc-path "^0.1.1" - -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" - -is-stream@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-unc-path@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" - dependencies: - unc-path-regex "^0.1.0" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - -is@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isexe@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -istextorbinary@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-1.0.2.tgz#ace19354d1a9a0173efeb1084ce0f87b0ad7decf" - dependencies: - binaryextensions "~1.0.0" - textextensions "~1.0.0" - -jasmine-reporters@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-0.2.1.tgz#395f6e5170692de1a966cd95a70d7a37bf3f2bc3" - -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" - -jquery-lazyload@1.9.7: - version "1.9.7" - resolved "https://registry.yarnpkg.com/jquery-lazyload/-/jquery-lazyload-1.9.7.tgz#9982b388c533c0b611214b3c5aaa0b9fede071f7" - -jquery-mousewheel@3.1.13: - version "3.1.13" - resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" - -jquery-scrollstop@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/jquery-scrollstop/-/jquery-scrollstop-1.2.0.tgz#f1827a25cf12887d965c085d8a75035655b37663" - dependencies: - jquery ">=1.2.3" - -jquery.backstretch@2.1.15: - version "2.1.15" - resolved "https://registry.yarnpkg.com/jquery.backstretch/-/jquery.backstretch-2.1.15.tgz#991f99d83b8cbd74e65ca1e1b3fc41d251d4570e" - dependencies: - jquery "^3.1.1" - -jquery@2.2.4, jquery@>=1.2.3: - version "2.2.4" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.4.tgz#2c89d6889b5eac522a7eea32c14521559c6cbf02" - -jquery@>=1.7.0, jquery@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.1.1.tgz#347c1c21c7e004115e0a4da32cece041fad3c8a3" - -js-cookie@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.1.4.tgz#da4ec503866f149d164cf25f579ef31015025d8d" - -js-tokens@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" - -js-yaml@^3.8.4: - version "3.8.4" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" - dependencies: - argparse "^1.0.7" - esprima "^3.1.1" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jschardet@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.4.2.tgz#2aa107f142af4121d145659d44f50830961e699a" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-loader@0.5.4, json-loader@^0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json3@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - -json5@^0.5.0, json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - -jsprim@^1.2.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" - dependencies: - extsprintf "1.0.2" - json-schema "0.2.3" - verror "1.3.6" - -kind-of@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" - dependencies: - is-buffer "^1.0.2" - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - optionalDependencies: - graceful-fs "^4.1.9" - -"knockout-projections@github:stevesanderson/knockout-projections#v1.1.0": - version "1.1.0" - resolved "https://codeload.github.com/stevesanderson/knockout-projections/tar.gz/01cb07b27b305c0240de7aa92687110e68432706" - dependencies: - jasmine-reporters "~0.2.1" - knockout "~3.0.0" - -knockout-sortable@0.14.1: - version "0.14.1" - resolved "https://registry.yarnpkg.com/knockout-sortable/-/knockout-sortable-0.14.1.tgz#bdf40412451969729d0dd37c61bb7333cdd46e1e" - -knockout@3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/knockout/-/knockout-3.4.2.tgz#e87958de77ad1e936f7ce645bab8b5d7c456d937" - -knockout@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/knockout/-/knockout-3.0.0.tgz#fd8d43ee446237cde7df650f5c7dbcf68ae49a80" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -"less@2.6.x || ^2.7.1": - version "2.7.2" - resolved "https://registry.yarnpkg.com/less/-/less-2.7.2.tgz#368d6cc73e1fb03981183280918743c5dcf9b3df" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - mime "^1.2.11" - mkdirp "^0.5.0" - promise "^7.1.1" - request "^2.72.0" - source-map "^0.5.3" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -liftoff@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" - dependencies: - extend "^3.0.0" - findup-sync "^0.4.2" - fined "^1.0.1" - flagged-respawn "^0.3.2" - lodash.isplainobject "^4.0.4" - lodash.isstring "^4.0.1" - lodash.mapvalues "^4.4.0" - rechoir "^0.6.2" - resolve "^1.1.7" - -lightgallery@1.2.21: - version "1.2.21" - resolved "https://registry.yarnpkg.com/lightgallery/-/lightgallery-1.2.21.tgz#8f4ba26a1b99bc583507eb1540291b156aa90aaf" - dependencies: - jquery ">=1.7.0" - -livereload-js@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" - -loader-utils@^0.2.15: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" - -loader-utils@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.0.3.tgz#566c320c24c33cb3f02db4df83f3dbf60b253de3" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - -loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -lodash._arraycopy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" - -lodash._arrayeach@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" - -lodash._baseassign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" - dependencies: - lodash._basecopy "^3.0.0" - lodash.keys "^3.0.0" - -lodash._baseclone@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" - dependencies: - lodash._arraycopy "^3.0.0" - lodash._arrayeach "^3.0.0" - lodash._baseassign "^3.0.0" - lodash._basefor "^3.0.0" - lodash.isarray "^3.0.0" - lodash.keys "^3.0.0" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - -lodash._basefor@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - -lodash._bindcallback@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - -lodash._createassigner@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" - dependencies: - lodash._bindcallback "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash.restparam "^3.0.0" - -lodash._escapehtmlchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" - dependencies: - lodash._htmlescapes "~2.4.1" - -lodash._escapestringchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash._htmlescapes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - -lodash._isnative@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" - -lodash._objecttypes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - -lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" - -lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - -lodash._reunescapedhtml@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" - dependencies: - lodash._htmlescapes "~2.4.1" - lodash.keys "~2.4.1" - -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - -lodash._shimkeys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.assign@^3.0.0, lodash.assign@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" - dependencies: - lodash._baseassign "^3.0.0" - lodash._createassigner "^3.0.0" - lodash.keys "^3.0.0" - -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - -lodash.assignwith@^4.0.7: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" - -lodash.clone@^4.3.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" - -lodash.clonedeep@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" - dependencies: - lodash._baseclone "^3.0.0" - lodash._bindcallback "^3.0.0" - -lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - -lodash.defaults@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" - dependencies: - lodash._objecttypes "~2.4.1" - lodash.keys "~2.4.1" - -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - dependencies: - lodash._root "^3.0.0" - -lodash.escape@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" - dependencies: - lodash._escapehtmlchar "~2.4.1" - lodash._reunescapedhtml "~2.4.1" - lodash.keys "~2.4.1" - -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - -lodash.isempty@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" - -lodash.isobject@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.isplainobject@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.keys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" - dependencies: - lodash._isnative "~2.4.1" - lodash._shimkeys "~2.4.1" - lodash.isobject "~2.4.1" - -lodash.mapvalues@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" - -lodash.merge@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" - -lodash.partialright@^4.1.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b" - -lodash.pick@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - -lodash.template@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" - dependencies: - lodash._escapestringchar "~2.4.1" - lodash._reinterpolate "~2.4.1" - lodash.defaults "~2.4.1" - lodash.escape "~2.4.1" - lodash.keys "~2.4.1" - lodash.templatesettings "~2.4.1" - lodash.values "~2.4.1" - -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.template@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - dependencies: - lodash._reinterpolate "~3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - -lodash.templatesettings@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" - dependencies: - lodash._reinterpolate "~3.0.0" - -lodash.templatesettings@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" - dependencies: - lodash._reinterpolate "~2.4.1" - lodash.escape "~2.4.1" - -lodash.uniq@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - -lodash.values@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" - dependencies: - lodash.keys "~2.4.1" - -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - -lodash@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" - -log-symbols@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - dependencies: - chalk "^1.0.0" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - -make-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" - dependencies: - pify "^2.3.0" - -make-error-cause@^1.1.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" - dependencies: - make-error "^1.2.0" - -make-error@^1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.2.3.tgz#6c4402df732e0977ac6faf754a5074b3d2b1d19d" - -map-cache@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - -marked-terminal@^1.6.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.7.0.tgz#c8c460881c772c7604b64367007ee5f77f125904" - dependencies: - cardinal "^1.0.0" - chalk "^1.1.3" - cli-table "^0.3.1" - lodash.assign "^4.2.0" - node-emoji "^1.4.1" - -marked@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" - -matchmedia-polyfill@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/matchmedia-polyfill/-/matchmedia-polyfill-0.3.0.tgz#6f91e34012b3dfc9d5b76cec89deafc1b41b45fa" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - -memory-fs@^0.4.0, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-stream@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - dependencies: - readable-stream "^2.0.1" - -micromatch@^2.1.5, micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -miller-rabin@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@~1.26.0: - version "1.26.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" - -mime-types@^2.1.12, mime-types@~2.1.13, mime-types@~2.1.7: - version "2.1.14" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee" - dependencies: - mime-db "~1.26.0" - -mime@^1.2.11: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - -mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" - -mini-lr@^0.1.8: - version "0.1.9" - resolved "https://registry.yarnpkg.com/mini-lr/-/mini-lr-0.1.9.tgz#02199d27347953d1fd1d6dbded4261f187b2d0f6" - dependencies: - body-parser "~1.14.0" - debug "^2.2.0" - faye-websocket "~0.7.2" - livereload-js "^2.2.0" - parseurl "~1.3.0" - qs "~2.2.3" - -minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" - dependencies: - brace-expansion "^1.0.0" - -minimatch@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimatch@^2.0.1: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" - -minimatch@^3.0.3, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimatch@~0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" - -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -moment@2.18.1, moment@2.x: - version "2.18.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" - -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -multimatch@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - dependencies: - array-differ "^1.0.0" - array-union "^1.0.1" - arrify "^1.0.0" - minimatch "^3.0.0" - -multipipe@^0.1.0, multipipe@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - dependencies: - duplexer2 "0.0.2" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - -nan@^2.3.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2" - -natives@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -node-dir@^0.1.10: - version "0.1.16" - resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.16.tgz#d2ef583aa50b90d93db8cdd26fcea58353957fe4" - dependencies: - minimatch "^3.0.2" - -node-emoji@^1.4.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.5.1.tgz#fd918e412769bf8c448051238233840b2aff16a1" - dependencies: - string.prototype.codepointat "^0.2.0" - -node-fetch@^1.3.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-fs@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/node-fs/-/node-fs-0.1.7.tgz#32323cccb46c9fbf0fc11812d45021cc31d325bb" - -node-libs-browser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" - dependencies: - assert "^1.1.1" - browserify-zlib "^0.1.4" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "0.0.1" - os-browserify "^0.2.0" - path-browserify "0.0.0" - process "^0.11.0" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.0.5" - stream-browserify "^2.0.1" - stream-http "^2.3.1" - string_decoder "^0.10.25" - timers-browserify "^2.0.2" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-localstorage@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-1.3.0.tgz#2e436aae8dcc9ace97b43c65c16c0d577be0a55c" - dependencies: - write-file-atomic "^1.1.4" - -node-notifier@5.1.2, node-notifier@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff" - dependencies: - growly "^1.3.0" - semver "^5.3.0" - shellwords "^0.1.0" - which "^1.2.12" - -node-notifier@^4.1.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" - dependencies: - cli-usage "^0.1.1" - growly "^1.2.0" - lodash.clonedeep "^3.0.0" - minimist "^1.1.1" - semver "^5.1.0" - shellwords "^0.1.0" - which "^1.0.5" - -node-pre-gyp@^0.6.29: - version "0.6.33" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz#640ac55198f6a925972e0c16c4ac26a034d5ecc9" - dependencies: - mkdirp "~0.5.1" - nopt "~3.0.6" - npmlog "^4.0.1" - rc "~1.1.6" - request "^2.79.0" - rimraf "~2.5.4" - semver "~5.3.0" - tar "~2.2.1" - tar-pack "~3.3.0" - -node.extend@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.6.tgz#a7b882c82d6c93a4863a5504bd5de8ec86258b96" - dependencies: - is "^3.1.0" - -nopt@~3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - dependencies: - abbrev "1" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.3.6" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.6.tgz#498fa420c96401f787402ba21e600def9f981fff" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - -normalize.css@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-7.0.0.tgz#abfb1dd82470674e0322b53ceb1aaf412938e4bf" - -npmlog@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.1" - set-blocking "~2.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@*, object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - -object-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -once@~1.3.0, once@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - dependencies: - mimic-fn "^1.0.0" - -openpgp@2.5.5: - version "2.5.5" - resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-2.5.5.tgz#44e959d8abc8b124d76f98e0929736c6ed81aa05" - dependencies: - node-fetch "^1.3.3" - node-localstorage "~1.3.0" - -opentip@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/opentip/-/opentip-2.4.3.tgz#2a3b500c2738f8069c33462ed48b5afe9ce804e6" - dependencies: - bean "0.x" - bonzo "1.x" - domready "0.x" - qwery "3.x" - reqwest "0.x" - -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -orchestrator@^0.3.0: - version "0.3.8" - resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" - dependencies: - end-of-stream "~0.1.5" - sequencify "~0.0.7" - stream-consume "~0.1.0" - -ordered-read-streams@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" - -os-browserify@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" - -os-homedir@^1.0.0, os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" - -os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -p-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - -parse-asn1@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.0.0.tgz#35060f6d5015d37628c770f4e091a0b5a278bc23" - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - -parse-filepath@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" - dependencies: - is-absolute "^0.2.3" - map-cache "^0.2.0" - path-root "^0.1.1" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - -parseurl@~1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" - -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - dependencies: - path-root-regex "^0.1.0" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - dependencies: - through "~2.3" - -pbkdf2@^3.0.3: - version "3.0.9" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.9.tgz#f2c4b25a600058b3c3773c086c37dbbee1ffe693" - dependencies: - create-hmac "^1.1.2" - -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pikaday@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/pikaday/-/pikaday-1.6.1.tgz#b91bcb9b8539cedd8d6d08e4e7465e12095671b0" - optionalDependencies: - moment "2.x" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - dependencies: - find-up "^2.1.0" - -pluralize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" - -postcss-value-parser@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" - -postcss@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2" - dependencies: - chalk "^1.1.3" - source-map "^0.5.6" - supports-color "^3.2.3" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -pretty-bytes@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-3.0.1.tgz#27d0008d778063a0b4811bb35c79f1bd5d5fbccf" - dependencies: - number-is-nan "^1.0.0" - -pretty-hrtime@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - -private@^0.1.6: - version "0.1.7" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -process@^0.11.0: - version "0.11.9" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" - -progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - -promise@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" - dependencies: - asap "~2.0.3" - -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" - -public-encrypt@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - -punycode@^1.2.4, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -qs@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be" - -qs@~2.2.3: - version "2.2.5" - resolved "https://registry.yarnpkg.com/qs/-/qs-2.2.5.tgz#1088abaf9dcc0ae5ae45b709e6c6b5888b23923c" - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - -qwery@3.x: - version "3.4.2" - resolved "https://registry.yarnpkg.com/qwery/-/qwery-3.4.2.tgz#7d0af3ebcf48af599f2ed498d8ce39023978a63e" - -randomatic@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" - dependencies: - is-number "^2.0.2" - kind-of "^3.0.2" - -randombytes@^2.0.0, randombytes@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" - -raw-body@~2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" - dependencies: - bytes "2.4.0" - iconv-lite "0.4.13" - unpipe "1.0.0" - -raw-loader@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" - -rc@~1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.7.tgz#c5ea564bb07aff9fd3a5b32e906c1d3a65940fea" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -"readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.0, readable-stream@^2.1.5, readable-stream@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.3.tgz#9cf49463985df016c8ae8813097a9293a9b33729" - dependencies: - buffer-shims "^1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -readable-stream@~2.1.4: - version "2.1.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" - dependencies: - buffer-shims "^1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - dependencies: - resolve "^1.1.6" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -redeyed@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" - dependencies: - esprima "~3.0.0" - -regenerate@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" - -regenerator-runtime@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e" - -regenerator-transform@0.9.8: - version "0.9.8" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-cache@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" - dependencies: - is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - -replacestream@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.2.tgz#0c4140707e4f0323f50de044851708cf58bc37bd" - dependencies: - escape-string-regexp "^1.0.3" - object-assign "^4.0.1" - readable-stream "^2.0.2" - -request@^2.72.0, request@^2.79.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -requireindex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" - -reqwest@0.x: - version "0.9.7" - resolved "https://registry.yarnpkg.com/reqwest/-/reqwest-0.9.7.tgz#11a2de9704dc8d52c9675265d7177103febf3a63" - -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" - -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - -resolve@^1.1.6, resolve@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" - dependencies: - path-parse "^1.0.5" - -resolve@^1.1.7: - version "1.3.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.2.tgz#1f0442c9e0cbb8136e87b9305f932f46c7f28235" - dependencies: - path-parse "^1.0.5" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -rifraf@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/rifraf/-/rifraf-2.0.3.tgz#8ceba761d2e88411232f272a2e06eb98e4fa2a8a" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -rimraf@2, rimraf@2.6.1, rimraf@^2.2.8, rimraf@^2.5.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" - dependencies: - glob "^7.0.5" - -rimraf@~2.5.1, rimraf@~2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" - dependencies: - glob "^7.0.5" - -ripemd160@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e" - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - dependencies: - is-promise "^2.1.0" - -run-sequence@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/run-sequence/-/run-sequence-2.0.0.tgz#6ab754fe53cd771d47dbdee63c254882344d5896" - dependencies: - chalk "^1.1.3" - gulp-util "^3.0.8" - -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - -safe-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" - -schema-utils@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" - dependencies: - ajv "^5.0.0" - -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -semver@^4.1.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -sequencify@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -sha.js@^2.3.6: - version "2.4.8" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" - dependencies: - inherits "^2.0.1" - -shellwords@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" - -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -simplestatemanager@3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/simplestatemanager/-/simplestatemanager-3.4.0.tgz#4a474125f34f4061f46dd05828f63aa998fe06eb" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" - -source-map-support@^0.4.2: - version "0.4.11" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.11.tgz#647f939978b38535909530885303daf23279f322" - dependencies: - source-map "^0.5.3" - -source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - -sparkles@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" - -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.11.0.tgz#2d8d5ebb4a6fab28ffba37fa62a90f4a3ea59d77" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -stat-mode@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" - -statuses@1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - -stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-combiner2@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" - dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" - -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - dependencies: - duplexer "~0.1.1" - -stream-consume@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" - -stream-counter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-1.0.0.tgz#91cf2569ce4dc5061febcd7acb26394a5a114751" - -stream-http@^2.3.1: - version "2.6.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.6.3.tgz#4c3ddbf9635968ea2cfd4e48d43de5def2625ac3" - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.1.0" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - -streamfilter@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/streamfilter/-/streamfilter-1.0.5.tgz#87507111beb8e298451717b511cfed8f002abf53" - dependencies: - readable-stream "^2.0.2" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" - -string.prototype.codepointat@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" - -string_decoder@^0.10.25, string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - dependencies: - ansi-regex "^0.2.1" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-bom@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" - dependencies: - first-chunk-stream "^1.0.0" - is-utf8 "^0.2.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -style-loader@0.18.2: - version "0.18.2" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.18.2.tgz#cc31459afbcd6d80b7220ee54b291a9fd66ff5eb" - dependencies: - loader-utils "^1.0.2" - schema-utils "^0.3.0" - -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^3.1.0, supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - dependencies: - has-flag "^1.0.0" - -table@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" - dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" - -tapable@^0.2.5, tapable@~0.2.5: - version "0.2.6" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d" - -tar-pack@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" - dependencies: - debug "~2.2.0" - fstream "~1.0.10" - fstream-ignore "~1.0.5" - once "~1.3.3" - readable-stream "~2.1.4" - rimraf "~2.5.1" - tar "~2.2.1" - uid-number "~0.0.6" - -tar@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -ternary-stream@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.0.1.tgz#064e489b4b5bf60ba6a6b7bc7f2f5c274ecf8269" - dependencies: - duplexify "^3.5.0" - fork-stream "^0.0.4" - merge-stream "^1.0.0" - through2 "^2.0.1" - -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -textextensions@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-1.0.2.tgz#65486393ee1f2bb039a60cbba05b0b68bd9501d2" - -through2@2.0.3, through2@^2, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through2@^0.5.0, through2@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" - dependencies: - readable-stream "~1.0.17" - xtend "~3.0.0" - -through2@^0.6.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545" - dependencies: - readable-stream ">=1.1.13-1 <1.2.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@~0.4: - version "0.4.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" - dependencies: - readable-stream "~1.0.17" - xtend "~2.1.1" - -through@2, through@^2.3.6, through@~2.3, through@~2.3.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -tildify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - dependencies: - os-homedir "^1.0.0" - -time-stamp@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.0.1.tgz#9f4bd23559c9365966f3302dbba2b07c6b99b151" - -timers-browserify@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" - dependencies: - setimmediate "^1.0.4" - -tmp@^0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - dependencies: - os-tmpdir "~1.0.1" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - -to-fast-properties@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" - -tough-cookie@~2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" - dependencies: - punycode "^1.4.1" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -type-is@~1.6.10: - version "1.6.14" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.13" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -uglify-js@^2.8.22, uglify-js@^2.8.29: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-js@^3.0.5: - version "3.0.10" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.10.tgz#e220e7dbc05ce1f9bb08268b221aa0cf152fb4e2" - dependencies: - commander "~2.9.0" - source-map "~0.5.1" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -uglifyjs-webpack-plugin@^0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" - dependencies: - source-map "^0.5.6" - uglify-js "^2.8.29" - webpack-sources "^1.0.1" - -uid-number@~0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - -unc-path-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - -underscore@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" - -unique-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" - -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -util@0.10.3, util@^0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - -uuid@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" - -v8flags@^2.0.2: - version "2.0.11" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" - dependencies: - user-home "^1.1.1" - -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" - dependencies: - extsprintf "1.0.2" - -vinyl-fs@^0.3.0: - version "0.3.14" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" - dependencies: - defaults "^1.0.0" - glob-stream "^3.1.5" - glob-watcher "^0.0.6" - graceful-fs "^3.0.0" - mkdirp "^0.5.0" - strip-bom "^1.0.0" - through2 "^0.6.1" - vinyl "^0.4.0" - -vinyl-sourcemaps-apply@0.2.1, vinyl-sourcemaps-apply@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" - dependencies: - source-map "^0.5.1" - -vinyl@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" - dependencies: - clone-stats "~0.0.1" - -vinyl@^0.4.0: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - dependencies: - indexof "0.0.1" - -watchpack@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87" - dependencies: - async "^2.1.2" - chokidar "^1.4.3" - graceful-fs "^4.1.2" - -webpack-notifier@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/webpack-notifier/-/webpack-notifier-1.5.0.tgz#c010007d448cebc34defc99ecf288fa5e8c6baf6" - dependencies: - node-notifier "^4.1.0" - object-assign "^4.1.0" - strip-ansi "^3.0.1" - -webpack-sources@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" - dependencies: - source-list-map "^2.0.0" - source-map "~0.5.3" - -webpack@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.1.0.tgz#ac0675e500db835f9ab2369d29ba096f51ad0731" - dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" - ajv "^5.1.5" - ajv-keywords "^2.0.0" - async "^2.1.2" - enhanced-resolve "^3.3.0" - escope "^3.6.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - mkdirp "~0.5.0" - node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^3.1.0" - tapable "~0.2.5" - uglifyjs-webpack-plugin "^0.4.6" - watchpack "^1.3.1" - webpack-sources "^1.0.1" - yargs "^6.0.0" - -websocket-driver@>=0.3.6: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" - dependencies: - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" - -when@^3.7.8: - version "3.7.8" - resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - -which@^1.0.5, which@^1.2.12: - version "1.2.12" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" - dependencies: - isexe "^1.1.1" - -wide-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" - dependencies: - string-width "^1.0.1" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@^1.1.4: - version "1.3.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - dependencies: - mkdirp "^0.5.1" - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -xtend@^3.0.0, xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - -xtend@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - dependencies: - object-keys "~0.4.0" - -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yargs-parser@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" - dependencies: - camelcase "^3.0.0" - -yargs@^6.0.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^4.2.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - -yazl@^2.1.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.2.tgz#14cb19083e1e25a70092c1588aabe0f4e4dd4d88" - dependencies: - buffer-crc32 "~0.2.3" +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"Progress.js@github:usablica/progress.js#v0.1.0": + version "0.1.0" + resolved "https://codeload.github.com/usablica/progress.js/tar.gz/acba45829bfea7ba073aedca7d70fcf47e22317b" + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +accord@^0.27.3: + version "0.27.3" + resolved "https://registry.yarnpkg.com/accord/-/accord-0.27.3.tgz#7fb9129709285caea84eb372c4e882031b7138e8" + dependencies: + convert-source-map "^1.5.0" + glob "^7.0.5" + indx "^0.2.3" + lodash.clone "^4.3.2" + lodash.defaults "^4.0.1" + lodash.flatten "^4.2.0" + lodash.merge "^4.4.0" + lodash.partialright "^4.1.4" + lodash.pick "^4.2.1" + lodash.uniq "^4.3.0" + resolve "^1.3.3" + semver "^5.3.0" + uglify-js "^2.8.22" + when "^3.7.8" + +acorn-dynamic-import@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" + dependencies: + acorn "^4.0.3" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^4.0.3: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^5.0.0, acorn@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" + +ajv-keywords@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + +ajv-keywords@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" + +ajv@^4.7.0, ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.0.0, ajv@^5.1.5, ajv@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + json-schema-traverse "^0.3.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +ansi-escapes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + +aproba@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-slice@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1, array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1.js@^4.0.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@^0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + +async@^2.1.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" + dependencies: + lodash "^4.14.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +autolinker@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.4.3.tgz#2e615057c8e371399a6d77949a9a6af24fe46dfc" + +autoprefixer@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.2.tgz#fbeaf07d48fd878e0682bf7cbeeade728adb2b18" + dependencies: + browserslist "^2.1.5" + caniuse-lite "^1.0.30000697" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^6.0.6" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@6.25.0, babel-core@^6.24.1: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.25.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.25.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-eslint@7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" + dependencies: + babel-code-frame "^6.22.0" + babel-traverse "^6.23.1" + babel-types "^6.23.0" + babylon "^6.17.0" + +babel-generator@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" + dependencies: + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-loader@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.1.tgz#b87134c8b12e3e4c2a94e0546085bc680a2b8488" + dependencies: + find-cache-dir "^1.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-constructor-call@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.1.18, babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-do-expressions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-export-extensions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + +babel-plugin-syntax-function-bind@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-constructor-call@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" + dependencies: + babel-plugin-syntax-class-constructor-call "^6.18.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-decorators-legacy@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz#741b58f6c5bce9e6027e0882d9c994f04f366925" + dependencies: + babel-plugin-syntax-decorators "^6.1.18" + babel-runtime "^6.2.0" + babel-template "^6.3.0" + +babel-plugin-transform-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" + dependencies: + babel-helper-explode-class "^6.24.1" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-do-expressions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" + dependencies: + babel-plugin-syntax-do-expressions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-export-extensions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" + dependencies: + babel-plugin-syntax-export-extensions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-function-bind@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" + dependencies: + babel-plugin-syntax-function-bind "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + +babel-plugin-transform-runtime@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-env@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.0.tgz#2de1c782a780a0a5d605d199c957596da43c44e4" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^2.1.2" + invariant "^2.2.2" + semver "^5.3.0" + +babel-preset-stage-0@6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" + dependencies: + babel-plugin-transform-do-expressions "^6.22.0" + babel-plugin-transform-function-bind "^6.22.0" + babel-preset-stage-1 "^6.24.1" + +babel-preset-stage-1@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" + dependencies: + babel-plugin-transform-class-constructor-call "^6.24.1" + babel-plugin-transform-export-extensions "^6.22.0" + babel-preset-stage-2 "^6.24.1" + +babel-preset-stage-2@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-decorators "^6.24.1" + babel-preset-stage-3 "^6.24.1" + +babel-preset-stage-3@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" + +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@6.25.0, babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.25.0.tgz#33b98eaa5d482bb01a8d1aa6b437ad2b01aec41c" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.24.1, babel-template@^6.25.0, babel-template@^6.3.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.25.0" + babel-types "^6.25.0" + babylon "^6.17.2" + lodash "^4.2.0" + +babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.25.0" + babylon "^6.17.2" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.25.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.17.0, babylon@^6.17.2: + version "6.17.4" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-js@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +bean@0.x: + version "0.4.11" + resolved "https://registry.yarnpkg.com/bean/-/bean-0.4.11.tgz#544c2bcdb1223e451a0ce4d9b13ab59f75cbb1bb" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +big.js@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" + +binary-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.9.0.tgz#66506c16ce6f4d6928a5b3cd6a33ca41e941e37b" + +binaryextensions@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^2.10.2: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" + +bluebird@^3.0.6: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.7" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.7.tgz#ddb048e50d9482790094c13eb3fcfc833ce7ab46" + +body-parser@~1.14.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9" + dependencies: + bytes "2.2.0" + content-type "~1.0.1" + debug "~2.2.0" + depd "~1.1.0" + http-errors "~1.3.1" + iconv-lite "0.4.13" + on-finished "~2.3.0" + qs "5.2.0" + raw-body "~2.1.5" + type-is "~1.6.10" + +bonzo@1.x: + version "1.4.0" + resolved "https://registry.yarnpkg.com/bonzo/-/bonzo-1.4.0.tgz#d7d2e06f6b6f67eb3b8fc18774f79058f4ab34df" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" + dependencies: + buffer-xor "^1.0.2" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + inherits "^2.0.1" + +browserify-cipher@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + dependencies: + pako "~0.2.0" + +browserslist@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.1.4.tgz#cc526af4a1312b7d2e05653e56d0c8ab70c0e053" + dependencies: + caniuse-lite "^1.0.30000670" + electron-to-chromium "^1.3.11" + +browserslist@^2.1.2, browserslist@^2.1.5: + version "2.3.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.3.0.tgz#b2aa76415c71643fe2368f6243b43bbbb4211752" + dependencies: + caniuse-lite "^1.0.30000710" + electron-to-chromium "^1.3.17" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +buffer-xor@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +bytes@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +caniuse-db@1.0.30000671: + version "1.0.30000671" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000671.tgz#9f071bbc7b96994638ccbaf47829d58a1577a8ed" + +caniuse-lite@^1.0.30000670, caniuse-lite@^1.0.30000697, caniuse-lite@^1.0.30000710: + version "1.0.30000712" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000712.tgz#b4732def2459224f3f78c6a9ba103abfcc705670" + +cardinal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" + dependencies: + ansicolors "~0.2.1" + redeyed "~1.0.0" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^0.5.0, chalk@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chokidar@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +classnames@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" + +clean-css@4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.7.tgz#b9aea4f85679889cf3eae8b40349ec4ebdfdd032" + dependencies: + source-map "0.5.x" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-table@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" + dependencies: + colors "1.0.3" + +cli-usage@^0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" + dependencies: + marked "^0.3.6" + marked-terminal "^1.6.2" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone-stats@^0.0.1, clone-stats@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +color-convert@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@~2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-with-sourcemaps@*, concat-with-sourcemaps@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz#f55b3be2aeb47601b10a2d5259ccfb70fd2f1dd6" + dependencies: + source-map "^0.5.1" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +content-type@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +convert-source-map@^1.1.0, convert-source-map@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +copy-webpack-plugin@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.0.1.tgz#9728e383b94316050d0c7463958f2b85c0aa8200" + dependencies: + bluebird "^2.10.2" + fs-extra "^0.26.4" + glob "^6.0.4" + is-glob "^3.1.0" + loader-utils "^0.2.15" + lodash "^4.3.0" + minimatch "^3.0.0" + node-dir "^0.1.10" + +core-js@^2.4.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.0.tgz#569c050918be6486b3837552028ae0466b717086" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +create-ecdh@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + ripemd160 "^2.0.0" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.6" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-browserify@^3.11.0: + version "3.11.1" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +dateformat@^1.0.7-1.2.3: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +dateformat@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" + +debug@^2.1.0, debug@^2.1.1, debug@^2.2.0, debug@^2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-assign@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b" + dependencies: + is-obj "^1.0.0" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-file@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + dependencies: + fs-exists-sync "^0.1.0" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +diffie-hellman@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + +domain-browser@^1.1.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + +domready@0.x: + version "0.3.0" + resolved "https://registry.yarnpkg.com/domready/-/domready-0.3.0.tgz#b3740facbd09163018152d12aec239383e102175" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +duplexer2@~0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + dependencies: + readable-stream "^2.0.2" + +duplexer@^0.1.1, duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +electron-to-chromium@^1.3.11, electron-to-chromium@^1.3.17: + version "1.3.17" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.17.tgz#41c13457cc7166c5c15e767ae61d86a8cacdee5d" + +elliptic@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" + dependencies: + once "^1.4.0" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + dependencies: + once "~1.3.0" + +enhanced-resolve@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.7" + +errno@^0.1.1, errno@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.26" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.26.tgz#51b2128a531b70c4f6764093a73cbebb82186372" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-symbol "^3.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-promise-polyfill@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz#f38925f23cb3e3e8ce6cda8ff774fcebbb090cde" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-plugin-compat@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-1.0.4.tgz#76e52038119a5080e2612cc4141d687f4d140398" + dependencies: + babel-runtime "^6.23.0" + browserslist "2.1.4" + caniuse-db "1.0.30000671" + requireindex "^1.1.0" + +eslint-scope@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint@4.4.0, eslint@^4.0.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.4.0.tgz#a3e153e704b64f78290ef03592494eaba228d3bc" + dependencies: + ajv "^5.2.0" + babel-code-frame "^6.22.0" + chalk "^1.1.3" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^2.6.8" + doctrine "^2.0.0" + eslint-scope "^3.7.1" + espree "^3.5.0" + esquery "^1.0.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^9.17.0" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^4.0.0" + progress "^2.0.0" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-json-comments "~2.0.1" + table "^4.0.1" + text-table "~0.2.0" + +espree@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d" + dependencies: + acorn "^5.1.1" + acorn-jsx "^3.0.0" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esprima@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.0.0.tgz#53cf247acda77313e551c3aa2e73342d3fb4f7d9" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +event-stream@^3.1.7: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +evp_bytestokey@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53" + dependencies: + create-hash "^1.1.1" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + dependencies: + os-homedir "^1.0.1" + +expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + +extend@^3.0.0, extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" + dependencies: + iconv-lite "^0.4.17" + jschardet "^1.4.2" + tmp "^0.0.31" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +fancy-log@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" + dependencies: + chalk "^1.1.1" + time-stamp "^1.0.0" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +faye-websocket@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11" + dependencies: + websocket-driver ">=0.3.6" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +findup-sync@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + dependencies: + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" + +fined@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +flagged-respawn@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" + +flat-cache@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +fork-stream@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + +fs-extra@^0.26.4: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.36" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + dependencies: + globule "~0.1.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +global@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + +globals@^9.0.0, globals@^9.17.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" + dependencies: + sparkles "^1.0.0" + +graceful-fs@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + +growly@^1.2.0, growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +gulp-autoprefixer@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-4.0.0.tgz#e00a8c571b85d06516ac26341be90dfd9fc1eab0" + dependencies: + autoprefixer "^7.0.0" + gulp-util "^3.0.0" + postcss "^6.0.1" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-cached@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/gulp-cached/-/gulp-cached-1.1.1.tgz#fe7cd4f87f37601e6073cfedee5c2bdaf8b6acce" + dependencies: + lodash.defaults "^4.2.0" + through2 "^2.0.1" + +gulp-chmod@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/gulp-chmod/-/gulp-chmod-2.0.0.tgz#00c390b928a0799b251accf631aa09e01cc6299c" + dependencies: + deep-assign "^1.0.0" + stat-mode "^0.2.0" + through2 "^2.0.0" + +gulp-clean-css@3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.7.0.tgz#54b33526dc899930949fb37b4cacf851c5d5d93b" + dependencies: + clean-css "4.1.7" + gulp-util "3.0.8" + through2 "2.0.3" + vinyl-sourcemaps-apply "0.2.1" + +gulp-concat-util@0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/gulp-concat-util/-/gulp-concat-util-0.5.5.tgz#c8f0633b4e6e950ff93c475b3c8d3b84be03b7dc" + dependencies: + concat-with-sourcemaps "^1.0.4" + gulp-if "^2.0.0" + gulp-util "^3.0.6" + lodash.assign "^3.2.0" + stream-combiner2 "^1.1.1" + through2 "^2.0.0" + +gulp-eol@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/gulp-eol/-/gulp-eol-0.1.2.tgz#a26818285cd554389d82e93be9b3d0e50d3dbea3" + dependencies: + gulp-util "~2.2" + through2 "~0.4" + +gulp-eslint@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp-eslint/-/gulp-eslint-4.0.0.tgz#16d9ea4d696e7b7a9d65eeb1aa5bc4ba0a22c7f7" + dependencies: + eslint "^4.0.0" + gulp-util "^3.0.8" + +gulp-expect-file@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/gulp-expect-file/-/gulp-expect-file-0.0.7.tgz#913e731db0dd6f5866149ba400ad835eb34623ad" + dependencies: + async "^0.9.0" + gulp-util "^2.2.16" + minimatch "^0.3.0" + through2 "^1.0.0" + xtend "^3.0.0" + +gulp-filter@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-5.0.1.tgz#5d87f662e317e5839ef7650e620e6c9008ff92d0" + dependencies: + gulp-util "^3.0.6" + multimatch "^2.0.0" + streamfilter "^1.0.5" + +gulp-header@1.8.9: + version "1.8.9" + resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.9.tgz#c9f10fee0632d81e939789c6ecf45a151bf3098b" + dependencies: + concat-with-sourcemaps "*" + gulp-util "*" + object-assign "*" + through2 "^2.0.0" + +gulp-if@2.0.2, gulp-if@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-2.0.2.tgz#a497b7e7573005041caa2bc8b7dda3c80444d629" + dependencies: + gulp-match "^1.0.3" + ternary-stream "^2.0.1" + through2 "^2.0.1" + +gulp-less@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/gulp-less/-/gulp-less-3.3.2.tgz#f6636adcc66150a8902719fa59963fc7f862a49a" + dependencies: + accord "^0.27.3" + gulp-util "^3.0.7" + less "2.6.x || ^2.7.1" + object-assign "^4.0.1" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-livereload@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/gulp-livereload/-/gulp-livereload-3.8.1.tgz#00f744b2d749d3e9e3746589c8a44acac779b50f" + dependencies: + chalk "^0.5.1" + debug "^2.1.0" + event-stream "^3.1.7" + gulp-util "^3.0.2" + lodash.assign "^3.0.0" + mini-lr "^0.1.8" + +gulp-match@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.0.3.tgz#91c7c0d7f29becd6606d57d80a7f8776a87aba8e" + dependencies: + minimatch "^3.0.3" + +gulp-notify@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-notify/-/gulp-notify-3.0.0.tgz#a04b8af9acdbe4e63c845678ce0c3d30694c59a3" + dependencies: + gulp-util "^3.0.8" + lodash.template "^4.4.0" + node-notifier "^5.0.1" + node.extend "^1.1.6" + through2 "^2.0.3" + +gulp-plumber@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.1.0.tgz#f12176c2d0422f60306c242fff6a01a394faba09" + dependencies: + gulp-util "^3" + through2 "^2" + +gulp-rename@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817" + +gulp-replace@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-0.6.1.tgz#11bf8c8fce533e33e2f6a8f2f430b955ba0be066" + dependencies: + istextorbinary "1.0.2" + readable-stream "^2.0.1" + replacestream "^4.0.0" + +gulp-rimraf@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/gulp-rimraf/-/gulp-rimraf-0.2.1.tgz#9f1783adc5d4890d8a1bedf834bc989e2a565030" + dependencies: + gulp-util "^3.0.7" + rimraf "^2.5.4" + through2 "^2.0.1" + +gulp-size@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/gulp-size/-/gulp-size-2.1.0.tgz#1c2b64f17f9071d5abd99d154b7b3481f8fba128" + dependencies: + chalk "^1.0.0" + gulp-util "^3.0.0" + gzip-size "^3.0.0" + object-assign "^4.0.1" + pretty-bytes "^3.0.1" + stream-counter "^1.0.0" + through2 "^2.0.0" + +gulp-stripbom@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/gulp-stripbom/-/gulp-stripbom-1.0.4.tgz#58c1d03e85e008a7aab47d81b1297c8c1bc828eb" + dependencies: + gulp-util "^3.0.0" + log-symbols "^1.0.0" + strip-bom "^1.0.0" + through2 "^0.5.1" + +gulp-through@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/gulp-through/-/gulp-through-0.4.0.tgz#6463b29f678c788540b63aa6a1bad5bd8552ae6d" + dependencies: + bluebird "^3.0.6" + chalk "^1.1.1" + gulp-util "^3.0.7" + through2 "^2.0.0" + xtend "^4.0.1" + +gulp-uglify@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca" + dependencies: + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash "^4.13.1" + make-error-cause "^1.1.1" + through2 "^2.0.0" + uglify-js "^3.0.5" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-util@*, gulp-util@3.0.8, gulp-util@^3, gulp-util@^3.0.0, gulp-util@^3.0.2, gulp-util@^3.0.6, gulp-util@^3.0.7, gulp-util@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp-util@^2.2.16, gulp-util@~2.2: + version "2.2.20" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" + dependencies: + chalk "^0.5.0" + dateformat "^1.0.7-1.2.3" + lodash._reinterpolate "^2.4.1" + lodash.template "^2.4.1" + minimist "^0.2.0" + multipipe "^0.1.0" + through2 "^0.5.0" + vinyl "^0.2.1" + +gulp-zip@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-4.0.0.tgz#1cefc08b4bf36df4b5b1e7c6b36ee55ebbe4a881" + dependencies: + get-stream "^3.0.0" + gulp-util "^3.0.0" + through2 "^2.0.1" + yazl "^2.1.0" + +gulp@3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +gzip-size@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" + dependencies: + duplexer "^0.1.1" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + dependencies: + ansi-regex "^0.2.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +hash-base@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + dependencies: + inherits "^2.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +http-errors@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" + dependencies: + inherits "~2.0.1" + statuses "1" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +iconv-lite@^0.4.17, iconv-lite@~0.4.13: + version "0.4.18" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + +ieee754@^1.1.4: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + +ifvisible.js@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/ifvisible.js/-/ifvisible.js-1.0.6.tgz#52eb151ce89c56f15316226462e892d1f8451261" + +ignore@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +indx@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^3.0.6: + version "3.2.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.1.tgz#06ceb0f540f45ca548c17d6840959878265fa175" + dependencies: + ansi-escapes "^2.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + +invariant@^2.2.0, invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-absolute@^0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" + dependencies: + is-relative "^0.2.1" + is-windows "^0.2.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-relative@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" + dependencies: + is-unc-path "^0.1.1" + +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-unc-path@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" + dependencies: + unc-path-regex "^0.1.0" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + +is@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0, isobject@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istextorbinary@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-1.0.2.tgz#ace19354d1a9a0173efeb1084ce0f87b0ad7decf" + dependencies: + binaryextensions "~1.0.0" + textextensions "~1.0.0" + +jasmine-reporters@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-0.2.1.tgz#395f6e5170692de1a966cd95a70d7a37bf3f2bc3" + +jquery-lazyload@1.9.7: + version "1.9.7" + resolved "https://registry.yarnpkg.com/jquery-lazyload/-/jquery-lazyload-1.9.7.tgz#9982b388c533c0b611214b3c5aaa0b9fede071f7" + +jquery-mousewheel@3.1.13: + version "3.1.13" + resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" + +jquery-scrollstop@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/jquery-scrollstop/-/jquery-scrollstop-1.2.0.tgz#f1827a25cf12887d965c085d8a75035655b37663" + dependencies: + jquery ">=1.2.3" + +jquery.backstretch@2.1.15: + version "2.1.15" + resolved "https://registry.yarnpkg.com/jquery.backstretch/-/jquery.backstretch-2.1.15.tgz#991f99d83b8cbd74e65ca1e1b3fc41d251d4570e" + dependencies: + jquery "^3.1.1" + +jquery@2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.4.tgz#2c89d6889b5eac522a7eea32c14521559c6cbf02" + +jquery@>=1.2.3, jquery@>=1.7.0, jquery@^3.1.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" + +js-cookie@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.1.4.tgz#da4ec503866f149d164cf25f579ef31015025d8d" + +js-tokens@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jschardet@^1.4.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-loader@0.5.7, json-loader@^0.5.4: + version "0.5.7" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +"knockout-projections@github:stevesanderson/knockout-projections#v1.1.0": + version "1.1.0" + resolved "https://codeload.github.com/stevesanderson/knockout-projections/tar.gz/01cb07b27b305c0240de7aa92687110e68432706" + dependencies: + jasmine-reporters "~0.2.1" + knockout "~3.0.0" + +knockout-sortable@0.14.1: + version "0.14.1" + resolved "https://registry.yarnpkg.com/knockout-sortable/-/knockout-sortable-0.14.1.tgz#bdf40412451969729d0dd37c61bb7333cdd46e1e" + +knockout@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/knockout/-/knockout-3.4.2.tgz#e87958de77ad1e936f7ce645bab8b5d7c456d937" + +knockout@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/knockout/-/knockout-3.0.0.tgz#fd8d43ee446237cde7df650f5c7dbcf68ae49a80" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +"less@2.6.x || ^2.7.1": + version "2.7.2" + resolved "https://registry.yarnpkg.com/less/-/less-2.7.2.tgz#368d6cc73e1fb03981183280918743c5dcf9b3df" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + mime "^1.2.11" + mkdirp "^0.5.0" + promise "^7.1.1" + request "^2.72.0" + source-map "^0.5.3" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +liftoff@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" + dependencies: + extend "^3.0.0" + findup-sync "^0.4.2" + fined "^1.0.1" + flagged-respawn "^0.3.2" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.mapvalues "^4.4.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +lightgallery@1.2.21: + version "1.2.21" + resolved "https://registry.yarnpkg.com/lightgallery/-/lightgallery-1.2.21.tgz#8f4ba26a1b99bc583507eb1540291b156aa90aaf" + dependencies: + jquery ">=1.7.0" + +livereload-js@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@^0.2.15: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash._arraycopy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" + +lodash._arrayeach@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._baseclone@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" + dependencies: + lodash._arraycopy "^3.0.0" + lodash._arrayeach "^3.0.0" + lodash._baseassign "^3.0.0" + lodash._basefor "^3.0.0" + lodash.isarray "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basefor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._escapehtmlchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" + dependencies: + lodash._htmlescapes "~2.4.1" + +lodash._escapestringchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._htmlescapes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._isnative@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" + +lodash._objecttypes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" + +lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._reunescapedhtml@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" + dependencies: + lodash._htmlescapes "~2.4.1" + lodash.keys "~2.4.1" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash._shimkeys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.assign@^3.0.0, lodash.assign@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.clone@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + +lodash.clonedeep@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" + dependencies: + lodash._baseclone "^3.0.0" + lodash._bindcallback "^3.0.0" + +lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + +lodash.defaults@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" + dependencies: + lodash._objecttypes "~2.4.1" + lodash.keys "~2.4.1" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.escape@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" + dependencies: + lodash._escapehtmlchar "~2.4.1" + lodash._reunescapedhtml "~2.4.1" + lodash.keys "~2.4.1" + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isobject@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.isplainobject@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.keys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" + dependencies: + lodash._isnative "~2.4.1" + lodash._shimkeys "~2.4.1" + lodash.isobject "~2.4.1" + +lodash.mapvalues@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + +lodash.merge@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" + +lodash.partialright@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b" + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.template@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" + dependencies: + lodash._escapestringchar "~2.4.1" + lodash._reinterpolate "~2.4.1" + lodash.defaults "~2.4.1" + lodash.escape "~2.4.1" + lodash.keys "~2.4.1" + lodash.templatesettings "~2.4.1" + lodash.values "~2.4.1" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.template@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + dependencies: + lodash._reinterpolate "~3.0.0" + +lodash.templatesettings@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" + dependencies: + lodash._reinterpolate "~2.4.1" + lodash.escape "~2.4.1" + +lodash.toarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" + +lodash.uniq@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash.values@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" + dependencies: + lodash.keys "~2.4.1" + +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + +log-symbols@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" + dependencies: + pify "^2.3.0" + +make-error-cause@^1.1.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" + dependencies: + make-error "^1.2.0" + +make-error@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" + +map-cache@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +marked-terminal@^1.6.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.7.0.tgz#c8c460881c772c7604b64367007ee5f77f125904" + dependencies: + cardinal "^1.0.0" + chalk "^1.1.3" + cli-table "^0.3.1" + lodash.assign "^4.2.0" + node-emoji "^1.4.1" + +marked@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + +matchmedia-polyfill@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/matchmedia-polyfill/-/matchmedia-polyfill-0.3.0.tgz#6f91e34012b3dfc9d5b76cec89deafc1b41b45fa" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-stream@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +micromatch@^2.1.5, micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +miller-rabin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@~1.29.0: + version "1.29.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" + +mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.7: + version "2.1.16" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" + dependencies: + mime-db "~1.29.0" + +mime@^1.2.11: + version "1.3.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + +mini-lr@^0.1.8: + version "0.1.9" + resolved "https://registry.yarnpkg.com/mini-lr/-/mini-lr-0.1.9.tgz#02199d27347953d1fd1d6dbded4261f187b2d0f6" + dependencies: + body-parser "~1.14.0" + debug "^2.2.0" + faye-websocket "~0.7.2" + livereload-js "^2.2.0" + parseurl "~1.3.0" + qs "~2.2.3" + +minimalistic-assert@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimatch@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" + +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +moment@2.18.1, moment@2.x: + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +multimatch@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +multipipe@^0.1.0, multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@^2.3.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +natives@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +node-dir@^0.1.10: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + dependencies: + minimatch "^3.0.2" + +node-emoji@^1.4.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.8.1.tgz#6eec6bfb07421e2148c75c6bba72421f8530a826" + dependencies: + lodash.toarray "^4.4.0" + +node-fetch@^1.3.3: + version "1.7.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fs@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/node-fs/-/node-fs-0.1.7.tgz#32323cccb46c9fbf0fc11812d45021cc31d325bb" + +node-libs-browser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.1.4" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "0.0.1" + os-browserify "^0.2.0" + path-browserify "0.0.0" + process "^0.11.0" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.0.5" + stream-browserify "^2.0.1" + stream-http "^2.3.1" + string_decoder "^0.10.25" + timers-browserify "^2.0.2" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-localstorage@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-1.3.0.tgz#2e436aae8dcc9ace97b43c65c16c0d577be0a55c" + dependencies: + write-file-atomic "^1.1.4" + +node-notifier@5.1.2, node-notifier@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff" + dependencies: + growly "^1.3.0" + semver "^5.3.0" + shellwords "^0.1.0" + which "^1.2.12" + +node-notifier@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" + dependencies: + cli-usage "^0.1.1" + growly "^1.2.0" + lodash.clonedeep "^3.0.0" + minimist "^1.1.1" + semver "^5.1.0" + shellwords "^0.1.0" + which "^1.0.5" + +node-pre-gyp@^0.6.36: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +node.extend@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.6.tgz#a7b882c82d6c93a4863a5504bd5de8ec86258b96" + dependencies: + is "^3.1.0" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +normalize.css@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-7.0.0.tgz#abfb1dd82470674e0322b53ceb1aaf412938e4bf" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@*, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.2.0.tgz#b5392bee9782da6d9fb7d6afaf539779f1234c2b" + dependencies: + isobject "^2.1.0" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +openpgp@2.5.8: + version "2.5.8" + resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-2.5.8.tgz#b12d7abe8bf73e23cb199a53696d77a1d9ddb05b" + dependencies: + node-fetch "^1.3.3" + node-localstorage "~1.3.0" + +opentip@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/opentip/-/opentip-2.4.3.tgz#2a3b500c2738f8069c33462ed48b5afe9ce804e6" + dependencies: + bean "0.x" + bonzo "1.x" + domready "0.x" + qwery "3.x" + reqwest "0.x" + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + +os-browserify@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + +parse-asn1@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-filepath@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" + dependencies: + is-absolute "^0.2.3" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +parseurl@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pbkdf2@^3.0.3: + version "3.0.13" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.13.tgz#c37d295531e786b1da3e3eadc840426accb0ae25" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pikaday@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/pikaday/-/pikaday-1.6.1.tgz#b91bcb9b8539cedd8d6d08e4e7465e12095671b0" + optionalDependencies: + moment "2.x" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +pluralize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" + +postcss-value-parser@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss@^6.0.1, postcss@^6.0.6: + version "6.0.8" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.8.tgz#89067a9ce8b11f8a84cbc5117efc30419a0857b3" + dependencies: + chalk "^2.0.1" + source-map "^0.5.6" + supports-color "^4.2.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-bytes@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-3.0.1.tgz#27d0008d778063a0b4811bb35c79f1bd5d5fbccf" + dependencies: + number-is-nan "^1.0.0" + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + +private@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@^0.11.0: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +public-encrypt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be" + +qs@~2.2.3: + version "2.2.5" + resolved "https://registry.yarnpkg.com/qs/-/qs-2.2.5.tgz#1088abaf9dcc0ae5ae45b709e6c6b5888b23923c" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +qwery@3.x: + version "3.4.2" + resolved "https://registry.yarnpkg.com/qwery/-/qwery-3.4.2.tgz#7d0af3ebcf48af599f2ed498d8ce39023978a63e" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +randombytes@^2.0.0, randombytes@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" + dependencies: + safe-buffer "^5.1.0" + +raw-body@~2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.13" + unpipe "1.0.0" + +raw-loader@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" + +rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +"readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +redeyed@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" + dependencies: + esprima "~3.0.0" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +replacestream@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.2.tgz#0c4140707e4f0323f50de044851708cf58bc37bd" + dependencies: + escape-string-regexp "^1.0.3" + object-assign "^4.0.1" + readable-stream "^2.0.2" + +request@^2.72.0, request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +requireindex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" + +reqwest@0.x: + version "0.9.7" + resolved "https://registry.yarnpkg.com/reqwest/-/reqwest-0.9.7.tgz#11a2de9704dc8d52c9675265d7177103febf3a63" + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rifraf@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/rifraf/-/rifraf-2.0.3.tgz#8ceba761d2e88411232f272a2e06eb98e4fa2a8a" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@2.6.1, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + dependencies: + hash-base "^2.0.0" + inherits "^2.0.1" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +run-sequence@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/run-sequence/-/run-sequence-2.1.0.tgz#149da012516f21dcf79db6dc99a2a95603631b21" + dependencies: + chalk "^1.1.3" + gulp-util "^3.0.8" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +schema-utils@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + dependencies: + ajv "^5.0.0" + +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + +semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.8" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" + dependencies: + inherits "^2.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shellwords@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +simplestatemanager@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/simplestatemanager/-/simplestatemanager-3.4.0.tgz#4a474125f34f4061f46dd05828f63aa998fe06eb" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + +source-map-support@^0.4.2: + version "0.4.15" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" + dependencies: + source-map "^0.5.6" + +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +sparkles@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stat-mode@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" + +statuses@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-consume@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" + +stream-counter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-1.0.0.tgz#91cf2569ce4dc5061febcd7acb26394a5a114751" + +stream-http@^2.3.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.2.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +streamfilter@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/streamfilter/-/streamfilter-1.0.5.tgz#87507111beb8e298451717b511cfed8f002abf53" + dependencies: + readable-stream "^2.0.2" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@^0.10.25, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +style-loader@0.18.2: + version "0.18.2" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.18.2.tgz#cc31459afbcd6d80b7220ee54b291a9fd66ff5eb" + dependencies: + loader-utils "^1.0.2" + schema-utils "^0.3.0" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^4.0.0, supports-color@^4.2.0, supports-color@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.1.tgz#65a4bb2631e90e02420dba5554c375a4754bb836" + dependencies: + has-flag "^2.0.0" + +table@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + +tapable@^0.2.7: + version "0.2.8" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +ternary-stream@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.0.1.tgz#064e489b4b5bf60ba6a6b7bc7f2f5c274ecf8269" + dependencies: + duplexify "^3.5.0" + fork-stream "^0.0.4" + merge-stream "^1.0.0" + through2 "^2.0.1" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +textextensions@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-1.0.2.tgz#65486393ee1f2bb039a60cbba05b0b68bd9501d2" + +through2@2.0.3, through2@^2, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through2@^0.5.0, through2@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" + dependencies: + readable-stream "~1.0.17" + xtend "~3.0.0" + +through2@^0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545" + dependencies: + readable-stream ">=1.1.13-1 <1.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@~0.4: + version "0.4.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" + dependencies: + readable-stream "~1.0.17" + xtend "~2.1.1" + +through@2, through@^2.3.6, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +timers-browserify@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.3.tgz#41fd0bdc926a5feedc33a17a8e1f7d491925f7fc" + dependencies: + global "^4.3.2" + setimmediate "^1.0.4" + +tmp@^0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.10: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uglify-js@^2.8.22, uglify-js@^2.8.29: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-js@^3.0.5: + version "3.0.27" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.27.tgz#a97db8c8ba6b9dba4e2f88d86aa9548fa6320034" + dependencies: + commander "~2.11.0" + source-map "~0.5.1" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uglifyjs-webpack-plugin@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" + dependencies: + source-map "^0.5.6" + uglify-js "^2.8.29" + webpack-sources "^1.0.1" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +unc-path-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +underscore@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3, util@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +uuid@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +v8flags@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl-sourcemaps-apply@0.2.1, vinyl-sourcemaps-apply@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + dependencies: + source-map "^0.5.1" + +vinyl@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" + dependencies: + clone-stats "~0.0.1" + +vinyl@^0.4.0: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +watchpack@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" + dependencies: + async "^2.1.2" + chokidar "^1.7.0" + graceful-fs "^4.1.2" + +webpack-notifier@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/webpack-notifier/-/webpack-notifier-1.5.0.tgz#c010007d448cebc34defc99ecf288fa5e8c6baf6" + dependencies: + node-notifier "^4.1.0" + object-assign "^4.1.0" + strip-ansi "^3.0.1" + +webpack-sources@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" + dependencies: + source-list-map "^2.0.0" + source-map "~0.5.3" + +webpack@3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.4.1.tgz#4c3f4f3fb318155a4db0cb6a36ff05c5697418f4" + dependencies: + acorn "^5.0.0" + acorn-dynamic-import "^2.0.0" + ajv "^5.1.5" + ajv-keywords "^2.0.0" + async "^2.1.2" + enhanced-resolve "^3.4.0" + escope "^3.6.0" + interpret "^1.0.0" + json-loader "^0.5.4" + json5 "^0.5.1" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + mkdirp "~0.5.0" + node-libs-browser "^2.0.0" + source-map "^0.5.3" + supports-color "^4.2.1" + tapable "^0.2.7" + uglifyjs-webpack-plugin "^0.4.6" + watchpack "^1.4.0" + webpack-sources "^1.0.1" + yargs "^8.0.2" + +websocket-driver@>=0.3.6: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + dependencies: + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + +when@^3.7.8: + version "3.7.8" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@^1.0.5, which@^1.2.12, which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xtend@^3.0.0, xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + dependencies: + object-keys "~0.4.0" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yazl@^2.1.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.2.tgz#14cb19083e1e25a70092c1588aabe0f4e4dd4d88" + dependencies: + buffer-crc32 "~0.2.3" From 070e4ee0fb6d8503356a08237377b34f936787e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Stenr=C3=B6se?= Date: Mon, 14 Aug 2017 14:51:10 +0200 Subject: [PATCH 06/83] Allow sieve filter to "fileinto" INBOX --- dev/Stores/User/Folder.js | 6 +++++- rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php | 1 + .../v/0.0.0/app/libraries/RainLoop/Config/Application.php | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dev/Stores/User/Folder.js b/dev/Stores/User/Folder.js index db4bf257e..1ed15acc9 100644 --- a/dev/Stores/User/Folder.js +++ b/dev/Stores/User/Folder.js @@ -2,6 +2,8 @@ import ko from 'ko'; import _ from '_'; +import {settingsGet} from 'Storage/Settings'; + import {FolderType} from 'Common/Enums'; import {UNUSED_OPTION_VALUE} from 'Common/Consts'; import {isArray, folderListOptionsBuilder} from 'Common/Utils'; @@ -35,6 +37,8 @@ class FolderUserStore this.currentFolder = ko.observable(null).extend({toggleSubscribeProperty: [this, 'selected']}); + this.sieveAllowFileintoInbox = !!settingsGet('SieveAllowFileintoInbox'); + this.computers(); this.subscribers(); } @@ -117,7 +121,7 @@ class FolderUserStore this.folderMenuForFilters = ko.computed( () => folderListOptionsBuilder( this.folderListSystem(), this.folderList(), - ['INBOX'], [['', '']], null, null, null, (item) => (item ? item.localName() : '')) + [(this.sieveAllowFileintoInbox ? '' : 'INBOX')], [['', '']], null, null, null, (item) => (item ? item.localName() : '')) ); } diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 7e3823125..4951703dd 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -1531,6 +1531,7 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack 'DetermineUserDomain' => (bool) $oConfig->Get('login', 'determine_user_domain', false), 'UseLoginWelcomePage' => (bool) $oConfig->Get('login', 'welcome_page', false), 'StartupUrl' => \trim(\ltrim(\trim($oConfig->Get('labs', 'startup_url', '')), '#/')), + 'SieveAllowFileintoInbox' => (bool) $oConfig->Get('labs', 'sieve_allow_fileinto_inbox', false), 'ContactsIsAllowed' => false, 'ChangePasswordIsAllowed' => false, 'RequireTwoFactor' => false, diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php index efbd86179..715c8a03e 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php @@ -422,6 +422,7 @@ Enables caching in the system'), 'sieve_allow_raw_script' => array(false), 'sieve_utf8_folder_name' => array(true), 'sieve_auth_plain_initial' => array(true), + 'sieve_allow_fileinto_inbox' => array(false), 'imap_timeout' => array(300), 'smtp_timeout' => array(60), 'sieve_timeout' => array(10), From 14e5ebbf7bd65cfb06e58b282271e79e6a8e73ee Mon Sep 17 00:00:00 2001 From: Marius Gripsgard Date: Wed, 23 Aug 2017 03:14:34 +0200 Subject: [PATCH 07/83] Add change email account password plugin for Mail-in-a-Box --- plugins/mailinabox-change-password/LICENSE | 20 +++ .../MailInABoxChangePasswordDriver.php | 157 ++++++++++++++++++ plugins/mailinabox-change-password/README | 1 + plugins/mailinabox-change-password/VERSION | 1 + plugins/mailinabox-change-password/index.php | 54 ++++++ 5 files changed, 233 insertions(+) create mode 100644 plugins/mailinabox-change-password/LICENSE create mode 100644 plugins/mailinabox-change-password/MailInABoxChangePasswordDriver.php create mode 100644 plugins/mailinabox-change-password/README create mode 100644 plugins/mailinabox-change-password/VERSION create mode 100644 plugins/mailinabox-change-password/index.php diff --git a/plugins/mailinabox-change-password/LICENSE b/plugins/mailinabox-change-password/LICENSE new file mode 100644 index 000000000..6ebe205bf --- /dev/null +++ b/plugins/mailinabox-change-password/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2017 Marius Gripsgard + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/plugins/mailinabox-change-password/MailInABoxChangePasswordDriver.php b/plugins/mailinabox-change-password/MailInABoxChangePasswordDriver.php new file mode 100644 index 000000000..95534f543 --- /dev/null +++ b/plugins/mailinabox-change-password/MailInABoxChangePasswordDriver.php @@ -0,0 +1,157 @@ +sHost = $sHost; + $this->sAdminUser = $sAdminUser; + $this->sAdminPassword = $sAdminPassword; + return $this; + } + /** + * @param string $sAllowedEmails + * + * @return \MailInABoxChangePasswordDriver + */ + public function SetAllowedEmails($sAllowedEmails) + { + $this->sAllowedEmails = $sAllowedEmails; + return $this; + } + /** + * @param \MailSo\Log\Logger $oLogger + * + * @return \MailInABoxChangePasswordDriver + */ + public function SetLogger($oLogger) + { + if ($oLogger instanceof \MailSo\Log\Logger) + { + $this->oLogger = $oLogger; + } + return $this; + } + /** + * @param string $sDesc + * @param int $iType = \MailSo\Log\Enumerations\Type::INFO + * + * @return \MailInABoxChangePasswordDriver + */ + public function WriteLog($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO) + { + if ($this->oLogger) + { + $this->oLogger->Write($sDesc, $iType); + } + return $this; + } + /** + * @param \RainLoop\Model\Account $oAccount + * + * @return bool + */ + public function PasswordChangePossibility($oAccount) + { + return $oAccount && $oAccount->Email() && + \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); + } + /** + * @param \RainLoop\Model\Account $oAccount + * @param string $sPrevPassword + * @param string $sNewPassword + * + * @return bool + */ + public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) + { + $this->WriteLog('Mail-in-a-box: Try to change password for '.$oAccount->Email()); + $bResult = false; + if (!empty($this->sHost) && !empty($this->sAdminUser) && !empty($this->sAdminPassword) && $oAccount) + { + $this->WriteLog('Mail-in-a-box:[Check] Required Fields Present'); + $sEmail = \trim(\strtolower($oAccount->Email())); + $sHost = \rtrim(\trim($this->sHost), '/'); + $sUrl = $sHost.'/admin/mail/users/password'; + + $sAdminUser = $this->sAdminUser; + $sAdminPassword = $this->sAdminPassword; + $iCode = 0; + $aPost = array( + 'email' => $sEmail, + 'password' => $sNewPassword, + ); + $aOptions = array( + CURLOPT_URL => $sUrl, + CURLOPT_HEADER => false, + CURLOPT_FAILONERROR => true, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => \http_build_query($aPost, '', '&'), + CURLOPT_TIMEOUT => 20, + CURLOPT_SSL_VERIFYHOST => false, + CURLOPT_USERPWD => $sAdminUser.':'.$sAdminPassword, + CURLOPT_HTTPAUTH => CURLAUTH_BASIC + ); + $oCurl = \curl_init(); + \curl_setopt_array($oCurl, $aOptions); + $this->WriteLog('Mail-in-a-box: Send post request: '.$sUrl); + $mResult = \curl_exec($oCurl); + $iCode = (int) \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); + $sContentType = (string) \curl_getinfo($oCurl, CURLINFO_CONTENT_TYPE); + $this->WriteLog('Mail-in-a-box: Post request result: (Status: '.$iCode.', ContentType: '.$sContentType.')'); + if (false === $mResult || 200 !== $iCode) + { + $this->WriteLog('Mail-in-a-box: Error: '.\curl_error($oCurl), \MailSo\Log\Enumerations\Type::WARNING); + } + if (\is_resource($oCurl)) + { + \curl_close($oCurl); + } + if (false !== $mResult && 200 === $iCode) + { + $this->WriteLog('Mail-in-a-box: Password Change Status: Success'); + $bResult = true; + } + else + { + $this->WriteLog('Mail-in-a-box[Error]: Empty Response: Code: '.$iCode); + } + } + return $bResult; + } +} diff --git a/plugins/mailinabox-change-password/README b/plugins/mailinabox-change-password/README new file mode 100644 index 000000000..9f419ce62 --- /dev/null +++ b/plugins/mailinabox-change-password/README @@ -0,0 +1 @@ +Plugin that adds functionality to change the email account password (Mail-in-a-Box). diff --git a/plugins/mailinabox-change-password/VERSION b/plugins/mailinabox-change-password/VERSION new file mode 100644 index 000000000..d3827e75a --- /dev/null +++ b/plugins/mailinabox-change-password/VERSION @@ -0,0 +1 @@ +1.0 diff --git a/plugins/mailinabox-change-password/index.php b/plugins/mailinabox-change-password/index.php new file mode 100644 index 000000000..b88235e54 --- /dev/null +++ b/plugins/mailinabox-change-password/index.php @@ -0,0 +1,54 @@ +addHook('main.fabrica', 'MainFabrica'); + } + /** + * @param string $sName + * @param mixed $oProvider + */ + public function MainFabrica($sName, &$oProvider) + { + switch ($sName) + { + case 'change-password': + include_once __DIR__.'/MailInABoxChangePasswordDriver.php'; + $sHost = \trim($this->Config()->Get('plugin', 'host', '')); + $sAdminUser = (string) $this->Config()->Get('plugin', 'admin_user', ''); + $sAdminPassword = (string) $this->Config()->Get('plugin', 'admin_password', ''); + $oProvider = new \MailInABoxChangePasswordDriver(); + $oProvider->SetLogger($this->Manager()->Actions()->Logger()); + $oProvider->SetConfig($sHost, $sAdminUser, $sAdminPassword); + $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); + break; + } + } + /** + * @return array + */ + public function configMapping() + { + return array( + \RainLoop\Plugins\Property::NewInstance('host')->SetLabel('Mail-in-a-box Host') + ->SetDefaultValue('https://box.mailinabox.email') + ->SetDescription('Mail-in-a-box host URL. Example: https://box.mailinabox.email'), + \RainLoop\Plugins\Property::NewInstance('admin_user')->SetLabel('Admin User') + ->SetDefaultValue(''), + \RainLoop\Plugins\Property::NewInstance('admin_password')->SetLabel('Admin Password') + ->SetDefaultValue(''), + \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') + ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) + ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') + ->SetDefaultValue('*') + ); + } +} From 2285fd45691d4d9be9424296260d204d21ec8c73 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Fri, 15 Sep 2017 19:51:01 +0300 Subject: [PATCH 08/83] Update package.json dependencies --- gulpfile.js | 2 +- package.json | 24 +- yarn.lock | 757 ++++++++++++++++++++++++++++++++------------------- 3 files changed, 484 insertions(+), 299 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 3c86c50f5..bd0243fb6 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -226,7 +226,7 @@ cfg.paths.js = { 'node_modules/jquery-mousewheel/jquery.mousewheel.js', 'node_modules/jquery-scrollstop/jquery.scrollstop.js', 'node_modules/jquery-lazyload/jquery.lazyload.js ', - 'node_modules/jquery.backstretch/jquery.backstretch.min.js', + 'node_modules/jquery-backstretch/jquery.backstretch.min.js', 'vendors/jquery-ui/js/jquery-ui-1.10.3.custom.min.js', // custom 'vendors/jquery-nanoscroller/jquery.nanoscroller.js', // custom (modified) 'vendors/jquery-wakeup/jquery.wakeup.js', // no-npm diff --git a/package.json b/package.json index ad5f327d9..6aadaf3a0 100644 --- a/package.json +++ b/package.json @@ -53,25 +53,25 @@ ], "devDependencies": { "Progress.js": "github:usablica/progress.js#v0.1.0", - "autolinker": "1.4.3", - "babel-core": "6.25.0", - "babel-eslint": "7.2.3", - "babel-loader": "7.1.1", + "autolinker": "1.4.4", + "babel-core": "6.26.0", + "babel-eslint": "8.0.0", + "babel-loader": "7.1.2", "babel-plugin-transform-decorators-legacy": "1.3.4", "babel-plugin-transform-runtime": "6.23.0", "babel-preset-env": "1.6.0", "babel-preset-stage-0": "6.24.1", - "babel-runtime": "6.25.0", + "babel-runtime": "6.26.0", "classnames": "2.2.5", "copy-webpack-plugin": "4.0.1", "es6-promise-polyfill": "1.2.0", - "eslint": "4.4.0", + "eslint": "4.6.1", "eslint-plugin-compat": "1.0.4", "gulp": "3.9.1", "gulp-autoprefixer": "4.0.0", "gulp-cached": "1.1.1", "gulp-chmod": "2.0.0", - "gulp-clean-css": "3.7.0", + "gulp-clean-css": "3.8.0", "gulp-concat-util": "0.5.5", "gulp-eol": "0.1.2", "gulp-eslint": "4.0.0", @@ -97,7 +97,7 @@ "jquery-lazyload": "1.9.7", "jquery-mousewheel": "3.1.13", "jquery-scrollstop": "1.2.0", - "jquery.backstretch": "2.1.15", + "jquery-backstretch": "2.1.16", "js-cookie": "2.1.4", "json-loader": "0.5.7", "json3": "3.3.2", @@ -110,17 +110,15 @@ "node-fs": "0.1.7", "node-notifier": "5.1.2", "normalize.css": "7.0.0", - "openpgp": "2.5.8", + "openpgp": "2.5.10", "opentip": "2.4.3", "pikaday": "1.6.1", "raw-loader": "0.5.1", - "rifraf": "2.0.3", - "rimraf": "2.6.1", + "rimraf": "2.6.2", "run-sequence": "2.1.0", "simplestatemanager": "3.4.0", "style-loader": "0.18.2", "underscore": "1.8.3", - "webpack": "3.4.1", + "webpack": "3.6.0", "webpack-notifier": "1.5.0" - } } diff --git a/yarn.lock b/yarn.lock index 718a96fff..f516de72b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -50,8 +50,8 @@ acorn@^4.0.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" acorn@^5.0.0, acorn@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" + version "5.1.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" ajv-keywords@^1.0.0: version "1.5.1" @@ -239,19 +239,19 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" -autolinker@1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.4.3.tgz#2e615057c8e371399a6d77949a9a6af24fe46dfc" +autolinker@1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.4.4.tgz#84aaaa9bb07c794f0855cd7041a31eec6f6fa8ca" autoprefixer@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.2.tgz#fbeaf07d48fd878e0682bf7cbeeade728adb2b18" + version "7.1.4" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.4.tgz#960847dbaa4016bc8e8e52ec891cbf8f1257a748" dependencies: - browserslist "^2.1.5" - caniuse-lite "^1.0.30000697" + browserslist "^2.4.0" + caniuse-lite "^1.0.30000726" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^6.0.6" + postcss "^6.0.11" postcss-value-parser "^3.2.3" aws-sign2@~0.6.0: @@ -262,58 +262,66 @@ aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-code-frame@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" +babel-code-frame@7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-7.0.0-beta.0.tgz#418a7b5f3f7dc9a4670e61b1158b4c5661bec98d" dependencies: - chalk "^1.1.0" + chalk "^2.0.0" esutils "^2.0.2" js-tokens "^3.0.0" -babel-core@6.25.0, babel-core@^6.24.1: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729" +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: - babel-code-frame "^6.22.0" - babel-generator "^6.25.0" + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@6.26.0, babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" babel-helpers "^6.24.1" babel-messages "^6.23.0" - babel-register "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.25.0" - babel-traverse "^6.25.0" - babel-types "^6.25.0" - babylon "^6.17.2" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.5.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-is-absolute "^1.0.0" - private "^0.1.6" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" slash "^1.0.0" - source-map "^0.5.0" + source-map "^0.5.6" -babel-eslint@7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" +babel-eslint@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.0.0.tgz#ce06f385bdfb5b6d7e603f06222f891abd14c240" dependencies: - babel-code-frame "^6.22.0" - babel-traverse "^6.23.1" - babel-types "^6.23.0" - babylon "^6.17.0" + babel-code-frame "7.0.0-beta.0" + babel-traverse "7.0.0-beta.0" + babel-types "7.0.0-beta.0" + babylon "7.0.0-beta.22" -babel-generator@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" +babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" dependencies: babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.25.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" detect-indent "^4.0.0" jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" + lodash "^4.17.4" + source-map "^0.5.6" trim-right "^1.0.1" babel-helper-bindify-decorators@^6.24.1: @@ -342,13 +350,13 @@ babel-helper-call-delegate@^6.24.1: babel-types "^6.24.1" babel-helper-define-map@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" dependencies: babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" babel-helper-explode-assignable-expression@^6.24.1: version "6.24.1" @@ -367,6 +375,15 @@ babel-helper-explode-class@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" +babel-helper-function-name@7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.0.tgz#d1b6779b647e5c5c31ebeb05e13b998e4d352d56" + dependencies: + babel-helper-get-function-arity "7.0.0-beta.0" + babel-template "7.0.0-beta.0" + babel-traverse "7.0.0-beta.0" + babel-types "7.0.0-beta.0" + babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" @@ -377,6 +394,12 @@ babel-helper-function-name@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" +babel-helper-get-function-arity@7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.0.tgz#9d1ab7213bb5efe1ef1638a8ea1489969b5a8b6e" + dependencies: + babel-types "7.0.0-beta.0" + babel-helper-get-function-arity@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" @@ -399,12 +422,12 @@ babel-helper-optimise-call-expression@^6.24.1: babel-types "^6.24.1" babel-helper-regex@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" babel-helper-remap-async-to-generator@^6.24.1: version "6.24.1" @@ -434,14 +457,18 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-loader@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.1.tgz#b87134c8b12e3e4c2a94e0546085bc680a2b8488" +babel-loader@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126" dependencies: find-cache-dir "^1.0.0" loader-utils "^1.0.2" mkdirp "^0.5.1" +babel-messages@7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-7.0.0-beta.0.tgz#6df01296e49fc8fbd0637394326a167f36da817b" + babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" @@ -573,14 +600,14 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: babel-runtime "^6.22.0" babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - lodash "^4.2.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" babel-plugin-transform-es2015-classes@^6.23.0: version "6.24.1" @@ -645,13 +672,13 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-template "^6.24.1" babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" dependencies: babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" babel-plugin-transform-es2015-modules-systemjs@^6.23.0: version "6.24.1" @@ -751,17 +778,17 @@ babel-plugin-transform-function-bind@^6.22.0: babel-runtime "^6.22.0" babel-plugin-transform-object-rest-spread@^6.22.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.22.0" + babel-runtime "^6.26.0" babel-plugin-transform-regenerator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" dependencies: - regenerator-transform "0.9.11" + regenerator-transform "^0.10.0" babel-plugin-transform-runtime@6.23.0: version "6.23.0" @@ -846,61 +873,96 @@ babel-preset-stage-3@^6.24.1: babel-plugin-transform-exponentiation-operator "^6.24.1" babel-plugin-transform-object-rest-spread "^6.22.0" -babel-register@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" dependencies: - babel-core "^6.24.1" - babel-runtime "^6.22.0" - core-js "^2.4.0" + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" home-or-tmp "^2.0.0" - lodash "^4.2.0" + lodash "^4.17.4" mkdirp "^0.5.1" - source-map-support "^0.4.2" + source-map-support "^0.4.15" -babel-runtime@6.25.0, babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.25.0.tgz#33b98eaa5d482bb01a8d1aa6b437ad2b01aec41c" +babel-runtime@6.26.0, babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: core-js "^2.4.0" - regenerator-runtime "^0.10.0" + regenerator-runtime "^0.11.0" -babel-template@^6.24.1, babel-template@^6.25.0, babel-template@^6.3.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" +babel-template@7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-7.0.0-beta.0.tgz#85083cf9e4395d5e48bf5154d7a8d6991cafecfb" dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.25.0" - babel-types "^6.25.0" - babylon "^6.17.2" + babel-traverse "7.0.0-beta.0" + babel-types "7.0.0-beta.0" + babylon "7.0.0-beta.22" lodash "^4.2.0" -babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" +babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" dependencies: - babel-code-frame "^6.22.0" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.25.0" - babylon "^6.17.2" - debug "^2.2.0" - globals "^9.0.0" + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-7.0.0-beta.0.tgz#da14be9b762f62a2f060db464eaafdd8cd072a41" + dependencies: + babel-code-frame "7.0.0-beta.0" + babel-helper-function-name "7.0.0-beta.0" + babel-messages "7.0.0-beta.0" + babel-types "7.0.0-beta.0" + babylon "7.0.0-beta.22" + debug "^3.0.1" + globals "^10.0.0" invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.25.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-7.0.0-beta.0.tgz#eb8b6e556470e6dcc4aef982d79ad229469b5169" dependencies: - babel-runtime "^6.22.0" esutils "^2.0.2" lodash "^4.2.0" - to-fast-properties "^1.0.1" + to-fast-properties "^2.0.0" -babylon@^6.17.0, babylon@^6.17.2: - version "6.17.4" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@7.0.0-beta.22: + version "7.0.0-beta.22" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.22.tgz#74f0ad82ed7c7c3cfeab74cf684f815104161b65" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" balanced-match@^1.0.0: version "1.0.0" @@ -925,12 +987,12 @@ beeper@^1.0.0: resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" big.js@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" binary-extensions@^1.0.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.9.0.tgz#66506c16ce6f4d6928a5b3cd6a33ca41e941e37b" + version "1.10.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" binaryextensions@~1.0.0: version "1.0.1" @@ -951,8 +1013,8 @@ bluebird@^3.0.6: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.7" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.7.tgz#ddb048e50d9482790094c13eb3fcfc833ce7ab46" + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" body-parser@~1.14.0: version "1.14.2" @@ -999,14 +1061,15 @@ brorand@^1.0.1: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" + version "1.0.8" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.8.tgz#c8fa3b1b7585bb7ba77c5560b60996ddec6d5309" dependencies: - buffer-xor "^1.0.2" + buffer-xor "^1.0.3" cipher-base "^1.0.0" create-hash "^1.1.0" - evp_bytestokey "^1.0.0" + evp_bytestokey "^1.0.3" inherits "^2.0.1" + safe-buffer "^5.0.1" browserify-cipher@^1.0.0: version "1.0.0" @@ -1056,18 +1119,18 @@ browserslist@2.1.4: caniuse-lite "^1.0.30000670" electron-to-chromium "^1.3.11" -browserslist@^2.1.2, browserslist@^2.1.5: - version "2.3.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.3.0.tgz#b2aa76415c71643fe2368f6243b43bbbb4211752" +browserslist@^2.1.2, browserslist@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.4.0.tgz#693ee93d01e66468a6348da5498e011f578f87f8" dependencies: - caniuse-lite "^1.0.30000710" - electron-to-chromium "^1.3.17" + caniuse-lite "^1.0.30000718" + electron-to-chromium "^1.3.18" buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" -buffer-xor@^1.0.2: +buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -1128,9 +1191,9 @@ caniuse-db@1.0.30000671: version "1.0.30000671" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000671.tgz#9f071bbc7b96994638ccbaf47829d58a1577a8ed" -caniuse-lite@^1.0.30000670, caniuse-lite@^1.0.30000697, caniuse-lite@^1.0.30000710: - version "1.0.30000712" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000712.tgz#b4732def2459224f3f78c6a9ba103abfcc705670" +caniuse-lite@^1.0.30000670, caniuse-lite@^1.0.30000718, caniuse-lite@^1.0.30000726: + version "1.0.30000730" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000730.tgz#26a14ff1b3bfc1f1cb4da75c2c73451b3f1ade1a" cardinal@^1.0.0: version "1.0.0" @@ -1160,7 +1223,7 @@ chalk@^0.5.0, chalk@^0.5.1: strip-ansi "^0.3.0" supports-color "^0.2.0" -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -1170,7 +1233,7 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1: +chalk@^2.0.0, chalk@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" dependencies: @@ -1208,9 +1271,9 @@ classnames@2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" -clean-css@4.1.7: - version "4.1.7" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.7.tgz#b9aea4f85679889cf3eae8b40349ec4ebdfdd032" +clean-css@4.1.8: + version "4.1.8" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.8.tgz#061455b2494a750ac98f46d8d5ebb17c679ea9d1" dependencies: source-map "0.5.x" @@ -1234,8 +1297,8 @@ cli-usage@^0.1.1: marked-terminal "^1.6.2" cli-width@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" cliui@^2.1.0: version "2.1.0" @@ -1334,10 +1397,10 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" content-type@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" -convert-source-map@^1.1.0, convert-source-map@^1.5.0: +convert-source-map@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" @@ -1354,9 +1417,9 @@ copy-webpack-plugin@4.0.1: minimatch "^3.0.0" node-dir "^0.1.10" -core-js@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.0.tgz#569c050918be6486b3837552028ae0466b717086" +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -1369,7 +1432,7 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" -create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2: +create-hash@^1.1.0, create-hash@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" dependencies: @@ -1451,12 +1514,18 @@ dateformat@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" -debug@^2.1.0, debug@^2.1.1, debug@^2.2.0, debug@^2.6.8: +debug@^2.1.0, debug@^2.2.0, debug@^2.6.8: version "2.6.8" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" dependencies: ms "2.0.0" +debug@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.0.1.tgz#0564c612b521dc92d9f2988f0549e34f9c98db64" + dependencies: + ms "2.0.0" + debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" @@ -1473,6 +1542,10 @@ deep-assign@^1.0.0: dependencies: is-obj "^1.0.0" +deep-equal@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" @@ -1487,6 +1560,17 @@ defaults@^1.0.0: dependencies: clone "^1.0.2" +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +defined@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" @@ -1549,10 +1633,6 @@ doctrine@^2.0.0: esutils "^2.0.2" isarray "^1.0.0" -dom-walk@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - domain-browser@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" @@ -1596,9 +1676,9 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -electron-to-chromium@^1.3.11, electron-to-chromium@^1.3.17: - version "1.3.17" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.17.tgz#41c13457cc7166c5c15e767ae61d86a8cacdee5d" +electron-to-chromium@^1.3.11, electron-to-chromium@^1.3.18: + version "1.3.21" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.21.tgz#a967ebdcfe8ed0083fc244d1894022a8e8113ea2" elliptic@^6.0.0: version "6.4.0" @@ -1655,9 +1735,27 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.5.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.8.2.tgz#25103263dc4decbda60e0c737ca32313518027ee" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.26" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.26.tgz#51b2128a531b70c4f6764093a73cbebb82186372" + version "0.10.30" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.30.tgz#7141a16836697dbabfaaaeee41495ce29f52c939" dependencies: es6-iterator "2" es6-symbol "~3.1" @@ -1740,13 +1838,13 @@ eslint-scope@^3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint@4.4.0, eslint@^4.0.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.4.0.tgz#a3e153e704b64f78290ef03592494eaba228d3bc" +eslint@4.6.1, eslint@^4.0.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.6.1.tgz#ddc7fc7fd70bf93205b0b3449bb16a1e9e7d4950" dependencies: ajv "^5.2.0" babel-code-frame "^6.22.0" - chalk "^1.1.3" + chalk "^2.1.0" concat-stream "^1.6.0" cross-spawn "^5.1.0" debug "^2.6.8" @@ -1777,6 +1875,7 @@ eslint@4.4.0, eslint@^4.0.0: progress "^2.0.0" require-uncached "^1.0.3" semver "^5.3.0" + strip-ansi "^4.0.0" strip-json-comments "~2.0.1" table "^4.0.1" text-table "~0.2.0" @@ -1840,11 +1939,12 @@ events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" -evp_bytestokey@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53" +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" dependencies: - create-hash "^1.1.1" + md5.js "^1.3.4" + safe-buffer "^5.1.1" execa@^0.7.0: version "0.7.0" @@ -2013,6 +2113,12 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +for-each@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" + dependencies: + is-function "~1.0.0" + for-in@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2029,6 +2135,10 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -2091,6 +2201,10 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" +function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" @@ -2187,7 +2301,7 @@ glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: +glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -2222,14 +2336,11 @@ global-prefix@^0.1.4: is-windows "^0.2.0" which "^1.2.12" -global@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - dependencies: - min-document "^2.19.0" - process "~0.5.1" +globals@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-10.1.0.tgz#4425a1881be0d336b4a823a82a7be725d5dd987c" -globals@^9.0.0, globals@^9.17.0: +globals@^9.17.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -2301,11 +2412,11 @@ gulp-chmod@2.0.0: stat-mode "^0.2.0" through2 "^2.0.0" -gulp-clean-css@3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.7.0.tgz#54b33526dc899930949fb37b4cacf851c5d5d93b" +gulp-clean-css@3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.8.0.tgz#3f7c17975fb8f3d311051e880d7ac99cd387d7ef" dependencies: - clean-css "4.1.7" + clean-css "4.1.8" gulp-util "3.0.8" through2 "2.0.3" vinyl-sourcemaps-apply "0.2.1" @@ -2590,12 +2701,25 @@ has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +has@^1.0.1, has@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + hash-base@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" dependencies: inherits "^2.0.1" +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.3" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" @@ -2648,6 +2772,10 @@ http-errors@~1.3.1: inherits "~2.0.1" statuses "1" +http-parser-js@>=0.4.0: + version "0.4.6" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.6.tgz#195273f58704c452d671076be201329dd341dc55" + http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -2665,8 +2793,8 @@ iconv-lite@0.4.13: resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" iconv-lite@^0.4.17, iconv-lite@~0.4.13: - version "0.4.18" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2" + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" ieee754@^1.1.4: version "1.1.8" @@ -2677,8 +2805,8 @@ ifvisible.js@1.0.6: resolved "https://registry.yarnpkg.com/ifvisible.js/-/ifvisible.js-1.0.6.tgz#52eb151ce89c56f15316226462e892d1f8451261" ignore@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" + version "3.3.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" image-size@~0.5.0: version "0.5.5" @@ -2726,8 +2854,8 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" inquirer@^3.0.6: - version "3.2.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.1.tgz#06ceb0f540f45ca548c17d6840959878265fa175" + version "3.2.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.3.tgz#1c7b1731cf77b934ec47d22c9ac5aa8fe7fbe095" dependencies: ansi-escapes "^2.0.0" chalk "^2.0.0" @@ -2745,8 +2873,8 @@ inquirer@^3.0.6: through "^2.3.6" interpret@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + version "1.0.4" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" invariant@^2.2.0, invariant@^2.2.2: version "2.2.2" @@ -2785,6 +2913,14 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" @@ -2823,6 +2959,10 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" +is-function@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -2885,6 +3025,12 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + is-relative@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" @@ -2901,6 +3047,10 @@ is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -2935,7 +3085,7 @@ isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" -isobject@^2.0.0, isobject@^2.1.0: +isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" dependencies: @@ -2960,6 +3110,12 @@ jasmine-reporters@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-0.2.1.tgz#395f6e5170692de1a966cd95a70d7a37bf3f2bc3" +jquery-backstretch@2.1.16: + version "2.1.16" + resolved "https://registry.yarnpkg.com/jquery-backstretch/-/jquery-backstretch-2.1.16.tgz#4ee7547dcb85cf69eed2639cac0c9131651dc5e7" + dependencies: + jquery "^3.1.1" + jquery-lazyload@1.9.7: version "1.9.7" resolved "https://registry.yarnpkg.com/jquery-lazyload/-/jquery-lazyload-1.9.7.tgz#9982b388c533c0b611214b3c5aaa0b9fede071f7" @@ -2974,12 +3130,6 @@ jquery-scrollstop@1.2.0: dependencies: jquery ">=1.2.3" -jquery.backstretch@2.1.15: - version "2.1.15" - resolved "https://registry.yarnpkg.com/jquery.backstretch/-/jquery.backstretch-2.1.15.tgz#991f99d83b8cbd74e65ca1e1b3fc41d251d4570e" - dependencies: - jquery "^3.1.1" - jquery@2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.4.tgz#2c89d6889b5eac522a7eea32c14521559c6cbf02" @@ -2992,13 +3142,13 @@ js-cookie@2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.1.4.tgz#da4ec503866f149d164cf25f579ef31015025d8d" -js-tokens@^3.0.0: +js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" js-yaml@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.9.1.tgz#08775cebdfdd359209f0d2acd383c8f86a6904a0" + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -3588,6 +3738,13 @@ matchmedia-polyfill@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/matchmedia-polyfill/-/matchmedia-polyfill-0.3.0.tgz#6f91e34012b3dfc9d5b76cec89deafc1b41b45fa" +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -3651,30 +3808,24 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@~1.29.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.29.0.tgz#48d26d235589651704ac5916ca06001914266878" +mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.7: - version "2.1.16" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.16.tgz#2b858a52e5ecd516db897ac2be87487830698e23" + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: - mime-db "~1.29.0" + mime-db "~1.30.0" mime@^1.2.11: - version "1.3.6" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" + version "1.4.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.0.tgz#69e9e0db51d44f2a3b56e48b7817d7d137f1a343" mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - dependencies: - dom-walk "^0.1.0" - mini-lr@^0.1.8: version "0.1.9" resolved "https://registry.yarnpkg.com/mini-lr/-/mini-lr-0.1.9.tgz#02199d27347953d1fd1d6dbded4261f187b2d0f6" @@ -3728,7 +3879,7 @@ minimist@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -3770,8 +3921,8 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" nan@^2.3.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + version "2.7.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" natives@^1.1.0: version "1.1.0" @@ -3794,8 +3945,8 @@ node-emoji@^1.4.1: lodash.toarray "^4.4.0" node-fetch@^1.3.3: - version "1.7.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5" + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" dependencies: encoding "^0.1.11" is-stream "^1.0.1" @@ -3860,8 +4011,8 @@ node-notifier@^4.1.0: which "^1.0.5" node-pre-gyp@^0.6.36: - version "0.6.36" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + version "0.6.37" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.37.tgz#3c872b236b2e266e4140578fe1ee88f693323a05" dependencies: mkdirp "^0.5.1" nopt "^4.0.1" @@ -3870,6 +4021,7 @@ node-pre-gyp@^0.6.36: request "^2.81.0" rimraf "^2.6.1" semver "^5.3.0" + tape "^4.6.3" tar "^2.2.1" tar-pack "^3.4.0" @@ -3944,6 +4096,14 @@ object-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" +object-inspect@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.3.0.tgz#5b1eb8e6742e2ee83342a637034d844928ba2f6d" + +object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" @@ -3965,10 +4125,10 @@ object.omit@^2.0.0: is-extendable "^0.1.1" object.pick@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.2.0.tgz#b5392bee9782da6d9fb7d6afaf539779f1234c2b" + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" dependencies: - isobject "^2.1.0" + isobject "^3.0.1" on-finished@~2.3.0: version "2.3.0" @@ -3994,9 +4154,9 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -openpgp@2.5.8: - version "2.5.8" - resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-2.5.8.tgz#b12d7abe8bf73e23cb199a53696d77a1d9ddb05b" +openpgp@2.5.10: + version "2.5.10" + resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-2.5.10.tgz#f5e9ee3c9c008bd5e3a030365e0a4b20a152d1a4" dependencies: node-fetch "^1.3.3" node-localstorage "~1.3.0" @@ -4117,8 +4277,8 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" parseurl@~1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" path-browserify@0.0.0: version "0.0.0" @@ -4134,7 +4294,7 @@ path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -4181,8 +4341,8 @@ pause-stream@0.0.11: through "~2.3" pbkdf2@^3.0.3: - version "3.0.13" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.13.tgz#c37d295531e786b1da3e3eadc840426accb0ae25" + version "3.0.14" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -4228,13 +4388,13 @@ postcss-value-parser@^3.2.3: version "3.3.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" -postcss@^6.0.1, postcss@^6.0.6: - version "6.0.8" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.8.tgz#89067a9ce8b11f8a84cbc5117efc30419a0857b3" +postcss@^6.0.1, postcss@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.11.tgz#f48db210b1d37a7f7ab6499b7a54982997ab6f72" dependencies: - chalk "^2.0.1" - source-map "^0.5.6" - supports-color "^4.2.0" + chalk "^2.1.0" + source-map "^0.5.7" + supports-color "^4.4.0" prelude-ls@~1.1.2: version "1.1.2" @@ -4254,7 +4414,7 @@ pretty-hrtime@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" -private@^0.1.6: +private@^0.1.6, private@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -4266,10 +4426,6 @@ process@^0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" @@ -4456,24 +4612,23 @@ regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" -regenerator-runtime@^0.10.0: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" +regenerator-runtime@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" -regenerator-transform@0.9.11: - version "0.9.11" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" dependencies: babel-runtime "^6.18.0" babel-types "^6.19.0" private "^0.1.6" regex-cache@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" dependencies: is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" regexpu-core@^2.0.0: version "2.0.0" @@ -4494,8 +4649,8 @@ regjsparser@^0.1.4: jsesc "~0.5.0" remove-trailing-separator@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511" + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" repeat-element@^1.1.2: version "1.1.2" @@ -4516,8 +4671,8 @@ replace-ext@0.0.1: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" replacestream@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.2.tgz#0c4140707e4f0323f50de044851708cf58bc37bd" + version "4.0.3" + resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36" dependencies: escape-string-regexp "^1.0.3" object-assign "^4.0.1" @@ -4584,7 +4739,7 @@ resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.3: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.3, resolve@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" dependencies: @@ -4597,9 +4752,11 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -rifraf@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/rifraf/-/rifraf-2.0.3.tgz#8ceba761d2e88411232f272a2e06eb98e4fa2a8a" +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + dependencies: + through "~2.3.4" right-align@^0.1.1: version "0.1.3" @@ -4607,9 +4764,9 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@2.6.1, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" +rimraf@2, rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" @@ -4643,7 +4800,7 @@ rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -4694,8 +4851,8 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" shellwords@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" sigmund@~1.0.0: version "1.0.1" @@ -4731,15 +4888,15 @@ source-list-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" -source-map-support@^0.4.2: - version "0.4.15" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" dependencies: source-map "^0.5.6" -source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@0.5.x, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.3: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" sparkles@^1.0.0: version "1.0.0" @@ -4854,6 +5011,14 @@ string-width@^2.0.0, string-width@^2.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string.prototype.trim@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + function-bind "^1.0.2" + string_decoder@^0.10.25, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -4932,9 +5097,9 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^4.0.0, supports-color@^4.2.0, supports-color@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.1.tgz#65a4bb2631e90e02420dba5554c375a4754bb836" +supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" dependencies: has-flag "^2.0.0" @@ -4953,6 +5118,24 @@ tapable@^0.2.7: version "0.2.8" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" +tape@^4.6.3: + version "4.8.0" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.8.0.tgz#f6a9fec41cc50a1de50fa33603ab580991f6068e" + dependencies: + deep-equal "~1.0.1" + defined "~1.0.0" + for-each "~0.3.2" + function-bind "~1.1.0" + glob "~7.1.2" + has "~1.0.1" + inherits "~2.0.3" + minimist "~1.2.0" + object-inspect "~1.3.0" + resolve "~1.4.0" + resumer "~0.0.0" + string.prototype.trim "~1.1.2" + through "~2.3.8" + tar-pack@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" @@ -5026,7 +5209,7 @@ through2@~0.4: readable-stream "~1.0.17" xtend "~2.1.1" -through@2, through@^2.3.6, through@~2.3, through@~2.3.1: +through@2, through@^2.3.6, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -5041,10 +5224,9 @@ time-stamp@^1.0.0: resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" timers-browserify@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.3.tgz#41fd0bdc926a5feedc33a17a8e1f7d491925f7fc" + version "2.0.4" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6" dependencies: - global "^4.3.2" setimmediate "^1.0.4" tmp@^0.0.31: @@ -5057,10 +5239,14 @@ to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" -to-fast-properties@^1.0.1: +to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + tough-cookie@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" @@ -5120,8 +5306,8 @@ uglify-js@^2.8.22, uglify-js@^2.8.29: uglify-to-browserify "~1.0.0" uglify-js@^3.0.5: - version "3.0.27" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.27.tgz#a97db8c8ba6b9dba4e2f88d86aa9548fa6320034" + version "3.1.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.0.tgz#92fae17b88dfbc3c394175a935044cdbcf4085ae" dependencies: commander "~2.11.0" source-map "~0.5.1" @@ -5273,9 +5459,9 @@ webpack-sources@^1.0.1: source-list-map "^2.0.0" source-map "~0.5.3" -webpack@3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.4.1.tgz#4c3f4f3fb318155a4db0cb6a36ff05c5697418f4" +webpack@3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.6.0.tgz#a89a929fbee205d35a4fa2cc487be9cbec8898bc" dependencies: acorn "^5.0.0" acorn-dynamic-import "^2.0.0" @@ -5301,14 +5487,15 @@ webpack@3.4.1: yargs "^8.0.2" websocket-driver@>=0.3.6: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" dependencies: + http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + version "0.1.2" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.2.tgz#0e18781de629a18308ce1481650f67ffa2693a5d" when@^3.7.8: version "3.7.8" From 350e0655750bf9264bf3a61705db83a68d344e7e Mon Sep 17 00:00:00 2001 From: RainLoop Date: Fri, 15 Sep 2017 20:31:36 +0300 Subject: [PATCH 09/83] Fix package.json --- package-lock.json | 6727 +++++++++++++++++ package.json | 1 + .../v/0.0.0/app/localization/admin/sk_SK.yml | 204 + 3 files changed, 6932 insertions(+) create mode 100644 package-lock.json create mode 100644 rainloop/v/0.0.0/app/localization/admin/sk_SK.yml diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..0b8169c3c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6727 @@ +{ + "name": "rainloop", + "version": "1.11.1", + "lockfileVersion": 1, + "dependencies": { + "accord": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/accord/-/accord-0.27.3.tgz", + "integrity": "sha1-f7kSlwkoXK6oTrNyxOiCAxtxOOg=", + "dev": true, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true + } + } + }, + "acorn": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", + "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", + "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", + "dev": true + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true + }, + "ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "ansicolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-slice": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", + "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true, + "optional": true + }, + "asn1.js": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", + "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "dev": true + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true + }, + "autolinker": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-1.4.4.tgz", + "integrity": "sha1-hKqqm7B8eU8IVc1wQaMe7G9vqMo=", + "dev": true + }, + "autoprefixer": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.4.tgz", + "integrity": "sha512-MB1XybOJqu1uAwpfSilAa1wSURNc4W310CFKvMj1fNaJBFxr1PGgz72vZaPr9ryKGqs2vYZ6jDyJ0aiGELjsoA==", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, + "optional": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true + }, + "babel-eslint": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.0.0.tgz", + "integrity": "sha512-tN1B3adZ3tw8pr9oGsZ18iKCbdKBSvsn9ab6cGdbED+61LpGLhIVcf76eh59XejbdRLTBe+OYezxmYIaTgPiYA==", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true + }, + "babel-code-frame": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.0.tgz", + "integrity": "sha512-/xr1ADm5bnTjjN+xwoXb7lF4v2rnxMzNZzFU7h8SxB+qB6+IqSTOOqVcpaPTUC2Non/MbQxS3OIZnJpQ2X21aQ==", + "dev": true + }, + "babel-messages": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-7.0.0-beta.0.tgz", + "integrity": "sha512-eXdShsm9ZTh9AQhlIaAn6HR3xWpxCnK9ZwIDA9QyjnwTgMctGxHHflw4b4RJ3/ZjTL0Vrmvm0tQXPkp49mTAUw==", + "dev": true + }, + "babel-traverse": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.0.tgz", + "integrity": "sha512-IKzuTqUcQtMRZ0Vv5RjIrGGj33eBKmNTNeRexWSyjPPuAciyNkva1rt7WXPfHfkb+dX7coRAIUhzeTUEzhnwdA==", + "dev": true + }, + "babel-types": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.0.tgz", + "integrity": "sha512-rJc2kV9iPJGLlqIY71AM3nPcdkoeLRCDuR07GFgfd3lFl4TsBQq76TxYQQIZ2MONg1HpsqmuoCXr9aZ1Oa4wYw==", + "dev": true + }, + "babylon": { + "version": "7.0.0-beta.22", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.22.tgz", + "integrity": "sha512-Yl7iT8QGrS8OfR7p6R12AJexQm+brKwrryai4VWZ7NHUbPoZ5al3+klhvl/14shXZiLa7uK//OIFuZ1/RKHgoA==", + "dev": true + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true + }, + "debug": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.0.1.tgz", + "integrity": "sha512-6nVc6S36qbt/mutyt+UGMnawAMrPDZUPQjRZI3FS9tCtDRhvxJbK79unYBLPi+z5SLXQ3ftoVBFCblQtNSls8w==", + "dev": true + }, + "globals": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-10.1.0.tgz", + "integrity": "sha1-RCWhiBvg0za0qCOoKnvnJdXdmHw=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "dependencies": { + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true + } + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true + }, + "babel-helper-function-name": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.0.tgz", + "integrity": "sha512-DaQccFBBWBEzMdqbKmNXamY0m1yLHJGOdbbEsNoGdJrrU7wAF3wwowtDDPzF0ZT3SqJXPgZW/P2kgBX9moMuAA==", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true + }, + "babel-code-frame": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.0.tgz", + "integrity": "sha512-/xr1ADm5bnTjjN+xwoXb7lF4v2rnxMzNZzFU7h8SxB+qB6+IqSTOOqVcpaPTUC2Non/MbQxS3OIZnJpQ2X21aQ==", + "dev": true + }, + "babel-messages": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-7.0.0-beta.0.tgz", + "integrity": "sha512-eXdShsm9ZTh9AQhlIaAn6HR3xWpxCnK9ZwIDA9QyjnwTgMctGxHHflw4b4RJ3/ZjTL0Vrmvm0tQXPkp49mTAUw==", + "dev": true + }, + "babel-template": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.0.tgz", + "integrity": "sha512-tmdH+MmmU0F6Ur8humpevSmFzYKbrN3Oru0g5Qyg4R6+sxjnzZmnvzUbsP0aKMr7tB0Ua6xhEb9arKTOsEMkyA==", + "dev": true + }, + "babel-traverse": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.0.tgz", + "integrity": "sha512-IKzuTqUcQtMRZ0Vv5RjIrGGj33eBKmNTNeRexWSyjPPuAciyNkva1rt7WXPfHfkb+dX7coRAIUhzeTUEzhnwdA==", + "dev": true + }, + "babel-types": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.0.tgz", + "integrity": "sha512-rJc2kV9iPJGLlqIY71AM3nPcdkoeLRCDuR07GFgfd3lFl4TsBQq76TxYQQIZ2MONg1HpsqmuoCXr9aZ1Oa4wYw==", + "dev": true + }, + "babylon": { + "version": "7.0.0-beta.22", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.22.tgz", + "integrity": "sha512-Yl7iT8QGrS8OfR7p6R12AJexQm+brKwrryai4VWZ7NHUbPoZ5al3+klhvl/14shXZiLa7uK//OIFuZ1/RKHgoA==", + "dev": true + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true + }, + "debug": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.0.1.tgz", + "integrity": "sha512-6nVc6S36qbt/mutyt+UGMnawAMrPDZUPQjRZI3FS9tCtDRhvxJbK79unYBLPi+z5SLXQ3ftoVBFCblQtNSls8w==", + "dev": true + }, + "globals": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-10.1.0.tgz", + "integrity": "sha1-RCWhiBvg0za0qCOoKnvnJdXdmHw=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "babel-helper-get-function-arity": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.0.tgz", + "integrity": "sha512-csqAic15/2Vm1951nJxkkL9K8E6ojyNF/eAOjk7pqJlO8kvgrccGNFCV9eDwcGHDPe5AjvJGwVSAcQ5fit9wuA==", + "dev": true, + "dependencies": { + "babel-types": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.0.tgz", + "integrity": "sha512-rJc2kV9iPJGLlqIY71AM3nPcdkoeLRCDuR07GFgfd3lFl4TsBQq76TxYQQIZ2MONg1HpsqmuoCXr9aZ1Oa4wYw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "dependencies": { + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true + } + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true + }, + "babel-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", + "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", + "dev": true + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-do-expressions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", + "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "dev": true + }, + "babel-plugin-syntax-function-bind": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", + "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "dev": true + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "dependencies": { + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true + } + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true + }, + "babel-plugin-transform-decorators-legacy": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz", + "integrity": "sha1-dBtY9sW86eYCfgiC2cmU8E82aSU=", + "dev": true + }, + "babel-plugin-transform-do-expressions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", + "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", + "dev": true + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "dependencies": { + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true + } + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "dependencies": { + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true + } + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "dependencies": { + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true + } + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true + }, + "babel-plugin-transform-function-bind": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", + "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", + "dev": true + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true + }, + "babel-plugin-transform-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "dev": true + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true + }, + "babel-preset-env": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.0.tgz", + "integrity": "sha512-OVgtQRuOZKckrILgMA5rvctvFZPv72Gua9Rt006AiPoB0DJKGN07UmaQA+qRrYgK71MVct8fFhT0EyNWYorVew==", + "dev": true + }, + "babel-preset-stage-0": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", + "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", + "dev": true + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true + }, + "bean": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/bean/-/bean-0.4.11.tgz", + "integrity": "sha1-VEwrzbEiPkUaDOTZsTq1n3XLsbs=", + "dev": true + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", + "dev": true + }, + "binaryextensions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz", + "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=", + "dev": true + }, + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", + "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", + "dev": true, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", + "dev": true + } + } + }, + "bonzo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/bonzo/-/bonzo-1.4.0.tgz", + "integrity": "sha1-19Lgb2tvZ+s7j8GHdPeQWPSrNN8=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.8.tgz", + "integrity": "sha512-WYCMOT/PtGTlpOKFht0YJFYcPy6pLCR98CtWfzK13zoynLlBMvAdEMSRGmgnJCw2M2j/5qxBkinZQFobieM8dQ==", + "dev": true + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true + }, + "browserslist": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.4.0.tgz", + "integrity": "sha512-aM2Gt4x9bVlCUteADBS6JP0F+2tMWKM1jQzUulVROtdFWFIcIVvY76AJbr7GDqy0eDhn+PcnpzzivGxY4qiaKQ==", + "dev": true + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true + }, + "caniuse-db": { + "version": "1.0.30000671", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000671.tgz", + "integrity": "sha1-nwcbvHuWmUY4zLr0eCnVihV3qO0=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000730", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000730.tgz", + "integrity": "sha1-JqFP8bO/wfHLTadcLHNFGz8a3ho=", + "dev": true + }, + "cardinal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", + "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true + } + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "classnames": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", + "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=", + "dev": true + }, + "clean-css": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.8.tgz", + "integrity": "sha1-BhRVsklKdQrJj0bY1euxfGeeqdE=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true + }, + "cli-usage": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/cli-usage/-/cli-usage-0.1.4.tgz", + "integrity": "sha1-fAHg3HBsI0s5yTODjI4gshdXduI=", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true + }, + "concat-with-sourcemaps": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz", + "integrity": "sha1-9Vs74q60dgGxCi1SWcz7cP0vHdY=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.0.1.tgz", + "integrity": "sha1-lyjjg7lDFgUNDHRjlY8rhcCqggA=", + "dev": true, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true + } + } + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true + }, + "crypto-browserify": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", + "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", + "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", + "dev": true + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-assign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", + "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true + }, + "detect-file": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", + "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "domready": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/domready/-/domready-0.3.0.tgz", + "integrity": "sha1-s3QPrL0JFjAYFS0SrsI5OD4QIXU=", + "dev": true + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "duplexify": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", + "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", + "dev": true, + "dependencies": { + "end-of-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "dev": true + } + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.21", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.21.tgz", + "integrity": "sha1-qWfr3P6O0Ag/wkTRiUAiqOgRPqI=", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true + } + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true + }, + "es5-ext": { + "version": "0.10.30", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", + "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", + "dev": true + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true + }, + "es6-promise-polyfill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz", + "integrity": "sha1-84kl8jyz4+jObNqP93T867sJDN4=", + "dev": true + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true + }, + "eslint": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.6.1.tgz", + "integrity": "sha1-3cf8f9cL+TIFsLNEm7FqHp59SVA=", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true + } + } + }, + "eslint-plugin-compat": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-1.0.4.tgz", + "integrity": "sha512-16yjDdjrivRQT7/Kov+3O6DMvfg8WYC1JKPAsvf/UNtdLBeMXVYATohAM4nOak1ynGP69mKUlOjw7nroUqY9Sg==", + "dev": true, + "dependencies": { + "browserslist": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.1.4.tgz", + "integrity": "sha1-zFJq9KExK30uBWU+VtDIq3DA4FM=", + "dev": true + } + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true + }, + "espree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", + "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", + "dev": true + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "external-editor": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", + "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", + "dev": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "faye-websocket": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.7.3.tgz", + "integrity": "sha1-zEB0x/Sk39A69U3WXDVLE1EyzhE=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true + }, + "findup-sync": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", + "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", + "dev": true, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true + } + } + }, + "fined": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "dev": true, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true + } + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", + "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", + "dev": true + }, + "flat-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "fork-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz", + "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, + "fs-extra": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "bundled": true, + "dev": true, + "optional": true + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "optional": true + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true + } + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true + } + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true + } + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true + } + } + }, + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + } + } + }, + "gulp-autoprefixer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-4.0.0.tgz", + "integrity": "sha1-4AqMVxuF0GUWrCY0G+kN/Z/B6rA=", + "dev": true + }, + "gulp-cached": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gulp-cached/-/gulp-cached-1.1.1.tgz", + "integrity": "sha1-/nzU+H83YB5gc8/t7lwr2vi2rM4=", + "dev": true + }, + "gulp-chmod": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", + "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", + "dev": true + }, + "gulp-clean-css": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.8.0.tgz", + "integrity": "sha512-R96U/umCB+XfmMNQ/VOPqMYHY9m+VeDCk9iv9Y7ysOx4dlX2Zkw1xDsO0vo7AzokARtQPEY7u1xm4/x6v7oABg==", + "dev": true + }, + "gulp-concat-util": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/gulp-concat-util/-/gulp-concat-util-0.5.5.tgz", + "integrity": "sha1-yPBjO05ulQ/5PEdbPI07hL4Dt9w=", + "dev": true + }, + "gulp-eol": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/gulp-eol/-/gulp-eol-0.1.2.tgz", + "integrity": "sha1-omgYKFzVVDidguk76bPQ5Q09vqM=", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true + }, + "gulp-util": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", + "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", + "dev": true, + "dependencies": { + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true + } + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", + "dev": true + }, + "lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "dev": true + }, + "lodash.escape": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "dev": true + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true + }, + "lodash.template": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "dev": true + }, + "lodash.templatesettings": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "dev": true + }, + "minimist": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "dev": true, + "dependencies": { + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "dev": true + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "gulp-eslint": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-4.0.0.tgz", + "integrity": "sha512-+qsePo04v1O3JshpNvww9+bOgZEJ6Cc2/w3mEktfKz0NL0zsh1SWzjyIL2FIM2zzy6IYQYv+j8REZORF8dKX4g==", + "dev": true + }, + "gulp-expect-file": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/gulp-expect-file/-/gulp-expect-file-0.0.7.tgz", + "integrity": "sha1-kT5zHbDdb1hmFJukAK2DXrNGI60=", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true + }, + "gulp-util": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", + "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", + "dev": true, + "dependencies": { + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true + } + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", + "dev": true + }, + "lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "dev": true + }, + "lodash.escape": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "dev": true + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true + }, + "lodash.template": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "dev": true + }, + "lodash.templatesettings": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true + }, + "minimist": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "dev": true, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "dev": true + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "gulp-filter": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.0.1.tgz", + "integrity": "sha512-5olRzAhFdXB2klCu1lnazP65aO9YdA/5WfC9VdInIc8PrUeDIoZfaA3Edb0yUBGhVdHv4eHKL9Fg5tUoEJ9z5A==", + "dev": true + }, + "gulp-header": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.9.tgz", + "integrity": "sha1-yfEP7gYy2B6Tl4nG7PRaFRvzCYs=", + "dev": true + }, + "gulp-if": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz", + "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=", + "dev": true + }, + "gulp-less": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-3.3.2.tgz", + "integrity": "sha1-9mNq3MZhUKiQJxn6WZY/x/hipJo=", + "dev": true + }, + "gulp-livereload": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/gulp-livereload/-/gulp-livereload-3.8.1.tgz", + "integrity": "sha1-APdEstdJ0+njdGWJyKRKysd5tQ8=", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true + } + } + }, + "gulp-match": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz", + "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=", + "dev": true + }, + "gulp-notify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-notify/-/gulp-notify-3.0.0.tgz", + "integrity": "sha1-oEuK+azb5OY8hFZ4zgw9MGlMWaM=", + "dev": true, + "dependencies": { + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "dev": true + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "dev": true + } + } + }, + "gulp-plumber": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-plumber/-/gulp-plumber-1.1.0.tgz", + "integrity": "sha1-8SF2wtBCL2AwbCQv/2oBo5T6ugk=", + "dev": true + }, + "gulp-rename": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", + "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", + "dev": true + }, + "gulp-replace": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.6.1.tgz", + "integrity": "sha1-Eb+Mj85TPjPi9qjy9DC5VboL4GY=", + "dev": true + }, + "gulp-rimraf": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/gulp-rimraf/-/gulp-rimraf-0.2.1.tgz", + "integrity": "sha1-nxeDrcXUiQ2KG+34NLyYnipWUDA=", + "dev": true + }, + "gulp-size": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gulp-size/-/gulp-size-2.1.0.tgz", + "integrity": "sha1-HCtk8X+QcdWr2Z0VS3s0gfj7oSg=", + "dev": true + }, + "gulp-stripbom": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/gulp-stripbom/-/gulp-stripbom-1.0.4.tgz", + "integrity": "sha1-WMHQPoXgCKeqtH2BsSl8jBvIKOs=", + "dev": true, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "gulp-through": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/gulp-through/-/gulp-through-0.4.0.tgz", + "integrity": "sha1-ZGOyn2eMeIVAtjqmobrVvYVSrm0=", + "dev": true, + "dependencies": { + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true + } + } + }, + "gulp-uglify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.0.tgz", + "integrity": "sha1-DfAzHXKg0wLj434QlIXd3zPG0co=", + "dev": true, + "dependencies": { + "uglify-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.0.tgz", + "integrity": "sha512-PGUXuTJ5AkrfPsyg0L9/LD+BWYm9feVngbWpW5bg7Q3B7hqDM3xz00tNby4yY0CqjrLTF6CP9wpb/aNITRuSXg==", + "dev": true + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "gulp-zip": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-4.0.0.tgz", + "integrity": "sha1-HO/Ai0vzbfS1sefGs27lXrvkqIE=", + "dev": true + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true + }, + "gzip-size": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "optional": true, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "optional": true + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "dev": true + }, + "http-parser-js": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.6.tgz", + "integrity": "sha1-GVJz9YcExFLWcQdr4gEyndNB3FU=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "ifvisible.js": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/ifvisible.js/-/ifvisible.js-1.0.6.tgz", + "integrity": "sha1-UusVHOicVvFTFiJkYuiS0fhFEmE=", + "dev": true + }, + "ignore": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", + "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "indx": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", + "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "inquirer": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.3.tgz", + "integrity": "sha512-Bc3KbimpDTOeQdDj18Ir/rlsGuhBSSNqdOnxaAuKhpkdnMMuKsEGbZD2v5KFF9oso2OU+BPh7+/u5obmFDRmWw==", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true + } + } + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "dev": true + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "dev": true + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": true + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "optional": true + }, + "istextorbinary": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz", + "integrity": "sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=", + "dev": true + }, + "jasmine-reporters": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-0.2.1.tgz", + "integrity": "sha1-OV9uUXBpLeGpZs2Vpw16N78/K8M=", + "dev": true + }, + "jquery": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", + "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=", + "dev": true + }, + "jquery-backstretch": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/jquery-backstretch/-/jquery-backstretch-2.1.16.tgz", + "integrity": "sha512-dN99jdyS1TIKGHJzn29+wBgKEqYHa1jp002pgdNP+R4JXtrFZMjp7ezRhRdp9n2Y4t40hG1MRBce/dFIWFbrEw==", + "dev": true, + "dependencies": { + "jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", + "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=", + "dev": true + } + } + }, + "jquery-lazyload": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/jquery-lazyload/-/jquery-lazyload-1.9.7.tgz", + "integrity": "sha1-mYKziMUzwLYRIUs8WqoLn+3gcfc=", + "dev": true + }, + "jquery-mousewheel": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz", + "integrity": "sha1-BvAzXxbjU6aV5yBr9QUDy1I6buU=", + "dev": true + }, + "jquery-scrollstop": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/jquery-scrollstop/-/jquery-scrollstop-1.2.0.tgz", + "integrity": "sha1-8YJ6Jc8SiH2WXAhdinUDVlWzdmM=", + "dev": true + }, + "js-cookie": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.1.4.tgz", + "integrity": "sha1-2k7FA4ZvFJ0WTPJfV57zEBUCXY0=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jschardet": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", + "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "optional": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true + }, + "knockout": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/knockout/-/knockout-3.4.2.tgz", + "integrity": "sha1-6HlY3netHpNvfOZFuri118RW2Tc=", + "dev": true + }, + "knockout-projections": { + "version": "github:stevesanderson/knockout-projections#01cb07b27b305c0240de7aa92687110e68432706", + "dev": true, + "dependencies": { + "knockout": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/knockout/-/knockout-3.0.0.tgz", + "integrity": "sha1-/Y1D7kRiN83n32UPXH289orkmoA=", + "dev": true + } + } + }, + "knockout-sortable": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/knockout-sortable/-/knockout-sortable-0.14.1.tgz", + "integrity": "sha1-vfQEEkUZaXKdDdN8YbtzM83Ubh4=", + "dev": true + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true + }, + "less": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.2.tgz", + "integrity": "sha1-No1sxz4fsDmBGDKAkYdDxdz5s98=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true + }, + "liftoff": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", + "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", + "dev": true + }, + "lightgallery": { + "version": "1.2.21", + "resolved": "https://registry.npmjs.org/lightgallery/-/lightgallery-1.2.21.tgz", + "integrity": "sha1-j0uiahuZvFg1B+sVQCkbFWqpCq8=", + "dev": true + }, + "livereload-js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.2.2.tgz", + "integrity": "sha1-bIclfmSKtHW8JOoldFftzB+NC8I=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", + "dev": true + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true + }, + "lodash._baseclone": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", + "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "dev": true + }, + "lodash._escapehtmlchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "dev": true + }, + "lodash._escapestringchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", + "dev": true + }, + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "dev": true, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true + } + } + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "dev": true + }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "dev": true + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", + "dev": true + }, + "lodash.clonedeep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", + "integrity": "sha1-oKHkDYKl6on/WxR7hETtY9koJ9s=", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", + "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=", + "dev": true + }, + "lodash.partialright": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", + "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "lodash.values": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "dev": true, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true + } + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true + }, + "make-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", + "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "dev": true + }, + "make-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", + "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", + "dev": true + }, + "make-error-cause": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", + "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "marked": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", + "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", + "dev": true + }, + "marked-terminal": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-1.7.0.tgz", + "integrity": "sha1-yMRgiBx3LHYEtkNnAH7l938SWQQ=", + "dev": true, + "dependencies": { + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + } + } + }, + "matchmedia-polyfill": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/matchmedia-polyfill/-/matchmedia-polyfill-0.3.0.tgz", + "integrity": "sha1-b5HjQBKz38nVt2zsid6vwbQbRfo=", + "dev": true + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true + } + } + }, + "miller-rabin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", + "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", + "dev": true + }, + "mime": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.0.tgz", + "integrity": "sha512-n9ChLv77+QQEapYz8lV+rIZAW3HhAPW2CXnzb1GN5uMkuczshwvkW7XPsbzU0ZQN3sP47Er2KVkp2p3KyqZKSQ==", + "dev": true, + "optional": true + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "mini-lr": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/mini-lr/-/mini-lr-0.1.9.tgz", + "integrity": "sha1-AhmdJzR5U9H9HW297UJh8Yey0PY=", + "dev": true, + "dependencies": { + "qs": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.2.5.tgz", + "integrity": "sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw=", + "dev": true + } + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true + }, + "moment": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", + "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", + "dev": true, + "optional": true + }, + "natives": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", + "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", + "dev": true + }, + "node-emoji": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", + "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", + "dev": true + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true + }, + "node-fs": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz", + "integrity": "sha1-MjI8zLRsn78PwRgS1FAhzDHTJbs=", + "dev": true + }, + "node-libs-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", + "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", + "dev": true, + "dependencies": { + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "node-localstorage": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.0.tgz", + "integrity": "sha1-LkNqro3Mms6XtDxlwWwNV3vgpVw=", + "dev": true + }, + "node-notifier": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", + "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=", + "dev": true + }, + "node.extend": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", + "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize.css": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-7.0.0.tgz", + "integrity": "sha1-q/sd2CRwZ04DIrU86xqvQSk45L8=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true + }, + "openpgp": { + "version": "2.5.10", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-2.5.10.tgz", + "integrity": "sha1-9enuPJwAi9XjoDA2XgpLIKFS0aQ=", + "dev": true + }, + "opentip": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/opentip/-/opentip-2.4.3.tgz", + "integrity": "sha1-KjtQDCc4+AacM0Yu1Ita/pzoBOY=", + "dev": true + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-browserify": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true + }, + "parse-filepath": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", + "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pikaday": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pikaday/-/pikaday-1.6.1.tgz", + "integrity": "sha512-B+pxVcSGuzLblMe4dnhCF3dnI2zkyj5GAqanGX9cVcOk90fp2ULo1OZFUPRXQXUE5tmcimnk1tPOFs8tUHQetQ==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true + }, + "pluralize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-4.0.0.tgz", + "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", + "dev": true + }, + "postcss": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.11.tgz", + "integrity": "sha512-DsnIzznNRQprsGTALpkC0xjDygo+QcOd+qVjP9+RjyzrPiyYOXBGOwoJ4rAiiE4lu6JggQ/jW4niY24WLxuncg==", + "dev": true, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true + } + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-bytes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", + "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "private": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "Progress.js": { + "version": "github:usablica/progress.js#acba45829bfea7ba073aedca7d70fcf47e22317b", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "qwery": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/qwery/-/qwery-3.4.2.tgz", + "integrity": "sha1-fQrz689Ir1mfLtSY2M45Ajl4pj4=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "dev": true + }, + "raw-body": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", + "dev": true, + "dependencies": { + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "dev": true + } + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true + }, + "redeyed": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", + "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", + "dev": true, + "dependencies": { + "esprima": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", + "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", + "dev": true + } + } + }, + "regenerate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", + "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dev": true + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true + }, + "requireindex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", + "integrity": "sha1-5UBLgVV+91225JxacgBIk/4D4WI=", + "dev": true + }, + "reqwest": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/reqwest/-/reqwest-0.9.7.tgz", + "integrity": "sha1-EaLelwTcjVLJZ1Jl1xdxA/6/OmM=", + "dev": true + }, + "resolve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true + } + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true + }, + "run-sequence": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.1.0.tgz", + "integrity": "sha1-FJ2gElFvIdz3nbbcmaKpVgNjGyE=", + "dev": true + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", + "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simplestatemanager": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/simplestatemanager/-/simplestatemanager-3.4.0.tgz", + "integrity": "sha1-SkdBJfNPQGH0bdBYKPY6qZj+Bus=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true + }, + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "dependencies": { + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true + } + } + }, + "stream-consume": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", + "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", + "dev": true + }, + "stream-counter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz", + "integrity": "sha1-kc8lac5NxQYf6816yyY5SloRR1E=", + "dev": true + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamfilter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.5.tgz", + "integrity": "sha1-h1BxEb644phFFxe1Ec/tjwAqv1M=", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true + } + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", + "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "table": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", + "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", + "dev": true, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true + } + } + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "ternary-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz", + "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "textextensions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz", + "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", + "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "dev": true + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "optional": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true, + "optional": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true + }, + "watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "dev": true, + "dependencies": { + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "dev": true + } + } + }, + "webpack": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.6.0.tgz", + "integrity": "sha512-OsHT3D0W0KmPPh60tC7asNnOmST6bKTiR90UyEdT9QYoaJ4OYN4Gg7WK1k3VxHK07ZoiYWPsKvlS/gAjwL/vRA==", + "dev": true, + "dependencies": { + "ajv-keywords": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", + "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", + "dev": true + }, + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true + } + } + }, + "webpack-notifier": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.5.0.tgz", + "integrity": "sha1-wBAAfUSM68NN78mezyiPpejGuvY=", + "dev": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "node-notifier": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-4.6.1.tgz", + "integrity": "sha1-BW0UJE89zBzq3+aK+c/wxUc6M/M=", + "dev": true + } + } + }, + "webpack-sources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", + "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true + }, + "websocket-extensions": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.2.tgz", + "integrity": "sha1-Dhh4HeYpoYMIzhSBZQ9n/6JpOl0=", + "dev": true + }, + "when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yazl": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.2.tgz", + "integrity": "sha1-FMsZCD4eJacAksFYiqvg9OTdTYg=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 6aadaf3a0..b529b409c 100644 --- a/package.json +++ b/package.json @@ -121,4 +121,5 @@ "underscore": "1.8.3", "webpack": "3.6.0", "webpack-notifier": "1.5.0" + } } diff --git a/rainloop/v/0.0.0/app/localization/admin/sk_SK.yml b/rainloop/v/0.0.0/app/localization/admin/sk_SK.yml new file mode 100644 index 000000000..60ea44a4e --- /dev/null +++ b/rainloop/v/0.0.0/app/localization/admin/sk_SK.yml @@ -0,0 +1,204 @@ +sk_SK: + LOGIN: + LABEL_LOGIN: "Používateľské meno" + LABEL_PASSWORD: "Heslo" + BUTTON_LOGIN: "Prihlásiť sa do admin panelu" + TOP_PANEL: + LABEL_ADMIN_PANEL: "Admin Panel" + TABS_LABELS: + LABEL_GENERAL_NAME: "Všeobecné" + LABEL_LOGIN_NAME: "Používateľské meno" + LABEL_BRANDING_NAME: "Branding" + LABEL_CONTACTS_NAME: "Kontakty" + LABEL_DOMAINS_NAME: "Domény" + LABEL_SECURITY_NAME: "Zabezpečenie" + LABEL_INTEGRATION_NAME: "Integrácie" + LABEL_PACKAGES_NAME: "Balíčky" + LABEL_LICENSING_NAME: "Licencovanie" + LABEL_ABOUT_NAME: "O programe" + TAB_GENERAL: + LEGEND_INTERFACE: "Rozhranie" + LABEL_LANGUAGE: "Jazyk" + LABEL_LANGUAGE_ADMIN: "Jazyk (admin)" + LABEL_THEME: "Téma" + LEGEND_MAIN: "Všeobecné" + LABEL_ALLOW_TEMPLATES: "Povoliť šablóny" + ALERT_WARNING: "Upozornenie!" + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Prihlasovacia obrazovka" + LABEL_DEFAULT_DOMAIN: "Predvolená doména" + TAB_BRANDING: + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Používateľské meno" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Popis" + LABEL_LOGIN_BACKGROUND: "Pozadie" + LABEL_LOGIN_CUSTOM_CSS: "Vlastné CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Zobraziť link \"Powered by RainLoop\"" + LEGEND_USER: "Užívateľ" + LABEL_USER_LOGO: "Logo" + LABEL_USER_CUSTOM_CSS: "Vlastné CSS" + LEGEND_WELCOME_PAGE: "Uvítacia stránka" + LABEL_WELCOME_PAGE_TITLE: "Nadpis" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Zobraziť" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Žiadne" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Jednorázovo" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Vždy" + TAB_CONTACTS: + LEGEND_CONTACTS: "Kontakty" + LABEL_ENABLE_CONTACTS: "Zapnúť kontakty" + LABEL_STORAGE_TYPE: "Typ" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "Užívateľ" + LABEL_STORAGE_PASSWORD: "Heslo" + BUTTON_TEST: "Test" + TAB_DOMAINS: + LEGEND_DOMAINS: "Domény" + BUTTON_ADD_DOMAIN: "Pridať doménu" + BUTTON_ADD_ALIAS: "Pridať alias" + DELETE_ARE_YOU_SURE: "Ste si istí?" + TAB_SECURITY: + LEGEND_SECURITY: "Bezpečnosť" + LABEL_CURRENT_PASSWORD: "Súčasné heslo" + LABEL_NEW_PASSWORD: "Nové heslo" + LABEL_REPEAT_PASSWORD: "Opakovať" + LEGEND_SSL: "SSL" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_GOOGLE_AUTH: "Overenie" + LABEL_GOOGLE_CLIENT_ID: "ID klienta" + LABEL_GOOGLE_API_KEY: "Api kľúč" + LEGEND_FACEBOOK: "Facebook" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Povoliť Twitter intergáciu (overenie)" + LEGEND_DROPBOX: "Dropbox" + LABEL_DROPBOX_API_KEY: "Api kľúč" + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Dostupné na aktualizáciu" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Dostupné na inštaláciu" + LEGEND_INSTALLED_PACKAGES: "Nainštalované balíčky" + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Vaša doména" + LABEL_VERSION: "Verzia" + LABEL_CHECKING: "Kontrolujem" + TYPE_BASIC_HINT_2: "Táto doména nemôže byť licencovaná" + HTML_ALERT_TOP_1: "RainLoop Webmail je licencovaný pod" + TYPE_PREMIUM_LIFETIME: "Doživotná" + BUTTON_PURCHASE: "Kúpiť" + BUTTON_TRIAL: "Skúšobná verzia" + TAB_ABOUT: + LABEL_TAG_HINT: "Jednoduchý, moderný a rýchly webmail klient" + LABEL_ALL_RIGHTS_RESERVED: "Všetky práva vyhradené." + HINT_READ_CHANGE_LOG: "Prosím prečítajte si zoznam zmien pred aktualizáciou." + HINT_IS_UP_TO_DATE: "RainLoop je aktuálny." + HTML_NEW_VERSION: "Dostupná nová %VERSION% verzia." + LABEL_UPDATING: "Aktualizujem" + LABEL_CHECKING: "Kontrolujem aktualizácie" + BUTTON_UPDATE: "Aktualizovať" + BUTTON_DOWNLOAD: "Stiahnuť" + BUTTON_CHANGELOG: "Zoznam zmien" + POPUPS_ACTIVATE: + TITLE_ACTIVATION: "Aktivácia..." + LABEL_DOMAIN: "Doména" + BUTTON_ACTIVATE: "Aktivovať" + LABEL_ACTIVATED: "Aktivované" + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Pridať alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Doména" + BUTTON_CLOSE: "Zatvoriť" + BUTTON_ADD: "Pridať" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Pridať doménu" + TITLE_ADD_DOMAIN_WITH_NAME: "Pridať doménu \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Upraviť doménu \"%NAME%\"" + LABEL_NAME: "Meno" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Server" + LABEL_PORT: "Port" + LABEL_SECURE: "Bezpečné" + SECURE_OPTION_NONE: "Žiadne" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_USE_SHORT_LOGIN: "Použiť skrátené prihlásenie" + LABEL_USE_AUTH: "Použiť overenie" + LABEL_USE_PHP_MAIL: "Použiť php mail() funkciu" + BUTTON_TEST: "Test" + BUTTON_SIEVE_CONFIGURATION: "Uložiť nastavenia" + BUTTON_BACK_TO_IMAP: "Späť do IMAP nastavení" + BUTTON_BACK: "Späť" + BUTTON_CLOSE: "Zatvoriť" + BUTTON_ADD: "Pridať" + BUTTON_UPDATE: "Aktualizovať" + POPUPS_PLUGIN: + BUTTON_CLOSE: "Zatvoriť" + BUTTON_SAVE: "Uložiť" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Zvoľte jazyk" + HINTS: + BETA: "beta" + UNSTABLE: "nestabilné" + WARNING: "Upozornenie!" + NOT_SUPPORTED: "nie je podporované" + REQUIRES_PHP_54: "vyžaduje PHP 5.4 alebo vyššie" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Táto Doména už existuje" + UNKNOWN_ERROR: "Neznáma chyba" + NOTIFICATIONS: + INVALID_TOKEN: "Neplatný token" + AUTH_ERROR: "Overenie zlyhalo" + ACCESS_ERROR: "Chyba prístupu" + CONNECTION_ERROR: "Nepodarilo sa pripojiť k serveru" + CAPTCHA_ERROR: "Nesprávne CAPTCHA." + DOMAIN_NOT_ALLOWED: "Doména nie je povolená" + ACCOUNT_NOT_ALLOWED: "Účet nie je povolený" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Dvojfaktorové overenie vyžadované" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Chyba dvojfaktorového overenia" + COULD_NOT_SAVE_NEW_PASSWORD: "Nepodarilo sa uložiť nové heslo" + CURRENT_PASSWORD_INCORRECT: "Chybné aktuálne heslo" + NEW_PASSWORD_SHORT: "Heslo je príliš krátke" + NEW_PASSWORD_WEAK: "Heslo je príliš jednoduché" + NEW_PASSWORD_FORBIDDENT: "Heslo obsahuje nepovolené znaky" + CONTACTS_SYNC_ERROR: "Chyba synchronizovania kontaktov" + CANT_GET_MESSAGE_LIST: "Chyba pri vytváraní zoznamu správ." + CANT_GET_MESSAGE: "Správu sa nepodarilo načítať" + CANT_DELETE_MESSAGE: "Správu sa nepodarilo odstrániť" + CANT_MOVE_MESSAGE: "Správu sa nepodarilo presunúť" + CANT_SAVE_MESSAGE: "Správu sa nepodarilo uložiť" + CANT_SEND_MESSAGE: "Správu sa nepodarilo odoslať" + INVALID_RECIPIENTS: "Neplatný príjemcovia" + CANT_SAVE_FILTERS: "Nepodarilo sa uložiť filtre" + CANT_GET_FILTERS: "Nepodarilo sa načítať filtre" + FILTERS_ARE_NOT_CORRECT: "Filtre nie sú správne" + CANT_CREATE_FOLDER: "Priečinok sa nepodarilo vytvoriť" + CANT_RENAME_FOLDER: "Priečinok sa nepodarilo premenovať" + CANT_DELETE_FOLDER: "Priečinok sa nepodarilo odstrániť" + CANT_DELETE_NON_EMPTY_FOLDER: "Nemôžem odstrániť neprázdny priečinok" + CANT_SAVE_SETTINGS: "Nastavenia sa nepodarilo uložiť" + CANT_SAVE_PLUGIN_SETTINGS: "Nastavenia sa nepodarilo uložiť" + DOMAIN_ALREADY_EXISTS: "Táto Doména už existuje" + CANT_INSTALL_PACKAGE: "Inštalácia balíčka zlyhala" + CANT_DELETE_PACKAGE: "Odstránenie balíčka zlyhalo" + LICENSING_DOMAIN_EXPIRED: "Prihlásenie pre túto doménu vypršalo." + LICENSING_DOMAIN_BANNED: "Prihlásenie pre túto doménu je zablokované." + ACCOUNT_ALREADY_EXISTS: "Účet už existuje" + ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" + MAIL_SERVER_ERROR: "Nastala chyba počas prístupu na poštový server" + UNKNOWN_ERROR: "Neznáma chyba" + STATIC: + BACK_LINK: "Obnoviť" + DOMAIN_LIST_DESC: "Zoznam domén ku ktorým je povolené pristupovať cez webmail." + PHP_EXSTENSIONS_ERROR_DESC: "Vyžadované PHP rozšírenia nie sú dostupné vo vašej PHP konfigurácii!" + PHP_VERSION_ERROR_DESC: "Vaša PHP verzia (%VERSION%) je nižšia ako minimálne vyžadovaná 5.3.0!" + NO_SCRIPT_TITLE: "Táto aplikácia vyžaduje JavaScript." + NO_SCRIPT_DESC: | + Váš internetový prehliadač nepodporuje JavaScript. + Prosím povoľte podporu JavaScriptu v nastaveniach vášho internetového prehliadača a skúste to znova. + NO_COOKIE_TITLE: "Táto aplikácia vyžaduje podporu Cookies." + NO_COOKIE_DESC: | + Váš internetový prehliadač nepodporuje Cookies. + Prosím povoľte podporu Cookies v nastaveniach vášho internetového prehliadača a skúste to znova. + BAD_BROWSER_TITLE: "Používate zastaralý internetový prehliadač." From 33a9234d9cbf10e78b7f3af1a641f65686862cb3 Mon Sep 17 00:00:00 2001 From: RainLoop Date: Tue, 19 Sep 2017 23:04:27 +0300 Subject: [PATCH 10/83] 1.11.2 --- .gitignore | 2 + docker-compose.yml | 24 + gulpfile.js | 61 +- package-lock.json | 6727 -------------------------------------------- package.json | 6 +- 5 files changed, 55 insertions(+), 6765 deletions(-) create mode 100644 docker-compose.yml delete mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 51a9006e9..b5b4570ab 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,8 @@ /build/local /build/dist /build/tmp +/build/docker +/dist /data .DS_Store /tests/fix.php diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..a70b39251 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,24 @@ +version: '2' +services: + node: + image: node:8.4-alpine + working_dir: /usr/app + command: sh -c 'yarn install && yarn global add gulp@3.9.1 && gulp all:docker' + volumes: + - ./dev:/usr/app/dev + - ./rainloop:/usr/app/rainloop + - ./assets:/usr/app/assets + - ./vendors:/usr/app/vendors + - ./build/owncloud:/usr/app/build/owncloud + - ./dist:/usr/app/dist + + - ./.eslintrc.js:/usr/app/.eslintrc.js + - ./gulpfile.js:/usr/app/gulpfile.js + - ./index.php:/usr/app/index.php + - ./package.json:/usr/app/package.json + - ./webpack.config.builder.js:/usr/app/webpack.config.builder.js + - ./webpack.config.js:/usr/app/webpack.config.js + - ./yarn.lock:/usr/app/yarn.lock + + - ./build/docker/node_modules:/usr/app/node_modules + - ./build/docker/tmp:/tmp diff --git a/gulpfile.js b/gulpfile.js index bd0243fb6..4626b6e32 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -130,37 +130,6 @@ function copyFile(sFile, sNewFile, callback) callback(); } -function signFile(sFile, callback) -{ - var exec = require('child_process').exec; - exec('gpg2 --openpgp -u 87DA4591 -a -b ' + sFile, function(err) { - if (err) { - gutil.log('gpg error: skip'); - } - callback(); - }); -} - -function signFileTask(callback) { - if (argv.sign) - { - signFile(cfg.destPath + cfg.zipFile, function() { - if (cfg.zipFileShort) - { - signFile(cfg.destPath + cfg.zipFileShort, callback); - } - else - { - callback(); - } - }); - } - else - { - callback(); - } -}; - cfg.paths.globjs = 'dev/**/*.js'; cfg.paths.static = 'rainloop/v/' + cfg.devVersion + '/static/'; cfg.paths.staticJS = 'rainloop/v/' + cfg.devVersion + '/static/js/'; @@ -521,7 +490,13 @@ gulp.task('rainloop:shortname', ['rainloop:zip'], function(callback) { copyFile(cfg.destPath + cfg.zipFile, cfg.destPath + cfg.zipFileShort, callback); }); -gulp.task('rainloop:sign', ['rainloop:shortname'], signFileTask); +gulp.task('rainloop:copy-dist', ['rainloop:shortname'], function(callback) { + var newPath = cfg.destPath.replace('build/dist/releases', 'dist/releases'); + fs.mkdirSync(newPath, '0777', true); + copyFile(cfg.destPath + cfg.zipFile, newPath + cfg.zipFile, function() { + copyFile(cfg.destPath + cfg.zipFileShort, newPath + cfg.zipFileShort, callback); + }); +}); // build (OwnCloud) gulp.task('rainloop:owncloud:copy', function() { @@ -594,7 +569,13 @@ gulp.task('rainloop:owncloud:shortname', ['rainloop:owncloud:zip'], function(cal copyFile(cfg.destPath + cfg.zipFile, cfg.destPath + cfg.zipFileShort, callback); }); -gulp.task('rainloop:owncloud:sign', ['rainloop:owncloud:shortname'], signFileTask); +gulp.task('rainloop:owncloud:copy-dist', ['rainloop:owncloud:shortname'], function(callback) { + var newPath = cfg.destPath.replace('build/dist/releases', 'dist/releases'); + fs.mkdirSync(newPath, '0777', true); + copyFile(cfg.destPath + cfg.zipFile, newPath + cfg.zipFile, function() { + copyFile(cfg.destPath + cfg.zipFileShort, newPath + cfg.zipFileShort, callback); + }); +}); // main gulp.task('moment', ['moment:locales']); @@ -607,11 +588,13 @@ gulp.task('clean', ['js:clean', 'css:clean', 'assets:clean']); gulp.task('rainloop:start', ['rainloop:copy', 'rainloop:setup']); -gulp.task('rainloop', ['rainloop:start', 'rainloop:zip', 'rainloop:clean', 'rainloop:shortname', 'rainloop:sign']); +gulp.task('rainloop', ['rainloop:start', 'rainloop:zip', 'rainloop:clean', 'rainloop:shortname']); +gulp.task('rainloop:docker', ['rainloop', 'rainloop:copy-dist']); gulp.task('owncloud', ['rainloop:owncloud:copy', 'rainloop:owncloud:copy-rainloop', 'rainloop:owncloud:copy-rainloop:clean', - 'rainloop:owncloud:setup', 'rainloop:owncloud:zip', 'rainloop:owncloud:clean', 'rainloop:owncloud:shortname', 'rainloop:owncloud:sign']); + 'rainloop:owncloud:setup', 'rainloop:owncloud:zip', 'rainloop:owncloud:clean', 'rainloop:owncloud:shortname']); +gulp.task('owncloud:docker', ['owncloud', 'rainloop:owncloud:copy-dist']); // default gulp.task('default', function(callback) { @@ -629,6 +612,14 @@ gulp.task('watch', ['css:main', 'js:validate'], function() { // aliases gulp.task('build', ['rainloop']); +gulp.task('all', function(callback) { + runSequence('rainloop', 'owncloud', callback); +}); + +gulp.task('all:docker', function(callback) { + runSequence('rainloop:docker', 'owncloud:docker', callback); +}); + gulp.task('d', ['default']); gulp.task('w', ['watch']); gulp.task('l', ['js:libs']); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 0b8169c3c..000000000 --- a/package-lock.json +++ /dev/null @@ -1,6727 +0,0 @@ -{ - "name": "rainloop", - "version": "1.11.1", - "lockfileVersion": 1, - "dependencies": { - "accord": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/accord/-/accord-0.27.3.tgz", - "integrity": "sha1-f7kSlwkoXK6oTrNyxOiCAxtxOOg=", - "dev": true, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true - } - } - }, - "acorn": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", - "dev": true - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true - }, - "ansi-escapes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "ansicolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", - "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=", - "dev": true - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-slice": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", - "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true, - "optional": true - }, - "asn1.js": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", - "dev": true - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true - }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true, - "optional": true - }, - "autolinker": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-1.4.4.tgz", - "integrity": "sha1-hKqqm7B8eU8IVc1wQaMe7G9vqMo=", - "dev": true - }, - "autoprefixer": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.4.tgz", - "integrity": "sha512-MB1XybOJqu1uAwpfSilAa1wSURNc4W310CFKvMj1fNaJBFxr1PGgz72vZaPr9ryKGqs2vYZ6jDyJ0aiGELjsoA==", - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true, - "optional": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true - }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true - }, - "babel-eslint": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.0.0.tgz", - "integrity": "sha512-tN1B3adZ3tw8pr9oGsZ18iKCbdKBSvsn9ab6cGdbED+61LpGLhIVcf76eh59XejbdRLTBe+OYezxmYIaTgPiYA==", - "dev": true, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true - }, - "babel-code-frame": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.0.tgz", - "integrity": "sha512-/xr1ADm5bnTjjN+xwoXb7lF4v2rnxMzNZzFU7h8SxB+qB6+IqSTOOqVcpaPTUC2Non/MbQxS3OIZnJpQ2X21aQ==", - "dev": true - }, - "babel-messages": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-7.0.0-beta.0.tgz", - "integrity": "sha512-eXdShsm9ZTh9AQhlIaAn6HR3xWpxCnK9ZwIDA9QyjnwTgMctGxHHflw4b4RJ3/ZjTL0Vrmvm0tQXPkp49mTAUw==", - "dev": true - }, - "babel-traverse": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.0.tgz", - "integrity": "sha512-IKzuTqUcQtMRZ0Vv5RjIrGGj33eBKmNTNeRexWSyjPPuAciyNkva1rt7WXPfHfkb+dX7coRAIUhzeTUEzhnwdA==", - "dev": true - }, - "babel-types": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.0.tgz", - "integrity": "sha512-rJc2kV9iPJGLlqIY71AM3nPcdkoeLRCDuR07GFgfd3lFl4TsBQq76TxYQQIZ2MONg1HpsqmuoCXr9aZ1Oa4wYw==", - "dev": true - }, - "babylon": { - "version": "7.0.0-beta.22", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.22.tgz", - "integrity": "sha512-Yl7iT8QGrS8OfR7p6R12AJexQm+brKwrryai4VWZ7NHUbPoZ5al3+klhvl/14shXZiLa7uK//OIFuZ1/RKHgoA==", - "dev": true - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true - }, - "debug": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.0.1.tgz", - "integrity": "sha512-6nVc6S36qbt/mutyt+UGMnawAMrPDZUPQjRZI3FS9tCtDRhvxJbK79unYBLPi+z5SLXQ3ftoVBFCblQtNSls8w==", - "dev": true - }, - "globals": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-10.1.0.tgz", - "integrity": "sha1-RCWhiBvg0za0qCOoKnvnJdXdmHw=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "dev": true - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "dependencies": { - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true - } - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true - }, - "babel-helper-function-name": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-7.0.0-beta.0.tgz", - "integrity": "sha512-DaQccFBBWBEzMdqbKmNXamY0m1yLHJGOdbbEsNoGdJrrU7wAF3wwowtDDPzF0ZT3SqJXPgZW/P2kgBX9moMuAA==", - "dev": true, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true - }, - "babel-code-frame": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.0.tgz", - "integrity": "sha512-/xr1ADm5bnTjjN+xwoXb7lF4v2rnxMzNZzFU7h8SxB+qB6+IqSTOOqVcpaPTUC2Non/MbQxS3OIZnJpQ2X21aQ==", - "dev": true - }, - "babel-messages": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-7.0.0-beta.0.tgz", - "integrity": "sha512-eXdShsm9ZTh9AQhlIaAn6HR3xWpxCnK9ZwIDA9QyjnwTgMctGxHHflw4b4RJ3/ZjTL0Vrmvm0tQXPkp49mTAUw==", - "dev": true - }, - "babel-template": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-7.0.0-beta.0.tgz", - "integrity": "sha512-tmdH+MmmU0F6Ur8humpevSmFzYKbrN3Oru0g5Qyg4R6+sxjnzZmnvzUbsP0aKMr7tB0Ua6xhEb9arKTOsEMkyA==", - "dev": true - }, - "babel-traverse": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-7.0.0-beta.0.tgz", - "integrity": "sha512-IKzuTqUcQtMRZ0Vv5RjIrGGj33eBKmNTNeRexWSyjPPuAciyNkva1rt7WXPfHfkb+dX7coRAIUhzeTUEzhnwdA==", - "dev": true - }, - "babel-types": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.0.tgz", - "integrity": "sha512-rJc2kV9iPJGLlqIY71AM3nPcdkoeLRCDuR07GFgfd3lFl4TsBQq76TxYQQIZ2MONg1HpsqmuoCXr9aZ1Oa4wYw==", - "dev": true - }, - "babylon": { - "version": "7.0.0-beta.22", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.22.tgz", - "integrity": "sha512-Yl7iT8QGrS8OfR7p6R12AJexQm+brKwrryai4VWZ7NHUbPoZ5al3+klhvl/14shXZiLa7uK//OIFuZ1/RKHgoA==", - "dev": true - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true - }, - "debug": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.0.1.tgz", - "integrity": "sha512-6nVc6S36qbt/mutyt+UGMnawAMrPDZUPQjRZI3FS9tCtDRhvxJbK79unYBLPi+z5SLXQ3ftoVBFCblQtNSls8w==", - "dev": true - }, - "globals": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-10.1.0.tgz", - "integrity": "sha1-RCWhiBvg0za0qCOoKnvnJdXdmHw=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "babel-helper-get-function-arity": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-7.0.0-beta.0.tgz", - "integrity": "sha512-csqAic15/2Vm1951nJxkkL9K8E6ojyNF/eAOjk7pqJlO8kvgrccGNFCV9eDwcGHDPe5AjvJGwVSAcQ5fit9wuA==", - "dev": true, - "dependencies": { - "babel-types": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-7.0.0-beta.0.tgz", - "integrity": "sha512-rJc2kV9iPJGLlqIY71AM3nPcdkoeLRCDuR07GFgfd3lFl4TsBQq76TxYQQIZ2MONg1HpsqmuoCXr9aZ1Oa4wYw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "dependencies": { - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true - } - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true - }, - "babel-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", - "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", - "dev": true - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "babel-plugin-syntax-class-constructor-call": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", - "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "babel-plugin-syntax-do-expressions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", - "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", - "dev": true - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-export-extensions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", - "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", - "dev": true - }, - "babel-plugin-syntax-function-bind": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", - "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true - }, - "babel-plugin-transform-class-constructor-call": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", - "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", - "dev": true - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "dependencies": { - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true - } - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true - }, - "babel-plugin-transform-decorators-legacy": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz", - "integrity": "sha1-dBtY9sW86eYCfgiC2cmU8E82aSU=", - "dev": true - }, - "babel-plugin-transform-do-expressions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", - "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", - "dev": true - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "dependencies": { - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "dependencies": { - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", - "dev": true - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "dependencies": { - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true - } - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true - }, - "babel-plugin-transform-export-extensions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", - "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", - "dev": true - }, - "babel-plugin-transform-function-bind": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", - "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", - "dev": true - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true - }, - "babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", - "dev": true - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true - }, - "babel-preset-env": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.0.tgz", - "integrity": "sha512-OVgtQRuOZKckrILgMA5rvctvFZPv72Gua9Rt006AiPoB0DJKGN07UmaQA+qRrYgK71MVct8fFhT0EyNWYorVew==", - "dev": true - }, - "babel-preset-stage-0": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", - "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", - "dev": true - }, - "babel-preset-stage-1": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", - "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", - "dev": true - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true - }, - "bean": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/bean/-/bean-0.4.11.tgz", - "integrity": "sha1-VEwrzbEiPkUaDOTZsTq1n3XLsbs=", - "dev": true - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "binary-extensions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", - "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", - "dev": true - }, - "binaryextensions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-1.0.1.tgz", - "integrity": "sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=", - "dev": true - }, - "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "body-parser": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", - "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", - "dev": true, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "qs": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", - "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", - "dev": true - } - } - }, - "bonzo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/bonzo/-/bonzo-1.4.0.tgz", - "integrity": "sha1-19Lgb2tvZ+s7j8GHdPeQWPSrNN8=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.8.tgz", - "integrity": "sha512-WYCMOT/PtGTlpOKFht0YJFYcPy6pLCR98CtWfzK13zoynLlBMvAdEMSRGmgnJCw2M2j/5qxBkinZQFobieM8dQ==", - "dev": true - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "dev": true - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "dev": true - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true - }, - "browserslist": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.4.0.tgz", - "integrity": "sha512-aM2Gt4x9bVlCUteADBS6JP0F+2tMWKM1jQzUulVROtdFWFIcIVvY76AJbr7GDqy0eDhn+PcnpzzivGxY4qiaKQ==", - "dev": true - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", - "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", - "dev": true - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true - }, - "caniuse-db": { - "version": "1.0.30000671", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000671.tgz", - "integrity": "sha1-nwcbvHuWmUY4zLr0eCnVihV3qO0=", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30000730", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000730.tgz", - "integrity": "sha1-JqFP8bO/wfHLTadcLHNFGz8a3ho=", - "dev": true - }, - "cardinal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", - "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "classnames": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.5.tgz", - "integrity": "sha1-+zgB1FNGdknvNgPH1hoCvRKb3m0=", - "dev": true - }, - "clean-css": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.8.tgz", - "integrity": "sha1-BhRVsklKdQrJj0bY1euxfGeeqdE=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true - }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true - }, - "cli-usage": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/cli-usage/-/cli-usage-0.1.4.tgz", - "integrity": "sha1-fAHg3HBsI0s5yTODjI4gshdXduI=", - "dev": true - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } - } - }, - "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "dev": true - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true - }, - "concat-with-sourcemaps": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz", - "integrity": "sha1-9Vs74q60dgGxCi1SWcz7cP0vHdY=", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.0.1.tgz", - "integrity": "sha1-lyjjg7lDFgUNDHRjlY8rhcCqggA=", - "dev": true, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true - } - } - }, - "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "dev": true - }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "dev": true - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "dev": true - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true - }, - "crypto-browserify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "dateformat": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", - "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", - "dev": true - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-assign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", - "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "deprecated": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", - "dev": true - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true - }, - "detect-file": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", - "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "dev": true - }, - "doctrine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", - "dev": true - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", - "dev": true - }, - "domready": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/domready/-/domready-0.3.0.tgz", - "integrity": "sha1-s3QPrL0JFjAYFS0SrsI5OD4QIXU=", - "dev": true - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "duplexify": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", - "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", - "dev": true, - "dependencies": { - "end-of-stream": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", - "dev": true - } - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.21", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.21.tgz", - "integrity": "sha1-qWfr3P6O0Ag/wkTRiUAiqOgRPqI=", - "dev": true - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true - }, - "end-of-stream": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", - "dev": true, - "dependencies": { - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true - } - } - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true - }, - "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "dev": true - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true - }, - "es5-ext": { - "version": "0.10.30", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.30.tgz", - "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", - "dev": true - }, - "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", - "dev": true - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true - }, - "es6-promise-polyfill": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz", - "integrity": "sha1-84kl8jyz4+jObNqP93T867sJDN4=", - "dev": true - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true - }, - "eslint": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.6.1.tgz", - "integrity": "sha1-3cf8f9cL+TIFsLNEm7FqHp59SVA=", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true - } - } - }, - "eslint-plugin-compat": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-1.0.4.tgz", - "integrity": "sha512-16yjDdjrivRQT7/Kov+3O6DMvfg8WYC1JKPAsvf/UNtdLBeMXVYATohAM4nOak1ynGP69mKUlOjw7nroUqY9Sg==", - "dev": true, - "dependencies": { - "browserslist": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.1.4.tgz", - "integrity": "sha1-zFJq9KExK30uBWU+VtDIq3DA4FM=", - "dev": true - } - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true - }, - "espree": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", - "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", - "dev": true - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, - "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", - "dev": true - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true - }, - "expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "dev": true - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "external-editor": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", - "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", - "dev": true - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fancy-log": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", - "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", - "dev": true - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "faye-websocket": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.7.3.tgz", - "integrity": "sha1-zEB0x/Sk39A69U3WXDVLE1EyzhE=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true - }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true - }, - "findup-sync": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", - "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", - "dev": true, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true - } - } - }, - "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", - "dev": true, - "dependencies": { - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true - } - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "flagged-respawn": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", - "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", - "dev": true - }, - "flat-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", - "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true - }, - "fork-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz", - "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=", - "dev": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", - "dev": true - }, - "fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "dev": true, - "optional": true, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "optional": true - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "dev": true, - "optional": true - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "optional": true - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true - } - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true - } - } - }, - "glob-stream": { - "version": "3.1.18", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", - "dev": true, - "dependencies": { - "glob": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true - } - } - }, - "glob-watcher": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true - }, - "global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", - "dev": true - }, - "global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", - "dev": true - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true - } - } - }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true - } - } - }, - "glogg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", - "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "gulp": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", - "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", - "dev": true, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - } - } - }, - "gulp-autoprefixer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-4.0.0.tgz", - "integrity": "sha1-4AqMVxuF0GUWrCY0G+kN/Z/B6rA=", - "dev": true - }, - "gulp-cached": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gulp-cached/-/gulp-cached-1.1.1.tgz", - "integrity": "sha1-/nzU+H83YB5gc8/t7lwr2vi2rM4=", - "dev": true - }, - "gulp-chmod": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", - "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", - "dev": true - }, - "gulp-clean-css": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.8.0.tgz", - "integrity": "sha512-R96U/umCB+XfmMNQ/VOPqMYHY9m+VeDCk9iv9Y7ysOx4dlX2Zkw1xDsO0vo7AzokARtQPEY7u1xm4/x6v7oABg==", - "dev": true - }, - "gulp-concat-util": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/gulp-concat-util/-/gulp-concat-util-0.5.5.tgz", - "integrity": "sha1-yPBjO05ulQ/5PEdbPI07hL4Dt9w=", - "dev": true - }, - "gulp-eol": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/gulp-eol/-/gulp-eol-0.1.2.tgz", - "integrity": "sha1-omgYKFzVVDidguk76bPQ5Q09vqM=", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true - }, - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true - }, - "gulp-util": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", - "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", - "dev": true, - "dependencies": { - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true - } - } - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", - "dev": true - }, - "lodash.defaults": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", - "dev": true - }, - "lodash.escape": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", - "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", - "dev": true - }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true - }, - "lodash.template": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", - "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", - "dev": true - }, - "lodash.templatesettings": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", - "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", - "dev": true - }, - "minimist": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", - "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true - }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", - "dev": true, - "dependencies": { - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true - } - } - }, - "vinyl": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", - "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", - "dev": true - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - } - } - }, - "gulp-eslint": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-4.0.0.tgz", - "integrity": "sha512-+qsePo04v1O3JshpNvww9+bOgZEJ6Cc2/w3mEktfKz0NL0zsh1SWzjyIL2FIM2zzy6IYQYv+j8REZORF8dKX4g==", - "dev": true - }, - "gulp-expect-file": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/gulp-expect-file/-/gulp-expect-file-0.0.7.tgz", - "integrity": "sha1-kT5zHbDdb1hmFJukAK2DXrNGI60=", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true - }, - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true - }, - "gulp-util": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", - "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", - "dev": true, - "dependencies": { - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true - } - } - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", - "dev": true - }, - "lodash.defaults": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", - "dev": true - }, - "lodash.escape": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", - "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", - "dev": true - }, - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true - }, - "lodash.template": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", - "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", - "dev": true - }, - "lodash.templatesettings": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", - "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true - }, - "minimist": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", - "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "dev": true, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - } - } - }, - "vinyl": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", - "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", - "dev": true - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - } - } - }, - "gulp-filter": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.0.1.tgz", - "integrity": "sha512-5olRzAhFdXB2klCu1lnazP65aO9YdA/5WfC9VdInIc8PrUeDIoZfaA3Edb0yUBGhVdHv4eHKL9Fg5tUoEJ9z5A==", - "dev": true - }, - "gulp-header": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.9.tgz", - "integrity": "sha1-yfEP7gYy2B6Tl4nG7PRaFRvzCYs=", - "dev": true - }, - "gulp-if": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz", - "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=", - "dev": true - }, - "gulp-less": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-3.3.2.tgz", - "integrity": "sha1-9mNq3MZhUKiQJxn6WZY/x/hipJo=", - "dev": true - }, - "gulp-livereload": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/gulp-livereload/-/gulp-livereload-3.8.1.tgz", - "integrity": "sha1-APdEstdJ0+njdGWJyKRKysd5tQ8=", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true - }, - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true - } - } - }, - "gulp-match": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz", - "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=", - "dev": true - }, - "gulp-notify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gulp-notify/-/gulp-notify-3.0.0.tgz", - "integrity": "sha1-oEuK+azb5OY8hFZ4zgw9MGlMWaM=", - "dev": true, - "dependencies": { - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "dev": true - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", - "dev": true - } - } - }, - "gulp-plumber": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-plumber/-/gulp-plumber-1.1.0.tgz", - "integrity": "sha1-8SF2wtBCL2AwbCQv/2oBo5T6ugk=", - "dev": true - }, - "gulp-rename": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", - "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", - "dev": true - }, - "gulp-replace": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-0.6.1.tgz", - "integrity": "sha1-Eb+Mj85TPjPi9qjy9DC5VboL4GY=", - "dev": true - }, - "gulp-rimraf": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/gulp-rimraf/-/gulp-rimraf-0.2.1.tgz", - "integrity": "sha1-nxeDrcXUiQ2KG+34NLyYnipWUDA=", - "dev": true - }, - "gulp-size": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/gulp-size/-/gulp-size-2.1.0.tgz", - "integrity": "sha1-HCtk8X+QcdWr2Z0VS3s0gfj7oSg=", - "dev": true - }, - "gulp-stripbom": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/gulp-stripbom/-/gulp-stripbom-1.0.4.tgz", - "integrity": "sha1-WMHQPoXgCKeqtH2BsSl8jBvIKOs=", - "dev": true, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - } - } - }, - "gulp-through": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/gulp-through/-/gulp-through-0.4.0.tgz", - "integrity": "sha1-ZGOyn2eMeIVAtjqmobrVvYVSrm0=", - "dev": true, - "dependencies": { - "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", - "dev": true - } - } - }, - "gulp-uglify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.0.tgz", - "integrity": "sha1-DfAzHXKg0wLj434QlIXd3zPG0co=", - "dev": true, - "dependencies": { - "uglify-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.0.tgz", - "integrity": "sha512-PGUXuTJ5AkrfPsyg0L9/LD+BWYm9feVngbWpW5bg7Q3B7hqDM3xz00tNby4yY0CqjrLTF6CP9wpb/aNITRuSXg==", - "dev": true - } - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, - "gulp-zip": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-4.0.0.tgz", - "integrity": "sha1-HO/Ai0vzbfS1sefGs27lXrvkqIE=", - "dev": true - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true - }, - "gzip-size": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", - "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "optional": true, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "optional": true - } - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true - }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "dev": true - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "http-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", - "dev": true - }, - "http-parser-js": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.6.tgz", - "integrity": "sha1-GVJz9YcExFLWcQdr4gEyndNB3FU=", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true - }, - "ifvisible.js": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/ifvisible.js/-/ifvisible.js-1.0.6.tgz", - "integrity": "sha1-UusVHOicVvFTFiJkYuiS0fhFEmE=", - "dev": true - }, - "ignore": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", - "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "indx": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", - "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true - }, - "inquirer": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.3.tgz", - "integrity": "sha512-Bc3KbimpDTOeQdDj18Ir/rlsGuhBSSNqdOnxaAuKhpkdnMMuKsEGbZD2v5KFF9oso2OU+BPh7+/u5obmFDRmWw==", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true - } - } - }, - "interpret": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", - "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", - "dev": true - }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", - "dev": true - }, - "is-absolute": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", - "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true - }, - "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-relative": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", - "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "dev": true - }, - "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, - "is-unc-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", - "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, - "istextorbinary": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-1.0.2.tgz", - "integrity": "sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=", - "dev": true - }, - "jasmine-reporters": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-0.2.1.tgz", - "integrity": "sha1-OV9uUXBpLeGpZs2Vpw16N78/K8M=", - "dev": true - }, - "jquery": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz", - "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=", - "dev": true - }, - "jquery-backstretch": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/jquery-backstretch/-/jquery-backstretch-2.1.16.tgz", - "integrity": "sha512-dN99jdyS1TIKGHJzn29+wBgKEqYHa1jp002pgdNP+R4JXtrFZMjp7ezRhRdp9n2Y4t40hG1MRBce/dFIWFbrEw==", - "dev": true, - "dependencies": { - "jquery": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", - "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=", - "dev": true - } - } - }, - "jquery-lazyload": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/jquery-lazyload/-/jquery-lazyload-1.9.7.tgz", - "integrity": "sha1-mYKziMUzwLYRIUs8WqoLn+3gcfc=", - "dev": true - }, - "jquery-mousewheel": { - "version": "3.1.13", - "resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz", - "integrity": "sha1-BvAzXxbjU6aV5yBr9QUDy1I6buU=", - "dev": true - }, - "jquery-scrollstop": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jquery-scrollstop/-/jquery-scrollstop-1.2.0.tgz", - "integrity": "sha1-8YJ6Jc8SiH2WXAhdinUDVlWzdmM=", - "dev": true - }, - "js-cookie": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.1.4.tgz", - "integrity": "sha1-2k7FA4ZvFJ0WTPJfV57zEBUCXY0=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "jschardet": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", - "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", - "dev": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true, - "optional": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true - }, - "knockout": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/knockout/-/knockout-3.4.2.tgz", - "integrity": "sha1-6HlY3netHpNvfOZFuri118RW2Tc=", - "dev": true - }, - "knockout-projections": { - "version": "github:stevesanderson/knockout-projections#01cb07b27b305c0240de7aa92687110e68432706", - "dev": true, - "dependencies": { - "knockout": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/knockout/-/knockout-3.0.0.tgz", - "integrity": "sha1-/Y1D7kRiN83n32UPXH289orkmoA=", - "dev": true - } - } - }, - "knockout-sortable": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/knockout-sortable/-/knockout-sortable-0.14.1.tgz", - "integrity": "sha1-vfQEEkUZaXKdDdN8YbtzM83Ubh4=", - "dev": true - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true - }, - "less": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.2.tgz", - "integrity": "sha1-No1sxz4fsDmBGDKAkYdDxdz5s98=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true - }, - "liftoff": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", - "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", - "dev": true - }, - "lightgallery": { - "version": "1.2.21", - "resolved": "https://registry.npmjs.org/lightgallery/-/lightgallery-1.2.21.tgz", - "integrity": "sha1-j0uiahuZvFg1B+sVQCkbFWqpCq8=", - "dev": true - }, - "livereload-js": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.2.2.tgz", - "integrity": "sha1-bIclfmSKtHW8JOoldFftzB+NC8I=", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", - "dev": true - }, - "lodash._arrayeach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true - }, - "lodash._baseclone": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", - "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", - "dev": true - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basefor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", - "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true - }, - "lodash._escapehtmlchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", - "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", - "dev": true - }, - "lodash._escapestringchar": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", - "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._htmlescapes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._isnative": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", - "dev": true - }, - "lodash._objecttypes": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._reunescapedhtml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", - "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", - "dev": true, - "dependencies": { - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true - } - } - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash._shimkeys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", - "dev": true - }, - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", - "dev": true - }, - "lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", - "dev": true - }, - "lodash.clonedeep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", - "integrity": "sha1-oKHkDYKl6on/WxR7hETtY9koJ9s=", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isobject": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", - "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true - }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", - "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=", - "dev": true - }, - "lodash.partialright": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", - "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=", - "dev": true - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", - "dev": true - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "lodash.values": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", - "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", - "dev": true, - "dependencies": { - "lodash.keys": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", - "dev": true - } - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true - }, - "make-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", - "dev": true - }, - "make-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", - "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", - "dev": true - }, - "make-error-cause": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", - "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", - "dev": true - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", - "dev": true - }, - "marked": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", - "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", - "dev": true - }, - "marked-terminal": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-1.7.0.tgz", - "integrity": "sha1-yMRgiBx3LHYEtkNnAH7l938SWQQ=", - "dev": true, - "dependencies": { - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - } - } - }, - "matchmedia-polyfill": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/matchmedia-polyfill/-/matchmedia-polyfill-0.3.0.tgz", - "integrity": "sha1-b5HjQBKz38nVt2zsid6vwbQbRfo=", - "dev": true - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "dev": true, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true - } - } - }, - "miller-rabin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", - "dev": true - }, - "mime": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.0.tgz", - "integrity": "sha512-n9ChLv77+QQEapYz8lV+rIZAW3HhAPW2CXnzb1GN5uMkuczshwvkW7XPsbzU0ZQN3sP47Er2KVkp2p3KyqZKSQ==", - "dev": true, - "optional": true - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", - "dev": true - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "dev": true - }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true - }, - "mini-lr": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/mini-lr/-/mini-lr-0.1.9.tgz", - "integrity": "sha1-AhmdJzR5U9H9HW297UJh8Yey0PY=", - "dev": true, - "dependencies": { - "qs": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.2.5.tgz", - "integrity": "sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw=", - "dev": true - } - } - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true - }, - "moment": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", - "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", - "dev": true, - "optional": true - }, - "natives": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", - "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", - "dev": true - }, - "node-emoji": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", - "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", - "dev": true - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true - }, - "node-fs": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz", - "integrity": "sha1-MjI8zLRsn78PwRgS1FAhzDHTJbs=", - "dev": true - }, - "node-libs-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", - "dev": true, - "dependencies": { - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "node-localstorage": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.0.tgz", - "integrity": "sha1-LkNqro3Mms6XtDxlwWwNV3vgpVw=", - "dev": true - }, - "node-notifier": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", - "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=", - "dev": true - }, - "node.extend": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", - "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", - "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize.css": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-7.0.0.tgz", - "integrity": "sha1-q/sd2CRwZ04DIrU86xqvQSk45L8=", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "dependencies": { - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true - }, - "openpgp": { - "version": "2.5.10", - "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-2.5.10.tgz", - "integrity": "sha1-9enuPJwAi9XjoDA2XgpLIKFS0aQ=", - "dev": true - }, - "opentip": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/opentip/-/opentip-2.4.3.tgz", - "integrity": "sha1-KjtQDCc4+AacM0Yu1Ita/pzoBOY=", - "dev": true - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true - }, - "orchestrator": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", - "dev": true - }, - "ordered-read-streams": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", - "dev": true - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true - }, - "parse-filepath": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", - "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", - "dev": true - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true - } - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true - }, - "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pikaday": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/pikaday/-/pikaday-1.6.1.tgz", - "integrity": "sha512-B+pxVcSGuzLblMe4dnhCF3dnI2zkyj5GAqanGX9cVcOk90fp2ULo1OZFUPRXQXUE5tmcimnk1tPOFs8tUHQetQ==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true - }, - "pluralize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-4.0.0.tgz", - "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", - "dev": true - }, - "postcss": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.11.tgz", - "integrity": "sha512-DsnIzznNRQprsGTALpkC0xjDygo+QcOd+qVjP9+RjyzrPiyYOXBGOwoJ4rAiiE4lu6JggQ/jW4niY24WLxuncg==", - "dev": true, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true - } - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-bytes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", - "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", - "dev": true - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "private": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", - "dev": true - }, - "Progress.js": { - "version": "github:usablica/progress.js#acba45829bfea7ba073aedca7d70fcf47e22317b", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true - }, - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "qwery": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/qwery/-/qwery-3.4.2.tgz", - "integrity": "sha1-fQrz689Ir1mfLtSY2M45Ajl4pj4=", - "dev": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true - } - } - }, - "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", - "dev": true - }, - "raw-body": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", - "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", - "dev": true, - "dependencies": { - "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true - } - } - }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true - }, - "redeyed": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", - "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", - "dev": true, - "dependencies": { - "esprima": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", - "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", - "dev": true - } - } - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "replacestream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", - "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", - "dev": true - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true - }, - "requireindex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", - "integrity": "sha1-5UBLgVV+91225JxacgBIk/4D4WI=", - "dev": true - }, - "reqwest": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/reqwest/-/reqwest-0.9.7.tgz", - "integrity": "sha1-EaLelwTcjVLJZ1Jl1xdxA/6/OmM=", - "dev": true - }, - "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "dev": true - }, - "resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "dev": true - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true - } - } - }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "dev": true - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true - }, - "run-sequence": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.1.0.tgz", - "integrity": "sha1-FJ2gElFvIdz3nbbcmaKpVgNjGyE=", - "dev": true - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", - "dev": true - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - }, - "sequencify": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simplestatemanager": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/simplestatemanager/-/simplestatemanager-3.4.0.tgz", - "integrity": "sha1-SkdBJfNPQGH0bdBYKPY6qZj+Bus=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true - }, - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "dependencies": { - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true - } - } - }, - "stream-consume": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", - "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", - "dev": true - }, - "stream-counter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz", - "integrity": "sha1-kc8lac5NxQYf6816yyY5SloRR1E=", - "dev": true - }, - "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", - "dev": true - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamfilter": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.5.tgz", - "integrity": "sha1-h1BxEb644phFFxe1Ec/tjwAqv1M=", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true - } - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true - }, - "strip-bom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "style-loader": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", - "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "table": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", - "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", - "dev": true, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true - } - } - }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", - "dev": true - }, - "ternary-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz", - "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "textextensions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-1.0.2.tgz", - "integrity": "sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true - }, - "tildify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "dev": true - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", - "dev": true - }, - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "dev": true, - "optional": true - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "optional": true - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true - }, - "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - }, - "unique-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", - "dev": true, - "optional": true - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true - }, - "vinyl-fs": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", - "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", - "dev": true, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true - } - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true - }, - "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", - "dev": true, - "dependencies": { - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "dev": true - } - } - }, - "webpack": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.6.0.tgz", - "integrity": "sha512-OsHT3D0W0KmPPh60tC7asNnOmST6bKTiR90UyEdT9QYoaJ4OYN4Gg7WK1k3VxHK07ZoiYWPsKvlS/gAjwL/vRA==", - "dev": true, - "dependencies": { - "ajv-keywords": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", - "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", - "dev": true - }, - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true - } - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true - } - } - }, - "webpack-notifier": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.5.0.tgz", - "integrity": "sha1-wBAAfUSM68NN78mezyiPpejGuvY=", - "dev": true, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "node-notifier": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-4.6.1.tgz", - "integrity": "sha1-BW0UJE89zBzq3+aK+c/wxUc6M/M=", - "dev": true - } - } - }, - "webpack-sources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", - "dev": true - }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "dev": true - }, - "websocket-extensions": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.2.tgz", - "integrity": "sha1-Dhh4HeYpoYMIzhSBZQ9n/6JpOl0=", - "dev": true - }, - "when": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", - "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", - "dev": true - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true - }, - "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - } - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, - "yazl": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.2.tgz", - "integrity": "sha1-FMsZCD4eJacAksFYiqvg9OTdTYg=", - "dev": true - } - } -} diff --git a/package.json b/package.json index b529b409c..b45a21fea 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "title": "RainLoop Webmail", "description": "Simple, modern & fast web-based email client", "private": true, - "version": "1.11.1", - "ownCloudVersion": "5.0.0", + "version": "1.11.2", + "ownCloudVersion": "5.0.1", "homepage": "http://rainloop.net", "main": "gulpfile.js", "author": { @@ -94,10 +94,10 @@ "gulp-zip": "4.0.0", "ifvisible.js": "1.0.6", "jquery": "2.2.4", + "jquery-backstretch": "2.1.16", "jquery-lazyload": "1.9.7", "jquery-mousewheel": "3.1.13", "jquery-scrollstop": "1.2.0", - "jquery-backstretch": "2.1.16", "js-cookie": "2.1.4", "json-loader": "0.5.7", "json3": "3.3.2", From 39ddb49cd605b24d0cca717138a4ca80598fa889 Mon Sep 17 00:00:00 2001 From: RainLoop Date: Wed, 20 Sep 2017 20:26:16 +0300 Subject: [PATCH 11/83] Fix Start reply at top of email (close #865) --- vendors/ckeditor-plugins/plain/plugin.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/vendors/ckeditor-plugins/plain/plugin.js b/vendors/ckeditor-plugins/plain/plugin.js index 635779af0..6d37d0a78 100644 --- a/vendors/ckeditor-plugins/plain/plugin.js +++ b/vendors/ckeditor-plugins/plain/plugin.js @@ -6,7 +6,7 @@ if (!el) { return; } - if(end === undefined) { + if (end === undefined) { end = start; } if('selectionStart' in el) { @@ -22,6 +22,12 @@ range.select(); } }, + toTop = function (el) { + selectRange(el, 0); + if (el) { + el.scrollTop = 0; + } + }, simplePlainToHtml = function (sPlain) { return sPlain .replace(/&/g, '&') @@ -144,7 +150,7 @@ editor.focus(); if (editor.mode === 'plain') { - selectRange(editor.__textarea, 0); + toTop(editor.__textarea); } }); From c7aa07506eee97dd098368d4c6caf1ed552a83e1 Mon Sep 17 00:00:00 2001 From: RainLoop Date: Wed, 20 Sep 2017 20:28:53 +0300 Subject: [PATCH 12/83] Change text: Save to ownCloud (close #1503) --- rainloop/v/0.0.0/app/localization/webmail/_source.en.yml | 1 + rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/rainloop/v/0.0.0/app/localization/webmail/_source.en.yml b/rainloop/v/0.0.0/app/localization/webmail/_source.en.yml index 962ab8b24..2f16f342b 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/_source.en.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/_source.en.yml @@ -151,6 +151,7 @@ en: PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" LINK_DOWNLOAD_AS_ZIP: "Download as zip" LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" + LINK_SAVE_TO_CLOUD: "Save to Cloud" LINK_SAVE_TO_DROPBOX: "Save to Dropbox" READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" diff --git a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html index 8bc97e8a7..6381baff6 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html @@ -413,7 +413,7 @@ css: {'icon-cloud-up': !saveToOwnCloudLoading(), 'icon-spinner animated': saveToOwnCloudLoading()}">    - + From 8ce5e86b04643f047d34ba3132602480973f1f2f Mon Sep 17 00:00:00 2001 From: RainLoop Date: Wed, 20 Sep 2017 21:36:56 +0300 Subject: [PATCH 13/83] Show 'To Top' and 'Fullscreen' buttons only on mouse-hover (close #1501) --- dev/App/Abstract.js | 2 ++ dev/Styles/MessageView.less | 43 ++++++++++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/dev/App/Abstract.js b/dev/App/Abstract.js index 7945df545..631879dbd 100644 --- a/dev/App/Abstract.js +++ b/dev/App/Abstract.js @@ -342,6 +342,8 @@ class AbstractApp extends AbstractBoot if (!mobile) { + $html.addClass('rl-desktop'); + ssm.addState({ id: 'mobile', query: '(max-width: 767px)', diff --git a/dev/Styles/MessageView.less b/dev/Styles/MessageView.less index 9d3580519..cd4875e93 100644 --- a/dev/Styles/MessageView.less +++ b/dev/Styles/MessageView.less @@ -276,11 +276,11 @@ html.rl-no-preview-pane { z-index: 2; cursor: pointer; border-radius: 5px; - opacity: 0.3; + .opacity(50); &:hover { .opacity(80); - border-color: #000; + border-color: #666; background-color: #888; color: #fff; } @@ -637,17 +637,40 @@ html.rl-message-fullscreen { z-index: 10000 !important; border: @rlLowBorderSize solid @rlMainDarkColor !important; border-radius: @rlLowBorderRadius !important; + } +} - .buttonUnFull { +html .messageItem { + .buttonUp, .buttonUp { + display: none !important; + } + &.scroller-shadow-top .buttonUp { + display: inline-block !important; + } +} + +html.rl-desktop .messageItem { + .buttonUp, .buttonFull { + display: none !important; + } + &:hover { + &.scroller-shadow-top .buttonUp, .buttonFull { display: inline-block !important; } - - .buttonFull { - display: none !important; - } } } -.nano.scroller-shadow-top .buttonUp { - display: inline-block !important; -} \ No newline at end of file +html.rl-message-fullscreen .messageItem { + .buttonUnFull { + display: inline-block !important; + } + .buttonFull { + display: none !important; + } + .buttonUp { + display: none !important; + } + &.scroller-shadow-top .buttonUp { + display: inline-block !important; + } +} From 4a19059217a1f06232bd7b2f17dd3dfdb258d7d8 Mon Sep 17 00:00:00 2001 From: RainLoop Date: Wed, 20 Sep 2017 22:47:08 +0300 Subject: [PATCH 14/83] UTF8-Subjects not working (close #1479) --- rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php index 372a070e2..2a8b8ef6d 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php @@ -668,7 +668,8 @@ END; $aEncodeArray = array(''); $aMatch = array(); - \preg_match_all('/=\?[^\?]+\?[q|b|Q|B]\?[^\?]*(\?=)/', $sValue, $aMatch); +// \preg_match_all('/=\?[^\?]+\?[q|b|Q|B]\?[^\?]*?\?=/', $sValue, $aMatch); + \preg_match_all('/=\?[^\?]+\?[q|b|Q|B]\?.*?\?=/', $sValue, $aMatch); if (isset($aMatch[0]) && \is_array($aMatch[0])) { From 4db982cb9b6f44231ed2ea30ac7af3efe8adb0e1 Mon Sep 17 00:00:00 2001 From: RainLoop Date: Wed, 20 Sep 2017 22:58:57 +0300 Subject: [PATCH 15/83] Small fixes --- dev/Settings/Admin/Contacts.js | 7 ------- rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php | 3 --- .../v/0.0.0/app/libraries/RainLoop/Config/Application.php | 1 - 3 files changed, 11 deletions(-) diff --git a/dev/Settings/Admin/Contacts.js b/dev/Settings/Admin/Contacts.js index de09b4139..8cc94b63a 100644 --- a/dev/Settings/Admin/Contacts.js +++ b/dev/Settings/Admin/Contacts.js @@ -19,7 +19,6 @@ class ContactsAdminSettings constructor() { this.defautOptionsAfterRender = defautOptionsAfterRender; this.enableContacts = ko.observable(!!settingsGet('ContactsEnable')); - this.contactsSharing = ko.observable(!!settingsGet('ContactsSharing')); this.contactsSync = ko.observable(!!settingsGet('ContactsSync')); const @@ -177,12 +176,6 @@ class ContactsAdminSettings }); }); - this.contactsSharing.subscribe((value) => { - Remote.saveAdminConfig(null, { - 'ContactsSharing': boolToAjax(value) - }); - }); - this.contactsSync.subscribe((value) => { Remote.saveAdminConfig(null, { 'ContactsSync': boolToAjax(value) diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 4951703dd..6c516e49f 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -1578,7 +1578,6 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack $aResult['AccountSignMe'] = $oAccount->SignMe(); $aResult['ChangePasswordIsAllowed'] = $this->ChangePasswordProvider()->PasswordChangePossibility($oAccount); $aResult['ContactsIsAllowed'] = $oAddressBookProvider->IsActive(); - $aResult['ContactsSharingIsAllowed'] = $oAddressBookProvider->IsSharingAllowed(); $aResult['ContactsSyncIsAllowed'] = (bool) $oConfig->Get('contacts', 'allow_sync', false); $aResult['ContactsSyncInterval'] = (int) $oConfig->Get('contacts', 'sync_interval', 20); @@ -1758,7 +1757,6 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack $aResult['PostgreSqlIsSupported'] = \is_array($aDrivers) ? \in_array('pgsql', $aDrivers) : false; $aResult['ContactsEnable'] = (bool) $oConfig->Get('contacts', 'enable', false); - $aResult['ContactsSharing'] = (bool) $oConfig->Get('contacts', 'allow_sharing', false); $aResult['ContactsSync'] = (bool) $oConfig->Get('contacts', 'allow_sync', false); $aResult['ContactsPdoType'] = (string) $this->ValidateContactPdoType(\trim($this->Config()->Get('contacts', 'type', 'sqlite'))); $aResult['ContactsPdoDsn'] = (string) $oConfig->Get('contacts', 'pdo_dsn', ''); @@ -3756,7 +3754,6 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack $this->setConfigFromParams($oConfig, 'LoginDefaultDomain', 'login', 'default_domain', 'string'); $this->setConfigFromParams($oConfig, 'ContactsEnable', 'contacts', 'enable', 'bool'); - $this->setConfigFromParams($oConfig, 'ContactsSharing', 'contacts', 'allow_sharing', 'bool'); $this->setConfigFromParams($oConfig, 'ContactsSync', 'contacts', 'allow_sync', 'bool'); $this->setConfigFromParams($oConfig, 'ContactsPdoDsn', 'contacts', 'pdo_dsn', 'string'); $this->setConfigFromParams($oConfig, 'ContactsPdoUser', 'contacts', 'pdo_user', 'string'); diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php index 715c8a03e..0a80d4227 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php @@ -183,7 +183,6 @@ class Application extends \RainLoop\Config\AbstractConfig 'contacts' => array( 'enable' => array(false, 'Enable contacts'), - 'allow_sharing' => array(true), 'allow_sync' => array(false), 'sync_interval' => array(20), 'type' => array('sqlite', ''), From 16ca116b30601c6c2e9ae082f020902676d237a9 Mon Sep 17 00:00:00 2001 From: RainLoop Date: Wed, 20 Sep 2017 23:47:54 +0300 Subject: [PATCH 16/83] Fix 'Horizontal scroll in message view broken' (close #1494) --- vendors/bootstrap/.code-changed | 1 - vendors/inputosaurus/.code-changed | 1 - vendors/jquery-nanoscroller/.code-changed | 1 - .../jquery.nanoscroller.js | 60 +- vendors/jua/_/jua.js | 1232 ----------------- vendors/jua/_/jua.min.js | 22 - vendors/jua/_2/jua.min.js | 3 - vendors/keymaster/.code-changed | 1 - 8 files changed, 40 insertions(+), 1281 deletions(-) delete mode 100644 vendors/jua/_/jua.js delete mode 100644 vendors/jua/_/jua.min.js delete mode 100644 vendors/jua/_2/jua.min.js diff --git a/vendors/bootstrap/.code-changed b/vendors/bootstrap/.code-changed index 8b1378917..e69de29bb 100644 --- a/vendors/bootstrap/.code-changed +++ b/vendors/bootstrap/.code-changed @@ -1 +0,0 @@ - diff --git a/vendors/inputosaurus/.code-changed b/vendors/inputosaurus/.code-changed index 8b1378917..e69de29bb 100644 --- a/vendors/inputosaurus/.code-changed +++ b/vendors/inputosaurus/.code-changed @@ -1 +0,0 @@ - diff --git a/vendors/jquery-nanoscroller/.code-changed b/vendors/jquery-nanoscroller/.code-changed index 8b1378917..e69de29bb 100644 --- a/vendors/jquery-nanoscroller/.code-changed +++ b/vendors/jquery-nanoscroller/.code-changed @@ -1 +0,0 @@ - diff --git a/vendors/jquery-nanoscroller/jquery.nanoscroller.js b/vendors/jquery-nanoscroller/jquery.nanoscroller.js index 48a4e7ef6..5a200c4cf 100644 --- a/vendors/jquery-nanoscroller/jquery.nanoscroller.js +++ b/vendors/jquery-nanoscroller/jquery.nanoscroller.js @@ -315,7 +315,7 @@ NanoScroll.prototype.preventScrolling = function(e, direction) { if (!this.isActive && !this.isActive2) { - return; + return; } if (e.type === DOMSCROLL) { if (direction === DOWN && e.originalEvent.detail > 0 || direction === UP && e.originalEvent.detail < 0) { @@ -325,7 +325,12 @@ if (!e.originalEvent || !e.originalEvent.wheelDelta) { return; } - if (direction === DOWN && e.originalEvent.wheelDelta < 0 || direction === UP && e.originalEvent.wheelDelta > 0) { + if ( + direction === DOWN && e.originalEvent.wheelDelta < 0 || + direction === UP && e.originalEvent.wheelDelta > 0 || + direction === 'down2' && e.originalEvent.wheelDelta < 0 || + direction === 'up2' && e.originalEvent.wheelDelta > 0 + ) { e.preventDefault(); } } @@ -385,17 +390,17 @@ this.sliderTop = this.contentScrollTop * this.maxSliderTop / this.maxScrollTop; this.slider2Left = this.contentScroll2Left * this.maxSlider2Left / this.maxScroll2Left; - if (limit < this.sliderTop) { - this.$el.addClass('nano-scrolllimit-top'); - } else { - this.$el.removeClass('nano-scrolllimit-top'); - } + if (limit < this.sliderTop) { + this.$el.addClass('nano-scrolllimit-top'); + } else { + this.$el.removeClass('nano-scrolllimit-top'); + } - if (this.contentScrollTop + limit >= this.maxScrollTop) { - this.$el.removeClass('nano-scrolllimit-bottom'); - } else { - this.$el.addClass('nano-scrolllimit-bottom'); - } + if (this.contentScrollTop + limit >= this.maxScrollTop) { + this.$el.removeClass('nano-scrolllimit-bottom'); + } else { + this.$el.addClass('nano-scrolllimit-bottom'); + } } }; @@ -491,16 +496,31 @@ if (!e) { return; } - if (_this.contentScrollTop >= _this.maxScrollTop) { - if (_this.options.preventPageScrolling) { - _this.preventScrolling(e, DOWN); + + if (e.shiftKey) { + if (_this.contentScroll2Left >= _this.maxScroll2Left) { + if (_this.options.preventPageScrolling) { + _this.preventScrolling(e, 'down2'); + } + _this.$el.trigger('scrollright'); + } else if (_this.contentScroll2Left === 0) { + if (_this.options.preventPageScrolling) { + _this.preventScrolling(e, 'up2'); + } + _this.$el.trigger('scrollleft'); } - _this.$el.trigger('scrollend'); - } else if (_this.contentScrollTop === 0) { - if (_this.options.preventPageScrolling) { - _this.preventScrolling(e, UP); + } else { + if (_this.contentScrollTop >= _this.maxScrollTop) { + if (_this.options.preventPageScrolling) { + _this.preventScrolling(e, DOWN); + } + _this.$el.trigger('scrollend'); + } else if (_this.contentScrollTop === 0) { + if (_this.options.preventPageScrolling) { + _this.preventScrolling(e, UP); + } + _this.$el.trigger('scrolltop'); } - _this.$el.trigger('scrolltop'); } if (!_this.iOSNativeScrolling) { diff --git a/vendors/jua/_/jua.js b/vendors/jua/_/jua.js deleted file mode 100644 index a12a2a8e5..000000000 --- a/vendors/jua/_/jua.js +++ /dev/null @@ -1,1232 +0,0 @@ -(function(){function a(a){function l(){if(g&&d iLimit && fLimitCallback) - { - bCallLimit = true; - fLimitCallback(iInputLimit); - } - } - }); - } - else if (bAllowFolderDragAndDrop && oItem['isDirectory'] && oItem['createReader']) - { - var - oDirReader = oItem['createReader'](), - iIndex = 0, - iLen = 0 - ; - - if (oDirReader && oDirReader['readEntries']) - { - oDirReader['readEntries'](function (aEntries) { - if (aEntries && isNonEmptyArray(aEntries)) - { - for (iIndex = 0, iLen = aEntries.length; iIndex < iLen; iIndex++) - { - fTraverseFileTree(aEntries[iIndex], sPath + oItem['name'] + '/', fCallback, fLimitCallbackProxy); - } - } - }); - } - } - } - } - ; - - bAllowFolderDragAndDrop = isUndefined(bAllowFolderDragAndDrop) ? true : !!bAllowFolderDragAndDrop; - - bEntry = isUndefined(bEntry) ? false : !!bEntry; - iLimit = isUndefined(iLimit) ? Jua.iDefLimit : pInt(iLimit); - iInputLimit = iLimit; - bUseLimit = 0 < iLimit; - - aItems = aItems && 0 < aItems.length ? aItems : null; - if (aItems) - { - for (iIndex = 0, iLen = aItems.length; iIndex < iLen; iIndex++) - { - oItem = aItems[iIndex]; - if (oItem) - { - if (bEntry) - { - if ('file' === oItem['kind'] && oItem['webkitGetAsEntry']) - { - oEntry = oItem['webkitGetAsEntry'](); - if (oEntry) - { - fTraverseFileTree(oEntry, '', fFileCallback, fLimitCallback); - } - } - } - else - { - if (!bUseLimit || 0 <= --iLimit) - { - fFileCallback(getDataFromFile(oItem)); - } - else if (bUseLimit && !bCallLimit) - { - if (0 > iLimit && fLimitCallback) - { - bCallLimit = true; - fLimitCallback(iInputLimit); - } - } - } - } - } - } - } - - /** - * @param {*} oInput - * @param {Function} fFileCallback - * @param {number=} iLimit = 20 - * @param {Function=} fLimitCallback - */ - function getDataFromInput(oInput, fFileCallback, iLimit, fLimitCallback) - { - var aFiles = oInput && oInput.files && 0 < oInput.files.length ? oInput.files : null; - if (aFiles) - { - getDataFromFiles(aFiles, fFileCallback, false, false, iLimit, fLimitCallback); - } - else - { - fFileCallback({ - 'FileName': oInput.value.split('\\').pop().split('/').pop(), - 'Size': null, - 'Type': null, - 'Folder': '', - 'File' : null - }); - } - } - - function eventContainsFiles(oEvent) - { - var bResult = false; - if (oEvent && oEvent.dataTransfer && oEvent.dataTransfer.types && oEvent.dataTransfer.types.length) - { - var - iIindex = 0, - iLen = oEvent.dataTransfer.types.length - ; - - for (; iIindex < iLen; iIindex++) - { - if (oEvent.dataTransfer.types[iIindex].toLowerCase() === 'files') - { - bResult = true; - break; - } - } - } - - return bResult; - } - - /** - * @param {Event} oEvent - * @param {Function} fFileCallback - * @param {number=} iLimit = 20 - * @param {Function=} fLimitCallback - * @param {boolean=} bAllowFolderDragAndDrop = true - */ - function getDataFromDragEvent(oEvent, fFileCallback, iLimit, fLimitCallback, bAllowFolderDragAndDrop) - { - var - aItems = null, - aFiles = null - ; - - oEvent = getEvent(oEvent); - if (oEvent) - { - aItems = (oEvent.dataTransfer ? getValue(oEvent.dataTransfer, 'items', null) : null) || getValue(oEvent, 'items', null); - if (aItems && 0 < aItems.length && aItems[0] && aItems[0]['webkitGetAsEntry']) - { - getDataFromFiles(aItems, fFileCallback, true, bAllowFolderDragAndDrop, iLimit, fLimitCallback); - } - else if (eventContainsFiles(oEvent)) - { - aFiles = (getValue(oEvent, 'files', null) || (oEvent.dataTransfer ? - getValue(oEvent.dataTransfer, 'files', null) : null)); - - if (aFiles && 0 < aFiles.length) - { - getDataFromFiles(aFiles, fFileCallback, false, false, iLimit, fLimitCallback); - } - } - } - } - - function createNextLabel() - { - return $('').css({ - 'opacity': 0 - }); - } - - function createNextInput() - { - return $(''); - } - - /** - * @param {string=} sName - * @param {boolean=} bMultiple = true - * @return {?Object} - */ - function getNewInput(sName, bMultiple) - { - sName = isUndefined(sName) ? '' : sName.toString(); - - var oLocal = createNextInput(); - if (0 < sName.length) - { - oLocal.attr('name', sName); - } - - if (isUndefined(bMultiple) ? true : bMultiple) - { - oLocal.prop('multiple', true); - } - - return oLocal; - } - - /** - * @param {?} mStringOrFunction - * @param {Array=} aFunctionParams - * @return {string} - */ - function getStringOrCallFunction(mStringOrFunction, aFunctionParams) - { - return $.isFunction(mStringOrFunction) ? - mStringOrFunction.apply(null, $.isArray(aFunctionParams) ? aFunctionParams : []).toString() : - mStringOrFunction.toString(); - } - - /** - * @constructor - * @param {Jua} oJua - * @param {Object} oOptions - */ - function AjaxDriver(oJua, oOptions) - { - this.oXhrs = {}; - this.oUids = {}; - this.oJua = oJua; - this.oOptions = oOptions; - } - - /** - * @type {Object} - */ - AjaxDriver.prototype.oXhrs = {}; - - /** - * @type {Object} - */ - AjaxDriver.prototype.oUids = {}; - - /** - * @type {?Jua} - */ - AjaxDriver.prototype.oJua = null; - - /** - * @type {Object} - */ - AjaxDriver.prototype.oOptions = {}; - - /** - * @return {boolean} - */ - AjaxDriver.prototype.isDragAndDropSupported = function () - { - return true; - }; - - /** - * @param {string} sUid - */ - AjaxDriver.prototype.regTaskUid = function (sUid) - { - this.oUids[sUid] = true; - }; - - /** - * @param {string} sUid - * @param {?} oFileInfo - * @param {Function} fCallback - */ - AjaxDriver.prototype.uploadTask = function (sUid, oFileInfo, fCallback) - { - if (false === this.oUids[sUid] || !oFileInfo || !oFileInfo['File']) - { - fCallback(null, sUid); - return false; - } - - try - { - var - self = this, - oXhr = new XMLHttpRequest(), - oFormData = new FormData(), - sAction = getValue(this.oOptions, 'action', ''), - aHidden = getValue(this.oOptions, 'hidden', {}), - fStartFunction = this.oJua.getEvent('onStart'), - fCompleteFunction = this.oJua.getEvent('onComplete'), - fProgressFunction = this.oJua.getEvent('onProgress') - ; - - oXhr.open('POST', sAction, true); - - if (fProgressFunction && oXhr.upload) - { - oXhr.upload.onprogress = function (oEvent) { - if (oEvent && oEvent.lengthComputable && !isUndefined(oEvent.loaded) && !isUndefined(oEvent.total)) - { - fProgressFunction(sUid, oEvent.loaded, oEvent.total); - } - }; - } - - oXhr.onreadystatechange = function () { - if (4 === oXhr.readyState && 200 === oXhr.status) - { - if (fCompleteFunction) - { - var - bResult = false, - oResult = null - ; - - try - { - oResult = $.parseJSON(oXhr.responseText); - bResult = true; - } - catch (oException) - { - oResult = null; - } - - fCompleteFunction(sUid, bResult, oResult); - } - - if (!isUndefined(self.oXhrs[sUid])) - { - self.oXhrs[sUid] = null; - } - - fCallback(null, sUid); - } - else - { - if (4 === oXhr.readyState) - { - fCompleteFunction(sUid, false, null); - fCallback(null, sUid); - } - } - }; - - if (fStartFunction) - { - fStartFunction(sUid); - } - - oFormData.append('jua-post-type', 'ajax'); - oFormData.append(getValue(this.oOptions, 'name', 'juaFile'), oFileInfo['File']); - $.each(aHidden, function (sKey, sValue) { - oFormData.append(sKey, getStringOrCallFunction(sValue, [oFileInfo])); - }); - - oXhr.send(oFormData); - - this.oXhrs[sUid] = oXhr; - return true; - } - catch (oError) - { - } - - fCallback(null, sUid); - return false; - }; - - AjaxDriver.prototype.generateNewInput = function (oClickElement) - { - var - self = this, - oLabel = null, - oInput = null - ; - - if (oClickElement) - { - oInput = getNewInput('', !getValue(this.oOptions, 'disableMultiple', false)); - oLabel = createNextLabel(); - oLabel.append(oInput); - - $(oClickElement).append(oLabel); - - oInput - .on('click', function () { - var fOn = self.oJua.getEvent('onDialog'); - if (fOn) - { - fOn(); - } - }) - .on('change', function () { - getDataFromInput(this, function (oFile) { - self.oJua.addNewFile(oFile); - self.generateNewInput(oClickElement); - - setTimeout(function () { - oLabel.remove(); - }, 10); - }, - getValue(self.oOptions, 'multipleSizeLimit', Jua.iDefLimit), - self.oJua.getEvent('onLimitReached') - ); - }) - ; - } - }; - - AjaxDriver.prototype.cancel = function (sUid) - { - this.oUids[sUid] = false; - if (this.oXhrs[sUid]) - { - try - { - if (this.oXhrs[sUid].abort) - { - this.oXhrs[sUid].abort(); - } - } - catch (oError) - { - } - - this.oXhrs[sUid] = null; - } - }; - - /** - * @constructor - * @param {Jua} oJua - * @param {Object} oOptions - */ - function IframeDriver(oJua, oOptions) - { - this.oUids = {}; - this.oForms = {}; - this.oJua = oJua; - this.oOptions = oOptions; - } - - /** - * @type {Object} - */ - IframeDriver.prototype.oUids = {}; - - /** - * @type {Object} - */ - IframeDriver.prototype.oForms = {}; - - /** - * @type {?Jua} - */ - IframeDriver.prototype.oJua = null; - - /** - * @type {Object} - */ - IframeDriver.prototype.oOptions = {}; - - /** - * @return {boolean} - */ - IframeDriver.prototype.isDragAndDropSupported = function () - { - return false; - }; - - /** - * @param {string} sUid - */ - IframeDriver.prototype.regTaskUid = function (sUid) - { - this.oUids[sUid] = true; - }; - - /** - * @param {string} sUid - * @param {?} oFileInfo - * @param {Function} fCallback - */ - IframeDriver.prototype.uploadTask = function (sUid, oFileInfo, fCallback) - { - if (false === this.oUids[sUid]) - { - fCallback(null, sUid); - return false; - } - - var - oForm = this.oForms[sUid], - aHidden = getValue(this.oOptions, 'hidden', {}), - fStartFunction = this.oJua.getEvent('onStart'), - fCompleteFunction = this.oJua.getEvent('onComplete') - ; - - if (oForm) - { - oForm.append($('').attr('name', 'jua-post-type').val('iframe')); - $.each(aHidden, function (sKey, sValue) { - oForm.append($('').attr('name', sKey).val(getStringOrCallFunction(sValue, [oFileInfo]))); - }); - - oForm.trigger('submit'); - if (fStartFunction) - { - fStartFunction(sUid); - } - - oForm.find('iframe').on('load', function (oEvent) { - - var - bResult = false, - oIframeDoc = null, - oResult = {} - ; - - if (fCompleteFunction) - { - try - { - oIframeDoc = this.contentDocument ? this.contentDocument: this.contentWindow.document; - oResult = $.parseJSON(oIframeDoc.body.innerHTML); - bResult = true; - } - catch (oErr) - { - oResult = {}; - } - - fCompleteFunction(sUid, bResult, oResult); - } - - fCallback(null, sUid); - - window.setTimeout(function () { - oForm.remove(); - }, 100); - }); - } - else - { - fCallback(null, sUid); - } - - return true; - }; - - IframeDriver.prototype.generateNewInput = function (oClickElement) - { - var - self = this, - sUid = '', - oInput = null, - oIframe = null, - sAction = getValue(this.oOptions, 'action', ''), - oForm = null - ; - - if (oClickElement) - { - sUid = getNewUid(); - - oInput = getNewInput(getValue(this.oOptions, 'name', 'juaFile'), !getValue(this.oOptions, 'disableMultiple', false)); - - oForm = $('
'); - - oIframe = $(''; + + } else if (isVideo.vimeo) { + + a = '?autoplay=' + autoplay + '&api=1'; + if (this.core.s.vimeoPlayerParams) { + a = a + '&' + $.param(this.core.s.vimeoPlayerParams); + } + + video = ''; + + } else if (isVideo.dailymotion) { + + a = '?wmode=opaque&autoplay=' + autoplay + '&api=postMessage'; + if (this.core.s.dailymotionPlayerParams) { + a = a + '&' + $.param(this.core.s.dailymotionPlayerParams); + } + + video = ''; + + } else if (isVideo.html5) { + var fL = html.substring(0, 1); + if (fL === '.' || fL === '#') { + html = $(html).html(); + } + + video = html; + + } else if (isVideo.vk) { + + a = '&autoplay=' + autoplay; + if (this.core.s.vkPlayerParams) { + a = a + '&' + $.param(this.core.s.vkPlayerParams); + } + + video = ''; + + } + + return video; + }; + + Video.prototype.destroy = function() { + this.videoLoaded = false; + }; + + $.fn.lightGallery.modules.video = Video; + +})(jQuery, window, document); diff --git a/vendors/lightgallery/dist/js/lg-video.min.js b/vendors/lightgallery/dist/js/lg-video.min.js new file mode 100644 index 000000000..ef4c2e891 --- /dev/null +++ b/vendors/lightgallery/dist/js/lg-video.min.js @@ -0,0 +1,4 @@ +/*! lightgallery - v1.2.21 - 2016-06-28 +* http://sachinchoolur.github.io/lightGallery/ +* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ +!function(a,b,c,d){"use strict";var e={videoMaxWidth:"855px",youtubePlayerParams:!1,vimeoPlayerParams:!1,dailymotionPlayerParams:!1,vkPlayerParams:!1,videojs:!1,videojsOptions:{}},f=function(b){return this.core=a(b).data("lightGallery"),this.$el=a(b),this.core.s=a.extend({},e,this.core.s),this.videoLoaded=!1,this.init(),this};f.prototype.init=function(){var b=this;b.core.$el.on("hasVideo.lg.tm",function(a,c,d,e){if(b.core.$slide.eq(c).find(".lg-video").append(b.loadVideo(d,"lg-object",!0,c,e)),e)if(b.core.s.videojs)try{videojs(b.core.$slide.eq(c).find(".lg-html5").get(0),b.core.s.videojsOptions,function(){b.videoLoaded||this.play()})}catch(f){console.error("Make sure you have included videojs")}else b.core.$slide.eq(c).find(".lg-html5").get(0).play()}),b.core.$el.on("onAferAppendSlide.lg.tm",function(a,c){b.core.$slide.eq(c).find(".lg-video-cont").css("max-width",b.core.s.videoMaxWidth),b.videoLoaded=!0});var c=function(a){if(a.find(".lg-object").hasClass("lg-has-poster")&&a.find(".lg-object").is(":visible"))if(a.hasClass("lg-has-video")){var c=a.find(".lg-youtube").get(0),d=a.find(".lg-vimeo").get(0),e=a.find(".lg-dailymotion").get(0),f=a.find(".lg-html5").get(0);if(c)c.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*");else if(d)try{$f(d).api("play")}catch(g){console.error("Make sure you have included froogaloop2 js")}else if(e)e.contentWindow.postMessage("play","*");else if(f)if(b.core.s.videojs)try{videojs(f).play()}catch(g){console.error("Make sure you have included videojs")}else f.play();a.addClass("lg-video-playing")}else{a.addClass("lg-video-playing lg-has-video");var h,i,j=function(c,d){if(a.find(".lg-video").append(b.loadVideo(c,"",!1,b.core.index,d)),d)if(b.core.s.videojs)try{videojs(b.core.$slide.eq(b.core.index).find(".lg-html5").get(0),b.core.s.videojsOptions,function(){this.play()})}catch(e){console.error("Make sure you have included videojs")}else b.core.$slide.eq(b.core.index).find(".lg-html5").get(0).play()};b.core.s.dynamic?(h=b.core.s.dynamicEl[b.core.index].src,i=b.core.s.dynamicEl[b.core.index].html,j(h,i)):(h=b.core.$items.eq(b.core.index).attr("href")||b.core.$items.eq(b.core.index).attr("data-src"),i=b.core.$items.eq(b.core.index).attr("data-html"),j(h,i));var k=a.find(".lg-object");a.find(".lg-video").append(k),a.find(".lg-video-object").hasClass("lg-html5")||(a.removeClass("lg-complete"),a.find(".lg-video-object").on("load.lg error.lg",function(){a.addClass("lg-complete")}))}};b.core.doCss()&&b.core.$items.length>1&&(b.core.s.enableSwipe&&b.core.isTouch||b.core.s.enableDrag&&!b.core.isTouch)?b.core.$el.on("onSlideClick.lg.tm",function(){var a=b.core.$slide.eq(b.core.index);c(a)}):b.core.$slide.on("click.lg",function(){c(a(this))}),b.core.$el.on("onBeforeSlide.lg.tm",function(c,d,e){var f=b.core.$slide.eq(d),g=f.find(".lg-youtube").get(0),h=f.find(".lg-vimeo").get(0),i=f.find(".lg-dailymotion").get(0),j=f.find(".lg-vk").get(0),k=f.find(".lg-html5").get(0);if(g)g.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*");else if(h)try{$f(h).api("pause")}catch(l){console.error("Make sure you have included froogaloop2 js")}else if(i)i.contentWindow.postMessage("pause","*");else if(k)if(b.core.s.videojs)try{videojs(k).pause()}catch(l){console.error("Make sure you have included videojs")}else k.pause();j&&a(j).attr("src",a(j).attr("src").replace("&autoplay","&noplay"));var m;m=b.core.s.dynamic?b.core.s.dynamicEl[e].src:b.core.$items.eq(e).attr("href")||b.core.$items.eq(e).attr("data-src");var n=b.core.isVideo(m,e)||{};(n.youtube||n.vimeo||n.dailymotion||n.vk)&&b.core.$outer.addClass("lg-hide-download")}),b.core.$el.on("onAfterSlide.lg.tm",function(a,c){b.core.$slide.eq(c).removeClass("lg-video-playing")})},f.prototype.loadVideo=function(b,c,d,e,f){var g="",h=1,i="",j=this.core.isVideo(b,e)||{};if(d&&(h=this.videoLoaded?0:1),j.youtube)i="?wmode=opaque&autoplay="+h+"&enablejsapi=1",this.core.s.youtubePlayerParams&&(i=i+"&"+a.param(this.core.s.youtubePlayerParams)),g='';else if(j.vimeo)i="?autoplay="+h+"&api=1",this.core.s.vimeoPlayerParams&&(i=i+"&"+a.param(this.core.s.vimeoPlayerParams)),g='';else if(j.dailymotion)i="?wmode=opaque&autoplay="+h+"&api=postMessage",this.core.s.dailymotionPlayerParams&&(i=i+"&"+a.param(this.core.s.dailymotionPlayerParams)),g='';else if(j.html5){var k=f.substring(0,1);"."!==k&&"#"!==k||(f=a(f).html()),g=f}else j.vk&&(i="&autoplay="+h,this.core.s.vkPlayerParams&&(i=i+"&"+a.param(this.core.s.vkPlayerParams)),g='');return g},f.prototype.destroy=function(){this.videoLoaded=!1},a.fn.lightGallery.modules.video=f}(jQuery,window,document); \ No newline at end of file diff --git a/vendors/lightgallery/dist/js/lg-zoom.js b/vendors/lightgallery/dist/js/lg-zoom.js new file mode 100644 index 000000000..701b12f9d --- /dev/null +++ b/vendors/lightgallery/dist/js/lg-zoom.js @@ -0,0 +1,477 @@ +/*! lightgallery - v1.2.21 - 2016-06-28 +* http://sachinchoolur.github.io/lightGallery/ +* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + scale: 1, + zoom: true, + actualSize: true, + enableZoomAfter: 300 + }; + + var Zoom = function(element) { + + this.core = $(element).data('lightGallery'); + + this.core.s = $.extend({}, defaults, this.core.s); + + if (this.core.s.zoom && this.core.doCss()) { + this.init(); + + // Store the zoomable timeout value just to clear it while closing + this.zoomabletimeout = false; + + // Set the initial value center + this.pageX = $(window).width() / 2; + this.pageY = ($(window).height() / 2) + $(window).scrollTop(); + } + + return this; + }; + + Zoom.prototype.init = function() { + + var _this = this; + var zoomIcons = ''; + + if (_this.core.s.actualSize) { + zoomIcons += ''; + } + + this.core.$outer.find('.lg-toolbar').append(zoomIcons); + + // Add zoomable class + _this.core.$el.on('onSlideItemLoad.lg.tm.zoom', function(event, index, delay) { + + // delay will be 0 except first time + var _speed = _this.core.s.enableZoomAfter + delay; + + // set _speed value 0 if gallery opened from direct url and if it is first slide + if ($('body').hasClass('lg-from-hash') && delay) { + + // will execute only once + _speed = 0; + } else { + + // Remove lg-from-hash to enable starting animation. + $('body').removeClass('lg-from-hash'); + } + + _this.zoomabletimeout = setTimeout(function() { + _this.core.$slide.eq(index).addClass('lg-zoomable'); + }, _speed + 30); + }); + + var scale = 1; + /** + * @desc Image zoom + * Translate the wrap and scale the image to get better user experience + * + * @param {String} scaleVal - Zoom decrement/increment value + */ + var zoom = function(scaleVal) { + + var $image = _this.core.$outer.find('.lg-current .lg-image'); + var _x; + var _y; + + // Find offset manually to avoid issue after zoom + var offsetX = ($(window).width() - $image.width()) / 2; + var offsetY = (($(window).height() - $image.height()) / 2) + $(window).scrollTop(); + + _x = _this.pageX - offsetX; + _y = _this.pageY - offsetY; + + var x = (scaleVal - 1) * (_x); + var y = (scaleVal - 1) * (_y); + + $image.css('transform', 'scale3d(' + scaleVal + ', ' + scaleVal + ', 1)').attr('data-scale', scaleVal); + + $image.parent().css({ + left: -x + 'px', + top: -y + 'px' + }).attr('data-x', x).attr('data-y', y); + }; + + var callScale = function() { + if (scale > 1) { + _this.core.$outer.addClass('lg-zoomed'); + } else { + _this.resetZoom(); + } + + if (scale < 1) { + scale = 1; + } + + zoom(scale); + }; + + var actualSize = function(event, $image, index, fromIcon) { + var w = $image.width(); + var nw; + if (_this.core.s.dynamic) { + nw = _this.core.s.dynamicEl[index].width || $image[0].naturalWidth || w; + } else { + nw = _this.core.$items.eq(index).attr('data-width') || $image[0].naturalWidth || w; + } + + var _scale; + + if (_this.core.$outer.hasClass('lg-zoomed')) { + scale = 1; + } else { + if (nw > w) { + _scale = nw / w; + scale = _scale || 2; + } + } + + if (fromIcon) { + _this.pageX = $(window).width() / 2; + _this.pageY = ($(window).height() / 2) + $(window).scrollTop(); + } else { + _this.pageX = event.pageX || event.originalEvent.targetTouches[0].pageX; + _this.pageY = event.pageY || event.originalEvent.targetTouches[0].pageY; + } + + callScale(); + setTimeout(function() { + _this.core.$outer.removeClass('lg-grabbing').addClass('lg-grab'); + }, 10); + }; + + var tapped = false; + + // event triggered after appending slide content + _this.core.$el.on('onAferAppendSlide.lg.tm.zoom', function(event, index) { + + // Get the current element + var $image = _this.core.$slide.eq(index).find('.lg-image'); + + $image.on('dblclick', function(event) { + actualSize(event, $image, index); + }); + + $image.on('touchstart', function(event) { + if (!tapped) { + tapped = setTimeout(function() { + tapped = null; + }, 300); + } else { + clearTimeout(tapped); + tapped = null; + actualSize(event, $image, index); + } + + event.preventDefault(); + }); + + }); + + // Update zoom on resize and orientationchange + $(window).on('resize.lg.zoom scroll.lg.zoom orientationchange.lg.zoom', function() { + _this.pageX = $(window).width() / 2; + _this.pageY = ($(window).height() / 2) + $(window).scrollTop(); + zoom(scale); + }); + + $('#lg-zoom-out').on('click.lg', function() { + if (_this.core.$outer.find('.lg-current .lg-image').length) { + scale -= _this.core.s.scale; + callScale(); + } + }); + + $('#lg-zoom-in').on('click.lg', function() { + if (_this.core.$outer.find('.lg-current .lg-image').length) { + scale += _this.core.s.scale; + callScale(); + } + }); + + $('#lg-actual-size').on('click.lg', function(event) { + actualSize(event, _this.core.$slide.eq(_this.core.index).find('.lg-image'), _this.core.index, true); + }); + + // Reset zoom on slide change + _this.core.$el.on('onBeforeSlide.lg.tm', function() { + scale = 1; + _this.resetZoom(); + }); + + // Drag option after zoom + if (!_this.core.isTouch) { + _this.zoomDrag(); + } + + if (_this.core.isTouch) { + _this.zoomSwipe(); + } + + }; + + // Reset zoom effect + Zoom.prototype.resetZoom = function() { + this.core.$outer.removeClass('lg-zoomed'); + this.core.$slide.find('.lg-img-wrap').removeAttr('style data-x data-y'); + this.core.$slide.find('.lg-image').removeAttr('style data-scale'); + + // Reset pagx pagy values to center + this.pageX = $(window).width() / 2; + this.pageY = ($(window).height() / 2) + $(window).scrollTop(); + }; + + Zoom.prototype.zoomSwipe = function() { + var _this = this; + var startCoords = {}; + var endCoords = {}; + var isMoved = false; + + // Allow x direction drag + var allowX = false; + + // Allow Y direction drag + var allowY = false; + + _this.core.$slide.on('touchstart.lg', function(e) { + + if (_this.core.$outer.hasClass('lg-zoomed')) { + var $image = _this.core.$slide.eq(_this.core.index).find('.lg-object'); + + allowY = $image.outerHeight() * $image.attr('data-scale') > _this.core.$outer.find('.lg').height(); + allowX = $image.outerWidth() * $image.attr('data-scale') > _this.core.$outer.find('.lg').width(); + if ((allowX || allowY)) { + e.preventDefault(); + startCoords = { + x: e.originalEvent.targetTouches[0].pageX, + y: e.originalEvent.targetTouches[0].pageY + }; + } + } + + }); + + _this.core.$slide.on('touchmove.lg', function(e) { + + if (_this.core.$outer.hasClass('lg-zoomed')) { + + var _$el = _this.core.$slide.eq(_this.core.index).find('.lg-img-wrap'); + var distanceX; + var distanceY; + + e.preventDefault(); + isMoved = true; + + endCoords = { + x: e.originalEvent.targetTouches[0].pageX, + y: e.originalEvent.targetTouches[0].pageY + }; + + // reset opacity and transition duration + _this.core.$outer.addClass('lg-zoom-dragging'); + + if (allowY) { + distanceY = (-Math.abs(_$el.attr('data-y'))) + (endCoords.y - startCoords.y); + } else { + distanceY = -Math.abs(_$el.attr('data-y')); + } + + if (allowX) { + distanceX = (-Math.abs(_$el.attr('data-x'))) + (endCoords.x - startCoords.x); + } else { + distanceX = -Math.abs(_$el.attr('data-x')); + } + + if ((Math.abs(endCoords.x - startCoords.x) > 15) || (Math.abs(endCoords.y - startCoords.y) > 15)) { + _$el.css({ + left: distanceX + 'px', + top: distanceY + 'px' + }); + } + + } + + }); + + _this.core.$slide.on('touchend.lg', function() { + if (_this.core.$outer.hasClass('lg-zoomed')) { + if (isMoved) { + isMoved = false; + _this.core.$outer.removeClass('lg-zoom-dragging'); + _this.touchendZoom(startCoords, endCoords, allowX, allowY); + + } + } + }); + + }; + + Zoom.prototype.zoomDrag = function() { + + var _this = this; + var startCoords = {}; + var endCoords = {}; + var isDraging = false; + var isMoved = false; + + // Allow x direction drag + var allowX = false; + + // Allow Y direction drag + var allowY = false; + + _this.core.$slide.on('mousedown.lg.zoom', function(e) { + + // execute only on .lg-object + var $image = _this.core.$slide.eq(_this.core.index).find('.lg-object'); + + allowY = $image.outerHeight() * $image.attr('data-scale') > _this.core.$outer.find('.lg').height(); + allowX = $image.outerWidth() * $image.attr('data-scale') > _this.core.$outer.find('.lg').width(); + + if (_this.core.$outer.hasClass('lg-zoomed')) { + if ($(e.target).hasClass('lg-object') && (allowX || allowY)) { + e.preventDefault(); + startCoords = { + x: e.pageX, + y: e.pageY + }; + + isDraging = true; + + // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723 + _this.core.$outer.scrollLeft += 1; + _this.core.$outer.scrollLeft -= 1; + + _this.core.$outer.removeClass('lg-grab').addClass('lg-grabbing'); + } + } + }); + + $(window).on('mousemove.lg.zoom', function(e) { + if (isDraging) { + var _$el = _this.core.$slide.eq(_this.core.index).find('.lg-img-wrap'); + var distanceX; + var distanceY; + + isMoved = true; + endCoords = { + x: e.pageX, + y: e.pageY + }; + + // reset opacity and transition duration + _this.core.$outer.addClass('lg-zoom-dragging'); + + if (allowY) { + distanceY = (-Math.abs(_$el.attr('data-y'))) + (endCoords.y - startCoords.y); + } else { + distanceY = -Math.abs(_$el.attr('data-y')); + } + + if (allowX) { + distanceX = (-Math.abs(_$el.attr('data-x'))) + (endCoords.x - startCoords.x); + } else { + distanceX = -Math.abs(_$el.attr('data-x')); + } + + _$el.css({ + left: distanceX + 'px', + top: distanceY + 'px' + }); + } + }); + + $(window).on('mouseup.lg.zoom', function(e) { + + if (isDraging) { + isDraging = false; + _this.core.$outer.removeClass('lg-zoom-dragging'); + + // Fix for chrome mouse move on click + if (isMoved && ((startCoords.x !== endCoords.x) || (startCoords.y !== endCoords.y))) { + endCoords = { + x: e.pageX, + y: e.pageY + }; + _this.touchendZoom(startCoords, endCoords, allowX, allowY); + + } + + isMoved = false; + } + + _this.core.$outer.removeClass('lg-grabbing').addClass('lg-grab'); + + }); + }; + + Zoom.prototype.touchendZoom = function(startCoords, endCoords, allowX, allowY) { + + var _this = this; + var _$el = _this.core.$slide.eq(_this.core.index).find('.lg-img-wrap'); + var $image = _this.core.$slide.eq(_this.core.index).find('.lg-object'); + var distanceX = (-Math.abs(_$el.attr('data-x'))) + (endCoords.x - startCoords.x); + var distanceY = (-Math.abs(_$el.attr('data-y'))) + (endCoords.y - startCoords.y); + var minY = (_this.core.$outer.find('.lg').height() - $image.outerHeight()) / 2; + var maxY = Math.abs(($image.outerHeight() * Math.abs($image.attr('data-scale'))) - _this.core.$outer.find('.lg').height() + minY); + var minX = (_this.core.$outer.find('.lg').width() - $image.outerWidth()) / 2; + var maxX = Math.abs(($image.outerWidth() * Math.abs($image.attr('data-scale'))) - _this.core.$outer.find('.lg').width() + minX); + + if ((Math.abs(endCoords.x - startCoords.x) > 15) || (Math.abs(endCoords.y - startCoords.y) > 15)) { + if (allowY) { + if (distanceY <= -maxY) { + distanceY = -maxY; + } else if (distanceY >= -minY) { + distanceY = -minY; + } + } + + if (allowX) { + if (distanceX <= -maxX) { + distanceX = -maxX; + } else if (distanceX >= -minX) { + distanceX = -minX; + } + } + + if (allowY) { + _$el.attr('data-y', Math.abs(distanceY)); + } else { + distanceY = -Math.abs(_$el.attr('data-y')); + } + + if (allowX) { + _$el.attr('data-x', Math.abs(distanceX)); + } else { + distanceX = -Math.abs(_$el.attr('data-x')); + } + + _$el.css({ + left: distanceX + 'px', + top: distanceY + 'px' + }); + + } + }; + + Zoom.prototype.destroy = function() { + + var _this = this; + + // Unbind all events added by lightGallery zoom plugin + _this.core.$el.off('.lg.zoom'); + $(window).off('.lg.zoom'); + _this.core.$slide.off('.lg.zoom'); + _this.core.$el.off('.lg.tm.zoom'); + _this.resetZoom(); + clearTimeout(_this.zoomabletimeout); + _this.zoomabletimeout = false; + }; + + $.fn.lightGallery.modules.zoom = Zoom; + +})(jQuery, window, document); \ No newline at end of file diff --git a/vendors/lightgallery/dist/js/lg-zoom.min.js b/vendors/lightgallery/dist/js/lg-zoom.min.js new file mode 100644 index 000000000..721aeb8fe --- /dev/null +++ b/vendors/lightgallery/dist/js/lg-zoom.min.js @@ -0,0 +1,4 @@ +/*! lightgallery - v1.2.21 - 2016-06-28 +* http://sachinchoolur.github.io/lightGallery/ +* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ +!function(a,b,c,d){"use strict";var e={scale:1,zoom:!0,actualSize:!0,enableZoomAfter:300},f=function(c){return this.core=a(c).data("lightGallery"),this.core.s=a.extend({},e,this.core.s),this.core.s.zoom&&this.core.doCss()&&(this.init(),this.zoomabletimeout=!1,this.pageX=a(b).width()/2,this.pageY=a(b).height()/2+a(b).scrollTop()),this};f.prototype.init=function(){var c=this,d='';c.core.s.actualSize&&(d+=''),this.core.$outer.find(".lg-toolbar").append(d),c.core.$el.on("onSlideItemLoad.lg.tm.zoom",function(b,d,e){var f=c.core.s.enableZoomAfter+e;a("body").hasClass("lg-from-hash")&&e?f=0:a("body").removeClass("lg-from-hash"),c.zoomabletimeout=setTimeout(function(){c.core.$slide.eq(d).addClass("lg-zoomable")},f+30)});var e=1,f=function(d){var e,f,g=c.core.$outer.find(".lg-current .lg-image"),h=(a(b).width()-g.width())/2,i=(a(b).height()-g.height())/2+a(b).scrollTop();e=c.pageX-h,f=c.pageY-i;var j=(d-1)*e,k=(d-1)*f;g.css("transform","scale3d("+d+", "+d+", 1)").attr("data-scale",d),g.parent().css({left:-j+"px",top:-k+"px"}).attr("data-x",j).attr("data-y",k)},g=function(){e>1?c.core.$outer.addClass("lg-zoomed"):c.resetZoom(),1>e&&(e=1),f(e)},h=function(d,f,h,i){var j,k=f.width();j=c.core.s.dynamic?c.core.s.dynamicEl[h].width||f[0].naturalWidth||k:c.core.$items.eq(h).attr("data-width")||f[0].naturalWidth||k;var l;c.core.$outer.hasClass("lg-zoomed")?e=1:j>k&&(l=j/k,e=l||2),i?(c.pageX=a(b).width()/2,c.pageY=a(b).height()/2+a(b).scrollTop()):(c.pageX=d.pageX||d.originalEvent.targetTouches[0].pageX,c.pageY=d.pageY||d.originalEvent.targetTouches[0].pageY),g(),setTimeout(function(){c.core.$outer.removeClass("lg-grabbing").addClass("lg-grab")},10)},i=!1;c.core.$el.on("onAferAppendSlide.lg.tm.zoom",function(a,b){var d=c.core.$slide.eq(b).find(".lg-image");d.on("dblclick",function(a){h(a,d,b)}),d.on("touchstart",function(a){i?(clearTimeout(i),i=null,h(a,d,b)):i=setTimeout(function(){i=null},300),a.preventDefault()})}),a(b).on("resize.lg.zoom scroll.lg.zoom orientationchange.lg.zoom",function(){c.pageX=a(b).width()/2,c.pageY=a(b).height()/2+a(b).scrollTop(),f(e)}),a("#lg-zoom-out").on("click.lg",function(){c.core.$outer.find(".lg-current .lg-image").length&&(e-=c.core.s.scale,g())}),a("#lg-zoom-in").on("click.lg",function(){c.core.$outer.find(".lg-current .lg-image").length&&(e+=c.core.s.scale,g())}),a("#lg-actual-size").on("click.lg",function(a){h(a,c.core.$slide.eq(c.core.index).find(".lg-image"),c.core.index,!0)}),c.core.$el.on("onBeforeSlide.lg.tm",function(){e=1,c.resetZoom()}),c.core.isTouch||c.zoomDrag(),c.core.isTouch&&c.zoomSwipe()},f.prototype.resetZoom=function(){this.core.$outer.removeClass("lg-zoomed"),this.core.$slide.find(".lg-img-wrap").removeAttr("style data-x data-y"),this.core.$slide.find(".lg-image").removeAttr("style data-scale"),this.pageX=a(b).width()/2,this.pageY=a(b).height()/2+a(b).scrollTop()},f.prototype.zoomSwipe=function(){var a=this,b={},c={},d=!1,e=!1,f=!1;a.core.$slide.on("touchstart.lg",function(c){if(a.core.$outer.hasClass("lg-zoomed")){var d=a.core.$slide.eq(a.core.index).find(".lg-object");f=d.outerHeight()*d.attr("data-scale")>a.core.$outer.find(".lg").height(),e=d.outerWidth()*d.attr("data-scale")>a.core.$outer.find(".lg").width(),(e||f)&&(c.preventDefault(),b={x:c.originalEvent.targetTouches[0].pageX,y:c.originalEvent.targetTouches[0].pageY})}}),a.core.$slide.on("touchmove.lg",function(g){if(a.core.$outer.hasClass("lg-zoomed")){var h,i,j=a.core.$slide.eq(a.core.index).find(".lg-img-wrap");g.preventDefault(),d=!0,c={x:g.originalEvent.targetTouches[0].pageX,y:g.originalEvent.targetTouches[0].pageY},a.core.$outer.addClass("lg-zoom-dragging"),i=f?-Math.abs(j.attr("data-y"))+(c.y-b.y):-Math.abs(j.attr("data-y")),h=e?-Math.abs(j.attr("data-x"))+(c.x-b.x):-Math.abs(j.attr("data-x")),(Math.abs(c.x-b.x)>15||Math.abs(c.y-b.y)>15)&&j.css({left:h+"px",top:i+"px"})}}),a.core.$slide.on("touchend.lg",function(){a.core.$outer.hasClass("lg-zoomed")&&d&&(d=!1,a.core.$outer.removeClass("lg-zoom-dragging"),a.touchendZoom(b,c,e,f))})},f.prototype.zoomDrag=function(){var c=this,d={},e={},f=!1,g=!1,h=!1,i=!1;c.core.$slide.on("mousedown.lg.zoom",function(b){var e=c.core.$slide.eq(c.core.index).find(".lg-object");i=e.outerHeight()*e.attr("data-scale")>c.core.$outer.find(".lg").height(),h=e.outerWidth()*e.attr("data-scale")>c.core.$outer.find(".lg").width(),c.core.$outer.hasClass("lg-zoomed")&&a(b.target).hasClass("lg-object")&&(h||i)&&(b.preventDefault(),d={x:b.pageX,y:b.pageY},f=!0,c.core.$outer.scrollLeft+=1,c.core.$outer.scrollLeft-=1,c.core.$outer.removeClass("lg-grab").addClass("lg-grabbing"))}),a(b).on("mousemove.lg.zoom",function(a){if(f){var b,j,k=c.core.$slide.eq(c.core.index).find(".lg-img-wrap");g=!0,e={x:a.pageX,y:a.pageY},c.core.$outer.addClass("lg-zoom-dragging"),j=i?-Math.abs(k.attr("data-y"))+(e.y-d.y):-Math.abs(k.attr("data-y")),b=h?-Math.abs(k.attr("data-x"))+(e.x-d.x):-Math.abs(k.attr("data-x")),k.css({left:b+"px",top:j+"px"})}}),a(b).on("mouseup.lg.zoom",function(a){f&&(f=!1,c.core.$outer.removeClass("lg-zoom-dragging"),!g||d.x===e.x&&d.y===e.y||(e={x:a.pageX,y:a.pageY},c.touchendZoom(d,e,h,i)),g=!1),c.core.$outer.removeClass("lg-grabbing").addClass("lg-grab")})},f.prototype.touchendZoom=function(a,b,c,d){var e=this,f=e.core.$slide.eq(e.core.index).find(".lg-img-wrap"),g=e.core.$slide.eq(e.core.index).find(".lg-object"),h=-Math.abs(f.attr("data-x"))+(b.x-a.x),i=-Math.abs(f.attr("data-y"))+(b.y-a.y),j=(e.core.$outer.find(".lg").height()-g.outerHeight())/2,k=Math.abs(g.outerHeight()*Math.abs(g.attr("data-scale"))-e.core.$outer.find(".lg").height()+j),l=(e.core.$outer.find(".lg").width()-g.outerWidth())/2,m=Math.abs(g.outerWidth()*Math.abs(g.attr("data-scale"))-e.core.$outer.find(".lg").width()+l);(Math.abs(b.x-a.x)>15||Math.abs(b.y-a.y)>15)&&(d&&(-k>=i?i=-k:i>=-j&&(i=-j)),c&&(-m>=h?h=-m:h>=-l&&(h=-l)),d?f.attr("data-y",Math.abs(i)):i=-Math.abs(f.attr("data-y")),c?f.attr("data-x",Math.abs(h)):h=-Math.abs(f.attr("data-x")),f.css({left:h+"px",top:i+"px"}))},f.prototype.destroy=function(){var c=this;c.core.$el.off(".lg.zoom"),a(b).off(".lg.zoom"),c.core.$slide.off(".lg.zoom"),c.core.$el.off(".lg.tm.zoom"),c.resetZoom(),clearTimeout(c.zoomabletimeout),c.zoomabletimeout=!1},a.fn.lightGallery.modules.zoom=f}(jQuery,window,document); \ No newline at end of file diff --git a/vendors/lightgallery/dist/js/lightgallery-all.js b/vendors/lightgallery/dist/js/lightgallery-all.js new file mode 100644 index 000000000..3890574c0 --- /dev/null +++ b/vendors/lightgallery/dist/js/lightgallery-all.js @@ -0,0 +1,2970 @@ +/*! lightgallery - v1.2.21 - 2016-06-28 +* http://sachinchoolur.github.io/lightGallery/ +* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + + mode: 'lg-slide', + + // Ex : 'ease' + cssEasing: 'ease', + + //'for jquery animation' + easing: 'linear', + speed: 600, + height: '100%', + width: '100%', + addClass: '', + startClass: 'lg-start-zoom', + backdropDuration: 150, + hideBarsDelay: 6000, + + useLeft: false, + + closable: true, + loop: true, + escKey: true, + keyPress: true, + controls: true, + slideEndAnimatoin: true, + hideControlOnEnd: false, + mousewheel: true, + + getCaptionFromTitleOrAlt: true, + + // .lg-item || '.lg-sub-html' + appendSubHtmlTo: '.lg-sub-html', + + subHtmlSelectorRelative: false, + + /** + * @desc number of preload slides + * will exicute only after the current slide is fully loaded. + * + * @ex you clicked on 4th image and if preload = 1 then 3rd slide and 5th + * slide will be loaded in the background after the 4th slide is fully loaded.. + * if preload is 2 then 2nd 3rd 5th 6th slides will be preloaded.. ... ... + * + */ + preload: 1, + showAfterLoad: true, + selector: '', + selectWithin: '', + nextHtml: '', + prevHtml: '', + + // 0, 1 + index: false, + + iframeMaxWidth: '100%', + + download: true, + counter: true, + appendCounterTo: '.lg-toolbar', + + swipeThreshold: 50, + enableSwipe: true, + enableDrag: true, + + dynamic: false, + dynamicEl: [], + galleryId: 1 + }; + + function Plugin(element, options) { + + // Current lightGallery element + this.el = element; + + // Current jquery element + this.$el = $(element); + + // lightGallery settings + this.s = $.extend({}, defaults, options); + + // When using dynamic mode, ensure dynamicEl is an array + if (this.s.dynamic && this.s.dynamicEl !== 'undefined' && this.s.dynamicEl.constructor === Array && !this.s.dynamicEl.length) { + throw ('When using dynamic mode, you must also define dynamicEl as an Array.'); + } + + // lightGallery modules + this.modules = {}; + + // false when lightgallery complete first slide; + this.lGalleryOn = false; + + this.lgBusy = false; + + // Timeout function for hiding controls; + this.hideBartimeout = false; + + // To determine browser supports for touch events; + this.isTouch = ('ontouchstart' in document.documentElement); + + // Disable hideControlOnEnd if sildeEndAnimation is true + if (this.s.slideEndAnimatoin) { + this.s.hideControlOnEnd = false; + } + + // Gallery items + if (this.s.dynamic) { + this.$items = this.s.dynamicEl; + } else { + if (this.s.selector === 'this') { + this.$items = this.$el; + } else if (this.s.selector !== '') { + if (this.s.selectWithin) { + this.$items = $(this.s.selectWithin).find(this.s.selector); + } else { + this.$items = this.$el.find($(this.s.selector)); + } + } else { + this.$items = this.$el.children(); + } + } + + // .lg-item + this.$slide = ''; + + // .lg-outer + this.$outer = ''; + + this.init(); + + return this; + } + + Plugin.prototype.init = function() { + + var _this = this; + + // s.preload should not be more than $item.length + if (_this.s.preload > _this.$items.length) { + _this.s.preload = _this.$items.length; + } + + // if dynamic option is enabled execute immediately + var _hash = window.location.hash; + if (_hash.indexOf('lg=' + this.s.galleryId) > 0) { + + _this.index = parseInt(_hash.split('&slide=')[1], 10); + + $('body').addClass('lg-from-hash'); + if (!$('body').hasClass('lg-on')) { + setTimeout(function() { + _this.build(_this.index); + $('body').addClass('lg-on'); + }); + } + } + + if (_this.s.dynamic) { + + _this.$el.trigger('onBeforeOpen.lg'); + + _this.index = _this.s.index || 0; + + // prevent accidental double execution + if (!$('body').hasClass('lg-on')) { + setTimeout(function() { + _this.build(_this.index); + $('body').addClass('lg-on'); + }); + } + } else { + + // Using different namespace for click because click event should not unbind if selector is same object('this') + _this.$items.on('click.lgcustom', function(event) { + + // For IE8 + try { + event.preventDefault(); + event.preventDefault(); + } catch (er) { + event.returnValue = false; + } + + _this.$el.trigger('onBeforeOpen.lg'); + + _this.index = _this.s.index || _this.$items.index(this); + + // prevent accidental double execution + if (!$('body').hasClass('lg-on')) { + _this.build(_this.index); + $('body').addClass('lg-on'); + } + }); + } + + }; + + Plugin.prototype.build = function(index) { + + var _this = this; + + _this.structure(); + + // module constructor + $.each($.fn.lightGallery.modules, function(key) { + _this.modules[key] = new $.fn.lightGallery.modules[key](_this.el); + }); + + // initiate slide function + _this.slide(index, false, false); + + if (_this.s.keyPress) { + _this.keyPress(); + } + + if (_this.$items.length > 1) { + + _this.arrow(); + + setTimeout(function() { + _this.enableDrag(); + _this.enableSwipe(); + }, 50); + + if (_this.s.mousewheel) { + _this.mousewheel(); + } + } + + _this.counter(); + + _this.closeGallery(); + + _this.$el.trigger('onAfterOpen.lg'); + + // Hide controllers if mouse doesn't move for some period + _this.$outer.on('mousemove.lg click.lg touchstart.lg', function() { + + _this.$outer.removeClass('lg-hide-items'); + + clearTimeout(_this.hideBartimeout); + + // Timeout will be cleared on each slide movement also + _this.hideBartimeout = setTimeout(function() { + _this.$outer.addClass('lg-hide-items'); + }, _this.s.hideBarsDelay); + + }); + + }; + + Plugin.prototype.structure = function() { + var list = ''; + var controls = ''; + var i = 0; + var subHtmlCont = ''; + var template; + var _this = this; + + $('body').append('
'); + $('.lg-backdrop').css('transition-duration', this.s.backdropDuration + 'ms'); + + // Create gallery items + for (i = 0; i < this.$items.length; i++) { + list += '
'; + } + + // Create controlls + if (this.s.controls && this.$items.length > 1) { + controls = '
' + + '
' + this.s.prevHtml + '
' + + '
' + this.s.nextHtml + '
' + + '
'; + } + + if (this.s.appendSubHtmlTo === '.lg-sub-html') { + subHtmlCont = '
'; + } + + template = '
' + + '
' + + '
' + list + '
' + + '
' + + '' + + '
' + + controls + + subHtmlCont + + '
' + + '
'; + + $('body').append(template); + this.$outer = $('.lg-outer'); + this.$slide = this.$outer.find('.lg-item'); + + if (this.s.useLeft) { + this.$outer.addClass('lg-use-left'); + + // Set mode lg-slide if use left is true; + this.s.mode = 'lg-slide'; + } else { + this.$outer.addClass('lg-use-css3'); + } + + // For fixed height gallery + _this.setTop(); + $(window).on('resize.lg orientationchange.lg', function() { + setTimeout(function() { + _this.setTop(); + }, 100); + }); + + // add class lg-current to remove initial transition + this.$slide.eq(this.index).addClass('lg-current'); + + // add Class for css support and transition mode + if (this.doCss()) { + this.$outer.addClass('lg-css3'); + } else { + this.$outer.addClass('lg-css'); + + // Set speed 0 because no animation will happen if browser doesn't support css3 + this.s.speed = 0; + } + + this.$outer.addClass(this.s.mode); + + if (this.s.enableDrag && this.$items.length > 1) { + this.$outer.addClass('lg-grab'); + } + + if (this.s.showAfterLoad) { + this.$outer.addClass('lg-show-after-load'); + } + + if (this.doCss()) { + var $inner = this.$outer.find('.lg-inner'); + $inner.css('transition-timing-function', this.s.cssEasing); + $inner.css('transition-duration', this.s.speed + 'ms'); + } + + $('.lg-backdrop').addClass('in'); + + setTimeout(function() { + _this.$outer.addClass('lg-visible'); + }, this.s.backdropDuration); + + if (this.s.download) { + this.$outer.find('.lg-toolbar').append(''); + } + + // Store the current scroll top value to scroll back after closing the gallery.. + this.prevScrollTop = $(window).scrollTop(); + + }; + + // For fixed height gallery + Plugin.prototype.setTop = function() { + if (this.s.height !== '100%') { + var wH = $(window).height(); + var top = (wH - parseInt(this.s.height, 10)) / 2; + var $lGallery = this.$outer.find('.lg'); + if (wH >= parseInt(this.s.height, 10)) { + $lGallery.css('top', top + 'px'); + } else { + $lGallery.css('top', '0px'); + } + } + }; + + // Find css3 support + Plugin.prototype.doCss = function() { + // check for css animation support + var support = function() { + var transition = ['transition', 'MozTransition', 'WebkitTransition', 'OTransition', 'msTransition', 'KhtmlTransition']; + var root = document.documentElement; + var i = 0; + for (i = 0; i < transition.length; i++) { + if (transition[i] in root.style) { + return true; + } + } + }; + + if (support()) { + return true; + } + + return false; + }; + + /** + * @desc Check the given src is video + * @param {String} src + * @return {Object} video type + * Ex:{ youtube : ["//www.youtube.com/watch?v=c0asJgSyxcY", "c0asJgSyxcY"] } + */ + Plugin.prototype.isVideo = function(src, index) { + + var html; + if (this.s.dynamic) { + html = this.s.dynamicEl[index].html; + } else { + html = this.$items.eq(index).attr('data-html'); + } + + if (!src && html) { + return { + html5: true + }; + } + + var youtube = src.match(/\/\/(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=|embed\/)?([a-z0-9\-\_\%]+)/i); + var vimeo = src.match(/\/\/(?:www\.)?vimeo.com\/([0-9a-z\-_]+)/i); + var dailymotion = src.match(/\/\/(?:www\.)?dai.ly\/([0-9a-z\-_]+)/i); + var vk = src.match(/\/\/(?:www\.)?(?:vk\.com|vkontakte\.ru)\/(?:video_ext\.php\?)(.*)/i); + + if (youtube) { + return { + youtube: youtube + }; + } else if (vimeo) { + return { + vimeo: vimeo + }; + } else if (dailymotion) { + return { + dailymotion: dailymotion + }; + } else if (vk) { + return { + vk: vk + }; + } + }; + + /** + * @desc Create image counter + * Ex: 1/10 + */ + Plugin.prototype.counter = function() { + if (this.s.counter) { + $(this.s.appendCounterTo).append('
' + (parseInt(this.index, 10) + 1) + ' / ' + this.$items.length + '
'); + } + }; + + /** + * @desc add sub-html into the slide + * @param {Number} index - index of the slide + */ + Plugin.prototype.addHtml = function(index) { + var subHtml = null; + var subHtmlUrl; + var $currentEle; + if (this.s.dynamic) { + if (this.s.dynamicEl[index].subHtmlUrl) { + subHtmlUrl = this.s.dynamicEl[index].subHtmlUrl; + } else { + subHtml = this.s.dynamicEl[index].subHtml; + } + } else { + $currentEle = this.$items.eq(index); + if ($currentEle.attr('data-sub-html-url')) { + subHtmlUrl = $currentEle.attr('data-sub-html-url'); + } else { + subHtml = $currentEle.attr('data-sub-html'); + if (this.s.getCaptionFromTitleOrAlt && !subHtml) { + subHtml = $currentEle.attr('title') || $currentEle.find('img').first().attr('alt'); + } + } + } + + if (!subHtmlUrl) { + if (typeof subHtml !== 'undefined' && subHtml !== null) { + + // get first letter of subhtml + // if first letter starts with . or # get the html form the jQuery object + var fL = subHtml.substring(0, 1); + if (fL === '.' || fL === '#') { + if (this.s.subHtmlSelectorRelative && !this.s.dynamic) { + subHtml = $currentEle.find(subHtml).html(); + } else { + subHtml = $(subHtml).html(); + } + } + } else { + subHtml = ''; + } + } + + if (this.s.appendSubHtmlTo === '.lg-sub-html') { + + if (subHtmlUrl) { + this.$outer.find(this.s.appendSubHtmlTo).load(subHtmlUrl); + } else { + this.$outer.find(this.s.appendSubHtmlTo).html(subHtml); + } + + } else { + + if (subHtmlUrl) { + this.$slide.eq(index).load(subHtmlUrl); + } else { + this.$slide.eq(index).append(subHtml); + } + } + + // Add lg-empty-html class if title doesn't exist + if (typeof subHtml !== 'undefined' && subHtml !== null) { + if (subHtml === '') { + this.$outer.find(this.s.appendSubHtmlTo).addClass('lg-empty-html'); + } else { + this.$outer.find(this.s.appendSubHtmlTo).removeClass('lg-empty-html'); + } + } + + this.$el.trigger('onAfterAppendSubHtml.lg', [index]); + }; + + /** + * @desc Preload slides + * @param {Number} index - index of the slide + */ + Plugin.prototype.preload = function(index) { + var i = 1; + var j = 1; + for (i = 1; i <= this.s.preload; i++) { + if (i >= this.$items.length - index) { + break; + } + + this.loadContent(index + i, false, 0); + } + + for (j = 1; j <= this.s.preload; j++) { + if (index - j < 0) { + break; + } + + this.loadContent(index - j, false, 0); + } + }; + + /** + * @desc Load slide content into slide. + * @param {Number} index - index of the slide. + * @param {Boolean} rec - if true call loadcontent() function again. + * @param {Boolean} delay - delay for adding complete class. it is 0 except first time. + */ + Plugin.prototype.loadContent = function(index, rec, delay) { + + var _this = this; + var _hasPoster = false; + var _$img; + var _src; + var _poster; + var _srcset; + var _sizes; + var _html; + var getResponsiveSrc = function(srcItms) { + var rsWidth = []; + var rsSrc = []; + for (var i = 0; i < srcItms.length; i++) { + var __src = srcItms[i].split(' '); + + // Manage empty space + if (__src[0] === '') { + __src.splice(0, 1); + } + + rsSrc.push(__src[0]); + rsWidth.push(__src[1]); + } + + var wWidth = $(window).width(); + for (var j = 0; j < rsWidth.length; j++) { + if (parseInt(rsWidth[j], 10) > wWidth) { + _src = rsSrc[j]; + break; + } + } + }; + + if (_this.s.dynamic) { + + if (_this.s.dynamicEl[index].poster) { + _hasPoster = true; + _poster = _this.s.dynamicEl[index].poster; + } + + _html = _this.s.dynamicEl[index].html; + _src = _this.s.dynamicEl[index].src; + + if (_this.s.dynamicEl[index].responsive) { + var srcDyItms = _this.s.dynamicEl[index].responsive.split(','); + getResponsiveSrc(srcDyItms); + } + + _srcset = _this.s.dynamicEl[index].srcset; + _sizes = _this.s.dynamicEl[index].sizes; + + } else { + + if (_this.$items.eq(index).attr('data-poster')) { + _hasPoster = true; + _poster = _this.$items.eq(index).attr('data-poster'); + } + + _html = _this.$items.eq(index).attr('data-html'); + _src = _this.$items.eq(index).attr('href') || _this.$items.eq(index).attr('data-src'); + + if (_this.$items.eq(index).attr('data-responsive')) { + var srcItms = _this.$items.eq(index).attr('data-responsive').split(','); + getResponsiveSrc(srcItms); + } + + _srcset = _this.$items.eq(index).attr('data-srcset'); + _sizes = _this.$items.eq(index).attr('data-sizes'); + + } + + //if (_src || _srcset || _sizes || _poster) { + + var iframe = false; + if (_this.s.dynamic) { + if (_this.s.dynamicEl[index].iframe) { + iframe = true; + } + } else { + if (_this.$items.eq(index).attr('data-iframe') === 'true') { + iframe = true; + } + } + + var _isVideo = _this.isVideo(_src, index); + if (!_this.$slide.eq(index).hasClass('lg-loaded')) { + if (iframe) { + _this.$slide.eq(index).prepend('
'); + } else if (_hasPoster) { + var videoClass = ''; + if (_isVideo && _isVideo.youtube) { + videoClass = 'lg-has-youtube'; + } else if (_isVideo && _isVideo.vimeo) { + videoClass = 'lg-has-vimeo'; + } else { + videoClass = 'lg-has-html5'; + } + + _this.$slide.eq(index).prepend('
'); + + } else if (_isVideo) { + _this.$slide.eq(index).prepend('
'); + _this.$el.trigger('hasVideo.lg', [index, _src, _html]); + } else { + _this.$slide.eq(index).prepend('
'); + } + + _this.$el.trigger('onAferAppendSlide.lg', [index]); + + _$img = _this.$slide.eq(index).find('.lg-object'); + if (_sizes) { + _$img.attr('sizes', _sizes); + } + + if (_srcset) { + _$img.attr('srcset', _srcset); + try { + picturefill({ + elements: [_$img[0]] + }); + } catch (e) { + console.error('Make sure you have included Picturefill version 2'); + } + } + + if (this.s.appendSubHtmlTo !== '.lg-sub-html') { + _this.addHtml(index); + } + + _this.$slide.eq(index).addClass('lg-loaded'); + } + + _this.$slide.eq(index).find('.lg-object').on('load.lg error.lg', function() { + + // For first time add some delay for displaying the start animation. + var _speed = 0; + + // Do not change the delay value because it is required for zoom plugin. + // If gallery opened from direct url (hash) speed value should be 0 + if (delay && !$('body').hasClass('lg-from-hash')) { + _speed = delay; + } + + setTimeout(function() { + _this.$slide.eq(index).addClass('lg-complete'); + _this.$el.trigger('onSlideItemLoad.lg', [index, delay || 0]); + }, _speed); + + }); + + // @todo check load state for html5 videos + if (_isVideo && _isVideo.html5 && !_hasPoster) { + _this.$slide.eq(index).addClass('lg-complete'); + } + + if (rec === true) { + if (!_this.$slide.eq(index).hasClass('lg-complete')) { + _this.$slide.eq(index).find('.lg-object').on('load.lg error.lg', function() { + _this.preload(index); + }); + } else { + _this.preload(index); + } + } + + //} + }; + + /** + * @desc slide function for lightgallery + ** Slide() gets call on start + ** ** Set lg.on true once slide() function gets called. + ** Call loadContent() on slide() function inside setTimeout + ** ** On first slide we do not want any animation like slide of fade + ** ** So on first slide( if lg.on if false that is first slide) loadContent() should start loading immediately + ** ** Else loadContent() should wait for the transition to complete. + ** ** So set timeout s.speed + 50 + <=> ** loadContent() will load slide content in to the particular slide + ** ** It has recursion (rec) parameter. if rec === true loadContent() will call preload() function. + ** ** preload will execute only when the previous slide is fully loaded (images iframe) + ** ** avoid simultaneous image load + <=> ** Preload() will check for s.preload value and call loadContent() again accoring to preload value + ** loadContent() <====> Preload(); + + * @param {Number} index - index of the slide + * @param {Boolean} fromTouch - true if slide function called via touch event or mouse drag + * @param {Boolean} fromThumb - true if slide function called via thumbnail click + */ + Plugin.prototype.slide = function(index, fromTouch, fromThumb) { + + var _prevIndex = this.$outer.find('.lg-current').index(); + var _this = this; + + // Prevent if multiple call + // Required for hsh plugin + if (_this.lGalleryOn && (_prevIndex === index)) { + return; + } + + var _length = this.$slide.length; + var _time = _this.lGalleryOn ? this.s.speed : 0; + var _next = false; + var _prev = false; + + if (!_this.lgBusy) { + + if (this.s.download) { + var _src; + if (_this.s.dynamic) { + _src = _this.s.dynamicEl[index].downloadUrl !== false && (_this.s.dynamicEl[index].downloadUrl || _this.s.dynamicEl[index].src); + } else { + _src = _this.$items.eq(index).attr('data-download-url') !== 'false' && (_this.$items.eq(index).attr('data-download-url') || _this.$items.eq(index).attr('href') || _this.$items.eq(index).attr('data-src')); + + } + + if (_src) { + $('#lg-download').attr('href', _src); + _this.$outer.removeClass('lg-hide-download'); + } else { + _this.$outer.addClass('lg-hide-download'); + } + } + + this.$el.trigger('onBeforeSlide.lg', [_prevIndex, index, fromTouch, fromThumb]); + + _this.lgBusy = true; + + clearTimeout(_this.hideBartimeout); + + // Add title if this.s.appendSubHtmlTo === lg-sub-html + if (this.s.appendSubHtmlTo === '.lg-sub-html') { + + // wait for slide animation to complete + setTimeout(function() { + _this.addHtml(index); + }, _time); + } + + this.arrowDisable(index); + + if (!fromTouch) { + + // remove all transitions + _this.$outer.addClass('lg-no-trans'); + + this.$slide.removeClass('lg-prev-slide lg-next-slide'); + + if (index < _prevIndex) { + _prev = true; + if ((index === 0) && (_prevIndex === _length - 1) && !fromThumb) { + _prev = false; + _next = true; + } + } else if (index > _prevIndex) { + _next = true; + if ((index === _length - 1) && (_prevIndex === 0) && !fromThumb) { + _prev = true; + _next = false; + } + } + + if (_prev) { + + //prevslide + this.$slide.eq(index).addClass('lg-prev-slide'); + this.$slide.eq(_prevIndex).addClass('lg-next-slide'); + } else if (_next) { + + // next slide + this.$slide.eq(index).addClass('lg-next-slide'); + this.$slide.eq(_prevIndex).addClass('lg-prev-slide'); + } + + // give 50 ms for browser to add/remove class + setTimeout(function() { + _this.$slide.removeClass('lg-current'); + + //_this.$slide.eq(_prevIndex).removeClass('lg-current'); + _this.$slide.eq(index).addClass('lg-current'); + + // reset all transitions + _this.$outer.removeClass('lg-no-trans'); + }, 50); + } else { + + var touchPrev = index - 1; + var touchNext = index + 1; + + if ((index === 0) && (_prevIndex === _length - 1)) { + + // next slide + touchNext = 0; + touchPrev = _length - 1; + } else if ((index === _length - 1) && (_prevIndex === 0)) { + + // prev slide + touchNext = 0; + touchPrev = _length - 1; + } + + this.$slide.removeClass('lg-prev-slide lg-current lg-next-slide'); + _this.$slide.eq(touchPrev).addClass('lg-prev-slide'); + _this.$slide.eq(touchNext).addClass('lg-next-slide'); + _this.$slide.eq(index).addClass('lg-current'); + } + + if (_this.lGalleryOn) { + setTimeout(function() { + _this.loadContent(index, true, 0); + }, this.s.speed + 50); + + setTimeout(function() { + _this.lgBusy = false; + _this.$el.trigger('onAfterSlide.lg', [_prevIndex, index, fromTouch, fromThumb]); + }, this.s.speed); + + } else { + _this.loadContent(index, true, _this.s.backdropDuration); + + _this.lgBusy = false; + _this.$el.trigger('onAfterSlide.lg', [_prevIndex, index, fromTouch, fromThumb]); + } + + _this.lGalleryOn = true; + + if (this.s.counter) { + $('#lg-counter-current').text(index + 1); + } + + } + + }; + + /** + * @desc Go to next slide + * @param {Boolean} fromTouch - true if slide function called via touch event + */ + Plugin.prototype.goToNextSlide = function(fromTouch) { + var _this = this; + if (!_this.lgBusy) { + if ((_this.index + 1) < _this.$slide.length) { + _this.index++; + _this.$el.trigger('onBeforeNextSlide.lg', [_this.index]); + _this.slide(_this.index, fromTouch, false); + } else { + if (_this.s.loop) { + _this.index = 0; + _this.$el.trigger('onBeforeNextSlide.lg', [_this.index]); + _this.slide(_this.index, fromTouch, false); + } else if (_this.s.slideEndAnimatoin) { + _this.$outer.addClass('lg-right-end'); + setTimeout(function() { + _this.$outer.removeClass('lg-right-end'); + }, 400); + } + } + } + }; + + /** + * @desc Go to previous slide + * @param {Boolean} fromTouch - true if slide function called via touch event + */ + Plugin.prototype.goToPrevSlide = function(fromTouch) { + var _this = this; + if (!_this.lgBusy) { + if (_this.index > 0) { + _this.index--; + _this.$el.trigger('onBeforePrevSlide.lg', [_this.index, fromTouch]); + _this.slide(_this.index, fromTouch, false); + } else { + if (_this.s.loop) { + _this.index = _this.$items.length - 1; + _this.$el.trigger('onBeforePrevSlide.lg', [_this.index, fromTouch]); + _this.slide(_this.index, fromTouch, false); + } else if (_this.s.slideEndAnimatoin) { + _this.$outer.addClass('lg-left-end'); + setTimeout(function() { + _this.$outer.removeClass('lg-left-end'); + }, 400); + } + } + } + }; + + Plugin.prototype.keyPress = function() { + var _this = this; + if (this.$items.length > 1) { + $(window).on('keyup.lg', function(e) { + if (_this.$items.length > 1) { + if (e.keyCode === 37) { + e.preventDefault(); + _this.goToPrevSlide(); + } + + if (e.keyCode === 39) { + e.preventDefault(); + _this.goToNextSlide(); + } + } + }); + } + + $(window).on('keydown.lg', function(e) { + if (_this.s.escKey === true && e.keyCode === 27) { + e.preventDefault(); + if (!_this.$outer.hasClass('lg-thumb-open')) { + _this.destroy(); + } else { + _this.$outer.removeClass('lg-thumb-open'); + } + } + }); + }; + + Plugin.prototype.arrow = function() { + var _this = this; + this.$outer.find('.lg-prev').on('click.lg', function() { + _this.goToPrevSlide(); + }); + + this.$outer.find('.lg-next').on('click.lg', function() { + _this.goToNextSlide(); + }); + }; + + Plugin.prototype.arrowDisable = function(index) { + + // Disable arrows if s.hideControlOnEnd is true + if (!this.s.loop && this.s.hideControlOnEnd) { + if ((index + 1) < this.$slide.length) { + this.$outer.find('.lg-next').removeAttr('disabled').removeClass('disabled'); + } else { + this.$outer.find('.lg-next').attr('disabled', 'disabled').addClass('disabled'); + } + + if (index > 0) { + this.$outer.find('.lg-prev').removeAttr('disabled').removeClass('disabled'); + } else { + this.$outer.find('.lg-prev').attr('disabled', 'disabled').addClass('disabled'); + } + } + }; + + Plugin.prototype.setTranslate = function($el, xValue, yValue) { + // jQuery supports Automatic CSS prefixing since jQuery 1.8.0 + if (this.s.useLeft) { + $el.css('left', xValue); + } else { + $el.css({ + transform: 'translate3d(' + (xValue) + 'px, ' + yValue + 'px, 0px)' + }); + } + }; + + Plugin.prototype.touchMove = function(startCoords, endCoords) { + + var distance = endCoords - startCoords; + + if (Math.abs(distance) > 15) { + // reset opacity and transition duration + this.$outer.addClass('lg-dragging'); + + // move current slide + this.setTranslate(this.$slide.eq(this.index), distance, 0); + + // move next and prev slide with current slide + this.setTranslate($('.lg-prev-slide'), -this.$slide.eq(this.index).width() + distance, 0); + this.setTranslate($('.lg-next-slide'), this.$slide.eq(this.index).width() + distance, 0); + } + }; + + Plugin.prototype.touchEnd = function(distance) { + var _this = this; + + // keep slide animation for any mode while dragg/swipe + if (_this.s.mode !== 'lg-slide') { + _this.$outer.addClass('lg-slide'); + } + + this.$slide.not('.lg-current, .lg-prev-slide, .lg-next-slide').css('opacity', '0'); + + // set transition duration + setTimeout(function() { + _this.$outer.removeClass('lg-dragging'); + if ((distance < 0) && (Math.abs(distance) > _this.s.swipeThreshold)) { + _this.goToNextSlide(true); + } else if ((distance > 0) && (Math.abs(distance) > _this.s.swipeThreshold)) { + _this.goToPrevSlide(true); + } else if (Math.abs(distance) < 5) { + + // Trigger click if distance is less than 5 pix + _this.$el.trigger('onSlideClick.lg'); + } + + _this.$slide.removeAttr('style'); + }); + + // remove slide class once drag/swipe is completed if mode is not slide + setTimeout(function() { + if (!_this.$outer.hasClass('lg-dragging') && _this.s.mode !== 'lg-slide') { + _this.$outer.removeClass('lg-slide'); + } + }, _this.s.speed + 100); + + }; + + Plugin.prototype.enableSwipe = function() { + var _this = this; + var startCoords = 0; + var endCoords = 0; + var isMoved = false; + + if (_this.s.enableSwipe && _this.isTouch && _this.doCss()) { + + _this.$slide.on('touchstart.lg', function(e) { + if (!_this.$outer.hasClass('lg-zoomed') && !_this.lgBusy) { + e.preventDefault(); + _this.manageSwipeClass(); + startCoords = e.originalEvent.targetTouches[0].pageX; + } + }); + + _this.$slide.on('touchmove.lg', function(e) { + if (!_this.$outer.hasClass('lg-zoomed')) { + e.preventDefault(); + endCoords = e.originalEvent.targetTouches[0].pageX; + _this.touchMove(startCoords, endCoords); + isMoved = true; + } + }); + + _this.$slide.on('touchend.lg', function() { + if (!_this.$outer.hasClass('lg-zoomed')) { + if (isMoved) { + isMoved = false; + _this.touchEnd(endCoords - startCoords); + } else { + _this.$el.trigger('onSlideClick.lg'); + } + } + }); + } + + }; + + Plugin.prototype.enableDrag = function() { + var _this = this; + var startCoords = 0; + var endCoords = 0; + var isDraging = false; + var isMoved = false; + if (_this.s.enableDrag && !_this.isTouch && _this.doCss()) { + _this.$slide.on('mousedown.lg', function(e) { + // execute only on .lg-object + if (!_this.$outer.hasClass('lg-zoomed')) { + if ($(e.target).hasClass('lg-object') || $(e.target).hasClass('lg-video-play')) { + e.preventDefault(); + + if (!_this.lgBusy) { + _this.manageSwipeClass(); + startCoords = e.pageX; + isDraging = true; + + // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723 + _this.$outer.scrollLeft += 1; + _this.$outer.scrollLeft -= 1; + + // * + + _this.$outer.removeClass('lg-grab').addClass('lg-grabbing'); + + _this.$el.trigger('onDragstart.lg'); + } + + } + } + }); + + $(window).on('mousemove.lg', function(e) { + if (isDraging) { + isMoved = true; + endCoords = e.pageX; + _this.touchMove(startCoords, endCoords); + _this.$el.trigger('onDragmove.lg'); + } + }); + + $(window).on('mouseup.lg', function(e) { + if (isMoved) { + isMoved = false; + _this.touchEnd(endCoords - startCoords); + _this.$el.trigger('onDragend.lg'); + } else if ($(e.target).hasClass('lg-object') || $(e.target).hasClass('lg-video-play')) { + _this.$el.trigger('onSlideClick.lg'); + } + + // Prevent execution on click + if (isDraging) { + isDraging = false; + _this.$outer.removeClass('lg-grabbing').addClass('lg-grab'); + } + }); + + } + }; + + Plugin.prototype.manageSwipeClass = function() { + var touchNext = this.index + 1; + var touchPrev = this.index - 1; + var length = this.$slide.length; + if (this.s.loop) { + if (this.index === 0) { + touchPrev = length - 1; + } else if (this.index === length - 1) { + touchNext = 0; + } + } + + this.$slide.removeClass('lg-next-slide lg-prev-slide'); + if (touchPrev > -1) { + this.$slide.eq(touchPrev).addClass('lg-prev-slide'); + } + + this.$slide.eq(touchNext).addClass('lg-next-slide'); + }; + + Plugin.prototype.mousewheel = function() { + var _this = this; + _this.$outer.on('mousewheel.lg', function(e) { + + if (!e.deltaY) { + return; + } + + if (e.deltaY > 0) { + _this.goToPrevSlide(); + } else { + _this.goToNextSlide(); + } + + e.preventDefault(); + }); + + }; + + Plugin.prototype.closeGallery = function() { + + var _this = this; + var mousedown = false; + this.$outer.find('.lg-close').on('click.lg', function() { + _this.destroy(); + }); + + if (_this.s.closable) { + + // If you drag the slide and release outside gallery gets close on chrome + // for preventing this check mousedown and mouseup happened on .lg-item or lg-outer + _this.$outer.on('mousedown.lg', function(e) { + + if ($(e.target).is('.lg-outer') || $(e.target).is('.lg-item ') || $(e.target).is('.lg-img-wrap')) { + mousedown = true; + } else { + mousedown = false; + } + + }); + + _this.$outer.on('mouseup.lg', function(e) { + + if ($(e.target).is('.lg-outer') || $(e.target).is('.lg-item ') || $(e.target).is('.lg-img-wrap') && mousedown) { + if (!_this.$outer.hasClass('lg-dragging')) { + _this.destroy(); + } + } + + }); + + } + + }; + + Plugin.prototype.destroy = function(d) { + + var _this = this; + + if (!d) { + _this.$el.trigger('onBeforeClose.lg'); + } + + $(window).scrollTop(_this.prevScrollTop); + + /** + * if d is false or undefined destroy will only close the gallery + * plugins instance remains with the element + * + * if d is true destroy will completely remove the plugin + */ + + if (d) { + if (!_this.s.dynamic) { + // only when not using dynamic mode is $items a jquery collection + this.$items.off('click.lg click.lgcustom'); + } + + $.removeData(_this.el, 'lightGallery'); + } + + // Unbind all events added by lightGallery + this.$el.off('.lg.tm'); + + // Distroy all lightGallery modules + $.each($.fn.lightGallery.modules, function(key) { + if (_this.modules[key]) { + _this.modules[key].destroy(); + } + }); + + this.lGalleryOn = false; + + clearTimeout(_this.hideBartimeout); + this.hideBartimeout = false; + $(window).off('.lg'); + $('body').removeClass('lg-on lg-from-hash'); + + if (_this.$outer) { + _this.$outer.removeClass('lg-visible'); + } + + $('.lg-backdrop').removeClass('in'); + + setTimeout(function() { + if (_this.$outer) { + _this.$outer.remove(); + } + + $('.lg-backdrop').remove(); + + if (!d) { + _this.$el.trigger('onCloseAfter.lg'); + } + + }, _this.s.backdropDuration + 50); + }; + + $.fn.lightGallery = function(options) { + return this.each(function() { + if (!$.data(this, 'lightGallery')) { + $.data(this, 'lightGallery', new Plugin(this, options)); + } else { + try { + $(this).data('lightGallery').init(); + } catch (err) { + console.error('lightGallery has not initiated properly'); + } + } + }); + }; + + $.fn.lightGallery.modules = {}; + +})(jQuery, window, document); + +/** + * Autoplay Plugin + * @version 1.2.0 + * @author Sachin N - @sachinchoolur + * @license MIT License (MIT) + */ + +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + autoplay: false, + pause: 5000, + progressBar: true, + fourceAutoplay: false, + autoplayControls: true, + appendAutoplayControlsTo: '.lg-toolbar' + }; + + /** + * Creates the autoplay plugin. + * @param {object} element - lightGallery element + */ + var Autoplay = function(element) { + + this.core = $(element).data('lightGallery'); + + this.$el = $(element); + + // Execute only if items are above 1 + if (this.core.$items.length < 2) { + return false; + } + + this.core.s = $.extend({}, defaults, this.core.s); + this.interval = false; + + // Identify if slide happened from autoplay + this.fromAuto = true; + + // Identify if autoplay canceled from touch/drag + this.canceledOnTouch = false; + + // save fourceautoplay value + this.fourceAutoplayTemp = this.core.s.fourceAutoplay; + + // do not allow progress bar if browser does not support css3 transitions + if (!this.core.doCss()) { + this.core.s.progressBar = false; + } + + this.init(); + + return this; + }; + + Autoplay.prototype.init = function() { + var _this = this; + + // append autoplay controls + if (_this.core.s.autoplayControls) { + _this.controls(); + } + + // Create progress bar + if (_this.core.s.progressBar) { + _this.core.$outer.find('.lg').append('
'); + } + + // set progress + _this.progress(); + + // Start autoplay + if (_this.core.s.autoplay) { + _this.startlAuto(); + } + + // cancel interval on touchstart and dragstart + _this.$el.on('onDragstart.lg.tm touchstart.lg.tm', function() { + if (_this.interval) { + _this.cancelAuto(); + _this.canceledOnTouch = true; + } + }); + + // restore autoplay if autoplay canceled from touchstart / dragstart + _this.$el.on('onDragend.lg.tm touchend.lg.tm onSlideClick.lg.tm', function() { + if (!_this.interval && _this.canceledOnTouch) { + _this.startlAuto(); + _this.canceledOnTouch = false; + } + }); + + }; + + Autoplay.prototype.progress = function() { + + var _this = this; + var _$progressBar; + var _$progress; + + _this.$el.on('onBeforeSlide.lg.tm', function() { + + // start progress bar animation + if (_this.core.s.progressBar && _this.fromAuto) { + _$progressBar = _this.core.$outer.find('.lg-progress-bar'); + _$progress = _this.core.$outer.find('.lg-progress'); + if (_this.interval) { + _$progress.removeAttr('style'); + _$progressBar.removeClass('lg-start'); + setTimeout(function() { + _$progress.css('transition', 'width ' + (_this.core.s.speed + _this.core.s.pause) + 'ms ease 0s'); + _$progressBar.addClass('lg-start'); + }, 20); + } + } + + // Remove setinterval if slide is triggered manually and fourceautoplay is false + if (!_this.fromAuto && !_this.core.s.fourceAutoplay) { + _this.cancelAuto(); + } + + _this.fromAuto = false; + + }); + }; + + // Manage autoplay via play/stop buttons + Autoplay.prototype.controls = function() { + var _this = this; + var _html = ''; + + // Append autoplay controls + $(this.core.s.appendAutoplayControlsTo).append(_html); + + _this.core.$outer.find('.lg-autoplay-button').on('click.lg', function() { + if ($(_this.core.$outer).hasClass('lg-show-autoplay')) { + _this.cancelAuto(); + _this.core.s.fourceAutoplay = false; + } else { + if (!_this.interval) { + _this.startlAuto(); + _this.core.s.fourceAutoplay = _this.fourceAutoplayTemp; + } + } + }); + }; + + // Autostart gallery + Autoplay.prototype.startlAuto = function() { + var _this = this; + + _this.core.$outer.find('.lg-progress').css('transition', 'width ' + (_this.core.s.speed + _this.core.s.pause) + 'ms ease 0s'); + _this.core.$outer.addClass('lg-show-autoplay'); + _this.core.$outer.find('.lg-progress-bar').addClass('lg-start'); + + _this.interval = setInterval(function() { + if (_this.core.index + 1 < _this.core.$items.length) { + _this.core.index++; + } else { + _this.core.index = 0; + } + + _this.fromAuto = true; + _this.core.slide(_this.core.index, false, false); + }, _this.core.s.speed + _this.core.s.pause); + }; + + // cancel Autostart + Autoplay.prototype.cancelAuto = function() { + clearInterval(this.interval); + this.interval = false; + this.core.$outer.find('.lg-progress').removeAttr('style'); + this.core.$outer.removeClass('lg-show-autoplay'); + this.core.$outer.find('.lg-progress-bar').removeClass('lg-start'); + }; + + Autoplay.prototype.destroy = function() { + + this.cancelAuto(); + this.core.$outer.find('.lg-progress-bar').remove(); + }; + + $.fn.lightGallery.modules.autoplay = Autoplay; + +})(jQuery, window, document); + +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + fullScreen: true + }; + + var Fullscreen = function(element) { + + // get lightGallery core plugin data + this.core = $(element).data('lightGallery'); + + this.$el = $(element); + + // extend module defalut settings with lightGallery core settings + this.core.s = $.extend({}, defaults, this.core.s); + + this.init(); + + return this; + }; + + Fullscreen.prototype.init = function() { + var fullScreen = ''; + if (this.core.s.fullScreen) { + + // check for fullscreen browser support + if (!document.fullscreenEnabled && !document.webkitFullscreenEnabled && + !document.mozFullScreenEnabled && !document.msFullscreenEnabled) { + return; + } else { + fullScreen = ''; + this.core.$outer.find('.lg-toolbar').append(fullScreen); + this.fullScreen(); + } + } + }; + + Fullscreen.prototype.requestFullscreen = function() { + var el = document.documentElement; + if (el.requestFullscreen) { + el.requestFullscreen(); + } else if (el.msRequestFullscreen) { + el.msRequestFullscreen(); + } else if (el.mozRequestFullScreen) { + el.mozRequestFullScreen(); + } else if (el.webkitRequestFullscreen) { + el.webkitRequestFullscreen(); + } + }; + + Fullscreen.prototype.exitFullscreen = function() { + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.msExitFullscreen) { + document.msExitFullscreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.webkitExitFullscreen) { + document.webkitExitFullscreen(); + } + }; + + // https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Using_full_screen_mode + Fullscreen.prototype.fullScreen = function() { + var _this = this; + + $(document).on('fullscreenchange.lg webkitfullscreenchange.lg mozfullscreenchange.lg MSFullscreenChange.lg', function() { + _this.core.$outer.toggleClass('lg-fullscreen-on'); + }); + + this.core.$outer.find('.lg-fullscreen').on('click.lg', function() { + if (!document.fullscreenElement && + !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement) { + _this.requestFullscreen(); + } else { + _this.exitFullscreen(); + } + }); + + }; + + Fullscreen.prototype.destroy = function() { + + // exit from fullscreen if activated + this.exitFullscreen(); + + $(document).off('fullscreenchange.lg webkitfullscreenchange.lg mozfullscreenchange.lg MSFullscreenChange.lg'); + }; + + $.fn.lightGallery.modules.fullscreen = Fullscreen; + +})(jQuery, window, document); + +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + pager: false + }; + + var Pager = function(element) { + + this.core = $(element).data('lightGallery'); + + this.$el = $(element); + this.core.s = $.extend({}, defaults, this.core.s); + if (this.core.s.pager && this.core.$items.length > 1) { + this.init(); + } + + return this; + }; + + Pager.prototype.init = function() { + var _this = this; + var pagerList = ''; + var $pagerCont; + var $pagerOuter; + var timeout; + + _this.core.$outer.find('.lg').append('
'); + + if (_this.core.s.dynamic) { + for (var i = 0; i < _this.core.s.dynamicEl.length; i++) { + pagerList += '
'; + } + } else { + _this.core.$items.each(function() { + + if (!_this.core.s.exThumbImage) { + pagerList += '
'; + } else { + pagerList += '
'; + } + + }); + } + + $pagerOuter = _this.core.$outer.find('.lg-pager-outer'); + + $pagerOuter.html(pagerList); + + $pagerCont = _this.core.$outer.find('.lg-pager-cont'); + $pagerCont.on('click.lg touchend.lg', function() { + var _$this = $(this); + _this.core.index = _$this.index(); + _this.core.slide(_this.core.index, false, false); + }); + + $pagerOuter.on('mouseover.lg', function() { + clearTimeout(timeout); + $pagerOuter.addClass('lg-pager-hover'); + }); + + $pagerOuter.on('mouseout.lg', function() { + timeout = setTimeout(function() { + $pagerOuter.removeClass('lg-pager-hover'); + }); + }); + + _this.core.$el.on('onBeforeSlide.lg.tm', function(e, prevIndex, index) { + $pagerCont.removeClass('lg-pager-active'); + $pagerCont.eq(index).addClass('lg-pager-active'); + }); + + }; + + Pager.prototype.destroy = function() { + + }; + + $.fn.lightGallery.modules.pager = Pager; + +})(jQuery, window, document); + +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + thumbnail: true, + + animateThumb: true, + currentPagerPosition: 'middle', + + thumbWidth: 100, + thumbContHeight: 100, + thumbMargin: 5, + + exThumbImage: false, + showThumbByDefault: true, + toogleThumb: true, + pullCaptionUp: true, + + enableThumbDrag: true, + enableThumbSwipe: true, + swipeThreshold: 50, + + loadYoutubeThumbnail: true, + youtubeThumbSize: 1, + + loadVimeoThumbnail: true, + vimeoThumbSize: 'thumbnail_small', + + loadDailymotionThumbnail: true + }; + + var Thumbnail = function(element) { + + // get lightGallery core plugin data + this.core = $(element).data('lightGallery'); + + // extend module default settings with lightGallery core settings + this.core.s = $.extend({}, defaults, this.core.s); + + this.$el = $(element); + this.$thumbOuter = null; + this.thumbOuterWidth = 0; + this.thumbTotalWidth = (this.core.$items.length * (this.core.s.thumbWidth + this.core.s.thumbMargin)); + this.thumbIndex = this.core.index; + + // Thumbnail animation value + this.left = 0; + + this.init(); + + return this; + }; + + Thumbnail.prototype.init = function() { + var _this = this; + if (this.core.s.thumbnail && this.core.$items.length > 1) { + if (this.core.s.showThumbByDefault) { + setTimeout(function(){ + _this.core.$outer.addClass('lg-thumb-open'); + }, 700); + } + + if (this.core.s.pullCaptionUp) { + this.core.$outer.addClass('lg-pull-caption-up'); + } + + this.build(); + if (this.core.s.animateThumb) { + if (this.core.s.enableThumbDrag && !this.core.isTouch && this.core.doCss()) { + this.enableThumbDrag(); + } + + if (this.core.s.enableThumbSwipe && this.core.isTouch && this.core.doCss()) { + this.enableThumbSwipe(); + } + + this.thumbClickable = false; + } else { + this.thumbClickable = true; + } + + this.toogle(); + this.thumbkeyPress(); + } + }; + + Thumbnail.prototype.build = function() { + var _this = this; + var thumbList = ''; + var vimeoErrorThumbSize = ''; + var $thumb; + var html = '
' + + '
' + + '
' + + '
'; + + switch (this.core.s.vimeoThumbSize) { + case 'thumbnail_large': + vimeoErrorThumbSize = '640'; + break; + case 'thumbnail_medium': + vimeoErrorThumbSize = '200x150'; + break; + case 'thumbnail_small': + vimeoErrorThumbSize = '100x75'; + } + + _this.core.$outer.addClass('lg-has-thumb'); + + _this.core.$outer.find('.lg').append(html); + + _this.$thumbOuter = _this.core.$outer.find('.lg-thumb-outer'); + _this.thumbOuterWidth = _this.$thumbOuter.width(); + + if (_this.core.s.animateThumb) { + _this.core.$outer.find('.lg-thumb').css({ + width: _this.thumbTotalWidth + 'px', + position: 'relative' + }); + } + + if (this.core.s.animateThumb) { + _this.$thumbOuter.css('height', _this.core.s.thumbContHeight + 'px'); + } + + function getThumb(src, thumb, index) { + var isVideo = _this.core.isVideo(src, index) || {}; + var thumbImg; + var vimeoId = ''; + + if (isVideo.youtube || isVideo.vimeo || isVideo.dailymotion) { + if (isVideo.youtube) { + if (_this.core.s.loadYoutubeThumbnail) { + thumbImg = '//img.youtube.com/vi/' + isVideo.youtube[1] + '/' + _this.core.s.youtubeThumbSize + '.jpg'; + } else { + thumbImg = thumb; + } + } else if (isVideo.vimeo) { + if (_this.core.s.loadVimeoThumbnail) { + thumbImg = '//i.vimeocdn.com/video/error_' + vimeoErrorThumbSize + '.jpg'; + vimeoId = isVideo.vimeo[1]; + } else { + thumbImg = thumb; + } + } else if (isVideo.dailymotion) { + if (_this.core.s.loadDailymotionThumbnail) { + thumbImg = '//www.dailymotion.com/thumbnail/video/' + isVideo.dailymotion[1]; + } else { + thumbImg = thumb; + } + } + } else { + thumbImg = thumb; + } + + thumbList += '
'; + vimeoId = ''; + } + + if (_this.core.s.dynamic) { + for (var i = 0; i < _this.core.s.dynamicEl.length; i++) { + getThumb(_this.core.s.dynamicEl[i].src, _this.core.s.dynamicEl[i].thumb, i); + } + } else { + _this.core.$items.each(function(i) { + + if (!_this.core.s.exThumbImage) { + getThumb($(this).attr('href') || $(this).attr('data-src'), $(this).find('img').attr('src'), i); + } else { + getThumb($(this).attr('href') || $(this).attr('data-src'), $(this).attr(_this.core.s.exThumbImage), i); + } + + }); + } + + _this.core.$outer.find('.lg-thumb').html(thumbList); + + $thumb = _this.core.$outer.find('.lg-thumb-item'); + + // Load vimeo thumbnails + $thumb.each(function() { + var $this = $(this); + var vimeoVideoId = $this.attr('data-vimeo-id'); + + if (vimeoVideoId) { + $.getJSON('//www.vimeo.com/api/v2/video/' + vimeoVideoId + '.json?callback=?', { + format: 'json' + }, function(data) { + $this.find('img').attr('src', data[0][_this.core.s.vimeoThumbSize]); + }); + } + }); + + // manage active class for thumbnail + $thumb.eq(_this.core.index).addClass('active'); + _this.core.$el.on('onBeforeSlide.lg.tm', function() { + $thumb.removeClass('active'); + $thumb.eq(_this.core.index).addClass('active'); + }); + + $thumb.on('click.lg touchend.lg', function() { + var _$this = $(this); + setTimeout(function() { + + // In IE9 and bellow touch does not support + // Go to slide if browser does not support css transitions + if ((_this.thumbClickable && !_this.core.lgBusy) || !_this.core.doCss()) { + _this.core.index = _$this.index(); + _this.core.slide(_this.core.index, false, true); + } + }, 50); + }); + + _this.core.$el.on('onBeforeSlide.lg.tm', function() { + _this.animateThumb(_this.core.index); + }); + + $(window).on('resize.lg.thumb orientationchange.lg.thumb', function() { + setTimeout(function() { + _this.animateThumb(_this.core.index); + _this.thumbOuterWidth = _this.$thumbOuter.width(); + }, 200); + }); + + }; + + Thumbnail.prototype.setTranslate = function(value) { + // jQuery supports Automatic CSS prefixing since jQuery 1.8.0 + this.core.$outer.find('.lg-thumb').css({ + transform: 'translate3d(-' + (value) + 'px, 0px, 0px)' + }); + }; + + Thumbnail.prototype.animateThumb = function(index) { + var $thumb = this.core.$outer.find('.lg-thumb'); + if (this.core.s.animateThumb) { + var position; + switch (this.core.s.currentPagerPosition) { + case 'left': + position = 0; + break; + case 'middle': + position = (this.thumbOuterWidth / 2) - (this.core.s.thumbWidth / 2); + break; + case 'right': + position = this.thumbOuterWidth - this.core.s.thumbWidth; + } + this.left = ((this.core.s.thumbWidth + this.core.s.thumbMargin) * index - 1) - position; + if (this.left > (this.thumbTotalWidth - this.thumbOuterWidth)) { + this.left = this.thumbTotalWidth - this.thumbOuterWidth; + } + + if (this.left < 0) { + this.left = 0; + } + + if (this.core.lGalleryOn) { + if (!$thumb.hasClass('on')) { + this.core.$outer.find('.lg-thumb').css('transition-duration', this.core.s.speed + 'ms'); + } + + if (!this.core.doCss()) { + $thumb.animate({ + left: -this.left + 'px' + }, this.core.s.speed); + } + } else { + if (!this.core.doCss()) { + $thumb.css('left', -this.left + 'px'); + } + } + + this.setTranslate(this.left); + + } + }; + + // Enable thumbnail dragging and swiping + Thumbnail.prototype.enableThumbDrag = function() { + + var _this = this; + var startCoords = 0; + var endCoords = 0; + var isDraging = false; + var isMoved = false; + var tempLeft = 0; + + _this.$thumbOuter.addClass('lg-grab'); + + _this.core.$outer.find('.lg-thumb').on('mousedown.lg.thumb', function(e) { + if (_this.thumbTotalWidth > _this.thumbOuterWidth) { + // execute only on .lg-object + e.preventDefault(); + startCoords = e.pageX; + isDraging = true; + + // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723 + _this.core.$outer.scrollLeft += 1; + _this.core.$outer.scrollLeft -= 1; + + // * + _this.thumbClickable = false; + _this.$thumbOuter.removeClass('lg-grab').addClass('lg-grabbing'); + } + }); + + $(window).on('mousemove.lg.thumb', function(e) { + if (isDraging) { + tempLeft = _this.left; + isMoved = true; + endCoords = e.pageX; + + _this.$thumbOuter.addClass('lg-dragging'); + + tempLeft = tempLeft - (endCoords - startCoords); + + if (tempLeft > (_this.thumbTotalWidth - _this.thumbOuterWidth)) { + tempLeft = _this.thumbTotalWidth - _this.thumbOuterWidth; + } + + if (tempLeft < 0) { + tempLeft = 0; + } + + // move current slide + _this.setTranslate(tempLeft); + + } + }); + + $(window).on('mouseup.lg.thumb', function() { + if (isMoved) { + isMoved = false; + _this.$thumbOuter.removeClass('lg-dragging'); + + _this.left = tempLeft; + + if (Math.abs(endCoords - startCoords) < _this.core.s.swipeThreshold) { + _this.thumbClickable = true; + } + + } else { + _this.thumbClickable = true; + } + + if (isDraging) { + isDraging = false; + _this.$thumbOuter.removeClass('lg-grabbing').addClass('lg-grab'); + } + }); + + }; + + Thumbnail.prototype.enableThumbSwipe = function() { + var _this = this; + var startCoords = 0; + var endCoords = 0; + var isMoved = false; + var tempLeft = 0; + + _this.core.$outer.find('.lg-thumb').on('touchstart.lg', function(e) { + if (_this.thumbTotalWidth > _this.thumbOuterWidth) { + e.preventDefault(); + startCoords = e.originalEvent.targetTouches[0].pageX; + _this.thumbClickable = false; + } + }); + + _this.core.$outer.find('.lg-thumb').on('touchmove.lg', function(e) { + if (_this.thumbTotalWidth > _this.thumbOuterWidth) { + e.preventDefault(); + endCoords = e.originalEvent.targetTouches[0].pageX; + isMoved = true; + + _this.$thumbOuter.addClass('lg-dragging'); + + tempLeft = _this.left; + + tempLeft = tempLeft - (endCoords - startCoords); + + if (tempLeft > (_this.thumbTotalWidth - _this.thumbOuterWidth)) { + tempLeft = _this.thumbTotalWidth - _this.thumbOuterWidth; + } + + if (tempLeft < 0) { + tempLeft = 0; + } + + // move current slide + _this.setTranslate(tempLeft); + + } + }); + + _this.core.$outer.find('.lg-thumb').on('touchend.lg', function() { + if (_this.thumbTotalWidth > _this.thumbOuterWidth) { + + if (isMoved) { + isMoved = false; + _this.$thumbOuter.removeClass('lg-dragging'); + if (Math.abs(endCoords - startCoords) < _this.core.s.swipeThreshold) { + _this.thumbClickable = true; + } + + _this.left = tempLeft; + } else { + _this.thumbClickable = true; + } + } else { + _this.thumbClickable = true; + } + }); + + }; + + Thumbnail.prototype.toogle = function() { + var _this = this; + if (_this.core.s.toogleThumb) { + _this.core.$outer.addClass('lg-can-toggle'); + _this.$thumbOuter.append(''); + _this.core.$outer.find('.lg-toogle-thumb').on('click.lg', function() { + _this.core.$outer.toggleClass('lg-thumb-open'); + }); + } + }; + + Thumbnail.prototype.thumbkeyPress = function() { + var _this = this; + $(window).on('keydown.lg.thumb', function(e) { + if (e.keyCode === 38) { + e.preventDefault(); + _this.core.$outer.addClass('lg-thumb-open'); + } else if (e.keyCode === 40) { + e.preventDefault(); + _this.core.$outer.removeClass('lg-thumb-open'); + } + }); + }; + + Thumbnail.prototype.destroy = function() { + if (this.core.s.thumbnail && this.core.$items.length > 1) { + $(window).off('resize.lg.thumb orientationchange.lg.thumb keydown.lg.thumb'); + this.$thumbOuter.remove(); + this.core.$outer.removeClass('lg-has-thumb'); + } + }; + + $.fn.lightGallery.modules.Thumbnail = Thumbnail; + +})(jQuery, window, document); + +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + videoMaxWidth: '855px', + youtubePlayerParams: false, + vimeoPlayerParams: false, + dailymotionPlayerParams: false, + vkPlayerParams: false, + videojs: false, + videojsOptions: {} + }; + + var Video = function(element) { + + this.core = $(element).data('lightGallery'); + + this.$el = $(element); + this.core.s = $.extend({}, defaults, this.core.s); + this.videoLoaded = false; + + this.init(); + + return this; + }; + + Video.prototype.init = function() { + var _this = this; + + // Event triggered when video url found without poster + _this.core.$el.on('hasVideo.lg.tm', function(event, index, src, html) { + _this.core.$slide.eq(index).find('.lg-video').append(_this.loadVideo(src, 'lg-object', true, index, html)); + if (html) { + if (_this.core.s.videojs) { + try { + videojs(_this.core.$slide.eq(index).find('.lg-html5').get(0), _this.core.s.videojsOptions, function() { + if (!_this.videoLoaded) { + this.play(); + } + }); + } catch (e) { + console.error('Make sure you have included videojs'); + } + } else { + _this.core.$slide.eq(index).find('.lg-html5').get(0).play(); + } + } + }); + + // Set max width for video + _this.core.$el.on('onAferAppendSlide.lg.tm', function(event, index) { + _this.core.$slide.eq(index).find('.lg-video-cont').css('max-width', _this.core.s.videoMaxWidth); + _this.videoLoaded = true; + }); + + var loadOnClick = function($el) { + // check slide has poster + if ($el.find('.lg-object').hasClass('lg-has-poster') && $el.find('.lg-object').is(':visible')) { + + // check already video element present + if (!$el.hasClass('lg-has-video')) { + + $el.addClass('lg-video-playing lg-has-video'); + + var _src; + var _html; + var _loadVideo = function(_src, _html) { + + $el.find('.lg-video').append(_this.loadVideo(_src, '', false, _this.core.index, _html)); + + if (_html) { + if (_this.core.s.videojs) { + try { + videojs(_this.core.$slide.eq(_this.core.index).find('.lg-html5').get(0), _this.core.s.videojsOptions, function() { + this.play(); + }); + } catch (e) { + console.error('Make sure you have included videojs'); + } + } else { + _this.core.$slide.eq(_this.core.index).find('.lg-html5').get(0).play(); + } + } + + }; + + if (_this.core.s.dynamic) { + + _src = _this.core.s.dynamicEl[_this.core.index].src; + _html = _this.core.s.dynamicEl[_this.core.index].html; + + _loadVideo(_src, _html); + + } else { + + _src = _this.core.$items.eq(_this.core.index).attr('href') || _this.core.$items.eq(_this.core.index).attr('data-src'); + _html = _this.core.$items.eq(_this.core.index).attr('data-html'); + + _loadVideo(_src, _html); + + } + + var $tempImg = $el.find('.lg-object'); + $el.find('.lg-video').append($tempImg); + + // @todo loading icon for html5 videos also + // for showing the loading indicator while loading video + if (!$el.find('.lg-video-object').hasClass('lg-html5')) { + $el.removeClass('lg-complete'); + $el.find('.lg-video-object').on('load.lg error.lg', function() { + $el.addClass('lg-complete'); + }); + } + + } else { + + var youtubePlayer = $el.find('.lg-youtube').get(0); + var vimeoPlayer = $el.find('.lg-vimeo').get(0); + var dailymotionPlayer = $el.find('.lg-dailymotion').get(0); + var html5Player = $el.find('.lg-html5').get(0); + if (youtubePlayer) { + youtubePlayer.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*'); + } else if (vimeoPlayer) { + try { + $f(vimeoPlayer).api('play'); + } catch (e) { + console.error('Make sure you have included froogaloop2 js'); + } + } else if (dailymotionPlayer) { + dailymotionPlayer.contentWindow.postMessage('play', '*'); + + } else if (html5Player) { + if (_this.core.s.videojs) { + try { + videojs(html5Player).play(); + } catch (e) { + console.error('Make sure you have included videojs'); + } + } else { + html5Player.play(); + } + } + + $el.addClass('lg-video-playing'); + + } + } + }; + + if (_this.core.doCss() && _this.core.$items.length > 1 && ((_this.core.s.enableSwipe && _this.core.isTouch) || (_this.core.s.enableDrag && !_this.core.isTouch))) { + _this.core.$el.on('onSlideClick.lg.tm', function() { + var $el = _this.core.$slide.eq(_this.core.index); + loadOnClick($el); + }); + } else { + + // For IE 9 and bellow + _this.core.$slide.on('click.lg', function() { + loadOnClick($(this)); + }); + } + + _this.core.$el.on('onBeforeSlide.lg.tm', function(event, prevIndex, index) { + + var $videoSlide = _this.core.$slide.eq(prevIndex); + var youtubePlayer = $videoSlide.find('.lg-youtube').get(0); + var vimeoPlayer = $videoSlide.find('.lg-vimeo').get(0); + var dailymotionPlayer = $videoSlide.find('.lg-dailymotion').get(0); + var vkPlayer = $videoSlide.find('.lg-vk').get(0); + var html5Player = $videoSlide.find('.lg-html5').get(0); + if (youtubePlayer) { + youtubePlayer.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*'); + } else if (vimeoPlayer) { + try { + $f(vimeoPlayer).api('pause'); + } catch (e) { + console.error('Make sure you have included froogaloop2 js'); + } + } else if (dailymotionPlayer) { + dailymotionPlayer.contentWindow.postMessage('pause', '*'); + + } else if (html5Player) { + if (_this.core.s.videojs) { + try { + videojs(html5Player).pause(); + } catch (e) { + console.error('Make sure you have included videojs'); + } + } else { + html5Player.pause(); + } + } if (vkPlayer) { + $(vkPlayer).attr('src', $(vkPlayer).attr('src').replace('&autoplay', '&noplay')); + } + + var _src; + if (_this.core.s.dynamic) { + _src = _this.core.s.dynamicEl[index].src; + } else { + _src = _this.core.$items.eq(index).attr('href') || _this.core.$items.eq(index).attr('data-src'); + + } + + var _isVideo = _this.core.isVideo(_src, index) || {}; + if (_isVideo.youtube || _isVideo.vimeo || _isVideo.dailymotion || _isVideo.vk) { + _this.core.$outer.addClass('lg-hide-download'); + } + + //$videoSlide.addClass('lg-complete'); + + }); + + _this.core.$el.on('onAfterSlide.lg.tm', function(event, prevIndex) { + _this.core.$slide.eq(prevIndex).removeClass('lg-video-playing'); + }); + }; + + Video.prototype.loadVideo = function(src, addClass, noposter, index, html) { + var video = ''; + var autoplay = 1; + var a = ''; + var isVideo = this.core.isVideo(src, index) || {}; + + // Enable autoplay for first video if poster doesn't exist + if (noposter) { + if (this.videoLoaded) { + autoplay = 0; + } else { + autoplay = 1; + } + } + + if (isVideo.youtube) { + + a = '?wmode=opaque&autoplay=' + autoplay + '&enablejsapi=1'; + if (this.core.s.youtubePlayerParams) { + a = a + '&' + $.param(this.core.s.youtubePlayerParams); + } + + video = ''; + + } else if (isVideo.vimeo) { + + a = '?autoplay=' + autoplay + '&api=1'; + if (this.core.s.vimeoPlayerParams) { + a = a + '&' + $.param(this.core.s.vimeoPlayerParams); + } + + video = ''; + + } else if (isVideo.dailymotion) { + + a = '?wmode=opaque&autoplay=' + autoplay + '&api=postMessage'; + if (this.core.s.dailymotionPlayerParams) { + a = a + '&' + $.param(this.core.s.dailymotionPlayerParams); + } + + video = ''; + + } else if (isVideo.html5) { + var fL = html.substring(0, 1); + if (fL === '.' || fL === '#') { + html = $(html).html(); + } + + video = html; + + } else if (isVideo.vk) { + + a = '&autoplay=' + autoplay; + if (this.core.s.vkPlayerParams) { + a = a + '&' + $.param(this.core.s.vkPlayerParams); + } + + video = ''; + + } + + return video; + }; + + Video.prototype.destroy = function() { + this.videoLoaded = false; + }; + + $.fn.lightGallery.modules.video = Video; + +})(jQuery, window, document); + +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + scale: 1, + zoom: true, + actualSize: true, + enableZoomAfter: 300 + }; + + var Zoom = function(element) { + + this.core = $(element).data('lightGallery'); + + this.core.s = $.extend({}, defaults, this.core.s); + + if (this.core.s.zoom && this.core.doCss()) { + this.init(); + + // Store the zoomable timeout value just to clear it while closing + this.zoomabletimeout = false; + + // Set the initial value center + this.pageX = $(window).width() / 2; + this.pageY = ($(window).height() / 2) + $(window).scrollTop(); + } + + return this; + }; + + Zoom.prototype.init = function() { + + var _this = this; + var zoomIcons = ''; + + if (_this.core.s.actualSize) { + zoomIcons += ''; + } + + this.core.$outer.find('.lg-toolbar').append(zoomIcons); + + // Add zoomable class + _this.core.$el.on('onSlideItemLoad.lg.tm.zoom', function(event, index, delay) { + + // delay will be 0 except first time + var _speed = _this.core.s.enableZoomAfter + delay; + + // set _speed value 0 if gallery opened from direct url and if it is first slide + if ($('body').hasClass('lg-from-hash') && delay) { + + // will execute only once + _speed = 0; + } else { + + // Remove lg-from-hash to enable starting animation. + $('body').removeClass('lg-from-hash'); + } + + _this.zoomabletimeout = setTimeout(function() { + _this.core.$slide.eq(index).addClass('lg-zoomable'); + }, _speed + 30); + }); + + var scale = 1; + /** + * @desc Image zoom + * Translate the wrap and scale the image to get better user experience + * + * @param {String} scaleVal - Zoom decrement/increment value + */ + var zoom = function(scaleVal) { + + var $image = _this.core.$outer.find('.lg-current .lg-image'); + var _x; + var _y; + + // Find offset manually to avoid issue after zoom + var offsetX = ($(window).width() - $image.width()) / 2; + var offsetY = (($(window).height() - $image.height()) / 2) + $(window).scrollTop(); + + _x = _this.pageX - offsetX; + _y = _this.pageY - offsetY; + + var x = (scaleVal - 1) * (_x); + var y = (scaleVal - 1) * (_y); + + $image.css('transform', 'scale3d(' + scaleVal + ', ' + scaleVal + ', 1)').attr('data-scale', scaleVal); + + $image.parent().css({ + left: -x + 'px', + top: -y + 'px' + }).attr('data-x', x).attr('data-y', y); + }; + + var callScale = function() { + if (scale > 1) { + _this.core.$outer.addClass('lg-zoomed'); + } else { + _this.resetZoom(); + } + + if (scale < 1) { + scale = 1; + } + + zoom(scale); + }; + + var actualSize = function(event, $image, index, fromIcon) { + var w = $image.width(); + var nw; + if (_this.core.s.dynamic) { + nw = _this.core.s.dynamicEl[index].width || $image[0].naturalWidth || w; + } else { + nw = _this.core.$items.eq(index).attr('data-width') || $image[0].naturalWidth || w; + } + + var _scale; + + if (_this.core.$outer.hasClass('lg-zoomed')) { + scale = 1; + } else { + if (nw > w) { + _scale = nw / w; + scale = _scale || 2; + } + } + + if (fromIcon) { + _this.pageX = $(window).width() / 2; + _this.pageY = ($(window).height() / 2) + $(window).scrollTop(); + } else { + _this.pageX = event.pageX || event.originalEvent.targetTouches[0].pageX; + _this.pageY = event.pageY || event.originalEvent.targetTouches[0].pageY; + } + + callScale(); + setTimeout(function() { + _this.core.$outer.removeClass('lg-grabbing').addClass('lg-grab'); + }, 10); + }; + + var tapped = false; + + // event triggered after appending slide content + _this.core.$el.on('onAferAppendSlide.lg.tm.zoom', function(event, index) { + + // Get the current element + var $image = _this.core.$slide.eq(index).find('.lg-image'); + + $image.on('dblclick', function(event) { + actualSize(event, $image, index); + }); + + $image.on('touchstart', function(event) { + if (!tapped) { + tapped = setTimeout(function() { + tapped = null; + }, 300); + } else { + clearTimeout(tapped); + tapped = null; + actualSize(event, $image, index); + } + + event.preventDefault(); + }); + + }); + + // Update zoom on resize and orientationchange + $(window).on('resize.lg.zoom scroll.lg.zoom orientationchange.lg.zoom', function() { + _this.pageX = $(window).width() / 2; + _this.pageY = ($(window).height() / 2) + $(window).scrollTop(); + zoom(scale); + }); + + $('#lg-zoom-out').on('click.lg', function() { + if (_this.core.$outer.find('.lg-current .lg-image').length) { + scale -= _this.core.s.scale; + callScale(); + } + }); + + $('#lg-zoom-in').on('click.lg', function() { + if (_this.core.$outer.find('.lg-current .lg-image').length) { + scale += _this.core.s.scale; + callScale(); + } + }); + + $('#lg-actual-size').on('click.lg', function(event) { + actualSize(event, _this.core.$slide.eq(_this.core.index).find('.lg-image'), _this.core.index, true); + }); + + // Reset zoom on slide change + _this.core.$el.on('onBeforeSlide.lg.tm', function() { + scale = 1; + _this.resetZoom(); + }); + + // Drag option after zoom + if (!_this.core.isTouch) { + _this.zoomDrag(); + } + + if (_this.core.isTouch) { + _this.zoomSwipe(); + } + + }; + + // Reset zoom effect + Zoom.prototype.resetZoom = function() { + this.core.$outer.removeClass('lg-zoomed'); + this.core.$slide.find('.lg-img-wrap').removeAttr('style data-x data-y'); + this.core.$slide.find('.lg-image').removeAttr('style data-scale'); + + // Reset pagx pagy values to center + this.pageX = $(window).width() / 2; + this.pageY = ($(window).height() / 2) + $(window).scrollTop(); + }; + + Zoom.prototype.zoomSwipe = function() { + var _this = this; + var startCoords = {}; + var endCoords = {}; + var isMoved = false; + + // Allow x direction drag + var allowX = false; + + // Allow Y direction drag + var allowY = false; + + _this.core.$slide.on('touchstart.lg', function(e) { + + if (_this.core.$outer.hasClass('lg-zoomed')) { + var $image = _this.core.$slide.eq(_this.core.index).find('.lg-object'); + + allowY = $image.outerHeight() * $image.attr('data-scale') > _this.core.$outer.find('.lg').height(); + allowX = $image.outerWidth() * $image.attr('data-scale') > _this.core.$outer.find('.lg').width(); + if ((allowX || allowY)) { + e.preventDefault(); + startCoords = { + x: e.originalEvent.targetTouches[0].pageX, + y: e.originalEvent.targetTouches[0].pageY + }; + } + } + + }); + + _this.core.$slide.on('touchmove.lg', function(e) { + + if (_this.core.$outer.hasClass('lg-zoomed')) { + + var _$el = _this.core.$slide.eq(_this.core.index).find('.lg-img-wrap'); + var distanceX; + var distanceY; + + e.preventDefault(); + isMoved = true; + + endCoords = { + x: e.originalEvent.targetTouches[0].pageX, + y: e.originalEvent.targetTouches[0].pageY + }; + + // reset opacity and transition duration + _this.core.$outer.addClass('lg-zoom-dragging'); + + if (allowY) { + distanceY = (-Math.abs(_$el.attr('data-y'))) + (endCoords.y - startCoords.y); + } else { + distanceY = -Math.abs(_$el.attr('data-y')); + } + + if (allowX) { + distanceX = (-Math.abs(_$el.attr('data-x'))) + (endCoords.x - startCoords.x); + } else { + distanceX = -Math.abs(_$el.attr('data-x')); + } + + if ((Math.abs(endCoords.x - startCoords.x) > 15) || (Math.abs(endCoords.y - startCoords.y) > 15)) { + _$el.css({ + left: distanceX + 'px', + top: distanceY + 'px' + }); + } + + } + + }); + + _this.core.$slide.on('touchend.lg', function() { + if (_this.core.$outer.hasClass('lg-zoomed')) { + if (isMoved) { + isMoved = false; + _this.core.$outer.removeClass('lg-zoom-dragging'); + _this.touchendZoom(startCoords, endCoords, allowX, allowY); + + } + } + }); + + }; + + Zoom.prototype.zoomDrag = function() { + + var _this = this; + var startCoords = {}; + var endCoords = {}; + var isDraging = false; + var isMoved = false; + + // Allow x direction drag + var allowX = false; + + // Allow Y direction drag + var allowY = false; + + _this.core.$slide.on('mousedown.lg.zoom', function(e) { + + // execute only on .lg-object + var $image = _this.core.$slide.eq(_this.core.index).find('.lg-object'); + + allowY = $image.outerHeight() * $image.attr('data-scale') > _this.core.$outer.find('.lg').height(); + allowX = $image.outerWidth() * $image.attr('data-scale') > _this.core.$outer.find('.lg').width(); + + if (_this.core.$outer.hasClass('lg-zoomed')) { + if ($(e.target).hasClass('lg-object') && (allowX || allowY)) { + e.preventDefault(); + startCoords = { + x: e.pageX, + y: e.pageY + }; + + isDraging = true; + + // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723 + _this.core.$outer.scrollLeft += 1; + _this.core.$outer.scrollLeft -= 1; + + _this.core.$outer.removeClass('lg-grab').addClass('lg-grabbing'); + } + } + }); + + $(window).on('mousemove.lg.zoom', function(e) { + if (isDraging) { + var _$el = _this.core.$slide.eq(_this.core.index).find('.lg-img-wrap'); + var distanceX; + var distanceY; + + isMoved = true; + endCoords = { + x: e.pageX, + y: e.pageY + }; + + // reset opacity and transition duration + _this.core.$outer.addClass('lg-zoom-dragging'); + + if (allowY) { + distanceY = (-Math.abs(_$el.attr('data-y'))) + (endCoords.y - startCoords.y); + } else { + distanceY = -Math.abs(_$el.attr('data-y')); + } + + if (allowX) { + distanceX = (-Math.abs(_$el.attr('data-x'))) + (endCoords.x - startCoords.x); + } else { + distanceX = -Math.abs(_$el.attr('data-x')); + } + + _$el.css({ + left: distanceX + 'px', + top: distanceY + 'px' + }); + } + }); + + $(window).on('mouseup.lg.zoom', function(e) { + + if (isDraging) { + isDraging = false; + _this.core.$outer.removeClass('lg-zoom-dragging'); + + // Fix for chrome mouse move on click + if (isMoved && ((startCoords.x !== endCoords.x) || (startCoords.y !== endCoords.y))) { + endCoords = { + x: e.pageX, + y: e.pageY + }; + _this.touchendZoom(startCoords, endCoords, allowX, allowY); + + } + + isMoved = false; + } + + _this.core.$outer.removeClass('lg-grabbing').addClass('lg-grab'); + + }); + }; + + Zoom.prototype.touchendZoom = function(startCoords, endCoords, allowX, allowY) { + + var _this = this; + var _$el = _this.core.$slide.eq(_this.core.index).find('.lg-img-wrap'); + var $image = _this.core.$slide.eq(_this.core.index).find('.lg-object'); + var distanceX = (-Math.abs(_$el.attr('data-x'))) + (endCoords.x - startCoords.x); + var distanceY = (-Math.abs(_$el.attr('data-y'))) + (endCoords.y - startCoords.y); + var minY = (_this.core.$outer.find('.lg').height() - $image.outerHeight()) / 2; + var maxY = Math.abs(($image.outerHeight() * Math.abs($image.attr('data-scale'))) - _this.core.$outer.find('.lg').height() + minY); + var minX = (_this.core.$outer.find('.lg').width() - $image.outerWidth()) / 2; + var maxX = Math.abs(($image.outerWidth() * Math.abs($image.attr('data-scale'))) - _this.core.$outer.find('.lg').width() + minX); + + if ((Math.abs(endCoords.x - startCoords.x) > 15) || (Math.abs(endCoords.y - startCoords.y) > 15)) { + if (allowY) { + if (distanceY <= -maxY) { + distanceY = -maxY; + } else if (distanceY >= -minY) { + distanceY = -minY; + } + } + + if (allowX) { + if (distanceX <= -maxX) { + distanceX = -maxX; + } else if (distanceX >= -minX) { + distanceX = -minX; + } + } + + if (allowY) { + _$el.attr('data-y', Math.abs(distanceY)); + } else { + distanceY = -Math.abs(_$el.attr('data-y')); + } + + if (allowX) { + _$el.attr('data-x', Math.abs(distanceX)); + } else { + distanceX = -Math.abs(_$el.attr('data-x')); + } + + _$el.css({ + left: distanceX + 'px', + top: distanceY + 'px' + }); + + } + }; + + Zoom.prototype.destroy = function() { + + var _this = this; + + // Unbind all events added by lightGallery zoom plugin + _this.core.$el.off('.lg.zoom'); + $(window).off('.lg.zoom'); + _this.core.$slide.off('.lg.zoom'); + _this.core.$el.off('.lg.tm.zoom'); + _this.resetZoom(); + clearTimeout(_this.zoomabletimeout); + _this.zoomabletimeout = false; + }; + + $.fn.lightGallery.modules.zoom = Zoom; + +})(jQuery, window, document); +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + hash: true + }; + + var Hash = function(element) { + + this.core = $(element).data('lightGallery'); + + this.core.s = $.extend({}, defaults, this.core.s); + + if (this.core.s.hash) { + this.oldHash = window.location.hash; + this.init(); + } + + return this; + }; + + Hash.prototype.init = function() { + var _this = this; + var _hash; + + // Change hash value on after each slide transition + _this.core.$el.on('onAfterSlide.lg.tm', function(event, prevIndex, index) { + window.location.hash = 'lg=' + _this.core.s.galleryId + '&slide=' + index; + }); + + // Listen hash change and change the slide according to slide value + $(window).on('hashchange.lg.hash', function() { + _hash = window.location.hash; + var _idx = parseInt(_hash.split('&slide=')[1], 10); + + // it galleryId doesn't exist in the url close the gallery + if ((_hash.indexOf('lg=' + _this.core.s.galleryId) > -1)) { + _this.core.slide(_idx, false, false); + } else if (_this.core.lGalleryOn) { + _this.core.destroy(); + } + + }); + }; + + Hash.prototype.destroy = function() { + + if (!this.core.s.hash) { + return; + } + + // Reset to old hash value + if (this.oldHash && this.oldHash.indexOf('lg=' + this.core.s.galleryId) < 0) { + window.location.hash = this.oldHash; + } else { + if (history.pushState) { + history.pushState('', document.title, window.location.pathname + window.location.search); + } else { + window.location.hash = ''; + } + } + + this.core.$el.off('.lg.hash'); + + }; + + $.fn.lightGallery.modules.hash = Hash; + +})(jQuery, window, document); \ No newline at end of file diff --git a/vendors/lightgallery/dist/js/lightgallery-all.min.js b/vendors/lightgallery/dist/js/lightgallery-all.min.js new file mode 100644 index 000000000..84b0beb81 --- /dev/null +++ b/vendors/lightgallery/dist/js/lightgallery-all.min.js @@ -0,0 +1,5 @@ +/*! lightgallery - v1.2.21 - 2016-06-28 +* http://sachinchoolur.github.io/lightGallery/ +* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ +!function(a,b,c,d){"use strict";function e(b,d){if(this.el=b,this.$el=a(b),this.s=a.extend({},f,d),this.s.dynamic&&"undefined"!==this.s.dynamicEl&&this.s.dynamicEl.constructor===Array&&!this.s.dynamicEl.length)throw"When using dynamic mode, you must also define dynamicEl as an Array.";return this.modules={},this.lGalleryOn=!1,this.lgBusy=!1,this.hideBartimeout=!1,this.isTouch="ontouchstart"in c.documentElement,this.s.slideEndAnimatoin&&(this.s.hideControlOnEnd=!1),this.s.dynamic?this.$items=this.s.dynamicEl:"this"===this.s.selector?this.$items=this.$el:""!==this.s.selector?this.s.selectWithin?this.$items=a(this.s.selectWithin).find(this.s.selector):this.$items=this.$el.find(a(this.s.selector)):this.$items=this.$el.children(),this.$slide="",this.$outer="",this.init(),this}var f={mode:"lg-slide",cssEasing:"ease",easing:"linear",speed:600,height:"100%",width:"100%",addClass:"",startClass:"lg-start-zoom",backdropDuration:150,hideBarsDelay:6e3,useLeft:!1,closable:!0,loop:!0,escKey:!0,keyPress:!0,controls:!0,slideEndAnimatoin:!0,hideControlOnEnd:!1,mousewheel:!0,getCaptionFromTitleOrAlt:!0,appendSubHtmlTo:".lg-sub-html",subHtmlSelectorRelative:!1,preload:1,showAfterLoad:!0,selector:"",selectWithin:"",nextHtml:"",prevHtml:"",index:!1,iframeMaxWidth:"100%",download:!0,counter:!0,appendCounterTo:".lg-toolbar",swipeThreshold:50,enableSwipe:!0,enableDrag:!0,dynamic:!1,dynamicEl:[],galleryId:1};e.prototype.init=function(){var c=this;c.s.preload>c.$items.length&&(c.s.preload=c.$items.length);var d=b.location.hash;d.indexOf("lg="+this.s.galleryId)>0&&(c.index=parseInt(d.split("&slide=")[1],10),a("body").addClass("lg-from-hash"),a("body").hasClass("lg-on")||setTimeout(function(){c.build(c.index),a("body").addClass("lg-on")})),c.s.dynamic?(c.$el.trigger("onBeforeOpen.lg"),c.index=c.s.index||0,a("body").hasClass("lg-on")||setTimeout(function(){c.build(c.index),a("body").addClass("lg-on")})):c.$items.on("click.lgcustom",function(b){try{b.preventDefault(),b.preventDefault()}catch(d){b.returnValue=!1}c.$el.trigger("onBeforeOpen.lg"),c.index=c.s.index||c.$items.index(this),a("body").hasClass("lg-on")||(c.build(c.index),a("body").addClass("lg-on"))})},e.prototype.build=function(b){var c=this;c.structure(),a.each(a.fn.lightGallery.modules,function(b){c.modules[b]=new a.fn.lightGallery.modules[b](c.el)}),c.slide(b,!1,!1),c.s.keyPress&&c.keyPress(),c.$items.length>1&&(c.arrow(),setTimeout(function(){c.enableDrag(),c.enableSwipe()},50),c.s.mousewheel&&c.mousewheel()),c.counter(),c.closeGallery(),c.$el.trigger("onAfterOpen.lg"),c.$outer.on("mousemove.lg click.lg touchstart.lg",function(){c.$outer.removeClass("lg-hide-items"),clearTimeout(c.hideBartimeout),c.hideBartimeout=setTimeout(function(){c.$outer.addClass("lg-hide-items")},c.s.hideBarsDelay)})},e.prototype.structure=function(){var c,d="",e="",f=0,g="",h=this;for(a("body").append('
'),a(".lg-backdrop").css("transition-duration",this.s.backdropDuration+"ms"),f=0;f';if(this.s.controls&&this.$items.length>1&&(e='
'+this.s.prevHtml+'
'+this.s.nextHtml+"
"),".lg-sub-html"===this.s.appendSubHtmlTo&&(g='
'),c='
'+d+'
'+e+g+"
",a("body").append(c),this.$outer=a(".lg-outer"),this.$slide=this.$outer.find(".lg-item"),this.s.useLeft?(this.$outer.addClass("lg-use-left"),this.s.mode="lg-slide"):this.$outer.addClass("lg-use-css3"),h.setTop(),a(b).on("resize.lg orientationchange.lg",function(){setTimeout(function(){h.setTop()},100)}),this.$slide.eq(this.index).addClass("lg-current"),this.doCss()?this.$outer.addClass("lg-css3"):(this.$outer.addClass("lg-css"),this.s.speed=0),this.$outer.addClass(this.s.mode),this.s.enableDrag&&this.$items.length>1&&this.$outer.addClass("lg-grab"),this.s.showAfterLoad&&this.$outer.addClass("lg-show-after-load"),this.doCss()){var i=this.$outer.find(".lg-inner");i.css("transition-timing-function",this.s.cssEasing),i.css("transition-duration",this.s.speed+"ms")}a(".lg-backdrop").addClass("in"),setTimeout(function(){h.$outer.addClass("lg-visible")},this.s.backdropDuration),this.s.download&&this.$outer.find(".lg-toolbar").append(''),this.prevScrollTop=a(b).scrollTop()},e.prototype.setTop=function(){if("100%"!==this.s.height){var c=a(b).height(),d=(c-parseInt(this.s.height,10))/2,e=this.$outer.find(".lg");c>=parseInt(this.s.height,10)?e.css("top",d+"px"):e.css("top","0px")}},e.prototype.doCss=function(){var a=function(){var a=["transition","MozTransition","WebkitTransition","OTransition","msTransition","KhtmlTransition"],b=c.documentElement,d=0;for(d=0;d'+(parseInt(this.index,10)+1)+' / '+this.$items.length+"")},e.prototype.addHtml=function(b){var c,d,e=null;if(this.s.dynamic?this.s.dynamicEl[b].subHtmlUrl?c=this.s.dynamicEl[b].subHtmlUrl:e=this.s.dynamicEl[b].subHtml:(d=this.$items.eq(b),d.attr("data-sub-html-url")?c=d.attr("data-sub-html-url"):(e=d.attr("data-sub-html"),this.s.getCaptionFromTitleOrAlt&&!e&&(e=d.attr("title")||d.find("img").first().attr("alt")))),!c)if("undefined"!=typeof e&&null!==e){var f=e.substring(0,1);"."!==f&&"#"!==f||(e=this.s.subHtmlSelectorRelative&&!this.s.dynamic?d.find(e).html():a(e).html())}else e="";".lg-sub-html"===this.s.appendSubHtmlTo?c?this.$outer.find(this.s.appendSubHtmlTo).load(c):this.$outer.find(this.s.appendSubHtmlTo).html(e):c?this.$slide.eq(b).load(c):this.$slide.eq(b).append(e),"undefined"!=typeof e&&null!==e&&(""===e?this.$outer.find(this.s.appendSubHtmlTo).addClass("lg-empty-html"):this.$outer.find(this.s.appendSubHtmlTo).removeClass("lg-empty-html")),this.$el.trigger("onAfterAppendSubHtml.lg",[b])},e.prototype.preload=function(a){var b=1,c=1;for(b=1;b<=this.s.preload&&!(b>=this.$items.length-a);b++)this.loadContent(a+b,!1,0);for(c=1;c<=this.s.preload&&!(0>a-c);c++)this.loadContent(a-c,!1,0)},e.prototype.loadContent=function(c,d,e){var f,g,h,i,j,k,l=this,m=!1,n=function(c){for(var d=[],e=[],f=0;fi){g=e[j];break}};if(l.s.dynamic){if(l.s.dynamicEl[c].poster&&(m=!0,h=l.s.dynamicEl[c].poster),k=l.s.dynamicEl[c].html,g=l.s.dynamicEl[c].src,l.s.dynamicEl[c].responsive){var o=l.s.dynamicEl[c].responsive.split(",");n(o)}i=l.s.dynamicEl[c].srcset,j=l.s.dynamicEl[c].sizes}else{if(l.$items.eq(c).attr("data-poster")&&(m=!0,h=l.$items.eq(c).attr("data-poster")),k=l.$items.eq(c).attr("data-html"),g=l.$items.eq(c).attr("href")||l.$items.eq(c).attr("data-src"),l.$items.eq(c).attr("data-responsive")){var p=l.$items.eq(c).attr("data-responsive").split(",");n(p)}i=l.$items.eq(c).attr("data-srcset"),j=l.$items.eq(c).attr("data-sizes")}var q=!1;l.s.dynamic?l.s.dynamicEl[c].iframe&&(q=!0):"true"===l.$items.eq(c).attr("data-iframe")&&(q=!0);var r=l.isVideo(g,c);if(!l.$slide.eq(c).hasClass("lg-loaded")){if(q)l.$slide.eq(c).prepend('
');else if(m){var s="";s=r&&r.youtube?"lg-has-youtube":r&&r.vimeo?"lg-has-vimeo":"lg-has-html5",l.$slide.eq(c).prepend('
')}else r?(l.$slide.eq(c).prepend('
'),l.$el.trigger("hasVideo.lg",[c,g,k])):l.$slide.eq(c).prepend('
');if(l.$el.trigger("onAferAppendSlide.lg",[c]),f=l.$slide.eq(c).find(".lg-object"),j&&f.attr("sizes",j),i){f.attr("srcset",i);try{picturefill({elements:[f[0]]})}catch(t){console.error("Make sure you have included Picturefill version 2")}}".lg-sub-html"!==this.s.appendSubHtmlTo&&l.addHtml(c),l.$slide.eq(c).addClass("lg-loaded")}l.$slide.eq(c).find(".lg-object").on("load.lg error.lg",function(){var b=0;e&&!a("body").hasClass("lg-from-hash")&&(b=e),setTimeout(function(){l.$slide.eq(c).addClass("lg-complete"),l.$el.trigger("onSlideItemLoad.lg",[c,e||0])},b)}),r&&r.html5&&!m&&l.$slide.eq(c).addClass("lg-complete"),d===!0&&(l.$slide.eq(c).hasClass("lg-complete")?l.preload(c):l.$slide.eq(c).find(".lg-object").on("load.lg error.lg",function(){l.preload(c)}))},e.prototype.slide=function(b,c,d){var e=this.$outer.find(".lg-current").index(),f=this;if(!f.lGalleryOn||e!==b){var g=this.$slide.length,h=f.lGalleryOn?this.s.speed:0,i=!1,j=!1;if(!f.lgBusy){if(this.s.download){var k;k=f.s.dynamic?f.s.dynamicEl[b].downloadUrl!==!1&&(f.s.dynamicEl[b].downloadUrl||f.s.dynamicEl[b].src):"false"!==f.$items.eq(b).attr("data-download-url")&&(f.$items.eq(b).attr("data-download-url")||f.$items.eq(b).attr("href")||f.$items.eq(b).attr("data-src")),k?(a("#lg-download").attr("href",k),f.$outer.removeClass("lg-hide-download")):f.$outer.addClass("lg-hide-download")}if(this.$el.trigger("onBeforeSlide.lg",[e,b,c,d]),f.lgBusy=!0,clearTimeout(f.hideBartimeout),".lg-sub-html"===this.s.appendSubHtmlTo&&setTimeout(function(){f.addHtml(b)},h),this.arrowDisable(b),c){var l=b-1,m=b+1;0===b&&e===g-1?(m=0,l=g-1):b===g-1&&0===e&&(m=0,l=g-1),this.$slide.removeClass("lg-prev-slide lg-current lg-next-slide"),f.$slide.eq(l).addClass("lg-prev-slide"),f.$slide.eq(m).addClass("lg-next-slide"),f.$slide.eq(b).addClass("lg-current")}else f.$outer.addClass("lg-no-trans"),this.$slide.removeClass("lg-prev-slide lg-next-slide"),e>b?(j=!0,0!==b||e!==g-1||d||(j=!1,i=!0)):b>e&&(i=!0,b!==g-1||0!==e||d||(j=!0,i=!1)),j?(this.$slide.eq(b).addClass("lg-prev-slide"),this.$slide.eq(e).addClass("lg-next-slide")):i&&(this.$slide.eq(b).addClass("lg-next-slide"),this.$slide.eq(e).addClass("lg-prev-slide")),setTimeout(function(){f.$slide.removeClass("lg-current"),f.$slide.eq(b).addClass("lg-current"),f.$outer.removeClass("lg-no-trans")},50);f.lGalleryOn?(setTimeout(function(){f.loadContent(b,!0,0)},this.s.speed+50),setTimeout(function(){f.lgBusy=!1,f.$el.trigger("onAfterSlide.lg",[e,b,c,d])},this.s.speed)):(f.loadContent(b,!0,f.s.backdropDuration),f.lgBusy=!1,f.$el.trigger("onAfterSlide.lg",[e,b,c,d])),f.lGalleryOn=!0,this.s.counter&&a("#lg-counter-current").text(b+1)}}},e.prototype.goToNextSlide=function(a){var b=this;b.lgBusy||(b.index+10?(b.index--,b.$el.trigger("onBeforePrevSlide.lg",[b.index,a]),b.slide(b.index,a,!1)):b.s.loop?(b.index=b.$items.length-1,b.$el.trigger("onBeforePrevSlide.lg",[b.index,a]),b.slide(b.index,a,!1)):b.s.slideEndAnimatoin&&(b.$outer.addClass("lg-left-end"),setTimeout(function(){b.$outer.removeClass("lg-left-end")},400)))},e.prototype.keyPress=function(){var c=this;this.$items.length>1&&a(b).on("keyup.lg",function(a){c.$items.length>1&&(37===a.keyCode&&(a.preventDefault(),c.goToPrevSlide()),39===a.keyCode&&(a.preventDefault(),c.goToNextSlide()))}),a(b).on("keydown.lg",function(a){c.s.escKey===!0&&27===a.keyCode&&(a.preventDefault(),c.$outer.hasClass("lg-thumb-open")?c.$outer.removeClass("lg-thumb-open"):c.destroy())})},e.prototype.arrow=function(){var a=this;this.$outer.find(".lg-prev").on("click.lg",function(){a.goToPrevSlide()}),this.$outer.find(".lg-next").on("click.lg",function(){a.goToNextSlide()})},e.prototype.arrowDisable=function(a){!this.s.loop&&this.s.hideControlOnEnd&&(a+10?this.$outer.find(".lg-prev").removeAttr("disabled").removeClass("disabled"):this.$outer.find(".lg-prev").attr("disabled","disabled").addClass("disabled"))},e.prototype.setTranslate=function(a,b,c){this.s.useLeft?a.css("left",b):a.css({transform:"translate3d("+b+"px, "+c+"px, 0px)"})},e.prototype.touchMove=function(b,c){var d=c-b;Math.abs(d)>15&&(this.$outer.addClass("lg-dragging"),this.setTranslate(this.$slide.eq(this.index),d,0),this.setTranslate(a(".lg-prev-slide"),-this.$slide.eq(this.index).width()+d,0),this.setTranslate(a(".lg-next-slide"),this.$slide.eq(this.index).width()+d,0))},e.prototype.touchEnd=function(a){var b=this;"lg-slide"!==b.s.mode&&b.$outer.addClass("lg-slide"),this.$slide.not(".lg-current, .lg-prev-slide, .lg-next-slide").css("opacity","0"),setTimeout(function(){b.$outer.removeClass("lg-dragging"),0>a&&Math.abs(a)>b.s.swipeThreshold?b.goToNextSlide(!0):a>0&&Math.abs(a)>b.s.swipeThreshold?b.goToPrevSlide(!0):Math.abs(a)<5&&b.$el.trigger("onSlideClick.lg"),b.$slide.removeAttr("style")}),setTimeout(function(){b.$outer.hasClass("lg-dragging")||"lg-slide"===b.s.mode||b.$outer.removeClass("lg-slide")},b.s.speed+100)},e.prototype.enableSwipe=function(){var a=this,b=0,c=0,d=!1;a.s.enableSwipe&&a.isTouch&&a.doCss()&&(a.$slide.on("touchstart.lg",function(c){a.$outer.hasClass("lg-zoomed")||a.lgBusy||(c.preventDefault(),a.manageSwipeClass(),b=c.originalEvent.targetTouches[0].pageX)}),a.$slide.on("touchmove.lg",function(e){a.$outer.hasClass("lg-zoomed")||(e.preventDefault(),c=e.originalEvent.targetTouches[0].pageX,a.touchMove(b,c),d=!0)}),a.$slide.on("touchend.lg",function(){a.$outer.hasClass("lg-zoomed")||(d?(d=!1,a.touchEnd(c-b)):a.$el.trigger("onSlideClick.lg"))}))},e.prototype.enableDrag=function(){var c=this,d=0,e=0,f=!1,g=!1;c.s.enableDrag&&!c.isTouch&&c.doCss()&&(c.$slide.on("mousedown.lg",function(b){c.$outer.hasClass("lg-zoomed")||(a(b.target).hasClass("lg-object")||a(b.target).hasClass("lg-video-play"))&&(b.preventDefault(),c.lgBusy||(c.manageSwipeClass(),d=b.pageX,f=!0,c.$outer.scrollLeft+=1,c.$outer.scrollLeft-=1,c.$outer.removeClass("lg-grab").addClass("lg-grabbing"),c.$el.trigger("onDragstart.lg")))}),a(b).on("mousemove.lg",function(a){f&&(g=!0,e=a.pageX,c.touchMove(d,e),c.$el.trigger("onDragmove.lg"))}),a(b).on("mouseup.lg",function(b){g?(g=!1,c.touchEnd(e-d),c.$el.trigger("onDragend.lg")):(a(b.target).hasClass("lg-object")||a(b.target).hasClass("lg-video-play"))&&c.$el.trigger("onSlideClick.lg"),f&&(f=!1,c.$outer.removeClass("lg-grabbing").addClass("lg-grab"))}))},e.prototype.manageSwipeClass=function(){var a=this.index+1,b=this.index-1,c=this.$slide.length;this.s.loop&&(0===this.index?b=c-1:this.index===c-1&&(a=0)),this.$slide.removeClass("lg-next-slide lg-prev-slide"),b>-1&&this.$slide.eq(b).addClass("lg-prev-slide"),this.$slide.eq(a).addClass("lg-next-slide")},e.prototype.mousewheel=function(){var a=this;a.$outer.on("mousewheel.lg",function(b){b.deltaY&&(b.deltaY>0?a.goToPrevSlide():a.goToNextSlide(),b.preventDefault())})},e.prototype.closeGallery=function(){var b=this,c=!1;this.$outer.find(".lg-close").on("click.lg",function(){b.destroy()}),b.s.closable&&(b.$outer.on("mousedown.lg",function(b){c=!!(a(b.target).is(".lg-outer")||a(b.target).is(".lg-item ")||a(b.target).is(".lg-img-wrap"))}),b.$outer.on("mouseup.lg",function(d){(a(d.target).is(".lg-outer")||a(d.target).is(".lg-item ")||a(d.target).is(".lg-img-wrap")&&c)&&(b.$outer.hasClass("lg-dragging")||b.destroy())}))},e.prototype.destroy=function(c){var d=this;c||d.$el.trigger("onBeforeClose.lg"),a(b).scrollTop(d.prevScrollTop),c&&(d.s.dynamic||this.$items.off("click.lg click.lgcustom"),a.removeData(d.el,"lightGallery")),this.$el.off(".lg.tm"),a.each(a.fn.lightGallery.modules,function(a){d.modules[a]&&d.modules[a].destroy()}),this.lGalleryOn=!1,clearTimeout(d.hideBartimeout),this.hideBartimeout=!1,a(b).off(".lg"),a("body").removeClass("lg-on lg-from-hash"),d.$outer&&d.$outer.removeClass("lg-visible"),a(".lg-backdrop").removeClass("in"),setTimeout(function(){d.$outer&&d.$outer.remove(),a(".lg-backdrop").remove(),c||d.$el.trigger("onCloseAfter.lg")},d.s.backdropDuration+50)},a.fn.lightGallery=function(b){return this.each(function(){if(a.data(this,"lightGallery"))try{a(this).data("lightGallery").init()}catch(c){console.error("lightGallery has not initiated properly")}else a.data(this,"lightGallery",new e(this,b))})},a.fn.lightGallery.modules={}}(jQuery,window,document),function(a,b,c,d){"use strict";var e={autoplay:!1,pause:5e3,progressBar:!0,fourceAutoplay:!1,autoplayControls:!0,appendAutoplayControlsTo:".lg-toolbar"},f=function(b){return this.core=a(b).data("lightGallery"),this.$el=a(b),this.core.$items.length<2?!1:(this.core.s=a.extend({},e,this.core.s),this.interval=!1,this.fromAuto=!0,this.canceledOnTouch=!1,this.fourceAutoplayTemp=this.core.s.fourceAutoplay,this.core.doCss()||(this.core.s.progressBar=!1),this.init(),this)};f.prototype.init=function(){var a=this;a.core.s.autoplayControls&&a.controls(),a.core.s.progressBar&&a.core.$outer.find(".lg").append('
'),a.progress(),a.core.s.autoplay&&a.startlAuto(),a.$el.on("onDragstart.lg.tm touchstart.lg.tm",function(){a.interval&&(a.cancelAuto(),a.canceledOnTouch=!0)}),a.$el.on("onDragend.lg.tm touchend.lg.tm onSlideClick.lg.tm",function(){!a.interval&&a.canceledOnTouch&&(a.startlAuto(),a.canceledOnTouch=!1)})},f.prototype.progress=function(){var a,b,c=this;c.$el.on("onBeforeSlide.lg.tm",function(){c.core.s.progressBar&&c.fromAuto&&(a=c.core.$outer.find(".lg-progress-bar"),b=c.core.$outer.find(".lg-progress"),c.interval&&(b.removeAttr("style"),a.removeClass("lg-start"),setTimeout(function(){b.css("transition","width "+(c.core.s.speed+c.core.s.pause)+"ms ease 0s"),a.addClass("lg-start")},20))),c.fromAuto||c.core.s.fourceAutoplay||c.cancelAuto(),c.fromAuto=!1})},f.prototype.controls=function(){var b=this,c='';a(this.core.s.appendAutoplayControlsTo).append(c),b.core.$outer.find(".lg-autoplay-button").on("click.lg",function(){a(b.core.$outer).hasClass("lg-show-autoplay")?(b.cancelAuto(),b.core.s.fourceAutoplay=!1):b.interval||(b.startlAuto(),b.core.s.fourceAutoplay=b.fourceAutoplayTemp)})},f.prototype.startlAuto=function(){var a=this;a.core.$outer.find(".lg-progress").css("transition","width "+(a.core.s.speed+a.core.s.pause)+"ms ease 0s"),a.core.$outer.addClass("lg-show-autoplay"),a.core.$outer.find(".lg-progress-bar").addClass("lg-start"),a.interval=setInterval(function(){a.core.index+11&&this.init(),this};f.prototype.init=function(){var b,c,d,e=this,f="";if(e.core.$outer.find(".lg").append('
'),e.core.s.dynamic)for(var g=0;g
';else e.core.$items.each(function(){f+=e.core.s.exThumbImage?'
':'
'});c=e.core.$outer.find(".lg-pager-outer"),c.html(f),b=e.core.$outer.find(".lg-pager-cont"),b.on("click.lg touchend.lg",function(){var b=a(this);e.core.index=b.index(),e.core.slide(e.core.index,!1,!1)}),c.on("mouseover.lg",function(){clearTimeout(d),c.addClass("lg-pager-hover")}),c.on("mouseout.lg",function(){d=setTimeout(function(){c.removeClass("lg-pager-hover")})}),e.core.$el.on("onBeforeSlide.lg.tm",function(a,c,d){b.removeClass("lg-pager-active"),b.eq(d).addClass("lg-pager-active")})},f.prototype.destroy=function(){},a.fn.lightGallery.modules.pager=f}(jQuery,window,document),function(a,b,c,d){"use strict";var e={thumbnail:!0,animateThumb:!0,currentPagerPosition:"middle",thumbWidth:100,thumbContHeight:100,thumbMargin:5,exThumbImage:!1,showThumbByDefault:!0,toogleThumb:!0,pullCaptionUp:!0,enableThumbDrag:!0,enableThumbSwipe:!0,swipeThreshold:50,loadYoutubeThumbnail:!0,youtubeThumbSize:1,loadVimeoThumbnail:!0,vimeoThumbSize:"thumbnail_small",loadDailymotionThumbnail:!0},f=function(b){return this.core=a(b).data("lightGallery"),this.core.s=a.extend({},e,this.core.s),this.$el=a(b),this.$thumbOuter=null,this.thumbOuterWidth=0,this.thumbTotalWidth=this.core.$items.length*(this.core.s.thumbWidth+this.core.s.thumbMargin),this.thumbIndex=this.core.index,this.left=0,this.init(),this};f.prototype.init=function(){var a=this;this.core.s.thumbnail&&this.core.$items.length>1&&(this.core.s.showThumbByDefault&&setTimeout(function(){a.core.$outer.addClass("lg-thumb-open")},700),this.core.s.pullCaptionUp&&this.core.$outer.addClass("lg-pull-caption-up"),this.build(),this.core.s.animateThumb?(this.core.s.enableThumbDrag&&!this.core.isTouch&&this.core.doCss()&&this.enableThumbDrag(),this.core.s.enableThumbSwipe&&this.core.isTouch&&this.core.doCss()&&this.enableThumbSwipe(),this.thumbClickable=!1):this.thumbClickable=!0,this.toogle(),this.thumbkeyPress())},f.prototype.build=function(){function c(a,b,c){var d,h=e.core.isVideo(a,c)||{},i="";h.youtube||h.vimeo||h.dailymotion?h.youtube?d=e.core.s.loadYoutubeThumbnail?"//img.youtube.com/vi/"+h.youtube[1]+"/"+e.core.s.youtubeThumbSize+".jpg":b:h.vimeo?e.core.s.loadVimeoThumbnail?(d="//i.vimeocdn.com/video/error_"+g+".jpg",i=h.vimeo[1]):d=b:h.dailymotion&&(d=e.core.s.loadDailymotionThumbnail?"//www.dailymotion.com/thumbnail/video/"+h.dailymotion[1]:b):d=b,f+='
',i=""}var d,e=this,f="",g="",h='
';switch(this.core.s.vimeoThumbSize){case"thumbnail_large":g="640";break;case"thumbnail_medium":g="200x150";break;case"thumbnail_small":g="100x75"}if(e.core.$outer.addClass("lg-has-thumb"),e.core.$outer.find(".lg").append(h),e.$thumbOuter=e.core.$outer.find(".lg-thumb-outer"),e.thumbOuterWidth=e.$thumbOuter.width(),e.core.s.animateThumb&&e.core.$outer.find(".lg-thumb").css({width:e.thumbTotalWidth+"px",position:"relative"}),this.core.s.animateThumb&&e.$thumbOuter.css("height",e.core.s.thumbContHeight+"px"),e.core.s.dynamic)for(var i=0;ithis.thumbTotalWidth-this.thumbOuterWidth&&(this.left=this.thumbTotalWidth-this.thumbOuterWidth),this.left<0&&(this.left=0),this.core.lGalleryOn?(b.hasClass("on")||this.core.$outer.find(".lg-thumb").css("transition-duration",this.core.s.speed+"ms"),this.core.doCss()||b.animate({left:-this.left+"px"},this.core.s.speed)):this.core.doCss()||b.css("left",-this.left+"px"),this.setTranslate(this.left)}},f.prototype.enableThumbDrag=function(){var c=this,d=0,e=0,f=!1,g=!1,h=0;c.$thumbOuter.addClass("lg-grab"),c.core.$outer.find(".lg-thumb").on("mousedown.lg.thumb",function(a){c.thumbTotalWidth>c.thumbOuterWidth&&(a.preventDefault(),d=a.pageX,f=!0,c.core.$outer.scrollLeft+=1,c.core.$outer.scrollLeft-=1,c.thumbClickable=!1,c.$thumbOuter.removeClass("lg-grab").addClass("lg-grabbing"))}),a(b).on("mousemove.lg.thumb",function(a){f&&(h=c.left,g=!0,e=a.pageX,c.$thumbOuter.addClass("lg-dragging"),h-=e-d,h>c.thumbTotalWidth-c.thumbOuterWidth&&(h=c.thumbTotalWidth-c.thumbOuterWidth),0>h&&(h=0),c.setTranslate(h))}),a(b).on("mouseup.lg.thumb",function(){g?(g=!1,c.$thumbOuter.removeClass("lg-dragging"),c.left=h,Math.abs(e-d)a.thumbOuterWidth&&(c.preventDefault(),b=c.originalEvent.targetTouches[0].pageX,a.thumbClickable=!1)}),a.core.$outer.find(".lg-thumb").on("touchmove.lg",function(f){a.thumbTotalWidth>a.thumbOuterWidth&&(f.preventDefault(),c=f.originalEvent.targetTouches[0].pageX,d=!0,a.$thumbOuter.addClass("lg-dragging"),e=a.left,e-=c-b,e>a.thumbTotalWidth-a.thumbOuterWidth&&(e=a.thumbTotalWidth-a.thumbOuterWidth),0>e&&(e=0),a.setTranslate(e))}),a.core.$outer.find(".lg-thumb").on("touchend.lg",function(){a.thumbTotalWidth>a.thumbOuterWidth&&d?(d=!1,a.$thumbOuter.removeClass("lg-dragging"),Math.abs(c-b)'),a.core.$outer.find(".lg-toogle-thumb").on("click.lg",function(){a.core.$outer.toggleClass("lg-thumb-open")}))},f.prototype.thumbkeyPress=function(){var c=this;a(b).on("keydown.lg.thumb",function(a){38===a.keyCode?(a.preventDefault(),c.core.$outer.addClass("lg-thumb-open")):40===a.keyCode&&(a.preventDefault(),c.core.$outer.removeClass("lg-thumb-open"))})},f.prototype.destroy=function(){this.core.s.thumbnail&&this.core.$items.length>1&&(a(b).off("resize.lg.thumb orientationchange.lg.thumb keydown.lg.thumb"),this.$thumbOuter.remove(),this.core.$outer.removeClass("lg-has-thumb"))},a.fn.lightGallery.modules.Thumbnail=f}(jQuery,window,document),function(a,b,c,d){"use strict";var e={videoMaxWidth:"855px",youtubePlayerParams:!1,vimeoPlayerParams:!1,dailymotionPlayerParams:!1,vkPlayerParams:!1,videojs:!1,videojsOptions:{}},f=function(b){return this.core=a(b).data("lightGallery"),this.$el=a(b),this.core.s=a.extend({},e,this.core.s),this.videoLoaded=!1,this.init(),this};f.prototype.init=function(){var b=this;b.core.$el.on("hasVideo.lg.tm",function(a,c,d,e){if(b.core.$slide.eq(c).find(".lg-video").append(b.loadVideo(d,"lg-object",!0,c,e)),e)if(b.core.s.videojs)try{videojs(b.core.$slide.eq(c).find(".lg-html5").get(0),b.core.s.videojsOptions,function(){b.videoLoaded||this.play()})}catch(f){console.error("Make sure you have included videojs")}else b.core.$slide.eq(c).find(".lg-html5").get(0).play()}),b.core.$el.on("onAferAppendSlide.lg.tm",function(a,c){b.core.$slide.eq(c).find(".lg-video-cont").css("max-width",b.core.s.videoMaxWidth),b.videoLoaded=!0});var c=function(a){if(a.find(".lg-object").hasClass("lg-has-poster")&&a.find(".lg-object").is(":visible"))if(a.hasClass("lg-has-video")){var c=a.find(".lg-youtube").get(0),d=a.find(".lg-vimeo").get(0),e=a.find(".lg-dailymotion").get(0),f=a.find(".lg-html5").get(0);if(c)c.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*");else if(d)try{$f(d).api("play")}catch(g){console.error("Make sure you have included froogaloop2 js")}else if(e)e.contentWindow.postMessage("play","*");else if(f)if(b.core.s.videojs)try{videojs(f).play()}catch(g){console.error("Make sure you have included videojs")}else f.play();a.addClass("lg-video-playing")}else{ +a.addClass("lg-video-playing lg-has-video");var h,i,j=function(c,d){if(a.find(".lg-video").append(b.loadVideo(c,"",!1,b.core.index,d)),d)if(b.core.s.videojs)try{videojs(b.core.$slide.eq(b.core.index).find(".lg-html5").get(0),b.core.s.videojsOptions,function(){this.play()})}catch(e){console.error("Make sure you have included videojs")}else b.core.$slide.eq(b.core.index).find(".lg-html5").get(0).play()};b.core.s.dynamic?(h=b.core.s.dynamicEl[b.core.index].src,i=b.core.s.dynamicEl[b.core.index].html,j(h,i)):(h=b.core.$items.eq(b.core.index).attr("href")||b.core.$items.eq(b.core.index).attr("data-src"),i=b.core.$items.eq(b.core.index).attr("data-html"),j(h,i));var k=a.find(".lg-object");a.find(".lg-video").append(k),a.find(".lg-video-object").hasClass("lg-html5")||(a.removeClass("lg-complete"),a.find(".lg-video-object").on("load.lg error.lg",function(){a.addClass("lg-complete")}))}};b.core.doCss()&&b.core.$items.length>1&&(b.core.s.enableSwipe&&b.core.isTouch||b.core.s.enableDrag&&!b.core.isTouch)?b.core.$el.on("onSlideClick.lg.tm",function(){var a=b.core.$slide.eq(b.core.index);c(a)}):b.core.$slide.on("click.lg",function(){c(a(this))}),b.core.$el.on("onBeforeSlide.lg.tm",function(c,d,e){var f=b.core.$slide.eq(d),g=f.find(".lg-youtube").get(0),h=f.find(".lg-vimeo").get(0),i=f.find(".lg-dailymotion").get(0),j=f.find(".lg-vk").get(0),k=f.find(".lg-html5").get(0);if(g)g.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*");else if(h)try{$f(h).api("pause")}catch(l){console.error("Make sure you have included froogaloop2 js")}else if(i)i.contentWindow.postMessage("pause","*");else if(k)if(b.core.s.videojs)try{videojs(k).pause()}catch(l){console.error("Make sure you have included videojs")}else k.pause();j&&a(j).attr("src",a(j).attr("src").replace("&autoplay","&noplay"));var m;m=b.core.s.dynamic?b.core.s.dynamicEl[e].src:b.core.$items.eq(e).attr("href")||b.core.$items.eq(e).attr("data-src");var n=b.core.isVideo(m,e)||{};(n.youtube||n.vimeo||n.dailymotion||n.vk)&&b.core.$outer.addClass("lg-hide-download")}),b.core.$el.on("onAfterSlide.lg.tm",function(a,c){b.core.$slide.eq(c).removeClass("lg-video-playing")})},f.prototype.loadVideo=function(b,c,d,e,f){var g="",h=1,i="",j=this.core.isVideo(b,e)||{};if(d&&(h=this.videoLoaded?0:1),j.youtube)i="?wmode=opaque&autoplay="+h+"&enablejsapi=1",this.core.s.youtubePlayerParams&&(i=i+"&"+a.param(this.core.s.youtubePlayerParams)),g='';else if(j.vimeo)i="?autoplay="+h+"&api=1",this.core.s.vimeoPlayerParams&&(i=i+"&"+a.param(this.core.s.vimeoPlayerParams)),g='';else if(j.dailymotion)i="?wmode=opaque&autoplay="+h+"&api=postMessage",this.core.s.dailymotionPlayerParams&&(i=i+"&"+a.param(this.core.s.dailymotionPlayerParams)),g='';else if(j.html5){var k=f.substring(0,1);"."!==k&&"#"!==k||(f=a(f).html()),g=f}else j.vk&&(i="&autoplay="+h,this.core.s.vkPlayerParams&&(i=i+"&"+a.param(this.core.s.vkPlayerParams)),g='');return g},f.prototype.destroy=function(){this.videoLoaded=!1},a.fn.lightGallery.modules.video=f}(jQuery,window,document),function(a,b,c,d){"use strict";var e={scale:1,zoom:!0,actualSize:!0,enableZoomAfter:300},f=function(c){return this.core=a(c).data("lightGallery"),this.core.s=a.extend({},e,this.core.s),this.core.s.zoom&&this.core.doCss()&&(this.init(),this.zoomabletimeout=!1,this.pageX=a(b).width()/2,this.pageY=a(b).height()/2+a(b).scrollTop()),this};f.prototype.init=function(){var c=this,d='';c.core.s.actualSize&&(d+=''),this.core.$outer.find(".lg-toolbar").append(d),c.core.$el.on("onSlideItemLoad.lg.tm.zoom",function(b,d,e){var f=c.core.s.enableZoomAfter+e;a("body").hasClass("lg-from-hash")&&e?f=0:a("body").removeClass("lg-from-hash"),c.zoomabletimeout=setTimeout(function(){c.core.$slide.eq(d).addClass("lg-zoomable")},f+30)});var e=1,f=function(d){var e,f,g=c.core.$outer.find(".lg-current .lg-image"),h=(a(b).width()-g.width())/2,i=(a(b).height()-g.height())/2+a(b).scrollTop();e=c.pageX-h,f=c.pageY-i;var j=(d-1)*e,k=(d-1)*f;g.css("transform","scale3d("+d+", "+d+", 1)").attr("data-scale",d),g.parent().css({left:-j+"px",top:-k+"px"}).attr("data-x",j).attr("data-y",k)},g=function(){e>1?c.core.$outer.addClass("lg-zoomed"):c.resetZoom(),1>e&&(e=1),f(e)},h=function(d,f,h,i){var j,k=f.width();j=c.core.s.dynamic?c.core.s.dynamicEl[h].width||f[0].naturalWidth||k:c.core.$items.eq(h).attr("data-width")||f[0].naturalWidth||k;var l;c.core.$outer.hasClass("lg-zoomed")?e=1:j>k&&(l=j/k,e=l||2),i?(c.pageX=a(b).width()/2,c.pageY=a(b).height()/2+a(b).scrollTop()):(c.pageX=d.pageX||d.originalEvent.targetTouches[0].pageX,c.pageY=d.pageY||d.originalEvent.targetTouches[0].pageY),g(),setTimeout(function(){c.core.$outer.removeClass("lg-grabbing").addClass("lg-grab")},10)},i=!1;c.core.$el.on("onAferAppendSlide.lg.tm.zoom",function(a,b){var d=c.core.$slide.eq(b).find(".lg-image");d.on("dblclick",function(a){h(a,d,b)}),d.on("touchstart",function(a){i?(clearTimeout(i),i=null,h(a,d,b)):i=setTimeout(function(){i=null},300),a.preventDefault()})}),a(b).on("resize.lg.zoom scroll.lg.zoom orientationchange.lg.zoom",function(){c.pageX=a(b).width()/2,c.pageY=a(b).height()/2+a(b).scrollTop(),f(e)}),a("#lg-zoom-out").on("click.lg",function(){c.core.$outer.find(".lg-current .lg-image").length&&(e-=c.core.s.scale,g())}),a("#lg-zoom-in").on("click.lg",function(){c.core.$outer.find(".lg-current .lg-image").length&&(e+=c.core.s.scale,g())}),a("#lg-actual-size").on("click.lg",function(a){h(a,c.core.$slide.eq(c.core.index).find(".lg-image"),c.core.index,!0)}),c.core.$el.on("onBeforeSlide.lg.tm",function(){e=1,c.resetZoom()}),c.core.isTouch||c.zoomDrag(),c.core.isTouch&&c.zoomSwipe()},f.prototype.resetZoom=function(){this.core.$outer.removeClass("lg-zoomed"),this.core.$slide.find(".lg-img-wrap").removeAttr("style data-x data-y"),this.core.$slide.find(".lg-image").removeAttr("style data-scale"),this.pageX=a(b).width()/2,this.pageY=a(b).height()/2+a(b).scrollTop()},f.prototype.zoomSwipe=function(){var a=this,b={},c={},d=!1,e=!1,f=!1;a.core.$slide.on("touchstart.lg",function(c){if(a.core.$outer.hasClass("lg-zoomed")){var d=a.core.$slide.eq(a.core.index).find(".lg-object");f=d.outerHeight()*d.attr("data-scale")>a.core.$outer.find(".lg").height(),e=d.outerWidth()*d.attr("data-scale")>a.core.$outer.find(".lg").width(),(e||f)&&(c.preventDefault(),b={x:c.originalEvent.targetTouches[0].pageX,y:c.originalEvent.targetTouches[0].pageY})}}),a.core.$slide.on("touchmove.lg",function(g){if(a.core.$outer.hasClass("lg-zoomed")){var h,i,j=a.core.$slide.eq(a.core.index).find(".lg-img-wrap");g.preventDefault(),d=!0,c={x:g.originalEvent.targetTouches[0].pageX,y:g.originalEvent.targetTouches[0].pageY},a.core.$outer.addClass("lg-zoom-dragging"),i=f?-Math.abs(j.attr("data-y"))+(c.y-b.y):-Math.abs(j.attr("data-y")),h=e?-Math.abs(j.attr("data-x"))+(c.x-b.x):-Math.abs(j.attr("data-x")),(Math.abs(c.x-b.x)>15||Math.abs(c.y-b.y)>15)&&j.css({left:h+"px",top:i+"px"})}}),a.core.$slide.on("touchend.lg",function(){a.core.$outer.hasClass("lg-zoomed")&&d&&(d=!1,a.core.$outer.removeClass("lg-zoom-dragging"),a.touchendZoom(b,c,e,f))})},f.prototype.zoomDrag=function(){var c=this,d={},e={},f=!1,g=!1,h=!1,i=!1;c.core.$slide.on("mousedown.lg.zoom",function(b){var e=c.core.$slide.eq(c.core.index).find(".lg-object");i=e.outerHeight()*e.attr("data-scale")>c.core.$outer.find(".lg").height(),h=e.outerWidth()*e.attr("data-scale")>c.core.$outer.find(".lg").width(),c.core.$outer.hasClass("lg-zoomed")&&a(b.target).hasClass("lg-object")&&(h||i)&&(b.preventDefault(),d={x:b.pageX,y:b.pageY},f=!0,c.core.$outer.scrollLeft+=1,c.core.$outer.scrollLeft-=1,c.core.$outer.removeClass("lg-grab").addClass("lg-grabbing"))}),a(b).on("mousemove.lg.zoom",function(a){if(f){var b,j,k=c.core.$slide.eq(c.core.index).find(".lg-img-wrap");g=!0,e={x:a.pageX,y:a.pageY},c.core.$outer.addClass("lg-zoom-dragging"),j=i?-Math.abs(k.attr("data-y"))+(e.y-d.y):-Math.abs(k.attr("data-y")),b=h?-Math.abs(k.attr("data-x"))+(e.x-d.x):-Math.abs(k.attr("data-x")),k.css({left:b+"px",top:j+"px"})}}),a(b).on("mouseup.lg.zoom",function(a){f&&(f=!1,c.core.$outer.removeClass("lg-zoom-dragging"),!g||d.x===e.x&&d.y===e.y||(e={x:a.pageX,y:a.pageY},c.touchendZoom(d,e,h,i)),g=!1),c.core.$outer.removeClass("lg-grabbing").addClass("lg-grab")})},f.prototype.touchendZoom=function(a,b,c,d){var e=this,f=e.core.$slide.eq(e.core.index).find(".lg-img-wrap"),g=e.core.$slide.eq(e.core.index).find(".lg-object"),h=-Math.abs(f.attr("data-x"))+(b.x-a.x),i=-Math.abs(f.attr("data-y"))+(b.y-a.y),j=(e.core.$outer.find(".lg").height()-g.outerHeight())/2,k=Math.abs(g.outerHeight()*Math.abs(g.attr("data-scale"))-e.core.$outer.find(".lg").height()+j),l=(e.core.$outer.find(".lg").width()-g.outerWidth())/2,m=Math.abs(g.outerWidth()*Math.abs(g.attr("data-scale"))-e.core.$outer.find(".lg").width()+l);(Math.abs(b.x-a.x)>15||Math.abs(b.y-a.y)>15)&&(d&&(-k>=i?i=-k:i>=-j&&(i=-j)),c&&(-m>=h?h=-m:h>=-l&&(h=-l)),d?f.attr("data-y",Math.abs(i)):i=-Math.abs(f.attr("data-y")),c?f.attr("data-x",Math.abs(h)):h=-Math.abs(f.attr("data-x")),f.css({left:h+"px",top:i+"px"}))},f.prototype.destroy=function(){var c=this;c.core.$el.off(".lg.zoom"),a(b).off(".lg.zoom"),c.core.$slide.off(".lg.zoom"),c.core.$el.off(".lg.tm.zoom"),c.resetZoom(),clearTimeout(c.zoomabletimeout),c.zoomabletimeout=!1},a.fn.lightGallery.modules.zoom=f}(jQuery,window,document),function(a,b,c,d){"use strict";var e={hash:!0},f=function(c){return this.core=a(c).data("lightGallery"),this.core.s=a.extend({},e,this.core.s),this.core.s.hash&&(this.oldHash=b.location.hash,this.init()),this};f.prototype.init=function(){var c,d=this;d.core.$el.on("onAfterSlide.lg.tm",function(a,c,e){b.location.hash="lg="+d.core.s.galleryId+"&slide="+e}),a(b).on("hashchange.lg.hash",function(){c=b.location.hash;var a=parseInt(c.split("&slide=")[1],10);c.indexOf("lg="+d.core.s.galleryId)>-1?d.core.slide(a,!1,!1):d.core.lGalleryOn&&d.core.destroy()})},f.prototype.destroy=function(){this.core.s.hash&&(this.oldHash&&this.oldHash.indexOf("lg="+this.core.s.galleryId)<0?b.location.hash=this.oldHash:history.pushState?history.pushState("",c.title,b.location.pathname+b.location.search):b.location.hash="",this.core.$el.off(".lg.hash"))},a.fn.lightGallery.modules.hash=f}(jQuery,window,document); \ No newline at end of file diff --git a/vendors/lightgallery/dist/js/lightgallery.js b/vendors/lightgallery/dist/js/lightgallery.js new file mode 100644 index 000000000..3bf270040 --- /dev/null +++ b/vendors/lightgallery/dist/js/lightgallery.js @@ -0,0 +1,1317 @@ +/*! lightgallery - v1.2.21 - 2016-06-28 +* http://sachinchoolur.github.io/lightGallery/ +* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + + mode: 'lg-slide', + + // Ex : 'ease' + cssEasing: 'ease', + + //'for jquery animation' + easing: 'linear', + speed: 600, + height: '100%', + width: '100%', + addClass: '', + startClass: 'lg-start-zoom', + backdropDuration: 150, + hideBarsDelay: 6000, + + useLeft: false, + + closable: true, + loop: true, + escKey: true, + keyPress: true, + controls: true, + slideEndAnimatoin: true, + hideControlOnEnd: false, + mousewheel: true, + + getCaptionFromTitleOrAlt: true, + + // .lg-item || '.lg-sub-html' + appendSubHtmlTo: '.lg-sub-html', + + subHtmlSelectorRelative: false, + + /** + * @desc number of preload slides + * will exicute only after the current slide is fully loaded. + * + * @ex you clicked on 4th image and if preload = 1 then 3rd slide and 5th + * slide will be loaded in the background after the 4th slide is fully loaded.. + * if preload is 2 then 2nd 3rd 5th 6th slides will be preloaded.. ... ... + * + */ + preload: 1, + showAfterLoad: true, + selector: '', + selectWithin: '', + nextHtml: '', + prevHtml: '', + + // 0, 1 + index: false, + + iframeMaxWidth: '100%', + + download: true, + counter: true, + appendCounterTo: '.lg-toolbar', + + swipeThreshold: 50, + enableSwipe: true, + enableDrag: true, + + dynamic: false, + dynamicEl: [], + galleryId: 1 + }; + + function Plugin(element, options) { + + // Current lightGallery element + this.el = element; + + // Current jquery element + this.$el = $(element); + + // lightGallery settings + this.s = $.extend({}, defaults, options); + + // When using dynamic mode, ensure dynamicEl is an array + if (this.s.dynamic && this.s.dynamicEl !== 'undefined' && this.s.dynamicEl.constructor === Array && !this.s.dynamicEl.length) { + throw ('When using dynamic mode, you must also define dynamicEl as an Array.'); + } + + // lightGallery modules + this.modules = {}; + + // false when lightgallery complete first slide; + this.lGalleryOn = false; + + this.lgBusy = false; + + // Timeout function for hiding controls; + this.hideBartimeout = false; + + // To determine browser supports for touch events; + this.isTouch = ('ontouchstart' in document.documentElement); + + // Disable hideControlOnEnd if sildeEndAnimation is true + if (this.s.slideEndAnimatoin) { + this.s.hideControlOnEnd = false; + } + + // Gallery items + if (this.s.dynamic) { + this.$items = this.s.dynamicEl; + } else { + if (this.s.selector === 'this') { + this.$items = this.$el; + } else if (this.s.selector !== '') { + if (this.s.selectWithin) { + this.$items = $(this.s.selectWithin).find(this.s.selector); + } else { + this.$items = this.$el.find($(this.s.selector)); + } + } else { + this.$items = this.$el.children(); + } + } + + // .lg-item + this.$slide = ''; + + // .lg-outer + this.$outer = ''; + + this.init(); + + return this; + } + + Plugin.prototype.init = function() { + + var _this = this; + + // s.preload should not be more than $item.length + if (_this.s.preload > _this.$items.length) { + _this.s.preload = _this.$items.length; + } + + // if dynamic option is enabled execute immediately + var _hash = window.location.hash; + if (_hash.indexOf('lg=' + this.s.galleryId) > 0) { + + _this.index = parseInt(_hash.split('&slide=')[1], 10); + + $('body').addClass('lg-from-hash'); + if (!$('body').hasClass('lg-on')) { + setTimeout(function() { + _this.build(_this.index); + $('body').addClass('lg-on'); + }); + } + } + + if (_this.s.dynamic) { + + _this.$el.trigger('onBeforeOpen.lg'); + + _this.index = _this.s.index || 0; + + // prevent accidental double execution + if (!$('body').hasClass('lg-on')) { + setTimeout(function() { + _this.build(_this.index); + $('body').addClass('lg-on'); + }); + } + } else { + + // Using different namespace for click because click event should not unbind if selector is same object('this') + _this.$items.on('click.lgcustom', function(event) { + + // For IE8 + try { + event.preventDefault(); + event.preventDefault(); + } catch (er) { + event.returnValue = false; + } + + _this.$el.trigger('onBeforeOpen.lg'); + + _this.index = _this.s.index || _this.$items.index(this); + + // prevent accidental double execution + if (!$('body').hasClass('lg-on')) { + _this.build(_this.index); + $('body').addClass('lg-on'); + } + }); + } + + }; + + Plugin.prototype.build = function(index) { + + var _this = this; + + _this.structure(); + + // module constructor + $.each($.fn.lightGallery.modules, function(key) { + _this.modules[key] = new $.fn.lightGallery.modules[key](_this.el); + }); + + // initiate slide function + _this.slide(index, false, false); + + if (_this.s.keyPress) { + _this.keyPress(); + } + + if (_this.$items.length > 1) { + + _this.arrow(); + + setTimeout(function() { + _this.enableDrag(); + _this.enableSwipe(); + }, 50); + + if (_this.s.mousewheel) { + _this.mousewheel(); + } + } + + _this.counter(); + + _this.closeGallery(); + + _this.$el.trigger('onAfterOpen.lg'); + + // Hide controllers if mouse doesn't move for some period + _this.$outer.on('mousemove.lg click.lg touchstart.lg', function() { + + _this.$outer.removeClass('lg-hide-items'); + + clearTimeout(_this.hideBartimeout); + + // Timeout will be cleared on each slide movement also + _this.hideBartimeout = setTimeout(function() { + _this.$outer.addClass('lg-hide-items'); + }, _this.s.hideBarsDelay); + + }); + + }; + + Plugin.prototype.structure = function() { + var list = ''; + var controls = ''; + var i = 0; + var subHtmlCont = ''; + var template; + var _this = this; + + $('body').append('
'); + $('.lg-backdrop').css('transition-duration', this.s.backdropDuration + 'ms'); + + // Create gallery items + for (i = 0; i < this.$items.length; i++) { + list += '
'; + } + + // Create controlls + if (this.s.controls && this.$items.length > 1) { + controls = '
' + + '
' + this.s.prevHtml + '
' + + '
' + this.s.nextHtml + '
' + + '
'; + } + + if (this.s.appendSubHtmlTo === '.lg-sub-html') { + subHtmlCont = '
'; + } + + template = '
' + + '
' + + '
' + list + '
' + + '
' + + '' + + '
' + + controls + + subHtmlCont + + '
' + + '
'; + + $('body').append(template); + this.$outer = $('.lg-outer'); + this.$slide = this.$outer.find('.lg-item'); + + if (this.s.useLeft) { + this.$outer.addClass('lg-use-left'); + + // Set mode lg-slide if use left is true; + this.s.mode = 'lg-slide'; + } else { + this.$outer.addClass('lg-use-css3'); + } + + // For fixed height gallery + _this.setTop(); + $(window).on('resize.lg orientationchange.lg', function() { + setTimeout(function() { + _this.setTop(); + }, 100); + }); + + // add class lg-current to remove initial transition + this.$slide.eq(this.index).addClass('lg-current'); + + // add Class for css support and transition mode + if (this.doCss()) { + this.$outer.addClass('lg-css3'); + } else { + this.$outer.addClass('lg-css'); + + // Set speed 0 because no animation will happen if browser doesn't support css3 + this.s.speed = 0; + } + + this.$outer.addClass(this.s.mode); + + if (this.s.enableDrag && this.$items.length > 1) { + this.$outer.addClass('lg-grab'); + } + + if (this.s.showAfterLoad) { + this.$outer.addClass('lg-show-after-load'); + } + + if (this.doCss()) { + var $inner = this.$outer.find('.lg-inner'); + $inner.css('transition-timing-function', this.s.cssEasing); + $inner.css('transition-duration', this.s.speed + 'ms'); + } + + $('.lg-backdrop').addClass('in'); + + setTimeout(function() { + _this.$outer.addClass('lg-visible'); + }, this.s.backdropDuration); + + if (this.s.download) { + this.$outer.find('.lg-toolbar').append(''); + } + + // Store the current scroll top value to scroll back after closing the gallery.. + this.prevScrollTop = $(window).scrollTop(); + + }; + + // For fixed height gallery + Plugin.prototype.setTop = function() { + if (this.s.height !== '100%') { + var wH = $(window).height(); + var top = (wH - parseInt(this.s.height, 10)) / 2; + var $lGallery = this.$outer.find('.lg'); + if (wH >= parseInt(this.s.height, 10)) { + $lGallery.css('top', top + 'px'); + } else { + $lGallery.css('top', '0px'); + } + } + }; + + // Find css3 support + Plugin.prototype.doCss = function() { + // check for css animation support + var support = function() { + var transition = ['transition', 'MozTransition', 'WebkitTransition', 'OTransition', 'msTransition', 'KhtmlTransition']; + var root = document.documentElement; + var i = 0; + for (i = 0; i < transition.length; i++) { + if (transition[i] in root.style) { + return true; + } + } + }; + + if (support()) { + return true; + } + + return false; + }; + + /** + * @desc Check the given src is video + * @param {String} src + * @return {Object} video type + * Ex:{ youtube : ["//www.youtube.com/watch?v=c0asJgSyxcY", "c0asJgSyxcY"] } + */ + Plugin.prototype.isVideo = function(src, index) { + + var html; + if (this.s.dynamic) { + html = this.s.dynamicEl[index].html; + } else { + html = this.$items.eq(index).attr('data-html'); + } + + if (!src && html) { + return { + html5: true + }; + } + + var youtube = src.match(/\/\/(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=|embed\/)?([a-z0-9\-\_\%]+)/i); + var vimeo = src.match(/\/\/(?:www\.)?vimeo.com\/([0-9a-z\-_]+)/i); + var dailymotion = src.match(/\/\/(?:www\.)?dai.ly\/([0-9a-z\-_]+)/i); + var vk = src.match(/\/\/(?:www\.)?(?:vk\.com|vkontakte\.ru)\/(?:video_ext\.php\?)(.*)/i); + + if (youtube) { + return { + youtube: youtube + }; + } else if (vimeo) { + return { + vimeo: vimeo + }; + } else if (dailymotion) { + return { + dailymotion: dailymotion + }; + } else if (vk) { + return { + vk: vk + }; + } + }; + + /** + * @desc Create image counter + * Ex: 1/10 + */ + Plugin.prototype.counter = function() { + if (this.s.counter) { + $(this.s.appendCounterTo).append('
' + (parseInt(this.index, 10) + 1) + ' / ' + this.$items.length + '
'); + } + }; + + /** + * @desc add sub-html into the slide + * @param {Number} index - index of the slide + */ + Plugin.prototype.addHtml = function(index) { + var subHtml = null; + var subHtmlUrl; + var $currentEle; + if (this.s.dynamic) { + if (this.s.dynamicEl[index].subHtmlUrl) { + subHtmlUrl = this.s.dynamicEl[index].subHtmlUrl; + } else { + subHtml = this.s.dynamicEl[index].subHtml; + } + } else { + $currentEle = this.$items.eq(index); + if ($currentEle.attr('data-sub-html-url')) { + subHtmlUrl = $currentEle.attr('data-sub-html-url'); + } else { + subHtml = $currentEle.attr('data-sub-html'); + if (this.s.getCaptionFromTitleOrAlt && !subHtml) { + subHtml = $currentEle.attr('title') || $currentEle.find('img').first().attr('alt'); + } + } + } + + if (!subHtmlUrl) { + if (typeof subHtml !== 'undefined' && subHtml !== null) { + + // get first letter of subhtml + // if first letter starts with . or # get the html form the jQuery object + var fL = subHtml.substring(0, 1); + if (fL === '.' || fL === '#') { + if (this.s.subHtmlSelectorRelative && !this.s.dynamic) { + subHtml = $currentEle.find(subHtml).html(); + } else { + subHtml = $(subHtml).html(); + } + } + } else { + subHtml = ''; + } + } + + if (this.s.appendSubHtmlTo === '.lg-sub-html') { + + if (subHtmlUrl) { + this.$outer.find(this.s.appendSubHtmlTo).load(subHtmlUrl); + } else { + this.$outer.find(this.s.appendSubHtmlTo).html(subHtml); + } + + } else { + + if (subHtmlUrl) { + this.$slide.eq(index).load(subHtmlUrl); + } else { + this.$slide.eq(index).append(subHtml); + } + } + + // Add lg-empty-html class if title doesn't exist + if (typeof subHtml !== 'undefined' && subHtml !== null) { + if (subHtml === '') { + this.$outer.find(this.s.appendSubHtmlTo).addClass('lg-empty-html'); + } else { + this.$outer.find(this.s.appendSubHtmlTo).removeClass('lg-empty-html'); + } + } + + this.$el.trigger('onAfterAppendSubHtml.lg', [index]); + }; + + /** + * @desc Preload slides + * @param {Number} index - index of the slide + */ + Plugin.prototype.preload = function(index) { + var i = 1; + var j = 1; + for (i = 1; i <= this.s.preload; i++) { + if (i >= this.$items.length - index) { + break; + } + + this.loadContent(index + i, false, 0); + } + + for (j = 1; j <= this.s.preload; j++) { + if (index - j < 0) { + break; + } + + this.loadContent(index - j, false, 0); + } + }; + + /** + * @desc Load slide content into slide. + * @param {Number} index - index of the slide. + * @param {Boolean} rec - if true call loadcontent() function again. + * @param {Boolean} delay - delay for adding complete class. it is 0 except first time. + */ + Plugin.prototype.loadContent = function(index, rec, delay) { + + var _this = this; + var _hasPoster = false; + var _$img; + var _src; + var _poster; + var _srcset; + var _sizes; + var _html; + var getResponsiveSrc = function(srcItms) { + var rsWidth = []; + var rsSrc = []; + for (var i = 0; i < srcItms.length; i++) { + var __src = srcItms[i].split(' '); + + // Manage empty space + if (__src[0] === '') { + __src.splice(0, 1); + } + + rsSrc.push(__src[0]); + rsWidth.push(__src[1]); + } + + var wWidth = $(window).width(); + for (var j = 0; j < rsWidth.length; j++) { + if (parseInt(rsWidth[j], 10) > wWidth) { + _src = rsSrc[j]; + break; + } + } + }; + + if (_this.s.dynamic) { + + if (_this.s.dynamicEl[index].poster) { + _hasPoster = true; + _poster = _this.s.dynamicEl[index].poster; + } + + _html = _this.s.dynamicEl[index].html; + _src = _this.s.dynamicEl[index].src; + + if (_this.s.dynamicEl[index].responsive) { + var srcDyItms = _this.s.dynamicEl[index].responsive.split(','); + getResponsiveSrc(srcDyItms); + } + + _srcset = _this.s.dynamicEl[index].srcset; + _sizes = _this.s.dynamicEl[index].sizes; + + } else { + + if (_this.$items.eq(index).attr('data-poster')) { + _hasPoster = true; + _poster = _this.$items.eq(index).attr('data-poster'); + } + + _html = _this.$items.eq(index).attr('data-html'); + _src = _this.$items.eq(index).attr('href') || _this.$items.eq(index).attr('data-src'); + + if (_this.$items.eq(index).attr('data-responsive')) { + var srcItms = _this.$items.eq(index).attr('data-responsive').split(','); + getResponsiveSrc(srcItms); + } + + _srcset = _this.$items.eq(index).attr('data-srcset'); + _sizes = _this.$items.eq(index).attr('data-sizes'); + + } + + //if (_src || _srcset || _sizes || _poster) { + + var iframe = false; + if (_this.s.dynamic) { + if (_this.s.dynamicEl[index].iframe) { + iframe = true; + } + } else { + if (_this.$items.eq(index).attr('data-iframe') === 'true') { + iframe = true; + } + } + + var _isVideo = _this.isVideo(_src, index); + if (!_this.$slide.eq(index).hasClass('lg-loaded')) { + if (iframe) { + _this.$slide.eq(index).prepend('
'); + } else if (_hasPoster) { + var videoClass = ''; + if (_isVideo && _isVideo.youtube) { + videoClass = 'lg-has-youtube'; + } else if (_isVideo && _isVideo.vimeo) { + videoClass = 'lg-has-vimeo'; + } else { + videoClass = 'lg-has-html5'; + } + + _this.$slide.eq(index).prepend('
'); + + } else if (_isVideo) { + _this.$slide.eq(index).prepend('
'); + _this.$el.trigger('hasVideo.lg', [index, _src, _html]); + } else { + _this.$slide.eq(index).prepend('
'); + } + + _this.$el.trigger('onAferAppendSlide.lg', [index]); + + _$img = _this.$slide.eq(index).find('.lg-object'); + if (_sizes) { + _$img.attr('sizes', _sizes); + } + + if (_srcset) { + _$img.attr('srcset', _srcset); + try { + picturefill({ + elements: [_$img[0]] + }); + } catch (e) { + console.error('Make sure you have included Picturefill version 2'); + } + } + + if (this.s.appendSubHtmlTo !== '.lg-sub-html') { + _this.addHtml(index); + } + + _this.$slide.eq(index).addClass('lg-loaded'); + } + + _this.$slide.eq(index).find('.lg-object').on('load.lg error.lg', function() { + + // For first time add some delay for displaying the start animation. + var _speed = 0; + + // Do not change the delay value because it is required for zoom plugin. + // If gallery opened from direct url (hash) speed value should be 0 + if (delay && !$('body').hasClass('lg-from-hash')) { + _speed = delay; + } + + setTimeout(function() { + _this.$slide.eq(index).addClass('lg-complete'); + _this.$el.trigger('onSlideItemLoad.lg', [index, delay || 0]); + }, _speed); + + }); + + // @todo check load state for html5 videos + if (_isVideo && _isVideo.html5 && !_hasPoster) { + _this.$slide.eq(index).addClass('lg-complete'); + } + + if (rec === true) { + if (!_this.$slide.eq(index).hasClass('lg-complete')) { + _this.$slide.eq(index).find('.lg-object').on('load.lg error.lg', function() { + _this.preload(index); + }); + } else { + _this.preload(index); + } + } + + //} + }; + + /** + * @desc slide function for lightgallery + ** Slide() gets call on start + ** ** Set lg.on true once slide() function gets called. + ** Call loadContent() on slide() function inside setTimeout + ** ** On first slide we do not want any animation like slide of fade + ** ** So on first slide( if lg.on if false that is first slide) loadContent() should start loading immediately + ** ** Else loadContent() should wait for the transition to complete. + ** ** So set timeout s.speed + 50 + <=> ** loadContent() will load slide content in to the particular slide + ** ** It has recursion (rec) parameter. if rec === true loadContent() will call preload() function. + ** ** preload will execute only when the previous slide is fully loaded (images iframe) + ** ** avoid simultaneous image load + <=> ** Preload() will check for s.preload value and call loadContent() again accoring to preload value + ** loadContent() <====> Preload(); + + * @param {Number} index - index of the slide + * @param {Boolean} fromTouch - true if slide function called via touch event or mouse drag + * @param {Boolean} fromThumb - true if slide function called via thumbnail click + */ + Plugin.prototype.slide = function(index, fromTouch, fromThumb) { + + var _prevIndex = this.$outer.find('.lg-current').index(); + var _this = this; + + // Prevent if multiple call + // Required for hsh plugin + if (_this.lGalleryOn && (_prevIndex === index)) { + return; + } + + var _length = this.$slide.length; + var _time = _this.lGalleryOn ? this.s.speed : 0; + var _next = false; + var _prev = false; + + if (!_this.lgBusy) { + + if (this.s.download) { + var _src; + if (_this.s.dynamic) { + _src = _this.s.dynamicEl[index].downloadUrl !== false && (_this.s.dynamicEl[index].downloadUrl || _this.s.dynamicEl[index].src); + } else { + _src = _this.$items.eq(index).attr('data-download-url') !== 'false' && (_this.$items.eq(index).attr('data-download-url') || _this.$items.eq(index).attr('href') || _this.$items.eq(index).attr('data-src')); + + } + + if (_src) { + $('#lg-download').attr('href', _src); + _this.$outer.removeClass('lg-hide-download'); + } else { + _this.$outer.addClass('lg-hide-download'); + } + } + + this.$el.trigger('onBeforeSlide.lg', [_prevIndex, index, fromTouch, fromThumb]); + + _this.lgBusy = true; + + clearTimeout(_this.hideBartimeout); + + // Add title if this.s.appendSubHtmlTo === lg-sub-html + if (this.s.appendSubHtmlTo === '.lg-sub-html') { + + // wait for slide animation to complete + setTimeout(function() { + _this.addHtml(index); + }, _time); + } + + this.arrowDisable(index); + + if (!fromTouch) { + + // remove all transitions + _this.$outer.addClass('lg-no-trans'); + + this.$slide.removeClass('lg-prev-slide lg-next-slide'); + + if (index < _prevIndex) { + _prev = true; + if ((index === 0) && (_prevIndex === _length - 1) && !fromThumb) { + _prev = false; + _next = true; + } + } else if (index > _prevIndex) { + _next = true; + if ((index === _length - 1) && (_prevIndex === 0) && !fromThumb) { + _prev = true; + _next = false; + } + } + + if (_prev) { + + //prevslide + this.$slide.eq(index).addClass('lg-prev-slide'); + this.$slide.eq(_prevIndex).addClass('lg-next-slide'); + } else if (_next) { + + // next slide + this.$slide.eq(index).addClass('lg-next-slide'); + this.$slide.eq(_prevIndex).addClass('lg-prev-slide'); + } + + // give 50 ms for browser to add/remove class + setTimeout(function() { + _this.$slide.removeClass('lg-current'); + + //_this.$slide.eq(_prevIndex).removeClass('lg-current'); + _this.$slide.eq(index).addClass('lg-current'); + + // reset all transitions + _this.$outer.removeClass('lg-no-trans'); + }, 50); + } else { + + var touchPrev = index - 1; + var touchNext = index + 1; + + if ((index === 0) && (_prevIndex === _length - 1)) { + + // next slide + touchNext = 0; + touchPrev = _length - 1; + } else if ((index === _length - 1) && (_prevIndex === 0)) { + + // prev slide + touchNext = 0; + touchPrev = _length - 1; + } + + this.$slide.removeClass('lg-prev-slide lg-current lg-next-slide'); + _this.$slide.eq(touchPrev).addClass('lg-prev-slide'); + _this.$slide.eq(touchNext).addClass('lg-next-slide'); + _this.$slide.eq(index).addClass('lg-current'); + } + + if (_this.lGalleryOn) { + setTimeout(function() { + _this.loadContent(index, true, 0); + }, this.s.speed + 50); + + setTimeout(function() { + _this.lgBusy = false; + _this.$el.trigger('onAfterSlide.lg', [_prevIndex, index, fromTouch, fromThumb]); + }, this.s.speed); + + } else { + _this.loadContent(index, true, _this.s.backdropDuration); + + _this.lgBusy = false; + _this.$el.trigger('onAfterSlide.lg', [_prevIndex, index, fromTouch, fromThumb]); + } + + _this.lGalleryOn = true; + + if (this.s.counter) { + $('#lg-counter-current').text(index + 1); + } + + } + + }; + + /** + * @desc Go to next slide + * @param {Boolean} fromTouch - true if slide function called via touch event + */ + Plugin.prototype.goToNextSlide = function(fromTouch) { + var _this = this; + if (!_this.lgBusy) { + if ((_this.index + 1) < _this.$slide.length) { + _this.index++; + _this.$el.trigger('onBeforeNextSlide.lg', [_this.index]); + _this.slide(_this.index, fromTouch, false); + } else { + if (_this.s.loop) { + _this.index = 0; + _this.$el.trigger('onBeforeNextSlide.lg', [_this.index]); + _this.slide(_this.index, fromTouch, false); + } else if (_this.s.slideEndAnimatoin) { + _this.$outer.addClass('lg-right-end'); + setTimeout(function() { + _this.$outer.removeClass('lg-right-end'); + }, 400); + } + } + } + }; + + /** + * @desc Go to previous slide + * @param {Boolean} fromTouch - true if slide function called via touch event + */ + Plugin.prototype.goToPrevSlide = function(fromTouch) { + var _this = this; + if (!_this.lgBusy) { + if (_this.index > 0) { + _this.index--; + _this.$el.trigger('onBeforePrevSlide.lg', [_this.index, fromTouch]); + _this.slide(_this.index, fromTouch, false); + } else { + if (_this.s.loop) { + _this.index = _this.$items.length - 1; + _this.$el.trigger('onBeforePrevSlide.lg', [_this.index, fromTouch]); + _this.slide(_this.index, fromTouch, false); + } else if (_this.s.slideEndAnimatoin) { + _this.$outer.addClass('lg-left-end'); + setTimeout(function() { + _this.$outer.removeClass('lg-left-end'); + }, 400); + } + } + } + }; + + Plugin.prototype.keyPress = function() { + var _this = this; + if (this.$items.length > 1) { + $(window).on('keyup.lg', function(e) { + if (_this.$items.length > 1) { + if (e.keyCode === 37) { + e.preventDefault(); + _this.goToPrevSlide(); + } + + if (e.keyCode === 39) { + e.preventDefault(); + _this.goToNextSlide(); + } + } + }); + } + + $(window).on('keydown.lg', function(e) { + if (_this.s.escKey === true && e.keyCode === 27) { + e.preventDefault(); + if (!_this.$outer.hasClass('lg-thumb-open')) { + _this.destroy(); + } else { + _this.$outer.removeClass('lg-thumb-open'); + } + } + }); + }; + + Plugin.prototype.arrow = function() { + var _this = this; + this.$outer.find('.lg-prev').on('click.lg', function() { + _this.goToPrevSlide(); + }); + + this.$outer.find('.lg-next').on('click.lg', function() { + _this.goToNextSlide(); + }); + }; + + Plugin.prototype.arrowDisable = function(index) { + + // Disable arrows if s.hideControlOnEnd is true + if (!this.s.loop && this.s.hideControlOnEnd) { + if ((index + 1) < this.$slide.length) { + this.$outer.find('.lg-next').removeAttr('disabled').removeClass('disabled'); + } else { + this.$outer.find('.lg-next').attr('disabled', 'disabled').addClass('disabled'); + } + + if (index > 0) { + this.$outer.find('.lg-prev').removeAttr('disabled').removeClass('disabled'); + } else { + this.$outer.find('.lg-prev').attr('disabled', 'disabled').addClass('disabled'); + } + } + }; + + Plugin.prototype.setTranslate = function($el, xValue, yValue) { + // jQuery supports Automatic CSS prefixing since jQuery 1.8.0 + if (this.s.useLeft) { + $el.css('left', xValue); + } else { + $el.css({ + transform: 'translate3d(' + (xValue) + 'px, ' + yValue + 'px, 0px)' + }); + } + }; + + Plugin.prototype.touchMove = function(startCoords, endCoords) { + + var distance = endCoords - startCoords; + + if (Math.abs(distance) > 15) { + // reset opacity and transition duration + this.$outer.addClass('lg-dragging'); + + // move current slide + this.setTranslate(this.$slide.eq(this.index), distance, 0); + + // move next and prev slide with current slide + this.setTranslate($('.lg-prev-slide'), -this.$slide.eq(this.index).width() + distance, 0); + this.setTranslate($('.lg-next-slide'), this.$slide.eq(this.index).width() + distance, 0); + } + }; + + Plugin.prototype.touchEnd = function(distance) { + var _this = this; + + // keep slide animation for any mode while dragg/swipe + if (_this.s.mode !== 'lg-slide') { + _this.$outer.addClass('lg-slide'); + } + + this.$slide.not('.lg-current, .lg-prev-slide, .lg-next-slide').css('opacity', '0'); + + // set transition duration + setTimeout(function() { + _this.$outer.removeClass('lg-dragging'); + if ((distance < 0) && (Math.abs(distance) > _this.s.swipeThreshold)) { + _this.goToNextSlide(true); + } else if ((distance > 0) && (Math.abs(distance) > _this.s.swipeThreshold)) { + _this.goToPrevSlide(true); + } else if (Math.abs(distance) < 5) { + + // Trigger click if distance is less than 5 pix + _this.$el.trigger('onSlideClick.lg'); + } + + _this.$slide.removeAttr('style'); + }); + + // remove slide class once drag/swipe is completed if mode is not slide + setTimeout(function() { + if (!_this.$outer.hasClass('lg-dragging') && _this.s.mode !== 'lg-slide') { + _this.$outer.removeClass('lg-slide'); + } + }, _this.s.speed + 100); + + }; + + Plugin.prototype.enableSwipe = function() { + var _this = this; + var startCoords = 0; + var endCoords = 0; + var isMoved = false; + + if (_this.s.enableSwipe && _this.isTouch && _this.doCss()) { + + _this.$slide.on('touchstart.lg', function(e) { + if (!_this.$outer.hasClass('lg-zoomed') && !_this.lgBusy) { + e.preventDefault(); + _this.manageSwipeClass(); + startCoords = e.originalEvent.targetTouches[0].pageX; + } + }); + + _this.$slide.on('touchmove.lg', function(e) { + if (!_this.$outer.hasClass('lg-zoomed')) { + e.preventDefault(); + endCoords = e.originalEvent.targetTouches[0].pageX; + _this.touchMove(startCoords, endCoords); + isMoved = true; + } + }); + + _this.$slide.on('touchend.lg', function() { + if (!_this.$outer.hasClass('lg-zoomed')) { + if (isMoved) { + isMoved = false; + _this.touchEnd(endCoords - startCoords); + } else { + _this.$el.trigger('onSlideClick.lg'); + } + } + }); + } + + }; + + Plugin.prototype.enableDrag = function() { + var _this = this; + var startCoords = 0; + var endCoords = 0; + var isDraging = false; + var isMoved = false; + if (_this.s.enableDrag && !_this.isTouch && _this.doCss()) { + _this.$slide.on('mousedown.lg', function(e) { + // execute only on .lg-object + if (!_this.$outer.hasClass('lg-zoomed')) { + if ($(e.target).hasClass('lg-object') || $(e.target).hasClass('lg-video-play')) { + e.preventDefault(); + + if (!_this.lgBusy) { + _this.manageSwipeClass(); + startCoords = e.pageX; + isDraging = true; + + // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723 + _this.$outer.scrollLeft += 1; + _this.$outer.scrollLeft -= 1; + + // * + + _this.$outer.removeClass('lg-grab').addClass('lg-grabbing'); + + _this.$el.trigger('onDragstart.lg'); + } + + } + } + }); + + $(window).on('mousemove.lg', function(e) { + if (isDraging) { + isMoved = true; + endCoords = e.pageX; + _this.touchMove(startCoords, endCoords); + _this.$el.trigger('onDragmove.lg'); + } + }); + + $(window).on('mouseup.lg', function(e) { + if (isMoved) { + isMoved = false; + _this.touchEnd(endCoords - startCoords); + _this.$el.trigger('onDragend.lg'); + } else if ($(e.target).hasClass('lg-object') || $(e.target).hasClass('lg-video-play')) { + _this.$el.trigger('onSlideClick.lg'); + } + + // Prevent execution on click + if (isDraging) { + isDraging = false; + _this.$outer.removeClass('lg-grabbing').addClass('lg-grab'); + } + }); + + } + }; + + Plugin.prototype.manageSwipeClass = function() { + var touchNext = this.index + 1; + var touchPrev = this.index - 1; + var length = this.$slide.length; + if (this.s.loop) { + if (this.index === 0) { + touchPrev = length - 1; + } else if (this.index === length - 1) { + touchNext = 0; + } + } + + this.$slide.removeClass('lg-next-slide lg-prev-slide'); + if (touchPrev > -1) { + this.$slide.eq(touchPrev).addClass('lg-prev-slide'); + } + + this.$slide.eq(touchNext).addClass('lg-next-slide'); + }; + + Plugin.prototype.mousewheel = function() { + var _this = this; + _this.$outer.on('mousewheel.lg', function(e) { + + if (!e.deltaY) { + return; + } + + if (e.deltaY > 0) { + _this.goToPrevSlide(); + } else { + _this.goToNextSlide(); + } + + e.preventDefault(); + }); + + }; + + Plugin.prototype.closeGallery = function() { + + var _this = this; + var mousedown = false; + this.$outer.find('.lg-close').on('click.lg', function() { + _this.destroy(); + }); + + if (_this.s.closable) { + + // If you drag the slide and release outside gallery gets close on chrome + // for preventing this check mousedown and mouseup happened on .lg-item or lg-outer + _this.$outer.on('mousedown.lg', function(e) { + + if ($(e.target).is('.lg-outer') || $(e.target).is('.lg-item ') || $(e.target).is('.lg-img-wrap')) { + mousedown = true; + } else { + mousedown = false; + } + + }); + + _this.$outer.on('mouseup.lg', function(e) { + + if ($(e.target).is('.lg-outer') || $(e.target).is('.lg-item ') || $(e.target).is('.lg-img-wrap') && mousedown) { + if (!_this.$outer.hasClass('lg-dragging')) { + _this.destroy(); + } + } + + }); + + } + + }; + + Plugin.prototype.destroy = function(d) { + + var _this = this; + + if (!d) { + _this.$el.trigger('onBeforeClose.lg'); + } + + $(window).scrollTop(_this.prevScrollTop); + + /** + * if d is false or undefined destroy will only close the gallery + * plugins instance remains with the element + * + * if d is true destroy will completely remove the plugin + */ + + if (d) { + if (!_this.s.dynamic) { + // only when not using dynamic mode is $items a jquery collection + this.$items.off('click.lg click.lgcustom'); + } + + $.removeData(_this.el, 'lightGallery'); + } + + // Unbind all events added by lightGallery + this.$el.off('.lg.tm'); + + // Distroy all lightGallery modules + $.each($.fn.lightGallery.modules, function(key) { + if (_this.modules[key]) { + _this.modules[key].destroy(); + } + }); + + this.lGalleryOn = false; + + clearTimeout(_this.hideBartimeout); + this.hideBartimeout = false; + $(window).off('.lg'); + $('body').removeClass('lg-on lg-from-hash'); + + if (_this.$outer) { + _this.$outer.removeClass('lg-visible'); + } + + $('.lg-backdrop').removeClass('in'); + + setTimeout(function() { + if (_this.$outer) { + _this.$outer.remove(); + } + + $('.lg-backdrop').remove(); + + if (!d) { + _this.$el.trigger('onCloseAfter.lg'); + } + + }, _this.s.backdropDuration + 50); + }; + + $.fn.lightGallery = function(options) { + return this.each(function() { + if (!$.data(this, 'lightGallery')) { + $.data(this, 'lightGallery', new Plugin(this, options)); + } else { + try { + $(this).data('lightGallery').init(); + } catch (err) { + console.error('lightGallery has not initiated properly'); + } + } + }); + }; + + $.fn.lightGallery.modules = {}; + +})(jQuery, window, document); diff --git a/vendors/lightgallery/dist/js/lightgallery.min.js b/vendors/lightgallery/dist/js/lightgallery.min.js new file mode 100644 index 000000000..159815dd4 --- /dev/null +++ b/vendors/lightgallery/dist/js/lightgallery.min.js @@ -0,0 +1,4 @@ +/*! lightgallery - v1.2.21 - 2016-06-28 +* http://sachinchoolur.github.io/lightGallery/ +* Copyright (c) 2016 Sachin N; Licensed Apache 2.0 */ +!function(a,b,c,d){"use strict";function e(b,d){if(this.el=b,this.$el=a(b),this.s=a.extend({},f,d),this.s.dynamic&&"undefined"!==this.s.dynamicEl&&this.s.dynamicEl.constructor===Array&&!this.s.dynamicEl.length)throw"When using dynamic mode, you must also define dynamicEl as an Array.";return this.modules={},this.lGalleryOn=!1,this.lgBusy=!1,this.hideBartimeout=!1,this.isTouch="ontouchstart"in c.documentElement,this.s.slideEndAnimatoin&&(this.s.hideControlOnEnd=!1),this.s.dynamic?this.$items=this.s.dynamicEl:"this"===this.s.selector?this.$items=this.$el:""!==this.s.selector?this.s.selectWithin?this.$items=a(this.s.selectWithin).find(this.s.selector):this.$items=this.$el.find(a(this.s.selector)):this.$items=this.$el.children(),this.$slide="",this.$outer="",this.init(),this}var f={mode:"lg-slide",cssEasing:"ease",easing:"linear",speed:600,height:"100%",width:"100%",addClass:"",startClass:"lg-start-zoom",backdropDuration:150,hideBarsDelay:6e3,useLeft:!1,closable:!0,loop:!0,escKey:!0,keyPress:!0,controls:!0,slideEndAnimatoin:!0,hideControlOnEnd:!1,mousewheel:!0,getCaptionFromTitleOrAlt:!0,appendSubHtmlTo:".lg-sub-html",subHtmlSelectorRelative:!1,preload:1,showAfterLoad:!0,selector:"",selectWithin:"",nextHtml:"",prevHtml:"",index:!1,iframeMaxWidth:"100%",download:!0,counter:!0,appendCounterTo:".lg-toolbar",swipeThreshold:50,enableSwipe:!0,enableDrag:!0,dynamic:!1,dynamicEl:[],galleryId:1};e.prototype.init=function(){var c=this;c.s.preload>c.$items.length&&(c.s.preload=c.$items.length);var d=b.location.hash;d.indexOf("lg="+this.s.galleryId)>0&&(c.index=parseInt(d.split("&slide=")[1],10),a("body").addClass("lg-from-hash"),a("body").hasClass("lg-on")||setTimeout(function(){c.build(c.index),a("body").addClass("lg-on")})),c.s.dynamic?(c.$el.trigger("onBeforeOpen.lg"),c.index=c.s.index||0,a("body").hasClass("lg-on")||setTimeout(function(){c.build(c.index),a("body").addClass("lg-on")})):c.$items.on("click.lgcustom",function(b){try{b.preventDefault(),b.preventDefault()}catch(d){b.returnValue=!1}c.$el.trigger("onBeforeOpen.lg"),c.index=c.s.index||c.$items.index(this),a("body").hasClass("lg-on")||(c.build(c.index),a("body").addClass("lg-on"))})},e.prototype.build=function(b){var c=this;c.structure(),a.each(a.fn.lightGallery.modules,function(b){c.modules[b]=new a.fn.lightGallery.modules[b](c.el)}),c.slide(b,!1,!1),c.s.keyPress&&c.keyPress(),c.$items.length>1&&(c.arrow(),setTimeout(function(){c.enableDrag(),c.enableSwipe()},50),c.s.mousewheel&&c.mousewheel()),c.counter(),c.closeGallery(),c.$el.trigger("onAfterOpen.lg"),c.$outer.on("mousemove.lg click.lg touchstart.lg",function(){c.$outer.removeClass("lg-hide-items"),clearTimeout(c.hideBartimeout),c.hideBartimeout=setTimeout(function(){c.$outer.addClass("lg-hide-items")},c.s.hideBarsDelay)})},e.prototype.structure=function(){var c,d="",e="",f=0,g="",h=this;for(a("body").append('
'),a(".lg-backdrop").css("transition-duration",this.s.backdropDuration+"ms"),f=0;f';if(this.s.controls&&this.$items.length>1&&(e='
'+this.s.prevHtml+'
'+this.s.nextHtml+"
"),".lg-sub-html"===this.s.appendSubHtmlTo&&(g='
'),c='
'+d+'
'+e+g+"
",a("body").append(c),this.$outer=a(".lg-outer"),this.$slide=this.$outer.find(".lg-item"),this.s.useLeft?(this.$outer.addClass("lg-use-left"),this.s.mode="lg-slide"):this.$outer.addClass("lg-use-css3"),h.setTop(),a(b).on("resize.lg orientationchange.lg",function(){setTimeout(function(){h.setTop()},100)}),this.$slide.eq(this.index).addClass("lg-current"),this.doCss()?this.$outer.addClass("lg-css3"):(this.$outer.addClass("lg-css"),this.s.speed=0),this.$outer.addClass(this.s.mode),this.s.enableDrag&&this.$items.length>1&&this.$outer.addClass("lg-grab"),this.s.showAfterLoad&&this.$outer.addClass("lg-show-after-load"),this.doCss()){var i=this.$outer.find(".lg-inner");i.css("transition-timing-function",this.s.cssEasing),i.css("transition-duration",this.s.speed+"ms")}a(".lg-backdrop").addClass("in"),setTimeout(function(){h.$outer.addClass("lg-visible")},this.s.backdropDuration),this.s.download&&this.$outer.find(".lg-toolbar").append(''),this.prevScrollTop=a(b).scrollTop()},e.prototype.setTop=function(){if("100%"!==this.s.height){var c=a(b).height(),d=(c-parseInt(this.s.height,10))/2,e=this.$outer.find(".lg");c>=parseInt(this.s.height,10)?e.css("top",d+"px"):e.css("top","0px")}},e.prototype.doCss=function(){var a=function(){var a=["transition","MozTransition","WebkitTransition","OTransition","msTransition","KhtmlTransition"],b=c.documentElement,d=0;for(d=0;d'+(parseInt(this.index,10)+1)+' / '+this.$items.length+"")},e.prototype.addHtml=function(b){var c,d,e=null;if(this.s.dynamic?this.s.dynamicEl[b].subHtmlUrl?c=this.s.dynamicEl[b].subHtmlUrl:e=this.s.dynamicEl[b].subHtml:(d=this.$items.eq(b),d.attr("data-sub-html-url")?c=d.attr("data-sub-html-url"):(e=d.attr("data-sub-html"),this.s.getCaptionFromTitleOrAlt&&!e&&(e=d.attr("title")||d.find("img").first().attr("alt")))),!c)if("undefined"!=typeof e&&null!==e){var f=e.substring(0,1);"."!==f&&"#"!==f||(e=this.s.subHtmlSelectorRelative&&!this.s.dynamic?d.find(e).html():a(e).html())}else e="";".lg-sub-html"===this.s.appendSubHtmlTo?c?this.$outer.find(this.s.appendSubHtmlTo).load(c):this.$outer.find(this.s.appendSubHtmlTo).html(e):c?this.$slide.eq(b).load(c):this.$slide.eq(b).append(e),"undefined"!=typeof e&&null!==e&&(""===e?this.$outer.find(this.s.appendSubHtmlTo).addClass("lg-empty-html"):this.$outer.find(this.s.appendSubHtmlTo).removeClass("lg-empty-html")),this.$el.trigger("onAfterAppendSubHtml.lg",[b])},e.prototype.preload=function(a){var b=1,c=1;for(b=1;b<=this.s.preload&&!(b>=this.$items.length-a);b++)this.loadContent(a+b,!1,0);for(c=1;c<=this.s.preload&&!(0>a-c);c++)this.loadContent(a-c,!1,0)},e.prototype.loadContent=function(c,d,e){var f,g,h,i,j,k,l=this,m=!1,n=function(c){for(var d=[],e=[],f=0;fi){g=e[j];break}};if(l.s.dynamic){if(l.s.dynamicEl[c].poster&&(m=!0,h=l.s.dynamicEl[c].poster),k=l.s.dynamicEl[c].html,g=l.s.dynamicEl[c].src,l.s.dynamicEl[c].responsive){var o=l.s.dynamicEl[c].responsive.split(",");n(o)}i=l.s.dynamicEl[c].srcset,j=l.s.dynamicEl[c].sizes}else{if(l.$items.eq(c).attr("data-poster")&&(m=!0,h=l.$items.eq(c).attr("data-poster")),k=l.$items.eq(c).attr("data-html"),g=l.$items.eq(c).attr("href")||l.$items.eq(c).attr("data-src"),l.$items.eq(c).attr("data-responsive")){var p=l.$items.eq(c).attr("data-responsive").split(",");n(p)}i=l.$items.eq(c).attr("data-srcset"),j=l.$items.eq(c).attr("data-sizes")}var q=!1;l.s.dynamic?l.s.dynamicEl[c].iframe&&(q=!0):"true"===l.$items.eq(c).attr("data-iframe")&&(q=!0);var r=l.isVideo(g,c);if(!l.$slide.eq(c).hasClass("lg-loaded")){if(q)l.$slide.eq(c).prepend('
');else if(m){var s="";s=r&&r.youtube?"lg-has-youtube":r&&r.vimeo?"lg-has-vimeo":"lg-has-html5",l.$slide.eq(c).prepend('
')}else r?(l.$slide.eq(c).prepend('
'),l.$el.trigger("hasVideo.lg",[c,g,k])):l.$slide.eq(c).prepend('
');if(l.$el.trigger("onAferAppendSlide.lg",[c]),f=l.$slide.eq(c).find(".lg-object"),j&&f.attr("sizes",j),i){f.attr("srcset",i);try{picturefill({elements:[f[0]]})}catch(t){console.error("Make sure you have included Picturefill version 2")}}".lg-sub-html"!==this.s.appendSubHtmlTo&&l.addHtml(c),l.$slide.eq(c).addClass("lg-loaded")}l.$slide.eq(c).find(".lg-object").on("load.lg error.lg",function(){var b=0;e&&!a("body").hasClass("lg-from-hash")&&(b=e),setTimeout(function(){l.$slide.eq(c).addClass("lg-complete"),l.$el.trigger("onSlideItemLoad.lg",[c,e||0])},b)}),r&&r.html5&&!m&&l.$slide.eq(c).addClass("lg-complete"),d===!0&&(l.$slide.eq(c).hasClass("lg-complete")?l.preload(c):l.$slide.eq(c).find(".lg-object").on("load.lg error.lg",function(){l.preload(c)}))},e.prototype.slide=function(b,c,d){var e=this.$outer.find(".lg-current").index(),f=this;if(!f.lGalleryOn||e!==b){var g=this.$slide.length,h=f.lGalleryOn?this.s.speed:0,i=!1,j=!1;if(!f.lgBusy){if(this.s.download){var k;k=f.s.dynamic?f.s.dynamicEl[b].downloadUrl!==!1&&(f.s.dynamicEl[b].downloadUrl||f.s.dynamicEl[b].src):"false"!==f.$items.eq(b).attr("data-download-url")&&(f.$items.eq(b).attr("data-download-url")||f.$items.eq(b).attr("href")||f.$items.eq(b).attr("data-src")),k?(a("#lg-download").attr("href",k),f.$outer.removeClass("lg-hide-download")):f.$outer.addClass("lg-hide-download")}if(this.$el.trigger("onBeforeSlide.lg",[e,b,c,d]),f.lgBusy=!0,clearTimeout(f.hideBartimeout),".lg-sub-html"===this.s.appendSubHtmlTo&&setTimeout(function(){f.addHtml(b)},h),this.arrowDisable(b),c){var l=b-1,m=b+1;0===b&&e===g-1?(m=0,l=g-1):b===g-1&&0===e&&(m=0,l=g-1),this.$slide.removeClass("lg-prev-slide lg-current lg-next-slide"),f.$slide.eq(l).addClass("lg-prev-slide"),f.$slide.eq(m).addClass("lg-next-slide"),f.$slide.eq(b).addClass("lg-current")}else f.$outer.addClass("lg-no-trans"),this.$slide.removeClass("lg-prev-slide lg-next-slide"),e>b?(j=!0,0!==b||e!==g-1||d||(j=!1,i=!0)):b>e&&(i=!0,b!==g-1||0!==e||d||(j=!0,i=!1)),j?(this.$slide.eq(b).addClass("lg-prev-slide"),this.$slide.eq(e).addClass("lg-next-slide")):i&&(this.$slide.eq(b).addClass("lg-next-slide"),this.$slide.eq(e).addClass("lg-prev-slide")),setTimeout(function(){f.$slide.removeClass("lg-current"),f.$slide.eq(b).addClass("lg-current"),f.$outer.removeClass("lg-no-trans")},50);f.lGalleryOn?(setTimeout(function(){f.loadContent(b,!0,0)},this.s.speed+50),setTimeout(function(){f.lgBusy=!1,f.$el.trigger("onAfterSlide.lg",[e,b,c,d])},this.s.speed)):(f.loadContent(b,!0,f.s.backdropDuration),f.lgBusy=!1,f.$el.trigger("onAfterSlide.lg",[e,b,c,d])),f.lGalleryOn=!0,this.s.counter&&a("#lg-counter-current").text(b+1)}}},e.prototype.goToNextSlide=function(a){var b=this;b.lgBusy||(b.index+10?(b.index--,b.$el.trigger("onBeforePrevSlide.lg",[b.index,a]),b.slide(b.index,a,!1)):b.s.loop?(b.index=b.$items.length-1,b.$el.trigger("onBeforePrevSlide.lg",[b.index,a]),b.slide(b.index,a,!1)):b.s.slideEndAnimatoin&&(b.$outer.addClass("lg-left-end"),setTimeout(function(){b.$outer.removeClass("lg-left-end")},400)))},e.prototype.keyPress=function(){var c=this;this.$items.length>1&&a(b).on("keyup.lg",function(a){c.$items.length>1&&(37===a.keyCode&&(a.preventDefault(),c.goToPrevSlide()),39===a.keyCode&&(a.preventDefault(),c.goToNextSlide()))}),a(b).on("keydown.lg",function(a){c.s.escKey===!0&&27===a.keyCode&&(a.preventDefault(),c.$outer.hasClass("lg-thumb-open")?c.$outer.removeClass("lg-thumb-open"):c.destroy())})},e.prototype.arrow=function(){var a=this;this.$outer.find(".lg-prev").on("click.lg",function(){a.goToPrevSlide()}),this.$outer.find(".lg-next").on("click.lg",function(){a.goToNextSlide()})},e.prototype.arrowDisable=function(a){!this.s.loop&&this.s.hideControlOnEnd&&(a+10?this.$outer.find(".lg-prev").removeAttr("disabled").removeClass("disabled"):this.$outer.find(".lg-prev").attr("disabled","disabled").addClass("disabled"))},e.prototype.setTranslate=function(a,b,c){this.s.useLeft?a.css("left",b):a.css({transform:"translate3d("+b+"px, "+c+"px, 0px)"})},e.prototype.touchMove=function(b,c){var d=c-b;Math.abs(d)>15&&(this.$outer.addClass("lg-dragging"),this.setTranslate(this.$slide.eq(this.index),d,0),this.setTranslate(a(".lg-prev-slide"),-this.$slide.eq(this.index).width()+d,0),this.setTranslate(a(".lg-next-slide"),this.$slide.eq(this.index).width()+d,0))},e.prototype.touchEnd=function(a){var b=this;"lg-slide"!==b.s.mode&&b.$outer.addClass("lg-slide"),this.$slide.not(".lg-current, .lg-prev-slide, .lg-next-slide").css("opacity","0"),setTimeout(function(){b.$outer.removeClass("lg-dragging"),0>a&&Math.abs(a)>b.s.swipeThreshold?b.goToNextSlide(!0):a>0&&Math.abs(a)>b.s.swipeThreshold?b.goToPrevSlide(!0):Math.abs(a)<5&&b.$el.trigger("onSlideClick.lg"),b.$slide.removeAttr("style")}),setTimeout(function(){b.$outer.hasClass("lg-dragging")||"lg-slide"===b.s.mode||b.$outer.removeClass("lg-slide")},b.s.speed+100)},e.prototype.enableSwipe=function(){var a=this,b=0,c=0,d=!1;a.s.enableSwipe&&a.isTouch&&a.doCss()&&(a.$slide.on("touchstart.lg",function(c){a.$outer.hasClass("lg-zoomed")||a.lgBusy||(c.preventDefault(),a.manageSwipeClass(),b=c.originalEvent.targetTouches[0].pageX)}),a.$slide.on("touchmove.lg",function(e){a.$outer.hasClass("lg-zoomed")||(e.preventDefault(),c=e.originalEvent.targetTouches[0].pageX,a.touchMove(b,c),d=!0)}),a.$slide.on("touchend.lg",function(){a.$outer.hasClass("lg-zoomed")||(d?(d=!1,a.touchEnd(c-b)):a.$el.trigger("onSlideClick.lg"))}))},e.prototype.enableDrag=function(){var c=this,d=0,e=0,f=!1,g=!1;c.s.enableDrag&&!c.isTouch&&c.doCss()&&(c.$slide.on("mousedown.lg",function(b){c.$outer.hasClass("lg-zoomed")||(a(b.target).hasClass("lg-object")||a(b.target).hasClass("lg-video-play"))&&(b.preventDefault(),c.lgBusy||(c.manageSwipeClass(),d=b.pageX,f=!0,c.$outer.scrollLeft+=1,c.$outer.scrollLeft-=1,c.$outer.removeClass("lg-grab").addClass("lg-grabbing"),c.$el.trigger("onDragstart.lg")))}),a(b).on("mousemove.lg",function(a){f&&(g=!0,e=a.pageX,c.touchMove(d,e),c.$el.trigger("onDragmove.lg"))}),a(b).on("mouseup.lg",function(b){g?(g=!1,c.touchEnd(e-d),c.$el.trigger("onDragend.lg")):(a(b.target).hasClass("lg-object")||a(b.target).hasClass("lg-video-play"))&&c.$el.trigger("onSlideClick.lg"),f&&(f=!1,c.$outer.removeClass("lg-grabbing").addClass("lg-grab"))}))},e.prototype.manageSwipeClass=function(){var a=this.index+1,b=this.index-1,c=this.$slide.length;this.s.loop&&(0===this.index?b=c-1:this.index===c-1&&(a=0)),this.$slide.removeClass("lg-next-slide lg-prev-slide"),b>-1&&this.$slide.eq(b).addClass("lg-prev-slide"),this.$slide.eq(a).addClass("lg-next-slide")},e.prototype.mousewheel=function(){var a=this;a.$outer.on("mousewheel.lg",function(b){b.deltaY&&(b.deltaY>0?a.goToPrevSlide():a.goToNextSlide(),b.preventDefault())})},e.prototype.closeGallery=function(){var b=this,c=!1;this.$outer.find(".lg-close").on("click.lg",function(){b.destroy()}),b.s.closable&&(b.$outer.on("mousedown.lg",function(b){c=!!(a(b.target).is(".lg-outer")||a(b.target).is(".lg-item ")||a(b.target).is(".lg-img-wrap"))}),b.$outer.on("mouseup.lg",function(d){(a(d.target).is(".lg-outer")||a(d.target).is(".lg-item ")||a(d.target).is(".lg-img-wrap")&&c)&&(b.$outer.hasClass("lg-dragging")||b.destroy())}))},e.prototype.destroy=function(c){var d=this;c||d.$el.trigger("onBeforeClose.lg"),a(b).scrollTop(d.prevScrollTop),c&&(d.s.dynamic||this.$items.off("click.lg click.lgcustom"),a.removeData(d.el,"lightGallery")),this.$el.off(".lg.tm"),a.each(a.fn.lightGallery.modules,function(a){d.modules[a]&&d.modules[a].destroy()}),this.lGalleryOn=!1,clearTimeout(d.hideBartimeout),this.hideBartimeout=!1,a(b).off(".lg"),a("body").removeClass("lg-on lg-from-hash"),d.$outer&&d.$outer.removeClass("lg-visible"),a(".lg-backdrop").removeClass("in"),setTimeout(function(){d.$outer&&d.$outer.remove(),a(".lg-backdrop").remove(),c||d.$el.trigger("onCloseAfter.lg")},d.s.backdropDuration+50)},a.fn.lightGallery=function(b){return this.each(function(){if(a.data(this,"lightGallery"))try{a(this).data("lightGallery").init()}catch(c){console.error("lightGallery has not initiated properly")}else a.data(this,"lightGallery",new e(this,b))})},a.fn.lightGallery.modules={}}(jQuery,window,document); \ No newline at end of file diff --git a/vendors/lightgallery/lib/jquery.mousewheel.min.js b/vendors/lightgallery/lib/jquery.mousewheel.min.js new file mode 100644 index 000000000..7c331e5e4 --- /dev/null +++ b/vendors/lightgallery/lib/jquery.mousewheel.min.js @@ -0,0 +1,8 @@ +/*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh) + * Licensed under the MIT License (LICENSE.txt). + * + * Version: 3.1.12 + * + * Requires: jQuery 1.2.2+ + */ +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a:a(jQuery)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})}); \ No newline at end of file diff --git a/vendors/lightgallery/lib/lg.png b/vendors/lightgallery/lib/lg.png new file mode 100644 index 0000000000000000000000000000000000000000..0b32daa333f64c93fbe2dd0e6c32412a234edd90 GIT binary patch literal 795264 zcmdqJ^ewfqKT~*!nJzd?^-E~f+>L*z&bW(IUI5;eMxew}aa7e~*a0nv+l-C?H zzUbFqICwX8St+<*f5?wt)48^qy6(ElO2Xz&4(z5DPG*+u-VV?Y>s!-|3TtzC-zQPS(RGa$<>mYkDZsD^PM<4H8r)UtA&-Y z`Ujc+Vt@T7_RhxL-C3A}!^_Ky-HV6a$<>;JOGrqFgOi(so15*Gg3Zmx(cRRW&C!ka zKZX1+IUg+D%w27r-EEy5ssE8{YUbqOF81!-KNbD=^`Gsu^tS!qH95Ndms+n1a{N=m z!NtzW@!zsvSw;WJ6;`$NwzSv%VC!J%==NHNI2RX}km!Ff{9i@?yUPE;s`tNH1-N+r zC+Ght`7cgUj(;@x9~%89T>p{#ikCRLD93+eFOJ?@%k>)$P6AH;gQTW6{AnjzprNb> zyI-5H3{Rp=yFFVIp#k^sHOdAN2?y~mvOT`%D$*eyC9c_D7 zb$UE%rhFrl?ZI#}CII<>jc+4LJV;Ys(GsT%R zqxq@@&q7=7Lq9(MNi}6X)-QHQVMhj8&ldZwUHn_;+yb210!}M0f6TjA&ETcgP7Mm4 z+qb0;eQGzhDd_!ku&K}%`GcmV>XKBER*AQ}cJHj=U%T29KLS46H=7h=7I*xQ8r5M2 z+n+hsTl$UUXnOwatt(_s+sH)ma2gaWljtk%HvN15uMv31Nx1!yrJ-;-n$UWwQOdl* z>OzTBv3>SV7YR!wM?NRie4?4;#d~Kcsp-=^ZyCv?%(3X&zX8*O=UsreL<0Y@p11IK z9HA`hAX(ndalr z?BYo^BsSqG7dkJLsu>nK_vh<%OlOE`e^qSOxH~6AiKgqeYKYnK^6VhrFKqd`T@{Yk z^0lEbY{*1FfowKC5^(Z&e)eCDU5OQ;-B1_zZL^+H z%+5*JMJy-F*Uk=B_QoNptP+QjZV|$(ssk?4&z&vWed?s(EQ*l1FT}HRg)u%E?OMWx zUjGkBy$f({v;foJei=R3nA#fh0A1v5NyA9OZ;#m6n+%GhW*bg7=KF%QA#pM~9PC(R z6O)2Zd)o&?M-#E|c6`ycf2RjK%9~CQ;ic1XQsrDx9?>XjbGbbacHfJmiJCPmcx=>q)y!|(%r>uivu>@fn4`a8rKW`tw%Fjb*u|GSU!2a% z=8cEjjM=u-JusxHq)agA-yZru^UWzY(&+x^)WX^7;>+TF7r5yHc9Nz|ON(yG7+4UA zOkFDyQ*r1-z^^a3YnF6CGIW-_8cHCN;+_1V>bgpHQ9)N}cDRa^BdzNRM*i|B&;{vs zYIAciU5z#RIe>c*pA6q{LJ~FhhKq?QCajgsquzUB$eSDJCa{AuC?n-MvBW(exHq;# z`j(M~N-dXngWE|{e99mvV{R?xk|e>H2WkXz0=bv`y;Ks>T`}&2Euxrq!V4i(y9d%C zO$;&&SIPgiOyiG;gCSj5J<#uI)i?wzXI4Bqzq{mJ5X3s3#gwZ1>s5dKQIAtOlOoF0 zH2VHd<qknG_fqK1?&#uKB9??s$I7qA87MvdZ&)rm))6|oq-e&||} z^ukw9=i+_&-K>;qdCv`4C(Iyi{#VLfv(<|o)d|cGl(EeBF;=&>%=;E6!1+#~>lz{w zNY-eo1Sd_rJH0uaGc&D%KN}JMXi7-5dOI_CW$x(~kZv=}Jo(jqqHpG5DX*=y(dKW; zCTw0=VC{C8TRZV6p^WQ$Ka*?zudO)#iOZ#gi$tbgz~i?F?uI@KI+eklZ(j2W&(h1f zgC^lTn?8l=EcgBU}QTnQac- z;!A`;Am}oWury}s?F{K1NymIT=0?25QgbmD!Qkr9s{qfW?asoKE4`BtrHkF}aGEPQ z_^W%EexADblqn|uZ87}mTD%-Q#gsWS(&={@d)gCj7>|Q zlZ6;X&F?jd;}M54XCxTn?n+^MA(n9A;*rDa13vm<^0p0bns5|5A3OQO*xr zJ*j5=`V;}xIm_CB)o&-qd?uS*{#FsoKm{``zk*aR82dqG^M-S+m+SxJf&A2G;fO#` zRPvkEP0;g8T;aPcjvM9XyRN?%-2=ZjVg4`pgR)0h+bI|nw7z6m{4b5^E8b?hxBhPl z?%uz<{bdMS2Tvto#3N7Ip7jrH;BHqEw&!M;SSiDYxXj$Bkj8LRfL#aUGAo;Rll=hy}q+}!7)Mc+3p=O*sO3vnDVKf7v3%X+UN zcek4Vx?LkoEt<4Ep2sF{+{>uX)Jk0|nU)EmnL{1W^MTBK@%W~fxq5POcJV@0SRib) z6}mbEN~f_uzl2O$jaxuJG1$=6x8_p1W#tszL#T-1@j+1A$!QKxJf2hj1=NR1<&PB6j?O)2_w$8S+a4alU#vl3*6KPgFjU?zImMDDN zK&ed1pSig+Ze?`9zuI@?#3F5F6%v7eRx^Se;4o1MNoFskNy581Vx?hyFGqDQ#0fAh zV6=Ut?lI3syB?=FQXZ5u01xS4E7k32jXB<$hNkEpA4h~hW;p+hN_4kYT;1SK@)G8R<{2%eI5evwJtQ?<<5d8Z_LarcrUp>J{gCjMiiJTSRee_*}v$9LM!}( z3&UUfH$na6_?PL!_b~f$HSu1xj2NZHw~zFuMYX){v%KKN!s*Zvol%BJ$90i}zBH@W zx~ZQ(i3n#0t`7LK+z&oEM9p6Q-HTLhi%E}b^v?Qp%S7~;Sa%3lPjK+s*Zca8c)SX| zcQxu`nk|PD_0nAj(!vrz&N|Jl@%$LHe70w|Vd53d%bBF|HnZL@oiClR)%0ojf?cVI z{5IUfT`IXylKvVS-fq4q0dc<71K|~3(*Qey3$Ss|&>?IEe>@MwZ`Jp3b=W<@^!k7= z{H^R%uI_;#*t~UBH|*)rTE!T4q}mwKxy;`?HMt)V3>NEHqR^UIwy*Sh#3Wflc^0NtFAcvE% z(<|cKq{ry0C-;T>+)K>r+r0F(O;{iq+|_;e)T`;^2tGVjSHt?;h3sGY`7By_-xsUn z@#prX)Uj(^JDk!(wq<#FB><2FrZa>jaW9>-cO=Al%xA4A* z+63VxTdGdJ=Egh{WxR<{D#e)#^bo1Bo?< zHJT+2iVuQ99ir^((Tdx6)`JLVLe30xv(mKY3yPUDIvGg8Qwoti)En6!0P@X;%4 znW8W4YfrIhZFlZ!pMI@8zP~+yMw5ZWZakV8Hba})qXG10<)$KlW0X!^nJ{C)OGp3B=+KGrXLjGGLY@2zZx{|D z1LW?C>VPN<E)h|$#6uOnnSZ7Qjt+xW z@X#ix9?~RS_WZKB2+Zc}CyVsJsE4p-e!HbQJTBPDxA%1nao2vdJYG9iCuJU;&B{$V zp9qQXQ%dynMMYxGnR2w%2*TJMduWhcrNapt+q11NuD1(sI210D!XhSRvpE3+)oXs- z(V&tdny~WECd7$3n0b-P0+ki;r5G-KJNk$Sojd3c)FvHF3zu(qh^@BSQq)lS)kEQP zi<{`RvA4HX&FvCwv-F$fJHB3N(JhYmuup;ab2~z?80149qYsSEu(j@}0Xr9rxu(4$ z3r^LboSkA(|Ttr3j%CC?|2^Z&=S3GcPbRH#k1o(VfbhEYh;6@Tf3Ww-8LPe z;%XFe{GK<(C@#WALb+QTXuIH78HX_Y;00)Ctmc^tzknXxar8HeKWkV!Ddff^Pk-B^ zCSgdEhoCd!g&_i55EKID$mEd9EBhl0eeO?=YV{1xgVEX4s6I$lr9~OJWs=uk7jyIS zhE}>>kJo2eoE4r}tUqGSbQa2feQIwtmb3bk%?>_fOGXACD7cipYhG{G{@OOi?XUoy zitbINV`Erx(gpn)-LQe;;1Gx_J=8{EWowz6RxK%6_^ErPY!g#(b#u}Gc91at#MOkv zYWQWR#>z2@Y9e-5z4`IXlKDnME{TUZd=+hiwWzhRuqQ9}Y=sqfgL0VunRIlHbD`Fz z9|_u90(`OT6t=1BHSbV*n2F96tq`5#dA9oiWvmGcD>APF-b2ymrrNk_n&fJ`RYon# zGWD9^yZA5Jbi5thuCzTE-+wxdm&mHS^OHM{T;^_09!1ZFEO+qs=h+ZD+=74@qVx=& zk`c6_E~QTf9zR(1>ONSFr$>5O*lYA5hwoqGioZQRBa1(5_WvAE|Fu&oM_iHF0l8@4 z?tK@`ZKBEv8!)=iX|-BEw*boDDx`z(o-lakx9{C`s!d9 z&-@@YvGqO`$kaYf4?o9)PIbYb6jh~U=M-crjr8mK+~hp%^1FfdRs4OE|>M^X(%`etb6RjWd%~A9ql-RZw|ogKC92 z@holC$|#2Ea8k#x!5Er{$d2OIAvySUb1r5=mg@(Nti4U>38~Lk!Y#L5cbJV#Q!T&E zLV534W_sj0$NANy(b=uF*SA$sPv0ju{=H{CGTz$N!SO#UrVIPz6b~00hk5rPDwsG7 z@_YyeJ&#ANL!W(JL}851+ohdYb`<2VL*HcX?(ZGk29taeMCJ62jjkiLPo&>;C4ig~ z13Wi@(0M}(MYOOB@y6hYp0tfmKj{;F5wpY+BlyD6_Sr(RC`0#svv za#}7HS=Ab^yoKj|62-WZcz4rhCFK71b6p1*J_Bg$za`KjM|o__gmdbh;htt?i?wre zpq<53S2ulbyU83k=`E3)*`}SF*P#ZPI5wb0yt$-x@ZvN4+fpxPuE{ zw7y1)L^nkj6(S4HL>EL2QZ`ZuOC+F%8^Ka5>lXxApy%)Qej2lpWi1{%of|j36IQ=pc+sf~y*q&+H;xPy z*$tAP0gqU}EbT89&shObWeH_C*7>bM(!_#afLh)chGY+yL$;rX zEFVfI3fA8SEg1HG%=2dr+fRM0U#o~2cbCzar0<-b`aBse&_$_&wW_y`fx)Xi%NP@u zm2=(bTu-9X44L>m8E46j28q!Q{1}6FqJ$Z@E6t;6G2K+UpX}i^I+Ak6-Dp?7cfdY# z!;&B1@qEDNI-6R$H%P~kcFS{U=iT`JMvrN$AuR$?m@-9cwmLNldyQJ7)Kk6-45!@u zqgyBT0+O=!yeI7{eZPFY*CR=~@xU^-yUe6A-0Ai!jRIASL8DYDy1h5A9l zNJt4`{5t}6C=Um^2Y`Qj5Eu2ch%1?t5$;T2?2-;AqUx!7pO&q|IGO2+C>_9v^XFbT z?wDUMnLI9P5L%s6|KD;dx>ub;jB*H zw6^D^_-6)E@g3FO1XZ}Tcrv;(pLp5|G`4Qo56U{`!QiteASC?Z^5~X!0e0WUOWtBV z44mw44uQsY^Df%x4B5m&&pslmiXJW3ek{=pcdo!&FnOL9;_>r)TjQC@XGdu7$Utg4 zTw(p>=>uKH(hZ>zTQH_rnlYX-NNh2x%yWFtkfSVExKxTQ&&Nncpim(V&qb(B7aY=| z9~n2x>qa(d<=($zAY-aqt{U{-COs`IQkfP+?s)#ylRUNUSf#(^rr5-GWz6U*)9W`f z$-$@0Kt;&0|LT59+y=9?Cqc2>9r=jlV<|JX?&Tr9a-uwLE-TZm!ZE~pKk^t{-0h%l zqhM!M&sUg#<+@NwHA*rjFt)esMgt%HP{8BquAKB+qgk%iI;8SML>GlQhcCb*p!MAL zB30xL=0u`jD}9jfm((MTOw73XKDioW|0JvFbMA@1ei%p6C`Es{=(t8H)K3s80p)u_ ztL^>y68&M0XC=AEQ7<=uMv>Cjr3_wO!VoQ!1{vE(3qw*kdY&7_2A+2=blbxmd8&K? zW5?B=gw-Y^HKj_G8NFAQER@L7rv1`~d%$iqnRZ59Bb;qCQ4%*%hX$<~OpSzB&L=%V zR8+VXR`*81{wG_~A;oP^Lh!p8E!>|7Zx5ovJm9aWX=wofRn#V)oom7OUjWEemo;T? zynjSntf3fHR(~0g$nSsF#2w%hzNW*@He_UUjb>b1Y3D4LC|imZD-XfVt}<%>MDL-r z;AwfG5yJnA)NM9)T?^rpV)SqcgC{Q8ETKLBYt~?^ zW@I3S(+=3vL$i=d``ZJi6a4v47XHd;b*kZdEz6`S?sBi&Y`S-l%{&k}!^q|3At*F* z2Qkq8&lKc63Kl&7VtUTbPg@zt=#op+v}!HDAx(U__RPlzddy&<(8X903(8;>cP>EJ zJEe$^+woj;Z*boBv$eA;YEPK0H?^8f|79H_{xm+Tjs(iB7^dPm)BSFB23ouYKFTI{ zq2^`YFla{bDJzp}Pf|qa>0|JSU^(qIU%D*EOpy`I(nrpIPh9K!yX>O-x1?K5m%Q|2 zU4T;7;DY3x;}CY!b*rq_Zn49osA{09Z9UR6GI`WZ(=pH9o^@Wrkfbm82dy0)HHq8A zu)Ob5a=YekF-0(G3OeU6QXB!oo3mMK=84@GuaSv$YfZ>8#|0y~18EmPRQx4i-aBLH zIsu0ciwg)qvC8+GB)^HSJn@IS6_TI5u1I;Tf99VW$KndRaol9K&i3OaFhZfJ$q)Pi zkOa*C3EwMb$o@QGZcT3I)JFPD{XPhe*5;S0RKFpOsAK`tQQ!mO8L}QtC^MZsOJAZm zrbSG|6iPsOHEtofEwyIB7xWLJ%pFW2K4?+|xpdNhq7U>~rJ3!~R&x~AcE6$T1$iN_ zFe86y*IXGP5tL>@u+6{$|B^tInQRHt#u0hbXv}!dBF#dNnxFxHY#zEY^;r7;Ew);cjKsZ+P!<6Yefqs+Bm~M$M&xpWOsk|B;&xeOam;8*t zmFv+5yT>I8V(sp%{pwxHQk$QW-~} zhNsMfm9K}Gv!AOk#Br}4g1W$uV4xA~0Sq$BgNaf%W5%TQ22n1fE2o%E5(@2Gvg{3~ zL=0DE@Mv9{Wpen5tFKy~uL9cgV9c$~| zk0){a|M4^Y(o4&q&)d@_Hu^C6Ly&A~$dx>m6(hR;pFP2*7%GQ@-j;PM&#+6nEa9vL znqnT%mn6LY9cQordc|+VKMyWMgoLT~79?pvSdk;&jHijlQdVZ7)meDN@!U@hONg7w zs4^-g-rJar1c76leT(J2`L_8o=Jy5UzrC-k;wtGSdC&Sw{Rq~7elLwg0e@a zNHp4^$77Md6z3J`3`MWVTuiDYbFpE|E@r{U(2|t&-!4HxyDC%)d7bVh^WTP?{0Wq$ z)MxZ@qzJ|>156})I(qeW717|PxmaQFeJT5_K^lCZEOO&Q4G7{zQk7;!&?cxYgF|+A zz_lj`A`)PG>k<%!E;~iPc8+uvCG{JvJSLcaRN>}>Q+_nB40IUNA=)cBgiD4 zvNA~ch&x)r9(gW^!^{D9D!JA;QHqo>`AkD{edSVi`xElM6$Q;=aA4Gm;BX(;N(^!2 zc#ar`KNQZ#^C`c<<5Dt2W?1Rs&f&T%YBJ>`>bPY4rTsfm+-a(5yGu!q!X|>11jk&4 z0XDazR-3QaCNL`%B);LsF+1+N$>1CFxYI%v$Hcr%=TiHn24#Ac{t3lz1vIib_;W*n zxMpDaZ|2n)mX_UhHStKrb-aV-1gi(R@gRAR3szKSyvn5>3giN7Z ztKKtjM-3`e2um7B5NE70D}V8Qt?o8`Lk+&WhvrSZ`UNtz{?FE6S%+YSsk&C?tSLe1 z)ofV>x2NaQ7Ra-)?}6?8aBf)Rxutnh6A*T@jO_en(hUTSIBfNdJMFagy8sf{r#LgR zgA6BeJjXs(8_}^~>(NtCoV9F!TVeLI4x|Sn@$&LmjZfjM7j_e+7T4EHr?MKoN2RP$ z#nu&63Gkc1s`KpEW>U#00dig^zRkiP#v#9|71BaHiUg9T`;)j7)^L9Nf*Di0oXUP{ z;QggpA+5yj2*>FbtMEjo2G^X6%m0+0vM`K`JyxK5dC&B`&GXDMYI?z_p_X@Ak7LOl zTyOGJpLjCf1Z5PHm#l7Z=D~y&>DADZ57?2^GrBK+M+%@gaT&yTn6_zp9*w@na-3m3 zdOdZpjA3oc%d5l75njn07;f>)j9|pF9nuH&_s$&8o9fydx&JxVmDo{wtI0W3B`G*g zhjR?4wIIWj_jL5MzdYZa3VJvlB1>|qRTyLx!D+PgU>unGa-~H0{e6DQkE3@YbYXC1 zn96CMpRfs1sU^wC2|6y*V`(r?5guGm@aZ%yZN_TK90*dURC2ef+~uNm-@aFq4!0g{ zklc}^BN&xkViY|o4&^bE2uDLCW!}m=RD7#5DQX=~&cxZP&`v2M+S45P5;r&c^TS<3@V-%TW@D1f5TiZ{8CA zD_>Vws?&6F1V4ejJiS>3g&MVZN%+^7$~HNiq=>h&d*-*j}r=lez1y|{CeInm`so+yoj({|LL*ZliyxeFyUB*NWa7%FoC_# zKr=@5CbVT6Ox1rXy|R6rVNeD-Eid44g_5xW+0d>lisM>&BIv{C^U>z79(|wejBVCH zov=85N-TkT`BzW&F?zz+YVn|a<#``$EHQ-3b=rqS@u+?Vkzx)f;VZq4&;3P+xjch( zCk}ghz5oLUrFJ1%h#zHhut~o(sQUWCS;wV1{~1eQNgYv(s8$WaaAMtgI`UZj%wV@r zDWhw|XLK-W9JtHo{2qyjeJ}i00p3pX%fRJQ)ZLwD(JD=rfYYEhE%{p1nT&mMKh9?w z4xm|BgSpyANo??ZVzf9^o_j?$Dt?MHdT=Jg0I`r`u#_GyUqf+8#GOBFgh&FlD$Kl~0*+={1H+ zwA1gSf*L)c8`I)vZc6h5YoDx%Hy<2@M`nY^t00`&!MM+!aUq_@0ZYA0=OM<2Os5jR z`<9uKF#~@EwLaGgjIDC`M3H+P*jcU*T9c{bF^I-9IR<&kXM92U2;g5K38xPw1f-zf zI2!>Z${cF+lV~D$i z$8!_%uCa)*AcRR(4h@F;gdXPjfLst<^G-jpQyHWr0dz9YgU@^Sgf~N|wt#J;+qpf@ zFjflP1{SReeWY?dCFdWqL3xi_{g*gYW4&QMz26>1<`wn+SJeGTVgXn@2%%b$+v<{5 zR@Qq(afd+v)?e3%3D>k#3%niPvnAVp%l1(4BR*poOMN}R8LnycB^ErPWETCGvDZT{ zQjil2a}rPw0A9d)!eE6Ru!n~savcg4;sE}^t($*#8a+`#&@jk+9<2T1B?8Rt#P?%C zv9=qh`XR)1tMBDzy(;9Z#ag8?N(UPFF5gqRq`WgcP{4~>Ycv~9UnJ&W2n3kI(pW77iwg^UHu%6Og5q0 zv0PLva%b=r!|AuouK9L3RR^QySBqioWVn<2?`&HSwnDP?fR2N}w$zJk(?S z#K`T}n(N6~A-Yj|Wgqxcjog{f)`jJPJd9Bcw@&o3Sd06qzPSu8un+ybcbgDfE2&Tv z8UF*e^P(so$tcHzYR$%r%fIqxm zctz*WA*5cJg*db5QAFwM9{+pJrtf&Gu{e?3p%g1|f6YS0gHZd0O7oD;lFrJ=l=!t7 zJU*owoEst9Pvzr&FR)Ai{`i^m!4%^tpB4ow+CbvdbKoQWF`H&UygVy`(WiIfGqN0d z)RDAs*HURh`eF$VbtS%3OIo$=cVqfTRVj(@;zo_fpTt?;^^d2w%cNbwMJ8lWl=3|a zD*0I5R{s$j|8AVV{Ws)(0Lfg8WNnmU>YwEc2Ow8usXOmHN9v#}tn<-kK zf{gz8pN3}+G7q|Ew963n5!+i>4cW$sV;71L2-fSF5Dwb6k(hX%S`hyJ|1)DcCToqV0weh?`nYFnd*Cw?0dbC}H*pOD}%2=Bkf$Y2h zpIZ(BIW26QCHN{(^Q+c37inLn+Rg{s*}Sw>k7lN)X&7?c>-_d;sS=_%x<2Ik-`PS= zt${2Teuo#MVMIpMhdExk9s6ufsrOy?_j^vz11HPf!5CL4q&i^}_A+MK8yq%_dP3TO z+Gs)PbIR2U&V9cWyr7iYr0Gw&Sm?%*j*_}d5~w4a`^=l8IW-smH>FrC&~Jt~K9 zALY`XNQ-2Y)o-1f6eT8%$O2V1{l!SfY5DZ1pApXUxrVggECz41NLvxWRaV~k z>Lsc2kHr=xWLX-w?3(x#-3t`>$qlVs8e=W1zaYTGmVVXP57mx3vEB+q564M`ik~8j zo+KAq;&u;c{K>~KIvBIdR}>A^cB8y%wCIJpKA1*~Zu&u3Xm@0g0-12~_Yt(t59Jvh zxM7u(V{v0F`FBAdS>Iez8(9DfP%RLL^Ds8o;BcDPOK#by*-ZBXokI8}VQz~fs~lCs zJXvvp{K|SwYY$$oI|kx3AeVWzYY_(aw9y`o>)Gx$U3SsGuB`#PI(q=agsMfU5VS@$ z#;w<2An9UHk|oS8M#N_Qx6M64b*@i}BrCW=Hpj`{Mi_rNix5bXL!^R`XmgX2X4y2i z#?VkZ%3wWNWv%{^%EM0QoXnCRcMqDoKDU8djj;1@Ch!lsS{ak#8JyI1r2GNpOlORF zDM|YkQFzEY1m|$TFPj6z+iR`>#B?{*CPPWTpn99{`7~Y3N>bvYYsBRejO3bFJ_=kI zhNy+)^JtPloU^;68O3QQMQ*?v^LM<)G46#{E0T%b4>%v0_`5`ZP{=uyKpahYvZysPhQ7%@;) z1guFc(tK4E$1j7)Q##(Ako>JLPyMN5XZOGoo!hW!$^%Y%9Dn+yUMeYFnaqTni9=wC z1F!MrIB86Ta-kcAFWVy~7FFHxv$drvLf=49gY7uQ((kuuR}X)5D>l97M~QSp*D}^l zR6caP#+|)a+Z6o)lwdBZmH(OG+uLcKPrfjs&VZ?SE2O3QS*5`j+t3pnbf!EAh` z?otPKVk8UV3JW`FE{dD%Y(o7p;if+~k32IdwAu0dH<z368y^1)RXSfq_qIgjd(@E`#DkGOpZc2o0q(Sj#p}fY);%{vXEPJi?0LR!Sga!N z^T{TJ!)Nv6Ps&sEQ*G``AJ~{NJrXN5i}5{Sb}~;soDV>?Nz^&!`6xHW^atp`6LM3` zbNl5?E6s@J;_C$6^}266O(0{zTgP}DTU|%nVfvKEGRv#YBlpm~ zS=ae_7<~oqeXA1;fO&SnXmG!7Y`-0$3Ey zFuX4QPxkwV4|%NF6Ir_238Q?;A0B(&UZY;L$sLSmv+-;`>glaw`9~=<``v#&9BV$m z=v{bQ!zj+2*LG>{s^Vny_52CP2WI>n<#+X&$N3AyzV*@^Mh$#uRzWOm<+eU&*&AC# zFfe3ba1aC@1zZN4gmELHGEa)#g2v*gR(@rQ;rQ)pTtl2dS{q`BwzytbhadzsqK_Ky zaG=+D7W3K5+^=VR8NR)!`wOM01ceh7(~kEJbL^ig8!ohRQ|+J!_ZIXumJrxc9!&P@ z$xWeQI9~P90aX~`K#uj3YJX8Uo^$wC7zS9hU(z7BbR`bAugX?P)I?hX&U=ugbS%ef zgRa@oD`d^D|MssqIHfu{gpfnhSO!?S6^8&1kSmi+k`-}Io5n@bK^@PcL1oJsRO+>;Yp$6&d#7qu;?&DUTomXTLKUWXC1NHcG z&6Uh5rR=t{+<8gFxbC4im~~KDo4Kmk;hf(QU7r#!hXSbj8fL>a$uTmf1zQlc0L`3q zTo86!9YEqj&W$6aSxQz5M;%r1c?_GUyHlTtlW+Ew8aqWrcai z;{)f@efp6+nW?8W2sV-K;~%OtnM>r?Z-z{5;aR(KKRYmb!aWTjDy?s0Y;MPq*q>!H z3$O|+1Wa$zi#X@FBS&DX?FLh|kqow+NY+;sDrzKR0Sjo64b}l0+L=s?P9ll{kW1EO z?8YkYx%M)lUYvDI^R-)p$wUWf9=*^nK8>2Jpu3?Krr*b|4{oJ$rnj0tR`^A!sw8B= z3g|$0o@kc{2jPz;n4hYzMui1yP4pns+*VC(eCY|SAxCIS-5%%1OVttk?+L#NPJO7>^{89(f_=&8-n56*#|6Myo}^rSzBPX-I_xI68GQd2G4$Zzf~Aw} zSL#X4S&8m4E9}O=dSp`DPmyx@q2YNpt7N#@=^;`y!a>AgEFXeag;B7<;)qTfEF>FN?In#*^OQpooaAW}giB$>z-Hi>fbr=ytOj!7 zy9cqROacmRiMT#fy#O-b`78%a67AOsykvD;FbIr@{1Ml(g6+la$;O#h5I4A;!?ua` zhlXgPPyu}8=x&qS!!y6{O?roaZzcZArHxHAeU(w-E7Kg1j zo-lmCXK}+xTU@ss>{oZjtUwWd;S-FI<;$k(`X}2)qX>ZpjSMnz63))q_ zRc8(cFP#k{vICKm>wV26mSp*K z=a{`-XG9tBV5-;bm?H`v=b4G}Ae*!+kO-s7U6xwK#91r0!kk2C^p4`mdPqW@bzE;# zhJqu2DGdDL5sT}W(vC{9UX7i7kH(vscuMWl5hH&y(l>TUtmr*?UY925^*6h9#@`%d z3$=!OzOz`G{&e8AZGkAmnY(+~C(a;=DE$)B6EM%UKNHlW^gVYGvH&O5Iq%{tG#1za zx3vqO4%t&2az4`>@|$u?PCl1JdS^F@;lObdE|6LTPn|B^3$B zQZ}ExeCCf!cUDfAuDfvjl%RWY>}eOzTe3_-mwhuCQAWSMj^LmcX*2gAW}<|>nwr2l zP^s&o-p#^_;ZH~F7CJ-&;+riywx&44Ryvxt>6NN2e*XNNq29Yt#PaL$ zd&jXwHdW|*s$kMF$YzTyJ9LTW`hu!U68d)$7W?>}HQ;ygb-<;CSec9D1X>RZg`4p^ z4k0Crr=TbcXg1SKrz!3;kfr;++;Zt_a#C9NUrjl*AUyP;H!iDh2JqDTw}!HW@a26UMV~Oh3MMM`n31@_)`eS6k#XFxvwhEWJM~i_U3u?d_VYsw>lVHz*&_8GT zEB8wbw9%^44}m0byNH3P8`@8JNYoDTGllKUucsfW!5l{2pBkd#AJY^Ow-nc=R)fs3 z^$kT0TfcRsMNEZ|G7FV$T>2H7#~QNJm07BT!_I!v;v?iX$>+FEW)AJO^rz*k1oEJu z3}Hp}ai=A4M@Bh9Z`_5sXSbh4nS?C!3aW zGs;#QG6Ns;3>vfNM0fj{Si;&I0;YPn{A3v%SQtzFqkV^q?p-#Jv!mJLI)H34G z{`jBwXJBLRWQ&)NPYIK-<&H$L$sdO)K-e?H=|Ye{NAu7KNq6m+H*940#am%fiJYbO zV*mhtoUR&Zj5D=A4IoGqy`9r=yn+s~{! z)St6A>nH>Q?rv{K`ob_QA+8-9V4dk<)sS%0=Cy!Q(Yk;nrA%S6i^(K+hL7p&ry^OR zQu6gEj8 zl=M4>uwaviWfb`HV=Ze0y?mr)=!j`=CF+orZV#QW<0z{T!ZxsFUrosA%Jo?A!4UG; zcvz768oh9^^Gw8=85IXpz!o_$Ydys`P87)YNa!%1CE9aaqU`%EWI6$M{(K(wPLu%q zc+E9~JfbuHY?UVXuc&U5tEdAj?$YAnOx_zT!)q;hSO+5y)Waj zZzu*N%YL63l*=Qsj?|C;2KlHyrZfEoeyCz;Q^R@msc|p{B6^bzWc96JegnS}HwvC@Z|~hZ{;RlbMG;N^6v1h3%RS5=hKH;_)er z;ZiE0|y~Tu@F>0S`sR|H= z3#I>vpLw_5HAPsAx&!#sI5Pi<{*LhyrDmXbQ6~u`B;!{o7_a1&nn7k&kC0RKx_SrWF)6?0Gg|GYEfG>IHseeY6bjaF-T0(=< zm8&P@^(AH!29B1gotwE~wvRVs-qYc=9dp={^W2sj{~vGf6deihuKh+GbE1xI+n(6A zZQD*Jp4hg{iJghY8&1y)sS>hekk@)vve^FNd5n&*}9U zhWP#IrG7)b%D)j;#WfZ<`&Y~vrKJ~iZbG{UUBO&hTP!p;Lq1Z*vhg|Fq7xZ+m2Kxv%DSWSCKgF)o_V=kw6@OHFet zfitwJ&bG!$yD3)Pjyp|7A`6uUeKj4ABiz%JJ_;)nJRuoQU+1|iI!%J&P14CD5BmN_ zV)4FmvlLxYFJkJzX(r(z63)Q4R>!H&$UI`p-hI|zN2jY#HA$iIJYwN2T-z?XayssJ z{mRQ&bIt%}>L6m^Y3@s%xC^+OoZv^Rtr=dJ@YClQ_7PKJ6FP!}4aJ;V1CmUA$O^3~ ziEJFQ4E)tDxuRfXvW`p4;q5;Il3njr=iB9M!c+pS3QZ5Ylz#z#MPFP?@*@BqM9A8s z5=1Y>Q%q^-X$n6h>%y^pziC4s4-Q3c5_g)bl61=D_TksnPdu(iPM+2Cs3KRs>ja$C z6Qxd|mbo>+bJLA7pKG~w`JHVsO;yiyiZZ^P+fJsfuGWbuo*fH{$34u;SSk2+|Lh0er0t`Su|vgQI`a^ixz%jAd@gnwzoM3 z07?F(qkInN9+i{=ysv$(iB2V73NQhAhqdD50-t#uuaHenXMIv*%Jr#Fe)kBs%Usd# zeSA*Gh*n5skHz=^bks0Fp?JR(KsJ$9nK;?xyS5fJ28Tn1zR3qH(D+RgIb`VVs#Eo< z=M9r@v4SAK^y&R z3VgQF0Z{<_ZU z%h~wchcRRSrT^HNA7g5Wp5HZxM8~A*?sysx_DJpN?ulbgn%zJiYa-a^JH@xC2lVE7 z_pGcIp+;MqwHSxb6Zt$Xp_W!LSXOo3^4Zkgt)~Y5hGP<|zLx3;_*T7m-gD|qKF>Ok zf?{0s>GSPheF!FDp6{;z(|&A5`F$*qut&CVsxY!Hj1zH1?{DPuwWP64hEVsJcjwiy z;napZUMYc)4%SBD!(b?;{ohrbFRKP_PWNVkg9e{~h|&n_-&#Je3|n@^)@JQ8tJDGk zRokr=H30Ho{#vZA<&Rd*Lss$}0_6RqumnX_qv7-BRr<@%^sxcRTik>@M!zZL4_Cs8 zqdR1lJLrF*k!ZoVMj>CtDxg~xRml?E92Q!m*|hz{bM&gIS$;Kl=kSS}9b~sx=}RPx zQAW%Qf16FCKsb?RQfL{))o6D-Y(!-eSu6lKivgy1$c+`kw!|F#N>6QupGtKvN3AXs zzCy$&2VDj`e)s!A#cL(;`?DX67m-#7*h8}T(;k~JYw+~Z{ov*AZ@a52LE;WzjR%uH=Zj92wzxA z7iu-U$>r!;vX_t9#LeC}IG(E|%v;8zc9~v}p;a?ZbxNZyC(3cu5<>9eGndCV<>&lQ zQAR;q91{{LFb6!xkB;}x)j&-~?kA}wd^!iYD6J7PhpwEP-ly^C^c?D^k29vDY|Ekm zx`Fg8;!|CM#G32+oPR%8{mz*V#p?OcOo)M2uTeSGxMWMvNvT@nkYsre8$5WDgVYjp ztXV8bE!=dlNK@g0=mvM?W0O?G7=6^*S>Q-XqK7hZxZ|;(hG5+58YIvGr`g*5^C60J1 z{`QT8YAJ>rDt3^hjhgCQe%}y@Y>pVkWGmi9#km}`60`ue>eyjPRtqC*hnKxok4otb zeu&vNYQsgI5xV}JeBvn(VRybFsrkPm?A96|8Qbq9*r_u;Ki=<6}=gvch^bD#4) zh}-*>etGLNAI~xU<0+f2*>YM9eClS5C_z`0>jJAJ6h%-=LFfZ9lhYoTv4I;Mmub7n zVjA}sPPA@f$MR`vJwL(*OLJr19~QU)rSYLlDX!gDycdp^;TW&{vbizjTaL}sOXcL3 zAqeswyU6r!zBhI2Mo0U&9j^)+bahCT^DbaiPS1>^=N9e$83YG=?L1SF{jiNWl6q9`Z0#}UU zo$Log$%%=>+p*=5etI5Nb-bWnX$AnZBa8v(S%k<+)wB=^L6TmJD}uKf@Fo#x7I`p^@0pBh?)Gsb)N07Yej*a%mKE=@es8K@ zv@tt3gxc=?YJYcM6!6J7~`t>!KJ(`8|$>$E8&5PS78N#Sz-D}5rZk5|=~X%;x(fB`F6F)_#{ zsAXv*Bs>mzi9;)QIvmEIl&TIOEWrszL#Di98b4&b7SZR%tymVVO?4V^vjsjpnusA% zj@EhnKuFA4t7?l_i zgI3?VvKh1Har%ZHu3ShE`C0TEkXH*qua2u&h=Eri9=maud^o!KFP$myVvN=Qk>4KA z!!WPA*?rOH<+^*fLX`KCidqomX8ALQ9v=1TG>r!eli7k+385&c0W6Ny=36Be;$--7 z`EN;%oC@PKOG7XL6cmRc$SZ8F9jevsR*f#Fx0Ecm0NBE~K4r#S9_z(e4u7fTXTGC+ z70&<9ggB7Tzm@%<`C=EWRm9CNQ#{KaDSub_@>&Fyfs;aUiWkYFrDsd-eX$1qaYzw zX*{f0u1-PJL^FClSTAs3Y6^=v4SJf}1be#ejrE1}vkD*4~C#9rZTYfQqCvQS2f>vRQSA%UIGumstLb83B3%CeTNLV1G@1$9|J;o3K(xn*Z9!f zvm1L4?EGAiwi?UCiIaNToc|nnPNFE9&f`udkal09Yu<+(CvCAz3sFR5;m{+E(6SFE zQ-A3F03=udy6CyMm64T$DZx>!7}CqeTQXG(7{GmM{Je9oQGa4Gv#2#l{ma;hCgbYx zhko(&s8BM4MexL51t&pi3nI?PUpQ*4t$>=2<1b+$kV+Rbz>tU=u8`~vxcS!kPDN_i zcal$%z1Q{)UK1jK|D-JJwP}l=4Eh`X65N8Zji3<<@>H#_vr_jcuvHq5U7cM(sk(rX zpE$!ZIu=kIPqSuF1}vmu_SqoOqb*pVk@#zAZp4lW1Ed@6F9>p#c0tW!AB?ikg8VqN z&iTz!2`PE`r7ZMkTBV01N;EQhI4W`rLasl`!;}b8LhQqI$O=}p8$I5q^8G<55YN7y z2#T~n(;gyc)A?fkslHcy$M1@^KhDQk?s{*>!y(30^3OUWY`L&AY=}r&kmVqA4Fo+m z+#Mo?&1j+_9)%;S&25muXB6jmIHVR21#X}4_xDl0QdtZG;A%h+xYq<9ScY`uMdJn8E_ z+@oO07Jcl0A~LWUxD>MI{wg&+NA!NLd~o@YZ=d9`%#C;;T2*7`S$1Oa#0%)qYcL9? z*J+VL**emos3U-ZrY5V*gn*)}Uad*PBk|(_wdXQwU2QhiMsWKpUq3Q5pwVKm+v1HJ z-l#+Eq~=@RFU~$eX+rcV9+B00{M~qI9GG>ps!VAMc|>QCGarj zb^+2-tYR>{1q%j2jb0}SXLdGd2_l%k0|UV;m#-lTpy(i7WEXlegrVeNkRQhb1p#g~ zWYi76de|eQm|#(W0Zfg?!`8yR-&267V|1u4|VQGPQ5r0m+{igBg7Z+A^jy7*J|` zB|dL<11ZaMy;AT&9}1-jWU~S+H280l#O}9MabC|0jvJz(D#+urHxXVTpb@LA}W=Rew-$eYA~P1o7KziwW}P6&kj#+wPn-!lZ5xuZBF!9!9-db5z(^kU=& z8S=%%-fuF6u#VkwrAUvGmDvPP_P1m0WygBo&0P-B=*;&+UTAB)ulL6eXJGOZ1GdtJ zAM_b#iDonBEOuh0VT}s>O-Lge-O{MtlhZ~|RoY*ysannE>bMRtd$mT!R2JCf&l9{^ zW(2Vu?y(GJi8Sc6hn$o^M)&2isiGG;wxJ~p2v^MmoPI9^F!{8IL-wI(T|Eua%N!?7 zzRFHd&R*>RdOK0J8oyYJ9c}jxy}y?`v?nbR%1LCED6@on1fm#NhL*0IO_w$?)m$iTx8clG(X9G8bSau-< z9Q@Sa2d)@u#5E^QlnTi(I10RxlEn6`$OJN0AI}=CnFwO5qFO8CP(ctkd}>9Z@C`t_ zu~w}kRJuH9ne}4!v0NC20t|YZWy6tW22W%IAKB=LkuWb*B_cvrgBO$AIny8*HF5)) z!equzY6_FLMM7slsyg0=H8)SW8QXX`KyBbs+}jG}vJ#j&3F-1kr_leH&v#8Xz}^CU zBM|J*)=lDka+~4`xJIB6wc@eMNpgUY<9j@r$?*(&ls4s}&#$2`G@{3Xhc@*%U$K%E z>-znxekRZ$@RGieC~QXM68-$hHQ}qJ+3Vtq#K_CAdbH7S;P2Ti2#3S@ZBsM5`nc`* z@o|=!ML0;6J@8wrS6%I>_tz>i=;ZkU?Qg8;{{?dG!d&-qd>N1aY4hxDespt8`>=4E zhz7wSQ0C?9V^&^}E*dAeZHTQ#u3-ixpl#Xczawk6>6OWy4R^*QJIjd>Ibbo2<2-}k z-8?8xru7mm1m6MOFVF(K2v~%|)>E4;wHzX9>_$tcQIM$25XyH4&t@oXc_TA3^3W;+ zfzFV#GbNQxxL=cIM8evdZzmYk9f*FQM0OG-wNkj;B$vWgCVOo#9jc8}6wEc$^iOKgL zabT&51@|+_#bH@1a0c;Ay%3N*F-f%Ab+6O?oCdT><_?WI3&IDb;MurmI#85T#fbOz zYMFXM(sh5__Jm|nnH3{qBw~>8g#T7+?@xI)ffXucqp&(Yl!E!hh`)Y4;6!xTCN&>~ ztGV_TuC^Hw?g-X%UXfUa=F47R*AxWf*phrcdoYI_6lwG2AX`7wwSh4fXk z-ZCAf%jSn<+gw{4rx+%X>-+d#4?v`7yY>Buj57p`ZDfHEW0#kPcx;7KNN&!_&I1kYu7EKA5=o2BTw7l!T|(LQ^O ztp@k+;}uAqggLPYl+U3LsI#*8BYUmibQn6uOAy)}3yKkuBN(K6;H+iGQ~!EjU^ zNFEDeDTi0#m9Y)z~hw42}K7(N^o`yNpMx@M_I5ckYAD>+3-0=$*=hHjk@P;GJA=m)|@ zepeR`gniKqLa~y=z1*x&+Wb20WJQE@{LIqrC(I@Nc9F@50VQHJbbHKVjA;Bt>ew)$ z`YSAa)SGbY$8Za6uygDqTd({ng zveCew4K%-yj(#H-2Nlx;p>;DF2|3fX%|fBxX5KZ4nCk-{n}9-WHDnx3wTi4eTg#s~ zd8J5iUma&+X-HkoX=`tN!HC>`?+F{me(!J3tCkJ3fxMn=_n7ibf?t+VmjkmxGtT@@ z?JBs5V#vHoY4p6pj#RjhIlrq!3S~7lu~%%KGjsaNxHukzq~YkAOkM_V_YM?gi9DE6 z8taA?4>MwD{DUhWNLZtUVmbOcrR{M>I1j9Cwrt!;jsc%L+k@C4rj*e0gI2m;a<=;* zQ9;`1pXvNX@5KrrUZxWnqRv=ArG?&t+6Ek6NrKk0=je7w4amGGbotu}d}U25XT2nL z%dN>yJ8>jqxtKTsR`TW42UaMmQc{Trj8ZGtAy|IcxGN!$kJ*bgRF;VPCl4H9z0tZs((=+M0T2{ZKr6q%7tXG|qs8uAig0ifA$WvL!QlfY7R9D$!C zs1eh^wS$hmG;r)%)IWm?AV}pfU5o-z2AzQDVZg-MAi^Tt@6{P%C@OG2n0u0_#`u|^ zX_g9t!gK>Sn1SA8$l9c+x;et3B!#*jz=%sxAGUZ0p+OJQLqH?yZO{x7fOjnmyshd( zGzkH~R}vY8ty|b1vl+KHeGr?G0o}D``aR>n@^g6;vbQ>6Ad(PtH=C!qO9rsJv1mmn? zJ<2azm>+;~63L^Pf$V(o#l9^lnjTn=4jYfgdIDUSTu#`HzyF=B-0%intEMSl*jc8rRt5QI#tRC z47s|CN`(Px>POnNRZDC$3J#|W*AF(I);AxYU{dU(CAB@DB$)gNd&(u9pbn9ZvoVNY z!W>9a+8t4UGD-Mn3*{JKq@Z1-#%zr${Y3^K0m%H!X`=9q<2=gMLBi%JCE!f>+_JR@ z79cr+i%Gc@bd1+_Q|OSfv}8NsI6NUeS*s8=&)y>t9(ApFyc}r|edkfk8~%=zD^ING zC)A;O#9XL*DQW}?>Zi=Cm@!??k>uHCKjda4u~Gq+lrCR$mZAdySVU#L?iL?#F5+%d_Pf^Ly0)nb|B)q;xL zp(IkGi0esd6(8k>FKT4L3c&nuF#5rW)Y4I;u6XFd`9@&Pi+}&v{Nbgl(hsX;m79cd zGfWLLfW#ttgo%=eiOy`I6YpR%(2x&Cb_~CPpKwh)Ogs*L@FS1w0C;%^EL22H@hJoh z^%{Rz*_p*eu}^boLSeF|993>m$y7cAQuL1BvQm;tu``vT(*JGy=um!tnc# zwJvDEQ{3Eg&Iw;ElQZ7HBzoT)!N?LmOe&nRr`4LPjz!cVAP&(2kMXB3=+HT_Aw-~a zFfPO(fdL1Eqp5Wj5JwDx)BjTs8gl11X&4D7sR%j_wT(Z6!E-2|aF#`Sr%%lDhRE{~ zgoDix*ABsGx<2}nogd)(S!T(lul{G6d+wC_AR>z&MLv85DxetJQ!ll~ z*Sx|zIIuz;qhc9iI)CdPO9HF1;r!tY(Dj+@sOCZG`Zmj5xCfBiFhXgh_v*I=FEAFfM_U#J7Y8>t3NRaE zrZy-zrbcfTi<6~BX?0JeGovpM$HlBu8VVi6f;BHF2H!_)TVMtktWt*@K$>-&zbH(K z-3)lth~02favlKJXXj%Uvu0FFptOX0>2rqL9?IF1I4BoAqWto+KH_Au=UbkEv)3r|Kz&2gdjA4w7Z`c(Db?HFN4?wJ zh+N~e3gv)G<9gW*Q)_*4Df9(_5w#irI%Ks(ftb#67FmDe4E(^t+QbsfiYqb3l!QS9 zMS2ORYs2O>b131F6=YC7R-8)P=@4IV9h);1@d@7;dh(FQJJv=HgH!FaTXh<4hegv6 zbm%?RqXu2&+`17&C%1}1L$x|7qNi^7HL7|{GDYKhY$^*tE`4NERpi0S<`4jbS25m2 z>+lxiP_w>U4DtbYlBq95y$0i6PO=L)o_BCm`>iV=)g~# zU1CR@gi3#-Z ziC1B2@L5K9cXE`aWdDc{*c@S`1JJ6qli*kL;)h`&rw}b@dGenj{ygsv?IU{OBi})D z+dlZ0$Ta%&H$EO&yX90^+xa=k_!6=-M8I6WdJ2P4Ei2G%0&{*Oplc#@bTHJ>q<6x% z{Q0WpdW2TB{@GgZZ^HJ&0w;XT;=FzS{Ap^0t-{wF+7$LWYmmSy3d zIAwzRJ!+tN{oaQ8u{?=9TGqEqEw^eJfJ%rU{yhR$7E1*eD3(;2B-%xCy@KagaKrrF zU_1fA4FlCLvShqgOfTrJprvGYSAD{LS{-tXKEXB}A( zUXLJEwc!$?&q~<~!Wz(Ca2P|ZS&J6de!z)mcM`;i7)Co6E|PpyFyGH0MH~TE8l_=I z55>7BzK;-&*%JUHHKwIB;)4w%_zmL`d`?-y=n_ais02m$43CyzLzm)(OJ5@3ZAGfI zS2T!%IVsF8dI|JX4*Q0@XO7vQorS#=r7Vt6i@G4vP^>}*Ym8cW(%nEmo&v+8OjC?F zfbg9jbuY}2SqoPHhzXkQ zN>7ddwK7je)}vPW6^*S9Mg*X!aQk!!;Atl{*04m0G-S2Fj>zWI=?B9+>5!0SJtFyG!MKkcUqF&t0L%(xh`s%wba(X?l za&b^GJr#$x7R$S;y1Ep0T@?b`yZBbUDRbXT%!?(>^-5A~t(~eZq5YkHpoqXTI>=my z#+11Tr1%BVbn|3Hl0!&14P#YoNni!Rm0zO%-s@u8GQgobrS*a^g9L-Fg2}I&6)6Gu zEo+HU0(xbNxaJO4f`S!NF8*{Up2SPUj!#Hpz_TP_pkgW@iXwj%=C_%2p#>BDq0*`l z$38Ltj(E3~JF)TsCRfbcL5TRIUH1o~fA8SFieKVY3FbDoN!q#EY;8b1k|#A9Y+-d- zvO|*^R=q!5>t~7=@s04G;9>iY2G^!l2MO+$`H2nBZDrKU6_5D44yk97HM( zCe)$CU?P33$&i|H720Zz8Aalx94D2;Pv2i|Bu!GRPdpv2!m|xq0BgYl-d{kjIWSs2 zqbcf!aBjjb&mo)u5riMxWt<`-SPo<%4UZ`?kx_w9;^4@E7l#U8ER5nc8L^hAm{a-9 z9eBIsQHeyZP1-kGmv-2TScN00ihMq3A@ooLedsQt^TnAi0${JR;eh z;Bv;TxwIiPyBm>M<&cVNEFJiNM?u?IOBY=Dxcrsy!^ju>T{p-B+XNh>KtmI5#%-gM z{y)0vzbinRmllU@oiRV4!j-0}j-%gkh9Ezctk;a6#iYd4;e>mhEGM==dR~p&OzcaK zbv_V+tm%v;i-663y5w%_b3D6Tmx)a@BnS=_UV-4xjBx6BL$mW3P6*YON7h{&EI;bq z9xkJ|Fh$1(LirPQ5M)7^64Fse96J!qOqgmOQCzk^vbJWzKq?o}+_(j?*z_5O^C|=? z2hux)9LxmOqL?i#D$nSOK-8@S%?)f6TsKdxD34#k8bWFi7Rw=Xn&3x8`~zJEgaW_> zEW;^1A41L>fmrzL78S?+(Gx6v@4OkTt&2eLC@`w6>9IEyZ4h;_w3_NhmmfMNTQcl@yv9YE-n z-8mM9vF?}f9P0sdZs8Rc*2i`825<=UbG$`SHpxyo{*C-^?=aTu0sdTF1bC$Ax9sHk z@}6RcqB z_uyX4O;Gu$LmPBj+UYUpJHE5IO?xi@m-W*0i2@NwmRwl<7+qykg+vF6>2aVNR|wB{ zccA&tgmH}f?~JpeDU#E~1YWS*1EW@WYbw*NCR*`7Ffaz|q@kkVaaYIj9BWb%1b3(- z30*SW1nLmLuoUo2*b&y8$*EIFm4z+oy`e5e}IGUz&4XF4+zv0=twg_yy$&^LfMq-jnlB z)vD$sw=6QddBF+)a3Qu?jiVr%vCDf9%}|Qxvdv?+-cZBE z=31#oYu~7wm3&##rwzA_#uAAToXMl5rCqY@@i5+KwM_>Ra>Q7DLA-%_Lx}#cUg_Ka z{!9J8%h7)--VLvV-Wq#@WbN3EC4z#IwY%-5qwXGaNoLVAJKU>y(GXdOqqC#Txp9!@^2uke` zB!BJu5rE+kdrD-c9ldgx!nvg5tUsYDLhQC5Gx7bbqU`|0w=3C>aH7U;8{cGtWgzSi z<7Hw+2QbP+PoY=9_rlT0pb|mw+^mRhy2en~Au2A8D!UWL&LhK5agAC7id7 z-;o8Mjd=bkDl(@|5_Cnm+p1O@&ZC~Ii22rwIWNWT;mr|2mhwyH?i3ic-0 z2TMwc-Z?6{)YP^3%`cp|g5T(hzcuz~R3E1Vn9?;Z1zn9MrIRhz@qd|bce=OC^5bE8GYV%kSXhUU4n1YTPp zF#fk;CtPdz3sciA!|i0zsu|x^^+PE`X|?%Tk$BU6YpP0DDJfm|i=TblpC!snA=|W? zt(02k>Mo|-4C}xuyW|?C?IMp9d)l}SeGS~FN`HGZn<*RZdmU?y*6fvDQpH&jBJC~} z7rl@gm%?8UfiS%tz3J8Vn7T4Yt)($$^9!qHwNIWa5#+=Fv&mj_Tn8yc^>?%sn(7!a z-TvIH)(Lv)<}x{O#+|%eWo9kC)bEbclE!>gW<@{cCgZhX2mE z>F&4bxT*KSzIR5u3*U;m1^?Tj6s(b9nE;2M;*0CLjKI2^F%QPDF0m-okQ3r^@cEe$ zegSw#HLCSsxEoIM&jf&V=Q8^-*@V97zclsg9SCaYjuyLh6~>-x2pC~uSq=||DvLt| z+CyF@n)?zA=m#jM+X8kXBPh>(l2g?C0UH!iZa=AW|Z!It)fq?Lk(L75upA#Pa?4Fs}v%G2Qur`x?H!v zUfg8|Eg&MCke*JvL$M$mk+VKfAr!&{VA$^&)iPhH6=tZ!)80IDk46@R#pELr@YTIL zWgJORRxn%0Ef{;6jE&t#EQG`Qz03Wg?9w_ap+iGaunw{wBB8S%+ly4x+&vDTJ9dou z<2o{w+390Z6R}@yGNv6R4Lqg^#mr2z60yUhfnT?aj@`fhwp-9gyYAPcjJMzN?vqTf zL7_g;#O101U5w!Cd)tcUs$>lGcq^nrD&~*gzlo8IlgS5;0V??4)e{siR2jR?MEd?~ zg1h-PF&`5D67(#yv-fUUdVlCMyZZa}(-XYN@AXwKlgqWJXB$ko^nFns1R1l_zQ20J z=SZ2zQC^+6mW}~S{Tri3;rQ-d_uKD-j2hwYP1Mtapftu}Jmu_*=HF_xP}yOsb@5@^ zJh~Ze8JJ#Zk@_^)fYAcdV?>wU9al2Pk-U@mcGB+Jggq~ zdVq_aTs9pEp_{gq+ku4+#mi6|NX$+19Y}Pu*Td4E>lbZ3w*|5IT;dk9;zXIeXhC10 zO^x6MIH{43D_;c9MXv^rZT8wP8HnBHEpmCh`ell_^am2VO(=b;!M4eE|Fe}p|K#tV zXMtAnWiG2t`xH85f+6%Oh)?2CsJlownEYqxhE~-tmCnY)tW`Vgg*CL4W2(b0aFHPh z=M{q97{0D{y$!Gjh)a4Nja?- zE0aG~HOC7h32CPrXC~$fhe|NZ2vSX7Ri_zy1c%zteRHV){pvO-CwE3GvjJ+1`0s(A zsHwH~MU)x3Ucp-TCQsmk7n4f;%paK$2cZP(;O7BBJ4_$s4-5#x|lq_ zi~}6qj?yXWyxVAXLfMF=8uz73`f#9YZJi6;y|~@X zW3Mtfuw^}%z&@(QtTv+qY`W^VFqfK5Pfa;Na?4)zoTyal@Jc&mcF7rNEgLdkYJ9!w z{MY^fKYwx%0Mu#Zdg1(KOCTedS+f+vWwU`U5 zLfA-bq%M~?26B;HiD1+j_;d^7AD_ZD)-pqkoBDX-wo>0?Ewp-wjzI7bC0@cW&ZIUyY*=2RPSHOH!v`XC$L-g zKNR6ni4crGsx^Y*ku}Dt(E#vs`$4a0&D6pl;V*MjQFw=)_8izH6u7FQi6!0$LEIb* zSQYziwVP(sxIIS2KXL7_r*{;T;AHWF!#oPe(C=x&kVC$Im%Dw51B)847Dm8kT$*Ff zy8m@In|=)R(*z3|7h6L1Pl4%;Bnp7F?R^)=HU8&$nKmcxS*X^h*Me=#;6#)TDUlX~ zpjqY06OJOkSEqE1(vRkFAW!tG(*hH$*0;odvrSlf(<%ywKg6^bf9+Vf^y_uibMnIR z*FM(#gJ4yJXr1Yh6X9#v9-Ke;cnUT$dw{;TezQ9Ow95(?$zznA&L+Yt?SCAusEOD@pa5$7F@z)Np@{r zkf!`P$*f|R_Dlp)%fWLq%!Jr%-$AWgBzArlqV6vS>ikaDHnZfmq4XmHrq$S78WA?5 zLEI$)sraYY^_dZEv2Rv%8!x9>9apy;E^K~IY*t6M7L)6iyNva9-r5e5OENp_$qVly zg-A?7w4pPPpMt&}az3XXou_}Z%_&Cz@a^Q02@!Efwi#6|me^*E@2#V1In}Zo^XP}C zES8^-ZME@OSNJ~AWIC~-`EGz2ZsqMGm=3eFjiFsUkgaikKJdI~bxme&Z$f2#pWHE| z56tM|&a;3dHs07SKJ2=v8`^d9c3Q#rcDlFn_VLHZZ9YDtI_y;*BAAVuXANX9{l+;_ z(;Ydnm5{W}s~8cNL2mnNyew65>J)7$vJdTPqJ{@$k~-~Tm6(DqfAq!4FklCA zDZ-bJ4*Zi-@LKC^V?7vdG#Nx{uGLKSn<%w}k9+|z#HS&=dU({_tTv?0a`kdjT@P)u zejRx(kcCakn9r2V&nR9mpGqrEQSN{xt<2_=lU-#~$nMj5+Ses_@0UN=rcZ9~cn(Q! zF~qFE+>n@Gm}A`|t=f9$#sWVIdfMi%1Zd>WvasI#pQ*hOKkt^UbB*(*?X{Wedv1U9 zv=JIc9rKwVO{O0SO!qQWuXbBY(V7t&&#wXt&Y9odOiX~WZK20}VNTD#ESBkbwo zTKQ>$&X*OtzOF6RpSCCFp{GPB2zyX|y5wzQdud6reZ?h&gM^3jf1*tv8<1VeOaWT; zkHm8RraFuby85lU9;vCaFLkqKmg@@mQ)a6Q_?{Yje(5PBvv>OA>BaovnZ&@xeF0oD zJ}}lCnxbYYAe?HrCGBYSegu!w|rMyoKBpmBw>g5h@9X7i171;bZC_Wu$VJo zCSkufS_6}jN{PTF_iQ=9(M{l?td!!%f114i*seJPU+B`8J)ItND`;y1f#af#Cen-J zd3A1CE~!!WpjXrO!zdJ_MdP%5p}_#QW4x?g!i*<;g&$vc`;lG!jK$i$(KLdoS}5VC z01+ey*N<|XgsBh!!eK!u^1?WV0u|{mxW9Ysv<}ho-;-mY=&r#9Xle?F7+T;W4vjak zoY5S7_4}y_Tg&;TcHQpnbF{+OH)_=f;@WS}hcP7`z15!2N6%N`MGRV~sd^ZW(@h zWMy?NXD=)+3qeT>j%!|-&c3?d4+C`ORzk7QyK9VGgl(b$bHDQGPX)gdX0XU*IcgDW zA`{S*PbxRro@1(X-jeX#FAb1V=d&JoRC>8b=<(gh=EwH@Hw%E@J7Ck#`(q_<0ce`c zbwxnC`bbEb@H>y>Uy$YDp6b!FYWtMBeH*+j%oH( zH9GVJkC3zV8f7#PG<@a@gXu1Vj+ z0(X=Nk!|Dh`((ay#PmO_`H6*GNQo14<>QZ)n$oV`h7Jz%;-f*PwV70X|h%M(wP@X5u1=a33T*K6a0uzlCPghrC1!3)}EK@JifRSP(DvYnuw3)uud(n@vZa#+{l^Hz1=5dbR%h&8x|h=xo=xoS(}#T8`*VlIOU6 zb)2M0nexM=rY7ihhFYj>nbJF8hc(l0QwPUo49MfRJ;Z8!%=+&st;u1)P8;@1IFSz3zSNjqy8Vj_ zFPU($5AwqN4+Hu=-(0a`;P@}5z&t+Pav&`%RP=K5==iYr>CtKPM|?$!_#B`4eSPWa zjIxVp&_{{-x16Q*HVgeDp{p)gc$P7J+DWs6i1x#Y2~cw5H1q`Ppxc5x^6dY9U5JKx z#6vN9*C-ZxcfAisqgWZN7&YQp&1hr6n)}%PN0j0{D_DEb{<<-M14uXY$kg)^5kkbK zW63)3!aU%LRdh#Ej@7?w#FykQ3s*q?J1A5g(eg_^WdxR0ri`vcJlxRixEjLHrF8;7 zshYn8ubw~~>o~O?I*A5x%4irqM2tLKVJO!dtc`>e;4O9d|Il>~&Y1;mlz-z)Y&#R% z*2K20iS@?T#I|kQPA0aKiEZ1P-KyR1tJ>W^;MT3~y8U!NeShbiy!XXrMlz_gSbL%= ze?A`340anQp**x_mIP5LTAfx2NQ8D2KR|O0xg|8xA43)Ht{=G~Y=CeyjOzmrW_N%{ zYnHlC0qDzqf&4)(0+f{#OdmKs_g^*>z?S_T5kL%Jg@X>_<%bvB-!B$bNaq(msogAb zRG^6Y%dNG_iERyHThLfVfdK?*=#H_zFdaYRO94a(vzn96+!49A7{}e5ZzejLtMemWP246CHIpDl$Z2iHQ2NtAi(>c+LXrj-;IqySqIwu z$&+*1*&ep>_cr2mm}4Mz8#EtFm%XRN2h3leeYx<72MluYs9}uvJqidZ9Q&ORc4J#0 z-N$w%8+Hj#**)k^g^n?a5c6{JbMVkRoB@A07boAc*CDq>gC~>CuG$oa4=}UWWD6x- z-L3ny+VWfG=k4C5Z~sP>9FJl%SSPS==@I3SkQ_I8W@a(id|S#j{=QMYMI1(mPpCbd z*lW=t@7l^P>>am}@1kgVRFyuczsjVPBg)}*h$>yn zzXiIBd9#abrh3LW?fJd-UyTXzXpd}L*h+zcwEDeOdswUYB7n>yG1L9J@;M#i0_u!QGJ71t0FoRmeU~1XPnC463Q_+h zj>;x1k1eI6v^}4m6`7-9%v5tq2J397;|#FeX6wmbhMlP-^iQ2qga9~<|CWG;B>Ne{U;VDcFG zQh#uN<(X#GX1!mtKOu}GUEWy5d$XK&+kci(IDT>rlChcSu8nNS*otWcyDK7C+P#op z7?G)Gq!SvD>f9rvt4Lqv@uAS}ZhFFB6FcY&dQCzG+^g}qEGElxFUI4uNtF3}PgX1| zZ3f~7vi>x#FS#XWYdLBmE*rmAJe`~(JmVgK))iT$7R{HfO(}Own^~9ga2CuWz4434l8SGfUQ&_v@2q=4>qxK{=B!c%OBJsKCC%KA6zf(7}7tKh_!WL4n`rg;y zkM;v1=wmxK+zo~`umr;L)S?1LhgZ`4!M=~r5ppnE^_}=pddqR0=8KVTY3$;{usCh~?pu|oH3kE#875P3Qac$qJd zUrKO4CBxs-(K^P)4|tznCK{&WMPc<~OR`^K&n+Q&O9e09ChdFzx%>|RMy*S5#i2qR zm~@ck35(*38cZ3_@&mn?&&AOTNY_PYPmtko_(Wjs+bMD)ZQtz#34UT05KS@s^Y-;I zyWXv@fcde=^!7g0(-h?FY`D+5$XX9JZY{V~sI#Tu>UeoanLJXg*?9eN?}}@CFy-!P z0m9DbXG`|w50}zFSB(x1qz__dpBZd!d-b?oTOi^$Y!{t0e($DtRqe4aZdeh>8lxJR z`R%*A?T-V|gbcjcws zkkXF=^e8QwbuRocRhM);5PNG*=9kPAyT<3K0WJ>D;VL0HwtQ>;40@Djd7!sx%jb=R zxrpnm+U(X5mZKzA%}0-Api)OWp&nt)7r;5O@S|T3c-m5g-kZYcEO0Y& z+_>$hmhQ^ohC8Q5O|*#hlwgz7AE0-{y)DX>G1}tcoYXeYai&?)Es(+!qfN&!qWMPU*Irj4;_-->Gx+E(E4CR!d<{dCHPa z8G~MjzHI(&EcgIch%Rn(xW({BkL>dE{<<}+9*#(^f*@tI2f>L5I;rTba~%YPZ#rT* z5JX-bpjiKBi-gvza{jl-Z+QaJ8l%`K3}lem`lwXfIb<|YxDvCZd;s@>>z1WzKVL(?ncVz&sh4;C5vz7L=k9rZg6P%}rA@Lk4GxTXy#)|Vmw$Srm=}$S# z9SGp7~u_UtE=W@mgd^<#i%B6G^TF`IMC zmK-0l;vLJGhLv^$QA7b(x#jGEn{<|{W6{&}bnR^=RAP%i5&kd|?h8oa5(RP<*Mj5YqP8F3`KZi z8*@UJnUINl$a-=BlPo5W^;(|oSZ6rc<4)my*ubaHfLGu!V7;8Zd^bE>!BNap~pXIMC52RAL=OT@$ z&1A@wLJEJN;{0=_rOvEisxQ)wMz}~Af$B>c@%3KG%Xakx+i~9D9V9&UHhA6nRLWxZ zK#I+DB$VfXLVhxZke@{dvWGz1)nGhwR$8^~yp%fe@P?D__ahg_e!1wBl)|PI5u`-a zhf(Q}M$o5@DweuRUuk}Daei@oFy!h6ZE$fD2C1{ar`mP>VnVo+Wn9Bt-S?@rkRYwK z6$Vy+Ipy>c8KtSHIs0F;`McjcMX89TQ1>Zax?6K#MW$wfQ7B zg{73!0QYjnkmb2k%>vVYUO%`&vbnp3g#CJgHIvr~GBus2I&bxp^*T1lUOD~Yg7$(Q z)+Dvh{zglTCtB`xVB^3OXuFm1~PS2 zl22xsji+)Y80=A?ovZuBV9I_H`nV}XvB^!%-OCrPfB+_uf>_SWc3Pbx+E9I&hR(`a z7Qby{W7`=4)GrS$?~l@4(XdSWUy{M5p1}4W^Q6ll+NTTy^!)g)mkB1z6kjAPCGu)y zx-mdMgOmunP6`N$8_BsW#K z&+=bOJ&HHCLVx?9wieV6`g~|4rpNsVZ(hxy(B-7awof-YkV|G_Am$RU-LN$HMvJjn zG<)1gWjCcI3mu?)z2_4}e*>^x&@4&{EJ300LcTTD+BXOJNVBAJw!as{pIlKxAoC7VKQl0ba?hUcyuMW`7zg8r z3ScaUWl~3w(1Rg@eM_i*jr0gt&}S?D!BkHsY5@75c21wNu_6?j+}5N52sEgcg~3mv z>8%{N6zLdum9nCh(heRB*J`w-$N$%o0<$tE2CUNt&&kCH5Hn^$QG>+VYaxuy`a63d zD8erJdC2p8IB7PY*Wi#pJ{z+XX{XqY`KMkg3;T#<&xmK9Hrx!v96ZjpoUxY8x~>yP z)smuk|1HywWb}8h*40=JV$NJqfhPL%dEi7w|0zv~yiLN}Z_jde3aPYVhyIxPH zBF{hd*{cJW{A#6VLLh9~8vFF|yKtn3Qp;NtE*S{G;|EIi*>Ep~PH4G>P|h1ed&=^bv2_~3O1&_~^r0YqG6KZ< z&(NVJzr5Ixmzfgh)#3-lEUK&Rbo_&)&Yp9I^l|VOF9)a6>6naUfhhe0p79tKjDJyR z;A#EE_jlaxcY!b`g^quaWN+vC-7Lj>Gic6&i$!O1bCe6mQfL#Sz&hGagjNdO2FI~D z!HjZ4)EMXo&-40j*R14RsA<&3=E3!u1-m9*pU?k(Dl;48=2ZV_kd-D(IJshvV@JqS zj=nC~kladsR8}9^Llht(B-JX?&*7w|*{@*8`PZmo3w5ou-juWc+R!~mE=-g$J&9O! zEgW{lp!>NMw+}+c#blF_=`t(GwSi{Tk_ScTmdCFy!rdR)kz8Q{@rcSW%ci5y{-LWG zT^qHlH!QJA6Ek|XNgJ1=@9m#yKLtU#{&QX|GLdY$hx&@(S+a_M-gKJ}IP8EpMwfs) zir<4zNhps?oZzZY;%YdCdYNev_w(VQpnh?lkqv5@(~3Iz4CHX-zN(Uzh`nFEt<@Q~ z3Kyw1^RB@+8GSiQ>;UiGAuHFnud%{R-$T86B5%c7 z|4t|k&&Fr%ww+eY*WyRoZ~S%%nly^2j>kCvqm`t}SkZZM>65q;f1Gt3%6;*pfEa?ZH#49c=Xmv-tsN2+T?i?Q->Tr12i0Wp(o*%*kgTJn-RhQ`e&Y~9*Re|VN#LQDX$1yvo?ABraC zWxt#k9fD8J=W*X_i$&8U9o=dQ{%xTk;z5j3MCHRzJ6y9Fk*!M^^SSJ_0vZa_uIBgD zI4=j43Tp7@0s>}0wVW#|+yJ7b)1{Q+xHKD<962@I%S4f?`;Deoh|usO%?rREDfOcV zJ5nmZ@$?~%9e!J$KmqTv`rcHQ=U?}udm1m0a`Vw_9R7%alxIu(r#wTiDAo$d0Nkfm zw6oeFZE`aOd&1z?3#@L2NP7>16$e{iO(8(zcTA%HfV9awyxEA_`L5#>7AS_9r~w?> z-_fY#y}NcGv0X5VT~Vv`%es{()Es@>iy8hgss$2)t| zU1&u5$a~xts^%Rg*U?y(=ki;$MAd9XI|OLn_03&UpZSS3TUeumDJY*&6#ij~KVUV{Iqv zyQk9qroPEFz^(o*3&`XZXHg>w0Ie8~VXJrJOrE}Q?xJtR9XFkJ=HAn>hzSj7+q)bB zWjY%5U)zc=3&k){ss&3m@s@mPu1++=#P`4Q;^2CC&t`TVW5)J;GG^Y6L|J`5Y-rzv z4W3pAdPBRZWs5MKJ#|Udy7Qk%=hf}YRwMNBqgf&rcb+UvInAQ@0#y#tiTtc}D3i%< zR~YNi!w@wD*T|foZ;i;@YDkjN3}!cknI6Sfb_1$F0@Eh2gPbi3W7gSDjaF-)HFa4E zp^A$;WAOc!RzUv+UF<(6tc~wtr}1-mri^kv@0>=+W4suI$z{}WOUr#kH|B5&6>lF?rGdv4*b;z;5y@9v13B&5-H@`CYQc)%O^}9 zQ|HtU-C05P@6kJJcH49{!Q zjl%Ets)3XtF~fJ2M*LnY4=)j)6rS3GI0O$;!EV*0t!B|Ql$%>(Q}dkyLT`lC^Zo<4 zpevA+^_|HOkG_Wl>l~D6FHz@pJqFWdOMwrvZD*59KQiQl%OENYIl>XnF`7dmugVp` zFn2ETB4-wt#v(pmm=$=iPEd8QA1AWJbc5#S7&@1BZDql=FSYRH zs(HPF*0uKVPL7jR_+NOT^F08n7ABU}`n!^y4fObGWc&Ok7z&83qHvg;mS*TcgT2)A zb08g_#$wp5NzZ85?#j%AOEcCgjU2l1_n4#AY|HYkihiScM&WKHMu2}A=!6pGynsg4 zKtkvz^MRJK4~Hw6VuT4aq;}675(YpL{Y^^IFU##etLY&Qap6?a^L|h*d#TeNFH9E% z-&X>#-nJUhiqZ# za6bwG#95|?=g{s-e_aJ}hJ_#9l-q$GBiicB-R*Aex_3P8`yYoZgQ3@f(i>2l<6<8o-1f+z&-4d zGnm9onthn()xxqNqQs<7D%; z7gl*6hF&n@TT;QL9dWR$xZ-QBCD3-ewvptzZL??kcOtJI`-0l?-_m%8up;ugu;u02 z($2ZI>4q}h!R}q~n7b3FOL+TTvp*1ZqF;s=xI6uZ@Z#vpuh%|JKpptz9SZ%k<+r$P z&XNsolhrAQOt3evirfY0OjOwuwEIb&@6rkK0rq3?u z%S9P?;DN*3oJv9BENSw;%y-f@2k9c2R6cp~$gGn6-6^wCh8lj4fj9S>${u5@~JPe~lb@`W)E6g!Fa+5Qb z?Y&`WeMupn&`8+*&nB7GbN`d;_I6gg$W&q;4r5nyB>ug%%M(gk16#I@8Fuu zcHB$L4*7hq8+HPrTB^BJAb^)9bajDiWv;1^B>_3j$+dCfnUR8YjH>Veye~XVR+y_F< zAXfUYcbk0?10O~&POlY}{!4-MsE=qbiC{YsAL5`XJk%(vF=w>d`LZI^l4g7PD^mn& z6VI&3tZ_DT_4?g$didvBBXZXS?CV)ki~O#5}FUxc|t!Bt{MI7&18FtC6F znTD2kWY1$_OD9XJlnE3TguKxX0+_RUMab@!=5%HriJ2hh!U;Eqnj@u_fw&En2_q?7 zhpZ{ty&t2#Sf8<5Y!(+KHVVM4si@}?9QWz72_eXU%vo>|mC=VboT-Dn``y5tE&wd{ zJ?Q>eI3coEAq3 zR8MQ6^T5Oy`K0M|#V_11IiA@eyofn_-JcVf!guLBe)ML_<+I!U{U1cw|__D>MYegQK!&%r-*lLTzwFyu$--=_)Ws`=8b%db&4A zaP{^QlgRM*58r$bNrBXb);zIMLz9J?#+zCW2=9eh+JbkLQ-3_wG_g%!ag582FRp$U zpAU&X8A9d3Gw)9^!T-bHRPNrqd-X!_Y#G=D1t7Ie(9x__&l6=dnXCD}ov}f0{$-UB zqXE9{YJIAF?f4)F>Uitte887pMI4K_l~)OhmjNU;vAV~cACy<>+hj7Jv$YULinxOK zHG>HSkgQVoeidM66pkbsiRr)pH4n#F~UY+MAtz{TDd;76XMr=cCw8xGXxx z=wmUG+6*x67|wA6g}v+!a3C4-#fmU;J3&U^m|H-d!DEwu^?B+5E^&3;ypat33x&y* z&^7)SA0M3(xJUYKnA?}L?!2AtzTdm?Ss8hxVs}5$nRS8xh?hjzyQXBtL*i*Av27Av$Lr0Vg$5$KinJ#M{MAv-@3@>SG&hwaqF8 zZ{{8FO^3%N$ni@4Yq6t1KS(MCWBuqRo$Co_@h5Y?c=O200zPH`J;pm+9I;cRsrGE1E~_n_G@q59#jv0lUm@m-U!n z_frdwh=i7k-endK8O%icC^pLNQBmwHm?@7BUOlTLs<@yvbqqHjKLVy@su?HJV$5ef z5-HQFuIAp@j-Tl3UrmKqqj|lK`#k6gpHJjD?sm`v`$Y5ZVbxO>A#D1O-)QW-s@Ab> zux8`yDVy=1DLHgDE?snAY~IBCo+B+!pl*hPYfE%Oe*~#8U@u6w1iBKe-9M<(x=bp* zDWPx!YBb1H3uP)pO=DI*k#hP2cgkpj6<3@eC$dXYJ{$*HoVu-y^%# z5{W12V|=-v1ICQTqUmc5{~NB+0Om{#P<0IppA7TZh#3O#aO%)j2Ptm-vYvl=rU1yn zSkU&&1tK;?%_5#!tr3*Vtf2lMfoiY%E{N^JgagTN<^L4;eauPMSr6vYKvEy)OIz5l z58sdvMd77W=>*i#1zV-s_&YGOhp%e--w?PldJLo{-|^{;u@^sxdO8{;;bkwS;Ebu~ zWPf7-2M;t@#qoAlx=b0n*}4;OQS+L7ycNZO?kX4rTtnod z$8xcSC{l#-fdB>|%))eQX#l?jxj+(eL|V`&0ZI}`5X#n+qvq%V#O>)ULU>|Pg3-ND zv4~K#$Lm~JkX&-|B-;v;s#ddxO>&8-i`zf*Kt*i<3xL*bv^<;uAxcRm&_6`*>V9I0 z&?T6v0}}KcU?yOX?zo%}qiJvif9#k7AR~;Jl_0eM*SSbzVQ*+ejgdqMp*URgSa%S& zKe%HN^k;%^!-1?|yl=hYLA4DhAar>d`hx8A`uuO!JYK=*HB9Ice&6A=;|!Eu4ftnk zh15S#n0{9I5VBF(lG|13(v>{%!p|!NQ1R4em%;UP`@Ei%0OF8r3gv+J6Y?~6Yt2>k z5}BIWnZBw7lqo57n?tEZO~i+Uc%c=@#+Twq9W5p!gFjWe%-G4~x@SIJxGPZl*iHDIjkp3J0ZHuX2o z$D0aQUSd3%11IKj*n`$id>1>p7J!Kq!7QYkv4KTTe~28bEmUIp0eS@>2uF%jU<5(>a?!@9&Ro=f9iWTDHZBG?{VC<?9Zq_8kq_cAgE>&uhmKaE1TW`Z+!Y|<`TkpuSa;Y2b!}^A87C@)!jG=h^_k8}B z67$g*kyi6Qz-zB{uduVz`g>|!c;BG|7zlT!dojVZnPc!KmmY@ux{_E3KTjk$1B2&T z33w1=oDVdI{(1n(;o6=uM4tV9;bq}>mtU*^KasWrHr$|d?8gvYu|RqIN-;$Y?IV7J z((4EmLFQ4eyNANI0qZn_6^mRtELbC5cBCd>BJ%;3Nkw2bu1e}Q^Bv5)8- z|HXEX>(TCJHthb$r4n`oUaY5xBatv&#JbEozUkoMN3J{7uhA}w(3`EdS#fP0Kg zt58txYIHx#BMd*am>~Q^?EsD$prZlc;Qs8i(?|Z?Nhcj)*#{?r7Q%{h0;x*()JF#R zvkRi*z~}dZPtOqFDfB|44C*jOl>*k}0?W^O?BTKcDgK3k6y}1O|1$Z(n;BCkm}(wq zssXa==l^xfNEQNnjp8~Ag$j~G5)}>ta`XZ)NQJ5OV_=9Es}rQate^wT#H;K6-~lNY zG-GRaJ3J@JWq8h|zZT{t%!OC4n-X_}Ygs*9AYhB?h0S+HYY@!nuI49^7(5YKYq{`a zSbh9S_8+YKKQ|Kp>*JwEv|s-lCCSJ*hz0z@nLn(@zR%qI@TOG`X`j|_6cFt;X%0r% zRHj(ol_y^K6AR;yTK20GN(d%^@z^O6jtU$Qh?C86Al|JyXzLCu*(ufb0)gC#PzXJ!paO(nh;p2gAb%<14%_P?1+VCQ%7BRL+Y(X%A z-euez3rV+8mUu>{5?@(aL@>l2Ip5I99~)G524t-#nqR69YBHUGsHo`bRMct}rDK?p zn(F`W7Z7_0QtjMk^TzI8)2O1=WFAfYvmc6aXx(n8(PHWJhj_1N{K$0A$8E~X2euaz z#Z}pWtXvGv1&ALhArb6y^#RPdD1Z*DOv!H~)-sn4`sdD1;;3K5_Whz(&Q<6$6%N(C zu(NP}^g#gm>oWYtbUzr3!Kywd@^5@z5Hb(`&k!1@+fE|k0;oHHCNyAYA)8vH+TQd8 zjYOZ5FLXYsHJ3p>rn)bnZLzit@V@>N2M-``&WbrlmJS;F=g!)k)J@qOiBto63<-Ak zl_hew3?%iJeQ^Ctq?_SS?9<XWxyH`Grz`Mz$iyZ z08}c(=dVv7uSIKadoMFdwHx0ZpjQ?3o01o^bugn7Q!FaQyfEmoy*$ZmX0 zlV&-i0sY^0YATUr`;KF3xKeC*rNE2)8>wPH2v@8z8epIqf*vd|>#kbP&?$XH|&H%iQ3d__H zTOY1b=%;=EMWM5_bpY$JdXUB!1bKlh=kPY(o|DL9VIfLxWHszwUorKi`JbwiJ4S=) zy?kc8kpivKKB&*{HC|pFTc1T`vDMs!2OJSHhsKp5Bpw%dhPMClFWj7H|E0_Xf;ZK8 z%kN52Pk06_7qf<_q`)80@(r9^Q~q%8rNo&P*@o0P<=)`V;62vJ%q~`x%q)ha;HeGF z)C+lPv5lFG=nd(51krQU7%6W8DaSwT1Jz-^&>orNUz+gA4eN!MHN*YUnRjK8F#_e8 z7|~pY=9Iv7qqtj8NJzHDwrOS0vn@;8M!55mwcc=(C6R44+CaDk@jmmn1;RVUAV*>| z=AB3779p)u_|wi~dI$@J<=5D_ivgT}jxiJehW=1vE65G`eGj`gejlb@>?^(0--O*= z3b%oUGJ#Nq9k3!8V`_xfuk+k?vV`zN}Y6SBZ8j+=L`fP6{2 ze+VXmsVYDShGthRP~zu?pBxX-ut8WcbehS)eDrU9!BYp=XOAMBGjOi3W<;NJcH z=GQqb@CNgYJAWh;oq_f-9Im3C-MYnY!da~4|9eT1O@HoxgkG(Vz9A2RkMfw@W>C2af2k=vKZEWz;Vz$oO^5+uDhWd~FigUMGw`q5mI6&S0EaEf zGa#B0sSP4M_Y&(g@PGn=Lzq#uM`wRkUpE-FVp(9=l$c3J+dxeD@-QVlQ4KxuGvEQDcBC7=BR;r~zMCNF> zg?rWvLRkD!2ypOc=QDeTEm1j1Bp113WWoygHh28Xh=Yl|FCw;Krp z=yX_u&#e8h4Iq~ziE0DQaYT3uW6kct{WHCSrHE7#W-+OvngRHYpw-v|NZ_SJ3QD4k z;1s2r%ZO#5&|rxY{%D)`*n^6IZEz;0UW48U=4z-wPONvZ<9^Y21CC{Qp$9iJG5m$e z2Oay$!*voriN>VzwkEa$JuJEbXB+7IpZro@iT4Hj9m(r4@t!XK@4+U054LxhkiELa zSm%~)^209Ft8D%O@pH%3Ihi8p|9O!5FLxq_IWTykxcZwvjn?i3H|D<9AqN*DBN-E& zvu=$7w;I`Zp0v{iSs~(w5jU=kp9FpS@sGlYnZErkr%h6r0TV+(1pci>rGKo7{)8#= zM-sv$?Afy>sgfs1ADRA1L~Q|@&(U^d(inlqQHV7;zNV6iVJOl_7H1WyTtveinP3a& z2@3nm2^i~jv`ShyTp&W50Zp=(F~X@%wV_)vxH2>>A5T4)IMwz0rnH(YOrL`!*0%S} zW1HcDr{Au4fH<4zGsV8vUo?5SX6h~)zK7L z3$59uJwn+Pr*6Tl1dD;pss$9W9Oy_p{ifBH9so^!NNT=3R^w&VTh971Yyr~MOup@A zAi6;&-UqJLEZ(Uz-&C6MXSAtihn}o>e!NDIWplfG{zq@M|I$??qqgpu5xN$PcV&u4 zq&)iG!1Kj=^c1ygas4J`6hHVXeU>s7ZX}U_Y|}kA%bv72ejKU}@ke4vs37^H{%0EC zfjXrFFs58_H7_QxxPW7syz1=0R@S;4C%0o)p?Diri15arrZsqLsQ$c#4qs*d8`E zQ~D*Tghz%9W`QVOTl3(X)Yr5qFYF+1fBWr`>vUpEP1UUBogBRZ5N zdTaxqVd3u;LlG%_cTc+=^|;QY3wVV~&~s)#Yde2_`HtJBJHVJw3Q|yW1ICoASWRrUq#MC&}at%=%eW&KbhoS6$RUeJ>`} zo6o&T@l9ZK-;_Ii<==n5m(%Y6sg=I73}fS@%$FyykSL18Y-PTr1&X;}_<>F8IW?sd zt5^S04`~>LJr~Gk%-ClM=E@wVXc(?pCEseGs{dFJ?$qG=mZL35n&d{%f&T*f zhK>oHUD7|GA@KH%Aaxctog(^im{p!h_^!cx(}(Ay#4kZbt1h(|G(d?2mBFpJBa?Jrmk19LnH6i_&Z zoLObj1v+zO=x(-+%_l88aC0q}Ocs}x>1iJdIh!I`ba&|K)ll`7Rj>)?`j@;f6_T0R zFQ|2E+=#BNi{sMT0S`TWPa-q#uu`je^D;M}=KfH{4vCQJ8m;ZI%*{};%{vcbm`}d@1(MLjhIt>lC6Vd=2)aJnw?xnT$tU`6e)My~MTe!@X?b-KIPu9w zNYU*ocHxY%ST5+T6p=1>jmdfaYr#xsZC<-Hkc4fCR!-f_%q6C_V3vxocmi0`POy;| zK=Cul79HI{Sp<%`xowUH+;kBS5S~-8pqMZ<( z`<9;Tm-w1$-aJm4;aDk$Of=mF$vRFBkRzS;^pNTwrREDROv)_9=vlE+jh|0t1j#-q`zW!OR5cT@S#ZMQuPRU$yye- zd_q3CMVv?EzsSK2^$kstad7H>BeRME&aYo7|8^o3aUxC#8II3gA1SG}pJ=DV_#Bkp z7uxNe(mQ=ril^n&U{O4Uay8jZJOiD#*fA=8A2{N8d&en94SW8O*;n{_Yrps0{Uh{r zTR!Vu+LNVBiJg>MN;K_Ou4Vmh3cFzte{PSf z?>rRBUHQ{;EcSAEnLm5}7IfB3g8RFNYd3Kk3v``l6a4!z_jj$%Q_upxF7yMT;Nf+R zP3prq?9e=`^TLs{4+RJjOgYOmgvc^%hzNUXKbLqwIQC$%e=7yxOLT2)7s#4QE&0c{ zWAy9yR0h759mb5ViQsJZR3gSd6A&J!;;Vu9?=90*wG`4^_~HkAuM5)ae6Zayu4@LY$Hc zihbdTrkUC2as5JRh&Bm!Nu(vSM{MfPMD8=OromkagT@vjCtf)L5YrRwO9v} z3l(v9&pzge72jQc6llmKMfOR&BnKQPgBo~eP?rz1+^_|RF%qrRI-q*QD={s?t%E03 z!tbObspX=-tpgD0&l_?_Y&nHY5ES(NAWe|V2{`9ILQ7g0{;_HiW}$04&^PEX)G9XQ z7f#waB`P{7VrOW|1%^mN;jUN$g0$;^$f!I*UzZr)cYwqBy22GjLGyynij zss!~IyeYCUF#(Tv2pXz@SM;xciO~q$*cwpMkD?F~;4Ul=`>P{n@fvgwp@}yP!v5yC zfJlOG!SC*Br$}J_~NxGN*oqLj+kG;DXfyxrv z_IlGAp(X;hR-dbwDVVSa--18N0Sg4@YhmYeuC;IipFlykoKQt$GKspNuNlVd+_jz+ zULG}OolSCGVKW9z6LUjMWpM)U#2KQTg0ZtgFsqMm!DDHrg>&Y8M^C0&u6RilgwhRz-+H8&n*M5-YbYmUDzTXq1kWgZv3?Bt`3(u>b9}i^f1TzCvTxXN zEO&%i_?Mv|uddVI>6W+h@Szi?YHE11ql_Le2gLotcLwx$IlV$v#A8BpT^MgCX!luq zA!EJZ_Xr=X+Jb!NcNwnMf`q{ahwg3NpW4$3N&)roBN%+(p8xz=le4O zb1_8;H9Ra@af_cs%p2boVx@e&e@IaV;m&=3TEa{xrOPT-fVOyQMNXeEOkxOAX_aC{ z-~(NmpAIoi@W4Wa0^KyRf=Hl#<{_PO1HIkKWQnume$Fi({&7Thi^rbnFy?elMk7zE z5K|fIb46~ikbL-r(nYSXbqkB5%z;GJ+1)YI8e@|+o@e%oP}N;?F-X~%jb}ZgQjuy~ zN#+KImyf?eXJT~B?KhbV99Ms*dYTJk+KLiJiSmOCdL6&XyKB_bztRm0t-S<|gc2ck z(5(qho*|<;E`?lYG1Ih(YDf%NJ#N)@P{KAI{G;N zw-fyu;`+t{D;$XXGi z5;t6y!S$dK?Z&e=*6Cl08H1`?3%+7@cu;2-vVXtOpml^htow-Ne4p`h47g*6H%Dbw zV-VHMCA7KpKG+sJGq%P~nuNV3-XzRx@5qqZmLbnk+`Ar*S@r;j>>4s7suL4#S%x!K z%-n}0`&UDJZLx&H!+`CQML=PkpCeRaDdVIgdb!L6;xfij;Paa#u{0}^jwQvvaxvwq zk~|fQPBn9)E4yqm?s9fY=%)0?{ZzN@@q0ngZm+aWxzkrrUV|3Jj>+PjHNQz}+iRN? zOBu2Ty{h;R;o|0Mr|{~XU7BL*23n8YKrD43YOd?y5Vh;vdumJk5z{dDdBSP(dExA00IGEqYR=;I4wwOu`pOwcPaWy}*cs{%|K(gnxHNAadr zT*&289zB5lFWVQoh)j{a?71gnmr>QJO}GaY;>O*|BN88B3UY4rVs*%)*j0 z_WqTG<>dMT`fd4`2ZAjxfi|-8aybo@ND^jqVvAbpgDOI_%|QX?R>kELj`nG-Qn|dm z6j5Opim-Vz_&FX0-j~>up#qJDxbP`e| zEs$~9M7NwublQMkf6$dNS0fLdxs@`|l8SdjOWR&y%R+1rSym09HcMzBWx0sC0 zNbPN8$mB@fjYm0)pBU7!M4{5Wiy4HMvbcxarYqs}EIiUyleF2SWm@*e#xjH^8c7Q{ zH=rwsfdMH?U_TuSnzIScZd|E+QC-1OHL4PbT2iht2mV<-5ld0hshwxwq6kU}JP?GP zH5jE^H62^*BiEs{(M^?-e>{PYttEk^ z6$u8B9x0|s^**-9LHm*Ag25h|;%*lb4X+~=rc3T_1kPyF2dN4u6b);X7PQnD%efEp zVM0LlRA-34?e$v3R));PnWPyZ5xA*W8qEAuhSRb%;itt~$~Hl~T5Ll6KdCB^i3oLR z<_8NHTo1MVrShSJ-sLrKHJRWeBJWJ)e!jx3RTwSoNN>c!NEXoR$Ks(NdWjN9^rqB| z+(0%l7!b?r7zP_Gqo(vo95*dB)z_R{hz=M3^@a{am*I=wAbJ%`4L) zFH<1qf17s0s3$F3nI_)WOl)c$kh{mkcbkXE=Ris{khk}*3&kNqYRh97!G9X+V*z4+aZC2FAiPpu~7$9y~_ADZwF?QAI zT7w+yCM%46G)ryJWB2f|*lrCbVmX#Zelfbw7d`|gbx9V~HM(TRA^R@X6ky_>M$_x) zgq+NmH+cQUc>RScijORDXaR1xyG5*Vg;Rtckvh_%cIh7cU_z|P22OrqnC-G3A&dY)$7v3ri3^Km`2YM-pP-~Hxlu%Mv>*XF!<0NI^_CKiL%zO1yDFzm4k2^cAICUyQk9P1$m0N~{T7 zk^XEF*=gakGUUi|shr=_Ds&R|T``;37UoH}bz@@Fcui=kSELKJx;qoUKdwKJ!TBS! ziTU`u8<(giRzT2&I*`{>WpOlXkKF^EJ+Q)?K~~zta#t4Xuya+XCw7&zg&=z+tc3L| zW1v{i{YRQI(rOWu4$n?MM12diDB{Z&rBF47}iIYG~ZKID2mf0B_8-HJdl7dUxn9`I=u&?yJuF9)OC|iza8uS zRCT0lv@^a41UF$LL!#D$MHTZ=mR`H7&uXQD+LWjfd{NV19=r~)>w}bHUX;?&1JeuY z%Zfe``BFj);s={&Njun!QAiAF_V5nNGxM~Ae0*Rzn;eIGV3FcekTnwPvcV8(Dg&Ce zOCvX++!n^mqQX?UBN^zQD5af5)bva?9!Cq?Z`V1zuI|??@_NhYdo;r2qK9^Ht$Ag_ zcBnpxX^#mDypd@n)lXl$X7bl5ricd_wZ;?ZKlgfy7d<$e*GPY{M7fJ}ai!GZuAa;B zGtlZzqtB=|rLaDW+;%KfZaJ6H>&YycgXH>*@1O0Ek%*tdm{fRyMLB>z`)uTxxti&)v(Z<=xboVu*+g?A(M$2jpxi8-DS903aDOh zdXxB52=qX?a{=;TaQe(RhP}MPfv?yD3Hb6AUx5G1)$39xbvPir?`LDP z8-85In<{U$F7d$=ouMeov)J8{b<|}lZ$Nert1S9jnuY-rY*sT{=!2$Ji+*AnZAIL&JE6V0HS-j@IhIH?YSRFi*SGFt5qk=sfT2a-WWerA#UVT@=-R;_an1j?;g# z+?l9y_Q7{_1=1WF$YgQ~t>1BnlT@TPVpJ7bR4ScZu8i%C0VT7FM{U1$ByOc!aa0a}({wMuEc4l}c_6YESyn)cUGI(UqbgU%obN8$Zl1fOR@q5(bUM67 zIts$hceSpbH4m~uV{zvE4q2xxHo(_nHCwS&Zge|$dgHUGApt2&H&&>AGl8ENa0wJc_eJk^ts1Vq+&0daqyRVq9 zt zAka<`aeB=>gf#HuG|ji6DfF*On!ZpT&jLK3O`BR`Ct%Za0yVyKM!wA2S<}2{HTokh zfMWl$>H11!mGT7Dsvn%7^F`+OOWPXRL_49HOisvu^}Jt{7MD4mY-O&*oZ+lQ&e+Qx6|RSsI!T_OS?9{n(&b6UwtZ>$>;}^ch|yM6+NqPs$N&JS!|k30pzK` zgrZ{l7Si;iv09n)sQNL&3{BpufgF7vN8YJ6Hab#QOKqe-$s`{5ay*cLFJF$IlUlNP zAQN1%8@;h|C>EmL+3v-5zcm?qxbQrF3|VP##NF3q^+wEdB^Xr|1Oh1MgG`x8b{V_x z+XKWsd|8fPO7KI9)9JbG1f}}m^N}rXi0y`2F3%Sa8pK~>GExnP>}I3AypYGWoc3_= zPU{N1t&xr7qFPVSXZ<+QcJT$3YM8VfXBwJ7DhR3sc@qXLPi;{N(Di><9DxX)gA%bn z;ETK(-#+A7C2P{8nGBkh@#yV${l%X|kp2M6IUyZbedT}Ip=ZY!Jy}9f?izx<@4SqYo{wRpSpUS3VeEnJg}$f zQQHr%sbJ^}wiPl)QYHKinjR*jNyqT zSiKqGINbfjYD2xjcfr2@&KmOIPs`1#u3i&~wRj1b#@d{PUfj;mD1JxTdb|E~LZ040 zeO+pz)9SQ9lm3cKzc`qNEYz>xI;x^R5EMMbwzFEUB-o5gkZ(6=szM?CPA9%87&1}4;>ncV#;=3%+3-&Gd%I~LF%JR+GX>Muvi`ble?Po1R6 znI07i8Wz&Y8=fn#@0gJuFYC^Y>P+Ett&q`??lkH?VgGRVE8iYFVZFX$lQm21JTf`( ziLb`p(!J%zZ)JKkB9)}I#|n&_eag|y&prk&y6^it76f8XMYe&azm7-hoG!hJ%1-^U zhKS8n;TT_kM@;JhT9K#Yi&cYXsV@Erl77pv+N^bN)6Jtc8%KU;xS+SXKtK3B;9z`suwckvGd@PQ8U%Mq>BSYcsS!iE#t~E5SpD7LZfh3Foj5-ka41o_J%(Nk;XLQw2WQLgz8rk$F|(bn;XM z!A5d5WssD`i}Ku6QypJ_GBEK7J}1SQ;QwduO@nSruIj+^UX7A!&{#rql~hI& zLK9fnCKPldF*VRKU;^503`7w80RJ!$K!hD(hr=fL0TCwn0R%x1KzB2UA0X2qP+=s% zfN2JeXh1?$DphH&DwR}|N;SOKYpuQ4&YgMh{l2Ffh5hAw_hjZC)*doXo^$h_dq3w~ za(OT>x|mPtKl_5jjnXUwx?|+zuzwJy6^&JkE#`kPJ(ovKtoT@l_GUZumXne)Imy7Imw}Vbmq#!6Cze|V;tg0MEKRTLUUV1sgX$i_92ds@@a5sCx^Cm2%D00nNkYxDgsLO_BsYz?$UFp;I$ni6Cg50dX_7V(?vm2ByuH)br^@ zaiQQq7U|CYl}DISIVq6axq%7M4T(~ z!xtKK3iX)lN=fD>^ehe(1MM@vk2X6OJ<0*tP)Z|58DquG8~fl~G9p2Ppf_z)&zIMH z)}bd!a9x_uAW?s8&{_s~b_OT|EBSOSJP5n&m;Atp*1TRB%~Ji`QY<+?i?0m;y&c6y z6n&4l{I!hoGs9G$c>w@l#6~QXVa>qF=F7vH-V^Y1$-uq~i}kcfF7Jo9kb1GT+=H!a zac)4J*6kg<8R`o35q({Yq0DP%EcpGR2%*%OF9y85V2p8dGDoXh4=FC@q*FLx@;cM~ z4$Lq)bXN(%;6VD2GIg%Q&zaV>aATJ@4Rrx-!pceZ+iig;;nlEjF9(J3nc6^G#JaiZ ztRQp1efDF>Ee@2N~TI*yBVhXOfJ@>m~KclZb zV`YTs?#939SVd&!t7m7CO&M0oG<0jOikByO!>qZ(Olh$6IamZneSyK|ab|_Tdk9ld z4xkiB8|clSyzen$Rmkq)CLTFqDG5_$PDrsANO6ogDfPT_RnDx$P6#&4Bs9UemEI97 zTT(V=L((LL8dJZct@DGzwuhFR##-lYVrwX+X~ATu>a>`Ft8Ge<)+G-itn^(h&f0@%az#_ZhrvP>{ z9sZB=6B>5B<+A360r%Ahp8ligxa_x;#gmKzvbiLMbol@uUQNC7mQjyrM`0#;$oQc>z!ls1D^M_RV^NQLheidwR>JzHsPk)RJ% z{dF9$Mnb41rz7~+iPlNZ54zl}qD?Jv?@ivax;ZrGD4<=eN$Vs7k8B1`HeVjue4kir8Q8Y~>KX!> z>1HNZS1z36g3^EvHMs&GRr;#kWMfT_n}jangTfzE0(*rNa_&x|jBVT5&!}KgE15i{?X9FKynmNuO`W zEI{s_ujLu%K)t3sU8!6#7Qda*k8K{nS;@X3lz)8F(gn(BMbx=!i$kT1l|(+)Z=mu0 zcH|LqlxOcVD026B2NuXf3K8!ZVfPpHwc9pcoRcmRK8DRg?77I9vEM7N86A<5 zcr^vWIiHOzCE0|)usyJ}cE|7zB3eC;6>sNVe#YWA<8d0(8n^Yzs_@;b8sKhIujVVC z97GXq#{tlNF@Vf@TBkxtPZ>&+Pr{(^&}3u%$V^cMFIEZxCt{!spTL@OLFvHN5!~Gv zsl$?KVQcB5n}#IQ{Ih*23^8|u0-@ol(L*FG4HVv=Iaj2TAKdgwYCJasQ&i-0$bk<3 ztV?l^vsBr4Lv=?F#>@|S&I^8JG44}RhrSlps; zi|$k%#<^~?MSZVr{k$OtGv{+)T#?6itRpsjAcietdX5oCAF0p?{&URq)D;b#l#>iR zN*OrWe0h`-e`0pd02f4-brB9K8D5Hua%|%uR@dCI%L_sZ@Zx}G+}ywgw#`B(@J-=G zk<9F)!y7b_Qb!dCy!cReTqK6TEDs^dkv%a$RAEkhJ7Iy~#iy2`Pto;eETpXyXrJqG zTnd|JgLMA+Bdjd;S}|pkEk2?MiewD{-PRNq5Br}?Fd`+&B0C35$O=*1*-(5(`iHfdxm0Q${OQ2LR$VcGs2wseTo9c@u~Jex1J#o)?bR}qwN z8X?7gP_|aVyJ5y*_h5l* z^{n8oZtNG`&Xb2Gl$^1Gz+OMcO3aNup-7w6v1SE9M;ugVTx|RIA*3oMiR__BK01uE zz-iMmuBEW&&}EZtGwkk!zX#&Mka%@Eswk=>VmLDQ0FJ!O7CIcQYlwQF5FlN)J6$k2 zAHihHe@d8Qz81tAXlVyfninRXs3FINw4;iwVUDnNu2joj+SmiIGwr%jzRiSw*xq}E zF2wlFsOZLK1KZqDq62J)UtDvv{vZjSi=>s=Fg6lPRg}nCNd>XAsFXY>7nB$hkF0@H zb*Y%EJjHCRBm#Y(ey2I_;Rn|e>7_rGoTmw7&B%twZjH2@u>uAzR1+Ydz@l71IwznV zp8vpsLjR!1w&ZIjMf0HLHe~EWq|A2hyZd8ZHS%t~$_!-78WpxcGPb#E-}I^>z%^9i z?8H%0YV12FhV`&LAda;>gP-(HGVm~D;AHdVVMyu;wT2ZJRa=uA&to>$T{IK&dG+NY%C`!scIq;j8Da?{MpJbPEdkBjZ><08aLu-m#^4VDx-oKH%Q?3 zj=0O4iCI+=;~)#w_4HU(Mt{UR&c?`4fh-Ms6K}bQL`_ny=e`v|r&yj_KE>>t`>c&% z%{T%0I~DPed(n?*RBUK)ERA3Erb~OGOEwsj5AIkw`&!D>He-NVC6Q6>%2=AR6Biw= zrxsvsz!Y3>{=4Wo@i@PlPq7lw%<#lG``!o*DO#R;au%dGb<*(+G9+`prCNoS{m{#f z0!w9DvW}I+-*Z^_9gWg;e(zBwX{e9Z5GBosZufdf9%^~s@8|EcIV3eM7(ZJir)wxj zV$#RK@p#5q2i+3U!%>8xL+l{c>I=wtdX>ChC|AV;m4ux+L=#9t-=vFA`LTvHpvn_y zZp)uCG&d~Mye+r}i>y?{iibR{6A7nl0BzzQpXEEt%_S@%3@ha39JMqH$$1|(hy0+0 z6j#l$?xq9wZ>Yg83i=`~`AwFU>pT&ii(mX7e1Y(whGHrvXtB{9o>D!0jJ`0X$3FFu z5za?+nHv@RhrDs#jd3P_jn+PdDvv>7Bk&DNURgz>KrQZhX)RE9~hl6 zdyeU87dRjvSaTi`wz;UjO(|d0PAdEA`8gO1W-b^rO2>%tBSLr~5#&WO%FnKbBwUsEL0 z1rswa(u`xh2-8An^ONH!?DG{saRZ6Ajii(-`;g)$t0qEs=V*{wast}H0RjH_=9aR$ z%)uF6=jw)pjH!&cf($L0OhQ&&beT$>rFLA-gY0Xubz*!5Xk-Ex zel#4*x;dao3;@`Evu$$NG1`txdkFR+>KNP5@0>x2)*hfFbv|z=4-`0T{K)v|S;H~8 z&w5uXxSo?fm+8guIb?YBhMl;nA$Qq@=Z7TYI`AG_~$5CB$l$Q zXbKLLHv82<+r>uRXWiWF+erOf8RC)Q9ccS71Rr=yi&Jw-F2+s&7@_0fXZ?`QRU#&r zNviX$0NO*Z&Lsz1EE57^9D!fghe7SFeV>eX{{BH5663cl%9&)w0N6A6o}GQ?$v`~U zR)7(A|GWq~GfdC4KBSAPvKvR$XELz4$)fd1fjcXZK~o#e zii-=tz$z2v$5iP%qh*3-93pY+7- z@+UrFyYz{V7w7g*-nxDImRq;mKl#b+<{LkP-$JqFk^72Y_QI!Q*N@>=dazq@W^v*K z;=;E+V`(hus822W+PUljPlFUsc{SD0N@Lnk%7G*TU(_S}(7Gakhw0!PKN_|lrjSlx zA4CRDHeVh@@=jDAx(w((VZE9pyzT+8a?VTeLuWgXa>cey)H7w*e)lKZ)QFvV_WdfL z7N6vC@P%gB3XE{WRMb-7#Zry*4(%>JcgDS!Rp?Vfl4SI-^)MVYaIh(3VXe6W`{8`u z;K(OPNEETQdm8&~FNqWB?1<))36L;3hz6-Qh18verk*e$ljG*>`%NSN6tOR;5yOZ? ztv23;JGoob;bUu!8^A_nGu85baAEfDZhYp(m=u)Bs)tvH^(Teu93u~-lwfY+mWq}} z&I(42eq%^N%4zIEkF>~h*9`B&lX12{&J6nMX}DK zbcmjH@!3ysL9osORbAfXcA4I$P~8LvSm})hJqXK6{b1}(MVBF@zRJ;bq6yzqP z%td&U|D^4r$3AAe;KB>Gdp>*5cF)~+Z@1x1{@r(d2C}hc35iL~tp=#pdAGYFrW3Rd zo&5Eg;T-7UUy$njrMy*TD>|JY6h~>{ZM*!*Pu!mM{HwQ1pYZtYahG4V-F4d?+ilpS z`0)GQzkT}SHwCU@q2tXCI{HCkL4nb4Rz!;&vPnOfOBHTxWr?8(y5e$h;IrvJ<;{G% zNP2WVgxg~;yL5Z;EC2EK_@_L{qE%mvF?z}~pRWF=Z@OiB=b!$?cIT&WgJbX|oCsOr z!dl{YR)MufbE8oYH|e|bKm+J-e0Rqv^(kyWAn!GEMUT8enDQ*jbu=}9K`$E)$N`4f zBX<0mpZOWt`u^|#{zuH_iJ{Nm44iDfeEyEjL+07}=byh_eDTHGop;_j7NUm?{ec5{ z@z%QOg^}xMGW;gQ7A&v+)Um|pSld=O5No~KvF`7CvY}hpxtY%x5+W`%sj!b0Uss6h zM!vl&c*_R?ml4G~Q+;)EzQQ~NQ_LxHY6~0<^6G{_3@BNl1W9PbeL%zk-BO{Ey*_}c zYdM-YPrn$-7ObStj!<%SZ!mir3cUHTv?%idfaF?2IRYr{5IbJ?4Za190s-NR9=AV? zGW59V0{{8rh6gX?abq!Dgu-G&w_&nlqpW$O7R7IFvM1XDNrC*}6mx?&s!=$n;ve7q z#SKn39K7(28ib;cjEjYJ!XvctgSLvJd@YI4k&=i5~DeV z8~tHFka$BHxb&1aRdFlZKcgSE$m7eo8JPu91+v326N`5Slg8&($#X=NA!_5<@|RxAH1O&5$h&e zTp}D@-3?h|(08e2wMg zEPfD`UQn2vQN^2j(mk`qwN!L;#QD>(Num~CVJ!3&lZa%nU>3mS**gD_Ne3=P_$5c7 z#K|IAs4)=q{o6w6wX#Gp>W~(6V$z1pMNJ-PvF^gg{r&t8z0jo+qsMAzzf}jfXh043 z2ucl&DjTw={6d&A~8$6p)o~1V&+8#ICpn5WM+_ zd4h@ZtQY=+?dq4mcsmdG`FDQ$_U*&hUaw8CPh%5_<#Id$bJ>%gus!2>S8bPLbLJoa z?_aaM|1EFdZhX)C%5O9Z+Ii+^>s$mYHsIjXdGYLze8&9c6dsxd5gwB#rbmo?5SS0P zwE4q0vmaG;B7e};d@vcpnXg*^QeP5zPO*x;RoV`Nv`1UfODDR`llDml9>ENpY`#2* zWM6&t)!X-d-}h~|-+ue{AOGWjoIVM8(TiTRee*Ye^Y*M~J*zBy;uD|Pe(9HfX}j*a z>xy=$@lXEAKiR(PyS{7t)nEP9?N9#XPbM)gM&I^r-?qK-m9N|`yzoNt=)6|5)aCvnxHsR63~wRg;+J>@Ht^lj zjYsnP4UzeW>by=CdvT%Yx?nHaJuKVQmgZ`2DlwWDNv1TTdvyUy2(fJ4+TcCERIJA!p}iDQ1JJ>@6qT_F))QKs+mG;yr7J8XC zd1Z!m`*L5tQhdh{!iF&l>oKlA+=1;Vf5S?(P7}hTW z@v<{8)-|_#2w`-CLd`gP*>}$4yo8K_6ThmYd)07|JpUPcSkEJ6@e0|+j{+PG`9K|r z(zC}u?Wx=2ufWC&l6LDSZo-oyw{Q2}bI*4E1sCeck;|`mGM>J8vT}OM$38lM_O$FT z=jmM1$)dAQlObn45f{~v6o(pasE&LF?YS>~(RS5~zeqX0{+;jHK7RcTisiAFUb;Q? z%4coQe$flSe~}=rd&@iINk{VrF@beHkvUCjnLP5KI0}^G6Pe(7lA#{0k1=@m3%_uC z{wrRt@wooo@7@0HEq}A!pPQD>)6F0G=yvmmKe~PJ-G94%;g`I0d(I1=zdirUzEs#Z zK6@LSg8c(b}#pFJ8l>FN7{y(Pkj^p))U;gz8;p@KppYO>0-Y@^g zI@FU+@6hLi=TR3tX>U(^+S9gg|MqX+e(@K7QSWh&O39@-Z@%YyzGr*wYhSy4^rJ_g z_ebIU&&2b6+W$;3KP0h!?bm+o_9H*?BikjHT%uR)cmtgi@n8L`f2EC=8*aE^`)~j4 zzil7*zz4P~uDD|R;UE5CJ%w_V6TE1@`qi)2h2cH#dC!jMzx}uWc6-&UUbWqWi{79A z`JZp^eCIo5^LxMdd$;F2=Q)xm#*hB!k80!Prkie(58QnDmT&o%?JK_GD|Rp+EkeH` zTh{hR#3f%qx-nleSReK3I=#({iZ3kIH=p+W>Q@Y2dgJz}BnyLR9g`C34_U)HQT zjfXBV;vY|XzT8(05Y8DsDzER#vfuv!OE=K1E<0@Sit4MX`i*AZQm1gBMCi(?o*Y3ta+NkPczkma|M-d6;g@X4gsn!cSe82gOU&*@ z)H)(}jGLbp`o;MZw`^#^Y0fMAPMmS`KchyEj*a4>slfm%Vnl<^xyaG*g*q+@(;e5z zCy&1Kp9?p9jw{pVUpl7G-GJ54mH3qS7_`OyDouCl1&5i-LuGZHd5YQLn`cOf#QKO= z%SRWdUG`(%MXZdszjO{GLHhI+9QCCWKJd)}i*VJ7Lw6@Ab2Q?YUmStMudopMn$DHu zq&2(yn~4o&&s)|CO7VsT>1LC2+Aq@GUTf*pfy#aru{F#~BaKt3P=oUxOuW1XbXwfgW4T;z5s;W9&_X!V=Y?r>)N*vfzOgM`)-g+T0TwhDVuVnRoZfNj0M>&YBX($UxE|n`2 zdL3@cUCv&XOsQx=apa@kN8jaAiq9Lwt90b^ObZ^I&cNe23kK28C5}7&V~+XU4C6K` z-Q`+A8Y4;Fq>;}2kV?zU&qa@YtTt9?@}t*&V7v8WpV;pC%xCn362EeE>&HI6eeAmH zA$taLPuw1J@nd3rg1pwLwbod|H_-W%jb3yQ{TL540V`qJMUK>wo>D?bnED(%8FLwaLnSgq zKStq(GoOA_?iqxn!pA-yj6r`MS~8T&7oVJ!lO74zw$Ws*)9Onuzht}mOJ1z_-u9+H z+1~e8Z$%7zn%CnRrkDa2ZpyqDGH?4se3%R3)!2yP*Ohc_R*oWv?uS+!c~7YI1Xy&L zMSalaCFhD?pzvQXASi*Xk)9auK_{C%2MZ~oLdI`VDC}VWA+cJPTSWujkRCY zcKgB9yq0!-_j}DYpX#{;uYZQuLt4J|TfcSt#&7(_?QUFfxao55z4vZ^@CSdOg@J~+ zDRSFww{5@syT7~r&hPxr_BVg?H`|~7>7Q;-fBMt6XFTH>+lM~%q3t6d`N%<^xJmPx z*Su!q#?9~l{_pR|QI`wfPyXajZf|?r+qS>_%fFOuPX3#3zIl89``<5H#JJ^_Teg4y z@BjVwj(5C6vfOxi_OqY8z3EMF(xSTq{s7ZL1!F$rc|1VVF&hh+HId7k8?b^Be@?V%kvtke-! z#@+RcXJyKQ=vO0GQ&=fyqH)YK{aow$l9(6v#fE~AfupU^_Xv2@MFY=lzIk_?s)smQ zQ7jvEjN(iic&67Uw+2~i%8hbp9$=h%QlO+a4^Y%5nE@c9*s?Dla0naotm|+T4;cfE zdN(JtrffjlHbS$Zp&2stZRl#_MSXGyedq@UM_)H_VAu*}tmShd^u{r?(Fb(2(?&A# z*0j*c9klR>w89zCQ%gQc2nWQ&CSTHZW73#A)VB^fj?uJQpTrAn^5Roh_G#1q20!L7 zGS?=AF==Nl9vazif^4qEZ1dEI9hqW{e}_s9c?!e^5p|o6Fc3@90x|hA24&ZW3>AI9 zAfW^P7=BJ0!_j|gs0gGwXb?2}{JNR=o<+9f{A6EFMEp{FWnHAz97JT$V!Ro5r zNvxd;e0t+^h~g|=t>$r2%}r@k*$Q1aXgo4BhM@VM(HVzgY1-TvAlAS`Kjj9^2whI5 z^FW2(pWDlDmVc5;J(Y%ok)8+85}qq!zbXW7yib}r*FC$n-#YzH3=4r9>(y#&)%y*9((B} ziuyBnGKMJA3l}sYGiL(cmpuM5{0`6EMI(^-uz4rO zdHcxwKM;24Pk-e(sdYM89J#tC%l};$eZG4hx|U=)S=lRq=e_KU zb#HUcul&Y#?c3kEUHA5P7tf7r-~KM~$ba5TzgXn=^Q&Pf+y-;bX{M!>J(SFI#`xY3 z-w@qFdJ;gcmF|Mw?|Yv_{m9|VUiLC! z{Lvr%QEduw(}o)}mtTJQ_GB!&pEpG-Wq6a9<8yM2n+Hd|rVB~GsJMNc70Vr}q3;b0 zuL^`@o5eKu_tWBPB$<{60W=J|;CO={x_MdEMb{TP)+{{1{Ui(Xp?~R6J=p-+fww8b`fmjJ4;OSGuFt4Ha*qc1(~);?bqY z+d-Ve&<=3R#vKwkAaLB`g)Rot@9FqG?`h+OK#)J^5y4qpM-OwCZ_wjqpXNGLs1~`3 zvr~Q1&_{=_njgUPr`wbpajO#t-s$cX(^%tEE#x;Sfim(>Hnm;-A$%>J`cnPi#)bdF3$}{O%Lm&Vk?T4n3al$`}VF z<$7&w)ew?1MguwqG&^B%NabK^>odk8Ik0P`U@^ z992i2RtcN4Psj6#gF^Fo*=^BuXnwV3KQX*6TiLT^V9c$vIHAt+gvWir(Dmqo=L^rQ zHuaP<;GEj`%3$J&ImjTWa-A^(DXt;OBW-%2lWCz*$uIq)C!gL&1OY@HZo24+3<|4w z&Y(ksJ@r&@p}zs6I>T|L+Vg6x1q5(BQ5%kR#M>zu7kNppu~6T>(#hRd`Iq{Nz57fZ z_EFdQ6E1>C?64cPZHXo8Ge2A)&8{$RU&Hu=!Er81Rfn!`ow*Jlc%D=C!iz5g_Sx-@ zPku`0X+1H+^A>!@K;w6Q>QiiN7vXmX9hb*KwYYI8A0idS;gd2INOOu;1^?@qJ=RWl zo7blpk5l+7Ku?gJkAL8UiiaJKz5S(m@ljure>I45JniVSOX(4ug^KxN)(-unGyE6D zb#_^4kz&37_2g$fO~2p5AI|-|zkaL6Lu)7WIM4pk*ME(EzHqzx4ZSuIHtODW=n_a+1eOG(~a+%S?({(oz(j? zaK{~YY(Mo=Kc!6-Zmz6Pz^ofDl%>u|Ikya){N~HKf{Ayi!^z8? zPd+Yp)OX^D`DI`BW!gRbtH1iILvTCvtFF3gqH(v9w%+~jdH48(AN=6P->NxRzbDX# zxPwrqGA>53NFH~8+2tpobL}kltrj;CaoscRTx$87*Qu;Z&HZjNZdoXT7B7rwiQk2i zW_?QglL)qtD#oNtLGsGX(gFANCA51Wri*S=vTHbVdG9ccT4SyyGm~_4W0FnrA|JST zOPhwovr#K7b$5aK630O`2*#qCZ3ToR)QlGGJF<}AahEc9;zPhOQg)zP&J?4gpCrl~ zpIqJOSS@SOCz|nw?!+#=Fk`Fbr1?k&$9A9ruR7_~jsTT=l)UBH^&@DU>uedc*N%E{ zP0<^7bwaz)on*R@MTm08*yd0x#*+_-A63Zr>9S9bUhL*D?CtyAixq<#Gc1~iSUk7^ z!*Px>EN93;b~4!0C)?DEwIc+4Bu*DLeW}x&QdQ#-QP~q}7|FFzd1S_5r6KoT0GH&j5Q4mVsfM4VAtuTqBXL-RiY zWj8RP1jqSTji`6uJ)hNv-gEGqDIROmSw8TNcjM`o_;mbyJY7+fo=IDZVb!nic&SeNGhMtDW3d`Tg+#uZ>!_p;nT`pDm1yPd&T zjW<$pv=LyWo8N^`j@@$C2Oj7jNF~zmE?Ogf)uYj~@~KFrIk%!Y_TPo&vh*L%UDn z>o0s|EHPHp58pT^dHLbSE-BNzrU8_3En`Qd{fC^m{u9_GG|Uyr4d%V%M_6Xp)afj{ z&}pS`(%72;Z@~QE5B}ix%x6AR8!-R*KmTXRax=zHyqs*j>`mX1#FNdJBhzy{b6Q{) z@t3^hCEIs=$9LeOcxt;W7jXW7E}xt^RG#;|=jq9mx4!kQ=lu8@%LUVy%7X+77W@@;a&R)Xq`! z?MCnl-Re{AH=iUr#8t!RSMZsoAu(DLY;}xT1l!r8*mF#I`JVxH@k8xyquO#HJxA5^ z6*4^<@G~~sa4sopnz1cwMpy}{_|%X&rBQ3_smYUHLr7DOU?4Fkge#VbxF4;f-JljW;XmJR|KK<-#o4QP6Mf$zKUD zPpb|X#^G;(n9bVPQ~9g}k!Dk9E?C@0<CNwn?!b>t}AiLr=e4 zeCgx#TQ6_=e|}R~U->V;9h)w{31P;2c5Kq{(|j5076GdKU=ERtHY;DBICl73aG^#v zUR4ZJ#35Hxhr*Tr(yWG`-r-Y7)5eSRY+&1-e)Uz`W%zU2@A%_C+wS-j{=9T6x8wJ1 zST4nrJ=3_Pj8Nc1oDbN%V{(0w!djvHG6o373`xa|tHvV9YvuWA`hWeuVjL=IWY7uV zb$shx^D7*y)aG2ueCgW3@yKKjKfjy-JJS8{hcGee4|?ckBP%zx#K3lI7Qb{nzyy zFBFOe^VE(lFG!ycPrmE~LxLAmHMz_l{wG<=KhPKL9aXq^AN4v)cj4vrXrV@zn=rim z)+JbXTvH+@;Z@kj%t0NJYM?8nthj)FaNkOwL8NuY8BOl5Nw=_=Gg}Ow!?X$mxah{ z{77tLl81bxiHX5si20uJgcCHTmuxbA#%1RTgu)m(j>KRcn|xyFpnOq>0w}BB2_wHk z0y31#7imskU%M%>`;XEtX%OAO8nGLj^(ajqj0iI%7#EAa7D%g^1KGEl>k!?0)aC~t zZ#a8DP|j@k-u)THz(2(t+oQw|Rjymk-6fB|TtxmDuW2^mzG^2qBOW>G@rRpi%(=ZZNq2)GMDYy*qA=uTiO!2T4($pjgLhO+c6S z*r!kHOX@Vh7Z21|+p^YUefZy{_z_^1+weodHd4|{GB_Um8WR6}cF(_bfx#aX-dh$N z=aI6+aS@#{@P+BZ{v-?X-aHr}>w&m14snCuC>9 z8!-G`7jC+oY`i!#54=8k^5uc&?pRI!rJ{fHZ~l$sxLAGXcYf#g@C(1N zqkj=TF?jKdU%Y(^-f&;e6@jAasbDk`Qr zn&$yXFhLfq_||+(T?6Ugm%qgsim&+f;R4bDk1vhlwH`XyfB&QGtZ~$lWQtv zp=>t!-X*}2Adf{9;gk$e8Z*g8G+5C$jyDF>$3b~RJ?86Zg{9CeOTcDaJfApc%{|RG z23ZuJgG^d`{}>bj%DVdcbiOYLsYkIfvy!-0AtdUUpF@+3@DmN$B_$f=fd#S-fBhIc z0W6TZ8sq{45t&ujXR@Cdp*-IDrTUT3|+~C<#i|I6NoBk${!pYi!i9uo`#{!{jfvL zQ}_xuH#1mxByZ9sEqNZJGyKgSQDX#R=qSY(^iQ83v9P1H40N%Ae-`7*^Dy)%1RZwd zN6bYLLp-tQn5ck^FYeh-Ac4WNCI!&zb3p?z$aMQsiIkNf)+@9{1Soa{Q1h`=9#Q&Dgg={(xbdmW!amPPjAtW&n({KiR|i zN!>9|(dGixlLJ0WotIqS94eaj;luBJ|Ms-!UA0|_zhrbP{sc4sY7+~edU38U$Dh-_ z@+I-7sBd`J-)5e|-;lvN4QJ|Hf_|6^N7?3ILSpIhb53gQARW2mIb*+sj%0Hcmkok2 z=p%}zSb4|!#^Ru($0M<2H}gdatyL*9+F_7l`c@&&aR_rJ$v=3j`M}UPX9dJ_By4JG zrqdMZ~EAzwH(rt=?tFRtfg- z75*Nm=alR7&yTm=9FIfaP>K$9P}q!uObt$+VOD+%s^p`Eu^LdQg%)(fE}k z{++1%tUF7VQ^LG@6 zdAiv=+MGl!VjI>!syNTGS)0yf654wQj^zx1AK;GX9*|EU&Ri!19p*scifZDG3EJdeP#X7_{ys+v$IjWuio&h5w@A&@tF1 zebktdCN!+B6XekFJg16^6POA?M`s716Rd3-VsR6oeO+;0ck$A`tMtRjCXYG|q`=O4 zl!EIR+bxG#cp$`BTcSACAZPev!^Kv^_Bj9D&O6t-VWptoY|h%PHw-nRZn@QWyb{~z zG8sh=z0YM$D%G5q&53C84m?XAUy+Vjcda8|0Kv@&L(ygB3=N_yHV47+$@cn{31fa< z)Qp{zE1WNvwC$HEQ@-j%D3NMNwVy!Xq-x1XopTJfLNv}~%Xv)9I~DKtq`$Z(jIu!A zm$JG#Y*>&wrY4QPkqUAk=K5Ctno0jtSHdyMhis08#eQZEXjU+R6=6`uaui^3W`drU zlNCMQMXXvOFplN(AfYv(DK3r=OUQGLfql_JmPbn5eb-&vr$2F%Hdn5=>Pofm!VkXQ z_u0>Gr}6tPkHa5w;HCv}_;r~3_@oT6ny1cLo#y}#Q<;0p#(!AcEj;&(5sEDj8HedG zUI3vJao%>*E%>WO@7k`yU(0#f*L>x6!#m%zef;_x@Eb3;pen$P@`mNvEuDRx#iTC;1S$|xYe)ivhx&8LrKVMz{y!Gp3^W|Y08h)*3 z{i{aYT=A~wKC`cUK+NCZ!2OO!zyD#>WY+ug7Sh|yFXV=AHmB8ZMNZctu zvP^6n9|*qa1je9GnELc!Q%LKIlucGVuAg}mOea!Sy6mGQDLQ#H);``Ohz`B7+*(`KW9(d;&Uz;< z0M2vXs9meK!IutbPEl7$2jxSjm+-*S9GGMp<`6@x3E5`j%VZPLBtzeMpy`-zI6B$X zZ#sG+L70mH%Op84=lLP~Og5Od)7%Tx!ePTUikRZmHf^})ILPr?mas0 zY&IsY-I|E!)`=U{l-+})s7GiAL2J%poY8YbV_@Ba4A|!K@rgdl`nabUL}JD=i5i$f1RF?dHhqKvc2{9-?V+^ z4n9R52JD}8x}T=SgUOU1p0mXl3;n1-N#JzH2BbF#j43(tTVal`c=j_le*Nf{597yj z!>yDUoe$wpY5y&LaQ8m^{6UnkPKisO6o2*UHvaYt$m==A^C32o)8mBIyl)GP{A^C9 zv|@7%X?$lqP3I)|>hJ#N>R$6Jzdp!ljc9^QOw#_h@BVfXe)pGuL;eT19h*;)?8bY9 zn%rFBhv47zP2V(GeBJ9__xE<=g+H##vi=C~$p*|c#K(3{HeZfS(a{24D7(}Xup9m3 zKmOwz|FY0~-}_!|!d!XfmHJ8%fBS_`s;uRTE3Vj{{p@FNH{N*T#-~;e724xhnfT|T ziNznz<)4*i;UjMRZr;!T{LkwzD$)K`S6#LJ$dCNU_U1RgdHedW|9bs43^#Z9J2a1W zsYUvLBmL&Au2@Yr{@6mGtXN!}sqc$#zX*sI0)@8fli|lfCDcBZ3nc*b#XX3+;JCT} ziZHklQ}>@vu|(wRVZ3`O36kCE0#ln2I0IlnN00M{VRk0zwKH3WIq9!b*~bbWJuD4|vvwOb>9PG!3%vBjyjTo8vo`*SY{ z!Xv};z(R5X9rsa_w9kInq+s|xytgt~SXoh1?lQ-yWp$3M15k&z}A(X6|Zq>AoTm0nK`D^L$2Ow1fcJO)QX-o>4W7?FH zLK$+Ca^tH>Faxc;>RSN9N}!eONeS*W6w3~ECg^v_)_K)772+#5v(Elr^Roo>@O<<< zc*S#rdKrskTHhi|%@G;v24;{=OK#72?X!)TWp&bB452Hw^Mk&#Psu(4oX>vxa-4tD z?4wGRu4|%Q>AXO&#BQxzK+!I)W6n2!+$az|fi2VRL_2d?@{!BH*4r&PKtD;Nj?Z5v zDlmqRv@@L_5b($`N5WCE*oqSIX4H@w;~ZG)P#T|a8XcFhScgyJ3YZZQOg!6@PHu$6 zQy)|gzbL7%=TV0a&@WVaB4Bk$K;sZ^zDGYDDuTZjQ3N%@Yc`#AnJqHCW{19nk5b!n zhz-C!jD=L2PYKTZAA=ROA;FxPMQ@aY)f7)x_Ezn0bGbC{eO`@%DyPBIVvFvI6xI7%){&L!na zT?L}pVD$R8zGJ)PgEwwZf5AW4E_uS^x5r#|>2~*>ci~BwTelD4t46oui4bnQ@M)MY z`Px@+Z@uP?`U^?UdiO=<@(^@LrC?u26@Myv{)Qkjf`Az_=@jw#)rO_6gY=Q*=~q8j zzTT(5cmzUX--q9ueD{CbK2>K-epG-6Q0jqLbw(#)k8Z{rIX-*w)v$;8ff{4EY`0bd}*4Geb+xBU}C6 z@BN-OU|#c@*U0ei{Lb%er2Ty;>k}{iuNtv^vH|nJNAYCy<$>o;np`CKBuOuK;qlB{ zZnZ+^sGVj(~Z{7H$3V#b`EiZb}i?n(2$AA3CD{H6kr)RjM`qG!abmG%C>D*lT ziJ$n1?T3H(hxMnW`RAos{_M~GZ2QgM#IJ<^Jt(?J+E1^d?E5OQ)|RD+t#WM$`2b{!21n}bj~3_{Sohi z26^#N*PKfm95Z@lUDjjVM_?T>Zrp<>I-3R%Ze=E|xT-ru6RP%uZQ&2dE#811nEj1X znN9iOdqA7-HwHF1&`cSzn$l~+JMEpWi7*i!M8^gkJHDF9b!b|q65gV=W)=6>T6svN zu3LH{ItP_C!7x{6+Hca7j<~CiEsr@BAjUL*t^M|9rO*A2GPh#|A?++S_hQZrUC-aH zQ(OrTj$4k5a$|e4w5G;*QY7OxNJ;T)4V=~kDfiZL!J>k57PC`No6rgB<&z0oK@wXm z9zrA<+4gUobvF`f$bp&adAeD;s3D+}DtL8WvuI8RN2RWLZO+8{09-*sAZ23RKCL&m zZFNi^A)Iot=9KGGL)TB+1gCtQrCN_pGzIkPYkfEmJPLGnv_n0@RS*sD_-3Z*c)IM%@Mk=LM`uDyP{;_554F>?hrU~a+&44;4zCa{>+YQ>DAMQuf<+QbLe^h@MYV3|KhKQB-H-m|9!)D7rsU{imisBFZ_ou!Pmqt+iu0z$TW`4l&@1- z3+#`^-xz_)UQoEw1;FHT6DPfyD7P3B?+>g`2IZ{kEqu)w`H(>UsYQV&y8RVKMnW3| zW~oMWAF1Q(U;lc&FQYxS|2~wXHeTqze}wmB1LlE^rsw!k+WTZWZC~3o)_&23+pf8K zt!>j-`$ZYI`73X3vv$ANY+sDm7vS})cs(kGn^z!2 z?2G%G{^2Y3k&DI){aQL@v`1@_U&%)-ysId2cFoTK(}l){8&Ur6yo=$K%`)E!k83TR z(FJ9AwJ#TjalLbsa+;^X>htLD#%H9chxMcnRS^_P3Yq0v0#he3T1EYcYrWlsBLBld zU2hM7@#hHF!gSLtUu`H>F^#P^QFfR~=tJil5@UvCTA54Nncl&stCPoz`qD*o@%Bxa z85gY?gBy!cLQ_4Hl!5Uhb?TEs)gk(4Pg>W7XK#8}#V0YqH)CQqUR z9AXlSu8s8z9TieX@n#Mwac#4ukcsV+Xp=MMQFb`k_R?RU(T3DuZ|7Zj{`S=8Jr{qP`a=9J%styDuKj?1AI2gv7r60YB=~73Bn0FH z?=sf!L3wPnc0-5#zF|(C1E~khuwU4ePvaNiPg1}1YhJAln7i@Sqqn@_5AYQv-pkvn zwPu_Og=EGkHnZ!Dg*@eg%|3aM0P+4h0~0^Qv$JiF!ynK1N8j`fc#7rp_Vzda@pjV< zABJjRYs_#i>s+%rVguufXFX$k`K!NTJ9Gb;?a%+q>+82*3~zCc&+wJ1DS>s%=eQgP zojT@QzZ@kFRE=MB2HpJq>hJzPV}l~+1IPTDU;ed_L7P^-4qr`*dq#p{J;Bre*ZlJM znv${0Z|Q|``)8T|@>hTA=1ILL1ONJ8|7-nB1^>cPf8u2o<$GLjz`Xn2@7{j;r+<1C zd7%A&0mYBubvIu8-W*??mTOH~r?buJW_s_N&U$T|29|hh-*nb2*>zn?$)?D$rj{Ci4n@{!dmu>$UUXM!Q!f-b}A>gLRJ$Nkh(JFiz z=F#?HU+gc$pDgPGxwhBYO#WOTA);>=s4-sg$@4(bI^T@2&;1Y9et8m6OvKsX)YC=4 zic|=tY_MZrx>~34B0G51w*j>>wM{E3hjQ=#|yUqjr?ZrZDQCNGP}xDDZrM!R$Jr}mX|!%2(r93g)N1k|3HHgg?sQicnvpflPwv^Muc@UMIM4AzwoJmQvQSCbClqgje71A zCFtQ-$!1>osJiTBVh3*8j4F@Les&3#UM8g~v8s0tjUyCvjt~Nkcmoo`x{+L5>XtYk z3zm)kvS8{DR^+Q-3m_GWk$o!;OGZWwEb>r7e*_0 zV6)x()W8%xvd9-G)x3bbXsiiVCw;%IPf*(H=u%95(8X&4$?h7KT4=r70KzjdE7pn+ zau&@POz`<;)EI-|O{j&ws3OET5mVh%7S&0XFc`f?hb~D6heVOKTzz!r;*kij{DH}`kl zcH8z?Y!X~>;f32{@TA3O@O7o>>yBwlUt3|EX@KdHWA4+*rP%L2Hk2BlY2o^$9Q)c6 zb*DvpH+Rf=EGB2SdvWi6%Z(r2p7g9|Y6Ipe&wkc+^NkTqlOemqG;AD)EGlrOmIIotUcU!=d>r0WEPeP2X9mh&z+e|y0z zUcSBH%f6Jx@U+aEx10I&Qu=B9kmfP%LzcV>huCtQGJ`|@{Pm;K2r-JbqUDp=pi}a> z`0X9Wtb4euuY3DDv@eum+V4$wQ9#5~~=P-Wm=YHVf5ggiI_$N(Po~rMwM}E~7s1_j&2@8ao5tEN%DC+(T-LtntoeG> zpL~H2C*_C?eDjy$B5*{BrGJkAS8Eh5uu-!UG!gQyx_^q|NhW?CPPb1UNooj^nC$Cr zAQiLfU-5|Zyz_ZOPXAWa*4Lj39Wm&VP`^#Ft6At3Yr_IF?3ENO^Awqjb2d}=_r}dY z99Gf9j~Y|wP9yanxiD_F#S zXTP&O{1Qny`)BofFJ^t-Je4en=u9`2HBUof4e>N@&!KO+{qYzwKDX_|+)qv3$XI}G zWIO&;dLvi{!m{fhytKURMTc?dk>CtaV?;jsw8cl3{aC&8qVoyN@rfjt=_uus392LF zFu~bOth0|f-|;ApMCwEwMLJtgL6*wo)3*n{wd|)!7Hfh6bXXHjq%H7r4kVi6NRa-hM;E_ z?J5TtWUA`(5aEV|T@>4d^(LjJ>rXn*9VsKFT7y80#CrOd;&jW zdp~}UgfeF^II<2b-K(S`wFvFGLOm+Xa{<@>%#~6j2gCNT&kx9>kd`7Qm7hgm!Gm>w^@wkf-~Rjf{g*rWfqa%6pKgQamwnNu1elt)rE-7Fu@vG{jhwF$ z1@qIBHs~{{ItMd@$_rwS*+v=oFfYJ?!6SV};r+QhRvm54)HM0JzkFz)eBp)*H!2=X z`M&S_z8aGUgY!R#?*GtFzVPXglX8-QM<)aA=8q2KnpwW&8o9%$A6F|$GFD*>qfzBUf6N#=QsQPs~!~bea3ltd#D=& z&=b~HfQikM#Ec(_!-z^Kh^HAJw0MlMj`6j>_h%r+Fg_z;o3q#R);fL8oPXByYiRc0 zA*uPDK9;k@1ubsA(8*#H+v>BMH-RxeRLoq&9h0zPY{)pZohMoPk3I@<`;D4${N^mh zQj!``{D#SW>d_~U$JvVC60S3nQ;{F~zVk*8uHn|Wz^Fmo(2QeE1o0x4IEEd63P_sh zSZ_Sil+ajp1^D4YxjvSGKw)_mV%og52J5z-iR}4gnSn29pD<=~qNP8yex6Sx^Ow52 zPFD0iD>xQIBHo4!|742pKtyjydh9vj{pM;hJG$NfH05)JLc}G0(1tIZsWd&j8IW@; z9E{7v&}VLRV~a65Jyk3As6@7i|i`bHVZ#)m=j1QcF90*4sU!m&tb&}H{smvC%kRY;^yCA=j`zum)H zo~C`{A&0bKY33m$QDOeD#Joa7W06-?2*%bqJpd;37(Z<=hr;AQLGH|F@7-?3hJdWx zdmkj!#QH*tU&uz;CI-(>5eN(+(uA%q@$ZL%SYUhH*^d&wxXoHT0?SWTB&(z)u#gFe zFlJp7*oFjGv%B$${#&r=!iD4RyY7}h&YRF7C>s$7<|e-wZDjhxHdewU$qs34=Ra~y z0a!%-iJx%tGgGSkhzI_M{`S4wEg$*F_QF?wxqbuY>Mxyt2U3c8;EyH0>rehaZPM`E z(HbIaAwZv4=)tM{6f50@|AXm!D+%*JmL0W%KtiiXqCuQvnZ|2=$!Z{mYRoX=YChQv zMbZ|{rdOn@c+={BFes)Wm(&=IX3A<0N&Wfs#%VP=_3q++jEHEoT@@w5518AralYr?5RWJo_u2aYt>fL77?x zn~0+m{tcnH;En!i?*d50wg$iAcOorf6Q-kYmTwF~B&a-AE>cicdvj*1YfenJ$udO3 zB20g^u?BklD=iAg^_>7KXd|V2af8$1>qvxPsr<-Z&_qX{x1BU&nZYG79a#K0n>SIN zU30A2v|Icu2qec%7%lL|tc^OH7&j*L1wP^6vCs`?;s%!(QG_cEQ&@wV@=+~sKSOCK z#J%_EXRGIgZ+sjtnpG&ndn=yPN|SR%8l?0_q~tNS<_lr!fU@?>%-#lbv_!U7&dKOG z?t+?&nJ~`2ac+d;iZ@*&&v_^e3Lr4+F((vP9}TvxL&SuVMP@Cm5RKp|&+guGE)jPt zdqF1Rx*ktVboxB7_kD9Oq75xZL+gExC@97`5kEH{1=<|*xlx!%DmO8lTZ+7`vf{x86aw7s_DmHb81Hlb^^3~`1oD(b{ zd2EucDb2MXaCHne#?g~@k=Hq#zLydji&$r=U3`X}26CNFF!&LQPJRgyELkz0qj!?Tf;=&`sR0S3Z4Kl=GXgTn7dmifx~ zRXpLSW9Nb)kdh-G{}cgK<5~j+wn|=3MHq(`5k$X)|=}tN@K5{QK^`M>gmd zWy6b*XIny`Mu~p)WSrT-zjTs3^Xr63?Q^MYF=UA(BONs34+*a)pT%#!P%^xsct(=y zsxpC|DH;{#&`m>=1XIiu zL4S>ka<|`%r(p2ck@(k}_%$Q`)=Mwx`hFW-aBY|4GsAfFjK%%YAPwj1bpJX@O0R!7 z8iY6+SI7cy6g9&l=Qq2yUs51=Y&!0PZFA#=Pp+JllMI|o22M6#&LvAHG7nD%yeby@ zN~q;BB-X`#Ve6{CLO_!X?J7z@UxN1WWYAcPfXR|M>fpPWLo&w!$*zU$g!=&9xp>hK zVogzh?aDU}J8on?jU3wT=AbJyvm{feZo(ypEO#K$^0sP^F4_EKEABr~doVOA0OEzy zcx~L{avEa_^(YXmCK?=X_Ty7ab3kY~p-7%(ZH#(BBafvas2?<2p}^1;FE?RMji4w* zR^CiO9)TA+V^0XW$R}c0;uCi@<4r|04F!nAY~~#zNwzTEzpAPni_9N$>$zSA?$AiCj4k}u zrSvj~1K{Z6h$GTK>DaJJy>!X>jA&O(__Jd>BHj6Pb&sk^(;NqJs`IYY$Q^8vJr6A7F%vyyyNc(F<*YY* z85;5k2J2}F_;%KxtXomJumxnK91KL~h+^dNH(APOB$ngRZS%6 zT8=cQ(UIjCcIdWoA7G*B_#83$ zhoUkOqLPJ@Hbto)d8G~uYvzobV8ZF^6nN9-k0hwoOCnJ(gR)-~@88Tn)3rPk0dG^0%}<`_gK=`ZF%&Ka_LsWD0-pG#HVvhO@O z7n;2gn9eU?Qclnudl(6SYz#g8-~F-g?#W5}Bm)nB22M6#9{wDkSU8jcufDN59+Emt z_j+0qJA{ej#d{D_J}=Oub0POdz+}5wdgs`fF7kVH>M`>@Jd&o1N?j&vc=9c`%TCQAOksgVuoRYHClIE#R&)<-f@cupzCR zf;4Dqx6!f84{_fBQ95oeW`6b3Ec$up5}!OWO#G97#9*5#-^c+uxtZZ=rn^JOQ@g>HP6F<9Wa`&j~dKe^9YHYwmFw;e~;|(G0 zq~PLgsnaNAdOvz$x!Vs>r?7qwe;I60$=>$Qb{= zYDBcnZuys(m1t@=-*!y~rR3R7`Du;>O*iAT)l5@kc+1|tGW!tnpcR>ojO0DGyz+5An3ctVfcfYb?p<_%cL3C!M55!PT-(1c85HVKj}rg3&r!e+G1F#@PE zod_9dz$Q(Vedv~qxLb4hBBUk{Z1!xqag@*Ar_Uh_9WiEZU_>s84Z^7(s@vVCFI9ri?8Hx<{ZgOD7B<(b)@n#(#k#Yv|F3QPc-Pl7&S}!}CZAj&*+I zrz>8ASF^OS&@?u~tXguv(=g}5pXMQM4%Vf-t3*!1Sku~XzY73l>2}y`%bTJrYMFv2 z0`ho7jk9=hl=#f+D3AW%I|MJryY|CyT@ZKI_QjDy-D4DeRXCs?H+yCV zR=;rM0~Qw8srdtVQ5HXn9F2wBE`JsT3Y&bzT~xp}NitU)4{Sq`UX6=Bx`mbnTnh*{ zzV7d_CQ=Ph3ZUvfO!}QM#E)!^Tyti10JmK;gmkvn6CZ~q%2Vl;znqHnl`gYiq@rsE+a zsm?#)fC6x;SlqJ4U2WIq0tFCG&l9nof8!O7C0B+8(r+TvaFW-4BS_tp54*^*^q6Ch zHe-n!Z~I*mS=*@I5_82d|*pZ2of8I@Pqvthhh?peCivxnCU_I zJ*azHl_&GUYihFa8#K%W#UiTclc&B-x0uMIl*+;1>P?iSx-A?Q;!GmDKa!ejz{su88lv@f+vCWE&OIIzJeLk<6{`p%c#)i z17*UYke-%fb;4W8QIHKK85y%diexc~-F5k>`DFP3m8P4nX~$v|D7vKMkW)vUG46|2 z2BbfNTyRjCD964Ia?doC~rXbiR7rMvO6+(Il}As&FiIQlDht(aFHc=F6j# z_Y!DUAm zpmFi?{r+Cx2@CzWK<wNvA1+)StGBJ%XnA!W9*2zkdSj}f7(q~Vlnvlm z(9mn$_&YIx$D0k~YN|E)4z+(CjyQBPdZaU9MHYJL8s7Kp*MOc)!-7Mh4*olQhkAWeQB9>6s& zQ*h|)7zKJ^26Na88`I6CWJ8W-C0qK#C)z2Tef%bBj1VJsW-M)S9DVcWnHHM>hkys2 zxzyM=NDyKiwdJF9l%Mp8^369jJs^S|*h4I6T`#Nzy&s2;=O-xpAcx?{W6@~IPf4KF z^p&fMfLV-{lGlFP;&PPKxlr?{hEqsmEbbd60bxu}nnF%OcpAG)z7K>@l9s4tOk1|G? zd8zeBC~=7O*0|%-eIsz5`a=;%Gt|SA>O**|2+JXd@DinSxRSO`IF?Axf+P#!q$%qe@1^GO}VjE9FpMbUe}0 z`LwKj8BBGIS@*|Fa~+)l@F$U468hOY_BKi0o_CW2gI=qVdnypKDnop>_D#eUt=;4 z`Lz&U$d}Ayf2GpbK^rZ2q6;1Qtt39ZoMhdX`y+;kko}>V0^OV@WgUSzs@6-V{Aql_f=&$g)k25<+7xTIu>&{~&ZH6-C)ahM2r%OjW&kgSh`S1ftvYXto%8~W`4Fx`2o2v1=j@T>J_`(*u<^A9 zG-ymasn7(DOfCz})Gg=Y=D%Dji$QT-++#gvpE|+HW57n7B<($?n?}SQgrU_0T5cmJ zo#)I)-a4nhG3xZS?V*uvI3NE)O8444I9Hlz!Sfc$w6U;)v!9r3T0P>7;}m}k8b#Y& zPB~G{NU!DB7{Bopk7*n!w++BL&f-3{%56F0tWY-Wvt@b7iUrC((WLQHb8Zso6aH!P zNm+<&RWTS%8rQie$+V%M@ltoVInB@7$bkKV5>A|Z@$|tkC#7voia!Fp`vfa3wV+eob_QCE*6KgMcS`&6B^{al32en9 zFx%=`0K>aD-h={sktkP8Hxe1;ote~b1I51=#EqBORN;6)gMKrU(qSi*qau2G?YKbU zT#Vds9t;np=|hqejqVuP>lXHx@L-Jn|Cb4c-hEwZB)HjpNRutERVr_8{ zzhF&-k}r7FAKL6hZ_x1R&>R3&N~!P`;oBQ##X_Z-AzG9Z)*j)2gXg z4vvT@?9*Y)n-H|W4HnMuM%Zr-jc$)al5u&?6}B6+$A9R@CfU%ndsDoGr0Y$eB>9>& zdNH%ZFOLf?PGtnz$c!tyr|0-gZo)fFXOti6`pGm2AsFJ0Owk(<^8QnAQuxN&MwnZE zZzl_LVQkY%)`T@-6$k|g+^v%~_vaqpINBM??kN)++TA{KyR&%%ygs`JBJ(_~$9XsA z&X8MM!vUW|ML{E;Y)G7n1wLRx&{dv)M-_5w1e!i|;+$wBA}AgPs^?u$sdcz;n`3Oi zP>z1H=9~~XJAfZ&jp^UH_ByQpg1q6RBgL*^T&cnlM z4z68`!AJoR=XEvw3{=M)-WjQ&l?PK{lg&&rrytK{T?aw0%LOwD=Q#J`t20gCc;NB6 z8DE`=>}bv^fUq834o}3Ao781~Xg`xP#3GP>l+Q_^@8wQsfD8<8_yHMWA7BjLr4IL4a=e8kFQu4ksCS zG%|3q`SNIF{lum+aC+mDAM;Wey*M7XSo(%xzR2;Slql2HAv=v$i}!)?@SBfSuHH<~ zuJ54KHDHGmghLlKa(P>~+T|szmvJEnb!JKIz6F8#^c!6Yobo4MlHNV|hIJpdq}!WA zYmbz`dk-L)i+|(dNk-g6&my=v%Qp|+#ITK;GPtl#IUdFpIX4HyPdf9dYq1Ss05pf1 zUf2ji9C?w)D|JN6-=a91@s~Pei0>Sm-p7eBHs2q|E?G1p8zC2VV>P?x^OKXhEuFLpH^2-Uk*gx07S-qOM4IfRqLfqU=O=xO3j&MR4nh?mI-P58# z49Y^H^6fJ*;ns?xrV%4M;lpVRKlOcHgrGMJ*sJq1Sdg6Uh3Dh#p2W2F&=AHi{Y>?! z5R<~nnCz3YP(efbJS4zkp6j7op%lN{h_v~Qb8<)=@2-P*dW?qHp-4gTV=X}&|7)s( z~c+4a2Q?~k}diyL4lIPg?G3;V(r2}Jxq zA3C}oRqg_fCW+5;TNr5He;!)$1-NqFb3w%N2cjsXK^JSD_0Qz>j~`;h_&^3R#k>XO zROFZ3K%{;6&L?Alb{_=QLdR>Zo+1eVNSuzmlTU>BFAUW7fVRoB!U<1_L1c53qoVjM@$BLmBlY$v{qG6gwSX+Ov@U&1FcNcETo zqQo%|!mYs6pu;x)ONUf%Oo@`QvrS0mGv*xg4-#n1J^$JN^AI>lvO`$@buj*;UF8*u zq}MP|p9B?2s3jR`Q4c*&49x@D4@5a;9-n&QUyC9F__QiSwBs`maSAJZDC3Za1~FI? zGc`bn)_F*fT2Qm!;mVMd{>kAa1CK%mPBvd2g`}UDbOy#^N=o!*nkDzudM~4^N^pV)bXUyY@9lm5)y>~tCWyecYf+v}sWZ}Z7E1?nQSb0M>_`xfQZ16^Pg2)*}MCMNUOj-NFi?}Y_@JBb;1!_M= z&6^v_viK8aiRZh(lILB$ zxwQd}0Aw>(pG(CiYl0pNpE@XcK?6&-Ze>%9N5w$ ztJr;K7y6~;%u=-t{nB>EMz@<))cMZw10bT3{U2ETa}ohpj~W}^x_Dm9mOw+Y^k0?B?+0XM zPrDb;{!7y$a$6dVyMN3BysDx6k=<;a!#~pSXpbv08*Wh_=6fuG=Q#GX@07U&;nT%5 z(2hsZ>|j1bi;v2EiX&LHWZMKu+ZZ#7v1J~>;m@V~ihopHvvc^^xM*eRY90IvGtLk& zezS4&TtJ18f>-R()C>wUhld~DR~s!Blv_(5h*Z%HEOqrgK88)M${h^ULpPp@RHhw; z9Qu^0(lG;E#wK{`pX@bnHArF$VeynPeK>29r z@>4*5#LF$cX>I008(qQ2zqyLWmDihGiT8O8b&-~K^pXPz*;mfDF z{wetMK!(QuwE@zLi;m|9>6(Z4$ULHoT*(JfLC1A{ZN?MVp0dIg+Vguq2Vt{!afQ!y zbG%iw_-pkviT(xwKBo@K{}(7KU57I#@dB?*78R@bA=Aaehl+;)G~4n#iB`aXvsgNa z&%>XGhK+~SV2uf=%@&@bzmuIhZ*8E`)NkZjYykR2>RRU)D3_`(rcU5>@tDQjuD@!x z;XBtw+lJh8SL^Ti*n7rkkJ`FO+P)GZtj1_>1O&LZm!%z!`7c;-S6J=1soK5GSD4kW zL>se^+w~_1HU-qFw+|5JG9R?XPQ@q2hQzV5@B43Fp$gVM{H#ZJ|16&sxCJ!kDbJGy z*LFKKD-lu)->@D&Y{+PL2aHv9{ccwfhwtiO+m`4RX6IK(B1P)A0SowWy()6Gb4fN; zt)oyqm+uzeE59p;AhCHY*2D2tm8aTUr&2N2oZ5tMXo7?POt%yTXK02E_*8FM)Kl3% zvV**-mD?##fP?~Q)mof>yh>^|hi6-v!boTDkF4|X?~$Ebu=Ry*002M$NklIK^gjuuyPU}Hed+->s)zYQLjM)f&g5@aQBNs$4%a4vPvkO#rqbP8Bcx8(HRUKL3?D zO#YML`b?D$6}xZnNY< zF;iJw@9HpwKal^3&(B~#BcHW^6nLz6`TcGZIqz|F=9&4&EPf`x{2#T+s#E57^m}8n zsm=-WY%60N45{O5B|Hkdlc&&KJQX|*J1~;HRo;pVU81ruh|K%uYmtpgr)Kcz*I?Ry zmv!Y5a%6_#!k?Tszpude9fsmDya6{_#+n7GJ+io8=ivCPDN2lVe!g4GsBw{2uIP0lzmFnEJpQ zk`kyFox`AZ#_2$atpp>07--dlk()s z+>!tX?;MjBzrnfp?nS!Q2x#Q5p}2^1-J&<)MV1Q0mHW3c%N+X`CZXHZ*uFU|{2iR4 zX+2hK%0dI8L|sO14!=I?I+BEzgGS0OEWN6q08UFr%OjrolYWg1yl-`tr+V9?T>WVT zWDTR$`zg;o{bhV{Zr5$lW+RlkYE)Zwz$=ccb<+o7-d`gsf;Z3Lj1Fu5F4M}v?gI}8 z)W&VM5QKG*E*+_Hs$vwZQ`*gSCLC(vMfVVdt8f*dV4J+`u{xA>WW{DA@$38qSDPcojd;H=W}m*RyyJP-f@MLwV_1DEDwa8klg z&4RE}(ys9kS`;?q}!$8luAvMmuk8w|sOiPK{N4zHSs*Dq8MX zLQ#InoZ!6Ba+oWRNI#D@L548+OPRAA70ts~^;RKbGX7ocjQ9L_df;t;8 zrFZdRCuBTb6IC43;qtMY&e|EDg}9+iEDzI65T2YKA_RC2^>dQ`N#x*o~CpZ|^)_bUhfX$>`Do2STzh$K?2-Qh=*}9${?$%hw}26Z;tYsO<%V zCU?*35MW8%)!f_%*veJR#4ocBnvpfC z<95Nti<(@Da_$v@`yB+LM7OSHo|;_oEmi{EuCUlD?d$=o?v_>u zwx06Ae#dw9Q1wv{k0sX(CB6r*QrE7z53g*8sf->dFy z5d??Z=6BbB5mw8{7C2(4FHTSlnflFlE{e-XiR5k(S|7;H< zE3$Fs$ev4!;aFz}JFp|)>~bJt3KZwbZV2Kch|gtO82hvF5Zf6IgTHv3vRqY+VbVaL z7}6DEu3C(Of1{R8TP7GOlM^$!gZPB4+XyiH1Xyg>fg_cwsJ;-XT=kG^nnjq5pFn`$ zz`5d+PRoE#of8xA1}?h!T3@t0^fCqrVSM_&J`ai&U4-jNxzVR=eDz=xjcUy1MIS4h zSUa4B8k+HBNNrW3+jv4*J{kvg|1Uk{g zq30mPH-ZEU#0sf&#D^OP(8xS=5>#nXDmQH}5OzSapC}X0whL6s4@Z@v7rZWOKY=S2 zNh`toplIwSv7e=<2mVP9JP%*~NpC-8T|Cey1q#eyzK7sr>@3RV z+Q*6wd@!OOoP=^9Om^<&U3gv#rGZoPU<~K0fGer7PMQzZns~FIEmp5(-^ubLWgzR$ z-%k*F=jg8H%_6B!D}h}cW}$fKV1$#Q@<$O}y`VdJ9`%4Pi&KJW>SJH5 z&7yEDAIH{yUf9}2wqw(>2G`!Y_TRfckGJLrjrFM>Vm>M^38SyYQccALws~b^N@b}_ zHP;mjXZ?lQ?jD2N&E83|x#Hc(kH4 zht*k9&S!A063+VMm;PcN?LOkHvEpOZG?ge1;=~)s>K*WvkQFz=LtW6Fy32Q=y(zUB zix;MemcBy{^WX_Es0W2)ZSCs|c(_$@=n%63Mb{54D&)YqR_OaNtIe~EqFpb~H!rak z{`(y6ZQ8}e?Y%bNVvVNwDP9O(UdW3Q`j6sbn(>5!XaaQJ0+n0(D&O(bq%c7#^ut-o zqrK&AwU!=cihs!+-Nj@RcC6U&F9JYnSXlVb3E`oeEA%|Kc&h8Yp}I9It+IJWjOvY z1zr61@oNE>>RJ3;VP|R03n%cB?@%3`g3o8lox?69XQ7kB2|M$524Zc_Vef_3iGI)j zj{W&qC$wAtJExzON0FaY`#ak|sRO(x-V^E0bK01R*a}jPrXLvG{Bg~n5FygEC4>26Pe9jm77W-9q z(dklHzBkbbT{cg-41f3J7GcJd{kYYn2R&m;_4}}>Lkp{Q5LD=S-FwTp40I7*;%?gA zFxA_qW3tiZYfEWhPYk3T2XSN?Z|V&)4LGhDtkMw0Jw$qo08Gv%LsEwz086TiZZ>kj1?zoY*xZJ^$`9vxaW{bu=-HLe6YI z2xWLp_4vmQ#@rwN zH6YPccF{sA8x9_X-ztw@(G^<}U26D;HZ>F1Lu@SL9!ByVwp_D_tG1yKKhx6#pW=b%;mfDE{V5a={P+L! z|A-?r(t5D0TjsmYFMVTR;kWCaw1>@YP<_!)*?mas5pxzd59$wsAM=yK_d|yM1oC%& zO7fTK*Y#a!u}JY8B3?{7T^#e)Lt!`E?L-N$25hZKkIFc-^->hvIrcA5_r~s$MFfhaX={tIb@`CA0|+ z{<}m^1NA!cq&y~Ny+Zz#CB$=EDF%G=Ge>ak0@S#qr{h?ngF!1(anbt2f ztNQ4({1j?qsP!C|Ro}K(%jiV9!^`6yo8PD5OCPVE{EI=c%gUyzQ4WFJRZMz-UmGD*wXSY?ic@5G7oqTEe^E&WPZGUY#-ML-MHf7E3IQa z#GeF*jz4KHgZ%*>sq@dPH4?tSta)-QBz<515R6fkHdHL-6vMO_hR@;jCP(-xJHk0S z(f^RuF$+DgpHx4%ppR`uAnuMD3*bSv}Ov<=RT*U_&e_y`*HU0O?tP|V5 zo9FlGb82teMf!S3mYvxACh5pSf9BHf62SG%bAfbLkT5qPH@zeJIM!u1n#bC-F`Q}# zIA7oXTCviYaobG$Ad51;I`=M_$RWX(14ZJxHUalh$;`>d{hJ@O#-{iX94D>Iu<7Od z--S4qv)+y+$o>9>6>er#udjsdzB_GrJ~?f@$J*rScUgbYuM0z<`=hRZy#1YcAdZfo zz0bP)<;(x||NP&eKhx6#pW=bXqwlAv@)Y`S^S~dSIgY{GSuJ`=ubmBk;utpVze>IH z>WODiIXLM+eSKkNCbmw~@MUpEYK;r}=-~b`3p3!=q;9b;5hTh zB4RdcA2b-fMm{vmx?XUw!0Q6!^{)9`IoZ;04-1eO&ykQ?UnN*QbTi%MW z#7ei?44!m`pLtgJ*sdk!x(gWc)0Rl^1Ln(DOUTNUCH`Fvv}$)d0;&$CEH5XM2G-&f*IF zS=`kI$|NsdO{N7Z0)W9=f0n`Fm5L`FU2e58J)pYk3hkCJx|i{f;6K(zY#)(y@n5^p z-(9*fMZ2I*ucJ%#;c$qwbda{tdn2Ih3=`Hrm`2}={vY4GnB#CG4I%$2%VLo$@dvN& zfmm=N%XNaY`JrcKamPY+7LM{8>0O%}7L?W(y;R+J1_m$vUukXfCvNg&8VlI?g(tPT zkc94K7XL74yRcZN)hK_R1!WI$!9!-#-)KL+?sfUvJ^^{g7#J$KeUp`xXBZGMAjpV*c|IaTpOQN%Vj@z$$kyoe5czn^2-O*Wjr3%}{KTZ|1R z{zv?9joryWGun`Ib0k#mBspgLq4d!#dWo zfg!CJ3)0r}yR@D$enOL=G1j|yzj{*`9|N4`kafX%)8Rb6@gFezC0N81n?Ty6>JfS7 zGrs)rPPJof2k-Cidwg;m2-cVA;)CAAkOE5vbkc~6Ho-Z(g%(XXtT!L3MgR3Zn>)r| zw03hSQ-2db_XO#S?fCKK&t+Kfdb6dS=yLchTptFP20rwCm3xnZxF@+kN~eq`x+=hV z3X6GxH4A4lUm0A!hZ#2EWvJPbqd$M&zvS?Vb&Of7PtoVx3c7w(M*%Oe_{J|!6{B~Z ze9$XBR*362;ce9uS8wnCulzYaMe&I@-8C`ajG3;8zrm2MD`|M}0iN1Dv0}6pXgZ#l z@it>t=xm|w`KrTZ^ndew$>Buwc^o`VN${PJ@n_c`LO2gM+>clfeEU-@;(0zj z+^z7D#j=xmg0|)(?RiyxELEE+n2eUy_4Ju8PSPMC(AX7peDhM1|b z8wXHOfA&>|FZ#j%aOsL+CVSUgRb~^ZycV-?R?_5irZGvA6$>}v=$ge*^j@32ljz8^ z*s1=2YeP}s)s4Y9ak*Y~T`orbE&nF#l+B^ zT7lcJJs0XMi)c`mRWOPz)h~=<50%lSPk2;6c!Ozde*jT=+Q0q?6c1_12j0Y={Um7H zjfE%4Jc&i+oLA0=v~ECPW&)~H<-KyahGUi7KK8e4oCBHS8R4fN=)gi$JftUb*+7Y5 ze5G1q!%vAh9^y&9-qS-PzxZ=}0Iw!TKdLJgO6#MSuc^xC*ntmrD%FOZwSlHxX-^i< z>2txNwe1%ndZBF{rPTxoezGpImjg2EI~y-t;Qm*E%Rb};xW`8#>p?1wu4g+H(>@pz zyNOY+aPxZhE zKbmo(w>&}0Pr*+!;2X&l*Lsq{q_Nde4QRF{^+AWHuW;hhf&cZ zIwBb@I`?@#!H)5TD?ufOVK?o{AxM3SjtK>|3(R!T0B-y|W68AXsq_7yn!41($BgWq z+UKJQo$~u&&HCX&Vu9ydu)p+~8{t3#F0A-Kc}J9#?5>^X zlb`hga~U$=@53t#6AXWer>~YW?J7Jo#XNF4c(KmlydhtD%D=7?F?|e7aGX@p*eoou zo_gzHzd*M~;phl#bQStg80JGkY;Z{*wDIW5_{32Pa>7UcQy=zC6r)LN6RHhF1DSOb z4EqgJ9@`xGT*L{I#*c{rKhx6#pX7n(;mapE{wa13>h*=k(-wSX`ubJ+NO5AHhaVYw zH9=-}G8(7<*Tl#T%%iogSN?Zw7Kc4-DW9$l!ToS&ut@7#ISb%SrDl0_)?M+LwoA~v zr91+=C#_%mkIAVU>FQnC@Z~NvF32WeWCNPTkT;3;QRIXd98!kdzVxI@K54oASR}UY zyk_xTuV*5^96-(D`lKP>#X_6W3pnXe8^Os^(F#&@$|5j%c#N4-d%MUTdT9Cr^g`rl zqBm~2C}j~as3L(kvV3<(U~~b~cYvg9+a&B`Ka#k^dg}DTLJTLvYj};D{dm&v*u(beI%?KH=A|#if2@$7=B$!pe4g%0Ak|bzbO6Cv0#!Bq{rN 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

Up&}ZJ?{EX>y-HXDH~75Vy4%vi~ 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

`WbNb|_PS?QIfxVZ+O|?M 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%0Ae%8SjbDL3X->RS?kS(nub-F?s38p@*Em{# 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
    9|>qQHOTH7PS-U2q(CVj$3Hz*mCAj; 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∓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

    7K3iz7&mNRuW6GV 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 {L19%lUWPc+@W`Oa>&a69r=w!9xry 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 literal 0 HcmV?d00001 diff --git a/vendors/lightgallery/lightGallery.jquery.json b/vendors/lightgallery/lightGallery.jquery.json new file mode 100644 index 000000000..a5713d7f0 --- /dev/null +++ b/vendors/lightgallery/lightGallery.jquery.json @@ -0,0 +1,28 @@ +{ + "name": "lightgallery", + "title": "jQuery lightgallery", + "description": "JQuery lightGallery is a lightweight jQuery lightbox gallery for displaying image and video gallery", + "version": "1.2.19", + "homepage": "https://github.com/sachinchoolur/lightGallery", + "author": { + "name": "Sachin N", + "url": "https://github.com/sachinchoolur" + }, + "repository": { + "type": "git", + "url": "https://github.com/sachinchoolur/lightGallery" + }, + "bugs": "", + "licenses": [ + { + "type": "MIT", + "url": "http://opensource.org/licenses/MIT" + } + ], + "dependencies": { + "jquery": ">=1.7.0" + }, + "keywords": [ + "jquery-plugin" + ] +} diff --git a/vendors/lightgallery/package.json b/vendors/lightgallery/package.json new file mode 100644 index 000000000..330fa8fea --- /dev/null +++ b/vendors/lightgallery/package.json @@ -0,0 +1,58 @@ +{ + "name": "lightgallery", + "version": "1.2.21", + "description": "A lightweight, customizable, modular, responsive, lightbox gallery plugin for jQuery.", + "keywords": [ + "jquery-plugin", + "gallery", + "lightbox", + "image", + "youtube", + "vimeo", + "dailymotion", + "html5 videos", + "thumbnails", + "zoom", + "fullscreen", + "responsive", + "touch", + "drag" + ], + "homepage": "http://sachinchoolur.github.io/lightGallery/", + "bugs": { + "url": "https://github.com/sachinchoolur/lightGallery/issues" + }, + "license": "Apache-2.0", + "author": { + "name": "Sachin N", + "email": "sachi77n@gmail.com", + "url": "https://github.com/sachinchoolur" + }, + "main": "dist/js/lightgallery.js", + "repository": { + "type": "git", + "url": "https://github.com/sachinchoolur/lightGallery.git" + }, + "dependencies": { + "jquery": ">=1.7.0" + }, + "scripts": { + "test": "grunt" + }, + "devDependencies": { + "grunt": "^0.4.5", + "grunt-contrib-clean": "^0.6.0", + "grunt-contrib-concat": "^0.5.0", + "grunt-contrib-connect": "^0.9.0", + "grunt-contrib-copy": "^0.8.0", + "grunt-contrib-cssmin": "^0.12.1", + "grunt-contrib-jshint": "^0.10.0", + "grunt-contrib-qunit": "^0.5.1", + "grunt-contrib-sass": "^0.9.2", + "grunt-contrib-uglify": "^0.7.0", + "grunt-contrib-watch": "^0.6.1", + "jshint-stylish": "^1.0.0", + "load-grunt-tasks": "^2.0.0", + "time-grunt": "^1.0.0" + } +} diff --git a/vendors/lightgallery/selection.json b/vendors/lightgallery/selection.json new file mode 100644 index 000000000..e9c2e39b9 --- /dev/null +++ b/vendors/lightgallery/selection.json @@ -0,0 +1,407 @@ +{ + "IcoMoonType": "selection", + "icons": [ + { + "icon": { + "paths": [ + "M554 682v-340h86v340h-86zM512 854q140 0 241-101t101-241-101-241-241-101-241 101-101 241 101 241 241 101zM512 86q176 0 301 125t125 301-125 301-301 125-301-125-125-301 125-301 301-125zM384 682v-340h86v340h-86z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "tags": [ + "pause_circle_outline" + ], + "defaultCode": 57370, + "grid": 24 + }, + "attrs": [ + {} + ], + "properties": { + "order": 18, + "id": 0, + "prevSize": 24, + "code": 57370, + "name": "pause_circle_outline", + "ligatures": "pause_circle_outline" + }, + "setIdx": 1, + "setId": 4, + "iconIdx": 0 + }, + { + "icon": { + "paths": [ + "M512 854q140 0 241-101t101-241-101-241-241-101-241 101-101 241 101 241 241 101zM512 86q176 0 301 125t125 301-125 301-301 125-301-125-125-301 125-301 301-125zM426 704v-384l256 192z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "tags": [ + "play_circle_outline" + ], + "defaultCode": 57373, + "grid": 24 + }, + "attrs": [ + {} + ], + "properties": { + "order": 20, + "id": 1, + "prevSize": 24, + "code": 57373, + "name": "play_circle_outline", + "ligatures": "play_circle_outline" + }, + "setIdx": 1, + "setId": 4, + "iconIdx": 1 + }, + { + "icon": { + "paths": [ + "M810 274l-238 238 238 238-60 60-238-238-238 238-60-60 238-238-238-238 60-60 238 238 238-238z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "tags": [ + "clear" + ], + "defaultCode": 57456, + "grid": 24 + }, + "attrs": [ + {} + ], + "properties": { + "order": 14, + "id": 2, + "prevSize": 24, + "code": 57456, + "name": "clear", + "ligatures": "clear" + }, + "setIdx": 1, + "setId": 4, + "iconIdx": 2 + }, + { + "icon": { + "paths": [ + "M170 810h684v86h-684v-86zM682 554l-170 172-170-172h128v-426h84v426h128z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "tags": [ + "vertical_align_bottom" + ], + "defaultCode": 57586, + "grid": 24 + }, + "attrs": [ + {} + ], + "properties": { + "order": 21, + "id": 3, + "prevSize": 24, + "code": 57586, + "name": "vertical_align_bottom", + "ligatures": "vertical_align_bottom" + }, + "setIdx": 1, + "setId": 4, + "iconIdx": 3 + }, + { + "icon": { + "paths": [ + "M682 854v-172h172v172h-172zM682 598v-172h172v172h-172zM426 342v-172h172v172h-172zM682 170h172v172h-172v-172zM426 598v-172h172v172h-172zM170 598v-172h172v172h-172zM170 854v-172h172v172h-172zM426 854v-172h172v172h-172zM170 342v-172h172v172h-172z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "tags": [ + "apps" + ], + "defaultCode": 57855, + "grid": 24 + }, + "attrs": [ + {} + ], + "properties": { + "order": 28, + "id": 4, + "prevSize": 24, + "code": 57855, + "name": "apps", + "ligatures": "apps" + }, + "setIdx": 1, + "setId": 4, + "iconIdx": 4 + }, + { + "icon": { + "paths": [ + "M598 214h212v212h-84v-128h-128v-84zM726 726v-128h84v212h-212v-84h128zM214 426v-212h212v84h-128v128h-84zM298 598v128h128v84h-212v-212h84z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "tags": [ + "fullscreen" + ], + "defaultCode": 57868, + "grid": 24 + }, + "attrs": [ + {} + ], + "properties": { + "order": 32, + "id": 5, + "prevSize": 24, + "code": 57868, + "name": "fullscreen", + "ligatures": "fullscreen" + }, + "setIdx": 1, + "setId": 4, + "iconIdx": 5 + }, + { + "icon": { + "paths": [ + "M682 342h128v84h-212v-212h84v128zM598 810v-212h212v84h-128v128h-84zM342 342v-128h84v212h-212v-84h128zM214 682v-84h212v212h-84v-128h-128z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "tags": [ + "fullscreen_exit" + ], + "defaultCode": 57869, + "grid": 24 + }, + "attrs": [ + {} + ], + "properties": { + "order": 31, + "id": 6, + "prevSize": 24, + "code": 57869, + "name": "fullscreen_exit", + "ligatures": "fullscreen_exit" + }, + "setIdx": 1, + "setId": 4, + "iconIdx": 6 + }, + { + "icon": { + "paths": [ + "M512 426h-86v86h-42v-86h-86v-42h86v-86h42v86h86v42zM406 598q80 0 136-56t56-136-56-136-136-56-136 56-56 136 56 136 136 56zM662 598l212 212-64 64-212-212v-34l-12-12q-76 66-180 66-116 0-197-80t-81-196 81-197 197-81 196 81 80 197q0 104-66 180l12 12h34z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "tags": [ + "zoom_in" + ], + "defaultCode": 58129, + "grid": 24 + }, + "attrs": [ + {} + ], + "properties": { + "order": 35, + "id": 7, + "prevSize": 24, + "code": 58129, + "name": "zoom_in", + "ligatures": "zoom_in" + }, + "setIdx": 1, + "setId": 4, + "iconIdx": 7 + }, + { + "icon": { + "paths": [ + "M298 384h214v42h-214v-42zM406 598q80 0 136-56t56-136-56-136-136-56-136 56-56 136 56 136 136 56zM662 598l212 212-64 64-212-212v-34l-12-12q-76 66-180 66-116 0-197-80t-81-196 81-197 197-81 196 81 80 197q0 104-66 180l12 12h34z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "tags": [ + "zoom_out" + ], + "defaultCode": 58130, + "grid": 24 + }, + "attrs": [ + {} + ], + "properties": { + "order": 36, + "id": 8, + "prevSize": 24, + "code": 58130, + "name": "zoom_out", + "ligatures": "zoom_out" + }, + "setIdx": 1, + "setId": 4, + "iconIdx": 8 + }, + { + "icon": { + "paths": [ + "M426.667 170.667q17.667 0 30.167 12.5t12.5 30.167q0 18-12.667 30.333l-225.667 225.667h665q17.667 0 30.167 12.5t12.5 30.167-12.5 30.167-30.167 12.5h-665l225.667 225.667q12.667 12.333 12.667 30.333 0 17.667-12.5 30.167t-30.167 12.5q-18 0-30.333-12.333l-298.667-298.667q-12.333-13-12.333-30.333t12.333-30.333l298.667-298.667q12.667-12.333 30.333-12.333z" + ], + "attrs": [], + "isMulticolor": false, + "tags": [ + "arrow-left" + ], + "defaultCode": 57492, + "grid": 24 + }, + "attrs": [], + "properties": { + "id": 9, + "order": 6, + "prevSize": 24, + "code": 57492, + "name": "arrow-left" + }, + "setIdx": 1, + "setId": 4, + "iconIdx": 9 + }, + { + "icon": { + "paths": [ + "M597.333 170.667q18 0 30.333 12.333l298.667 298.667q12.333 12.333 12.333 30.333t-12.333 30.333l-298.667 298.667q-12.333 12.333-30.333 12.333-18.333 0-30.5-12.167t-12.167-30.5q0-18 12.333-30.333l226-225.667h-665q-17.667 0-30.167-12.5t-12.5-30.167 12.5-30.167 30.167-12.5h665l-226-225.667q-12.333-12.333-12.333-30.333 0-18.333 12.167-30.5t30.5-12.167z" + ], + "attrs": [], + "isMulticolor": false, + "tags": [ + "arrow-right" + ], + "defaultCode": 57493, + "grid": 24 + }, + "attrs": [], + "properties": { + "id": 10, + "order": 5, + "prevSize": 24, + "code": 57493, + "name": "arrow-right" + }, + "setIdx": 1, + "setId": 4, + "iconIdx": 10 + }, + { + "icon": { + "paths": [ + "M384 85.333h426.667q53 0 90.5 37.5t37.5 90.5v426.667q0 53-37.5 90.5t-90.5 37.5h-426.667q-53 0-90.5-37.5t-37.5-90.5v-426.667q0-53 37.5-90.5t90.5-37.5zM170.667 263.333v547.333q0 17.667 12.5 30.167t30.167 12.5h547.333q-13.333 37.667-46.333 61.5t-74.333 23.833h-426.667q-53 0-90.5-37.5t-37.5-90.5v-426.667q0-41.333 23.833-74.333t61.5-46.333zM810.667 170.667h-426.667q-17.667 0-30.167 12.5t-12.5 30.167v426.667q0 17.667 12.5 30.167t30.167 12.5h426.667q17.667 0 30.167-12.5t12.5-30.167v-426.667q0-17.667-12.5-30.167t-30.167-12.5z" + ], + "attrs": [], + "isMulticolor": false, + "tags": [ + "stack-2" + ], + "defaultCode": 57395, + "grid": 24 + }, + "attrs": [], + "properties": { + "id": 33, + "order": 18, + "prevSize": 24, + "code": 57395, + "name": "stack-2" + }, + "setIdx": 2, + "setId": 3, + "iconIdx": 33 + } + ], + "height": 1024, + "metadata": { + "name": "lg", + "url": "https://github.com/sachinchoolur/lightGallery", + "license": "MLT", + "licenseURL": "http://opensource.org/licenses/MIT" + }, + "preferences": { + "showGlyphs": true, + "showQuickUse": true, + "showQuickUse2": true, + "showSVGs": true, + "fontPref": { + "prefix": "lg-", + "metadata": { + "fontFamily": "lg", + "majorVersion": 1, + "minorVersion": 0, + "fontURL": "https://github.com/sachinchoolur/lightGallery", + "copyright": "sachin", + "license": "MLT", + "licenseURL": "http://opensource.org/licenses/MIT" + }, + "metrics": { + "emSize": 1024, + "baseline": 6.25, + "whitespace": 50 + }, + "showSelector": true, + "showMetrics": true, + "showMetadata": true, + "showVersion": true, + "embed": false, + "includeMetadata": true, + "ie7": false, + "resetPoint": 58880, + "selector": "class", + "classSelector": ".lg-icon", + "cssVars": false, + "autoHost": true + }, + "imagePref": { + "prefix": "icon-", + "png": true, + "useClassSelector": true, + "color": 4473924, + "bgColor": 16777215, + "classSelector": ".icon" + }, + "historySize": 100, + "showCodes": true, + "gridSize": 16, + "showLiga": false, + "quickUsageToken": { + "UntitledProject": "Y2Q2M2U4MWIyMWQ0NDQ4MDYyMzk4NTJmYzFlYmIyMjkjMSMxNDMyMDU3NDgwIyMj" + } + } +} \ No newline at end of file diff --git a/vendors/lightgallery/src/css/lg-fb-comment-box.css b/vendors/lightgallery/src/css/lg-fb-comment-box.css new file mode 100644 index 000000000..76d8613b9 --- /dev/null +++ b/vendors/lightgallery/src/css/lg-fb-comment-box.css @@ -0,0 +1,31 @@ +.lg-outer.fb-comments .lg-img-wrap { + padding-right: 400px !important; } +.lg-outer.fb-comments .fb-comments { + height: 100%; + overflow-y: auto; + position: absolute; + right: 0; + top: 0; + width: 420px; + z-index: 99999; + background: #fff url("../img/loading.gif") no-repeat scroll center center; } + .lg-outer.fb-comments .fb-comments.fb_iframe_widget { + background-image: none; } + .lg-outer.fb-comments .fb-comments.fb_iframe_widget.fb_iframe_widget_loader { + background: #fff url("../img/loading.gif") no-repeat scroll center center; } +.lg-outer.fb-comments .lg-toolbar { + right: 420px; + width: auto; } +.lg-outer.fb-comments .lg-actions .lg-next { + right: 420px; } +.lg-outer.fb-comments .lg-item { + background-image: none; } + .lg-outer.fb-comments .lg-item.lg-complete .lg-img-wrap { + background-image: none; } +.lg-outer.fb-comments .lg-img-wrap { + background: url(../img/loading.gif) no-repeat scroll center center transparent; } +.lg-outer.fb-comments .lg-sub-html { + padding: 0; + position: static; } + +/*# sourceMappingURL=lg-fb-comment-box.css.map */ diff --git a/vendors/lightgallery/src/css/lg-fb-comment-box.css.map b/vendors/lightgallery/src/css/lg-fb-comment-box.css.map new file mode 100644 index 000000000..9c6fc14b3 --- /dev/null +++ b/vendors/lightgallery/src/css/lg-fb-comment-box.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAGI,kCAAa;EACT,aAAa,EAAE,gBAAgB;AAEnC,kCAAa;EACT,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,CAAC;EACR,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,KAAK;EACZ,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,6DAA6D;EACzE,mDAAmB;IACf,gBAAgB,EAAE,IAAI;IACtB,2EAAyB;MACrB,UAAU,EAAE,6DAA6D;AAIrF,iCAAY;EACR,KAAK,EAAE,KAAK;EACZ,KAAK,EAAE,IAAI;AAEf,0CAAqB;EACjB,KAAK,EAAE,KAAK;AAEhB,8BAAS;EACL,gBAAgB,EAAE,IAAI;EAElB,uDAAY;IACR,gBAAgB,EAAE,IAAI;AAIlC,kCAAa;EACT,UAAU,EAAE,kEAAkE;AAGlF,kCAAa;EACT,OAAO,EAAE,CAAC;EACV,QAAQ,EAAE,MAAM", +"sources": ["../sass/lg-fb-comment-box.scss"], +"names": [], +"file": "lg-fb-comment-box.css" +} diff --git a/vendors/lightgallery/src/css/lg-transitions.css b/vendors/lightgallery/src/css/lg-transitions.css new file mode 100644 index 000000000..3b9473291 --- /dev/null +++ b/vendors/lightgallery/src/css/lg-transitions.css @@ -0,0 +1,776 @@ +.lg-css3.lg-zoom-in .lg-item { + opacity: 0; } + .lg-css3.lg-zoom-in .lg-item.lg-prev-slide { + -webkit-transform: scale3d(1.3, 1.3, 1.3); + transform: scale3d(1.3, 1.3, 1.3); } + .lg-css3.lg-zoom-in .lg-item.lg-next-slide { + -webkit-transform: scale3d(1.3, 1.3, 1.3); + transform: scale3d(1.3, 1.3, 1.3); } + .lg-css3.lg-zoom-in .lg-item.lg-current { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + opacity: 1; } + .lg-css3.lg-zoom-in .lg-item.lg-prev-slide, .lg-css3.lg-zoom-in .lg-item.lg-next-slide, .lg-css3.lg-zoom-in .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-zoom-in-big .lg-item { + opacity: 0; } + .lg-css3.lg-zoom-in-big .lg-item.lg-prev-slide { + -webkit-transform: scale3d(2, 2, 2); + transform: scale3d(2, 2, 2); } + .lg-css3.lg-zoom-in-big .lg-item.lg-next-slide { + -webkit-transform: scale3d(2, 2, 2); + transform: scale3d(2, 2, 2); } + .lg-css3.lg-zoom-in-big .lg-item.lg-current { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + opacity: 1; } + .lg-css3.lg-zoom-in-big .lg-item.lg-prev-slide, .lg-css3.lg-zoom-in-big .lg-item.lg-next-slide, .lg-css3.lg-zoom-in-big .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-zoom-out .lg-item { + opacity: 0; } + .lg-css3.lg-zoom-out .lg-item.lg-prev-slide { + -webkit-transform: scale3d(0.7, 0.7, 0.7); + transform: scale3d(0.7, 0.7, 0.7); } + .lg-css3.lg-zoom-out .lg-item.lg-next-slide { + -webkit-transform: scale3d(0.7, 0.7, 0.7); + transform: scale3d(0.7, 0.7, 0.7); } + .lg-css3.lg-zoom-out .lg-item.lg-current { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + opacity: 1; } + .lg-css3.lg-zoom-out .lg-item.lg-prev-slide, .lg-css3.lg-zoom-out .lg-item.lg-next-slide, .lg-css3.lg-zoom-out .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-zoom-out-big .lg-item { + opacity: 0; } + .lg-css3.lg-zoom-out-big .lg-item.lg-prev-slide { + -webkit-transform: scale3d(0, 0, 0); + transform: scale3d(0, 0, 0); } + .lg-css3.lg-zoom-out-big .lg-item.lg-next-slide { + -webkit-transform: scale3d(0, 0, 0); + transform: scale3d(0, 0, 0); } + .lg-css3.lg-zoom-out-big .lg-item.lg-current { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + opacity: 1; } + .lg-css3.lg-zoom-out-big .lg-item.lg-prev-slide, .lg-css3.lg-zoom-out-big .lg-item.lg-next-slide, .lg-css3.lg-zoom-out-big .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-zoom-out-in .lg-item { + opacity: 0; } + .lg-css3.lg-zoom-out-in .lg-item.lg-prev-slide { + -webkit-transform: scale3d(0, 0, 0); + transform: scale3d(0, 0, 0); } + .lg-css3.lg-zoom-out-in .lg-item.lg-next-slide { + -webkit-transform: scale3d(2, 2, 2); + transform: scale3d(2, 2, 2); } + .lg-css3.lg-zoom-out-in .lg-item.lg-current { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + opacity: 1; } + .lg-css3.lg-zoom-out-in .lg-item.lg-prev-slide, .lg-css3.lg-zoom-out-in .lg-item.lg-next-slide, .lg-css3.lg-zoom-out-in .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-zoom-in-out .lg-item { + opacity: 0; } + .lg-css3.lg-zoom-in-out .lg-item.lg-prev-slide { + -webkit-transform: scale3d(2, 2, 2); + transform: scale3d(2, 2, 2); } + .lg-css3.lg-zoom-in-out .lg-item.lg-next-slide { + -webkit-transform: scale3d(0, 0, 0); + transform: scale3d(0, 0, 0); } + .lg-css3.lg-zoom-in-out .lg-item.lg-current { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + opacity: 1; } + .lg-css3.lg-zoom-in-out .lg-item.lg-prev-slide, .lg-css3.lg-zoom-in-out .lg-item.lg-next-slide, .lg-css3.lg-zoom-in-out .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-soft-zoom .lg-item { + opacity: 0; } + .lg-css3.lg-soft-zoom .lg-item.lg-prev-slide { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); } + .lg-css3.lg-soft-zoom .lg-item.lg-next-slide { + -webkit-transform: scale3d(0.9, 0.9, 0.9); + transform: scale3d(0.9, 0.9, 0.9); } + .lg-css3.lg-soft-zoom .lg-item.lg-current { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + opacity: 1; } + .lg-css3.lg-soft-zoom .lg-item.lg-prev-slide, .lg-css3.lg-soft-zoom .lg-item.lg-next-slide, .lg-css3.lg-soft-zoom .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-scale-up .lg-item { + opacity: 0; } + .lg-css3.lg-scale-up .lg-item.lg-prev-slide { + -moz-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0); + -o-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0); + -ms-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0); + -webkit-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0); + transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0); } + .lg-css3.lg-scale-up .lg-item.lg-next-slide { + -moz-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0); + -o-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0); + -ms-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0); + -webkit-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0); + transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0); } + .lg-css3.lg-scale-up .lg-item.lg-current { + -moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + opacity: 1; } + .lg-css3.lg-scale-up .lg-item.lg-prev-slide, .lg-css3.lg-scale-up .lg-item.lg-next-slide, .lg-css3.lg-scale-up .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-slide-circular .lg-item { + opacity: 0; } + .lg-css3.lg-slide-circular .lg-item.lg-prev-slide { + -moz-transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0); + -o-transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0); + -ms-transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0); + -webkit-transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0); + transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0); } + .lg-css3.lg-slide-circular .lg-item.lg-next-slide { + -moz-transform: scale3d(0, 0, 0) translate3d(100%, 0, 0); + -o-transform: scale3d(0, 0, 0) translate3d(100%, 0, 0); + -ms-transform: scale3d(0, 0, 0) translate3d(100%, 0, 0); + -webkit-transform: scale3d(0, 0, 0) translate3d(100%, 0, 0); + transform: scale3d(0, 0, 0) translate3d(100%, 0, 0); } + .lg-css3.lg-slide-circular .lg-item.lg-current { + -moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + opacity: 1; } + .lg-css3.lg-slide-circular .lg-item.lg-prev-slide, .lg-css3.lg-slide-circular .lg-item.lg-next-slide, .lg-css3.lg-slide-circular .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-slide-circular-up .lg-item { + opacity: 0; } + .lg-css3.lg-slide-circular-up .lg-item.lg-prev-slide { + -moz-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0); + -o-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0); + -ms-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0); + -webkit-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0); + transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0); } + .lg-css3.lg-slide-circular-up .lg-item.lg-next-slide { + -moz-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0); + -o-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0); + -ms-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0); + -webkit-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0); + transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0); } + .lg-css3.lg-slide-circular-up .lg-item.lg-current { + -moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + opacity: 1; } + .lg-css3.lg-slide-circular-up .lg-item.lg-prev-slide, .lg-css3.lg-slide-circular-up .lg-item.lg-next-slide, .lg-css3.lg-slide-circular-up .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-slide-circular-down .lg-item { + opacity: 0; } + .lg-css3.lg-slide-circular-down .lg-item.lg-prev-slide { + -moz-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0); + -o-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0); + -ms-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0); + -webkit-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0); + transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0); } + .lg-css3.lg-slide-circular-down .lg-item.lg-next-slide { + -moz-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0); + -o-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0); + -ms-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0); + -webkit-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0); + transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0); } + .lg-css3.lg-slide-circular-down .lg-item.lg-current { + -moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + opacity: 1; } + .lg-css3.lg-slide-circular-down .lg-item.lg-prev-slide, .lg-css3.lg-slide-circular-down .lg-item.lg-next-slide, .lg-css3.lg-slide-circular-down .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-slide-circular-vertical .lg-item { + opacity: 0; } + .lg-css3.lg-slide-circular-vertical .lg-item.lg-prev-slide { + -moz-transform: scale3d(0, 0, 0) translate3d(0, -100%, 0); + -o-transform: scale3d(0, 0, 0) translate3d(0, -100%, 0); + -ms-transform: scale3d(0, 0, 0) translate3d(0, -100%, 0); + -webkit-transform: scale3d(0, 0, 0) translate3d(0, -100%, 0); + transform: scale3d(0, 0, 0) translate3d(0, -100%, 0); } + .lg-css3.lg-slide-circular-vertical .lg-item.lg-next-slide { + -moz-transform: scale3d(0, 0, 0) translate3d(0, 100%, 0); + -o-transform: scale3d(0, 0, 0) translate3d(0, 100%, 0); + -ms-transform: scale3d(0, 0, 0) translate3d(0, 100%, 0); + -webkit-transform: scale3d(0, 0, 0) translate3d(0, 100%, 0); + transform: scale3d(0, 0, 0) translate3d(0, 100%, 0); } + .lg-css3.lg-slide-circular-vertical .lg-item.lg-current { + -moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + opacity: 1; } + .lg-css3.lg-slide-circular-vertical .lg-item.lg-prev-slide, .lg-css3.lg-slide-circular-vertical .lg-item.lg-next-slide, .lg-css3.lg-slide-circular-vertical .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-slide-circular-vertical-left .lg-item { + opacity: 0; } + .lg-css3.lg-slide-circular-vertical-left .lg-item.lg-prev-slide { + -moz-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0); + -o-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0); + -ms-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0); + -webkit-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0); + transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0); } + .lg-css3.lg-slide-circular-vertical-left .lg-item.lg-next-slide { + -moz-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0); + -o-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0); + -ms-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0); + -webkit-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0); + transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0); } + .lg-css3.lg-slide-circular-vertical-left .lg-item.lg-current { + -moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + opacity: 1; } + .lg-css3.lg-slide-circular-vertical-left .lg-item.lg-prev-slide, .lg-css3.lg-slide-circular-vertical-left .lg-item.lg-next-slide, .lg-css3.lg-slide-circular-vertical-left .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-slide-circular-vertical-down .lg-item { + opacity: 0; } + .lg-css3.lg-slide-circular-vertical-down .lg-item.lg-prev-slide { + -moz-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0); + -o-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0); + -ms-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0); + -webkit-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0); + transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0); } + .lg-css3.lg-slide-circular-vertical-down .lg-item.lg-next-slide { + -moz-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0); + -o-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0); + -ms-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0); + -webkit-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0); + transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0); } + .lg-css3.lg-slide-circular-vertical-down .lg-item.lg-current { + -moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + opacity: 1; } + .lg-css3.lg-slide-circular-vertical-down .lg-item.lg-prev-slide, .lg-css3.lg-slide-circular-vertical-down .lg-item.lg-next-slide, .lg-css3.lg-slide-circular-vertical-down .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; } +.lg-css3.lg-slide-vertical .lg-item { + opacity: 0; } + .lg-css3.lg-slide-vertical .lg-item.lg-prev-slide { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); } + .lg-css3.lg-slide-vertical .lg-item.lg-next-slide { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); } + .lg-css3.lg-slide-vertical .lg-item.lg-current { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; } + .lg-css3.lg-slide-vertical .lg-item.lg-prev-slide, .lg-css3.lg-slide-vertical .lg-item.lg-next-slide, .lg-css3.lg-slide-vertical .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-vertical-growth .lg-item { + opacity: 0; } + .lg-css3.lg-slide-vertical-growth .lg-item.lg-prev-slide { + -moz-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, -150%, 0); + -o-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, -150%, 0); + -ms-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, -150%, 0); + -webkit-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, -150%, 0); + transform: scale3d(0.5, 0.5, 0.5) translate3d(0, -150%, 0); } + .lg-css3.lg-slide-vertical-growth .lg-item.lg-next-slide { + -moz-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, 150%, 0); + -o-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, 150%, 0); + -ms-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, 150%, 0); + -webkit-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, 150%, 0); + transform: scale3d(0.5, 0.5, 0.5) translate3d(0, 150%, 0); } + .lg-css3.lg-slide-vertical-growth .lg-item.lg-current { + -moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + opacity: 1; } + .lg-css3.lg-slide-vertical-growth .lg-item.lg-prev-slide, .lg-css3.lg-slide-vertical-growth .lg-item.lg-next-slide, .lg-css3.lg-slide-vertical-growth .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-skew-only .lg-item { + opacity: 0; } + .lg-css3.lg-slide-skew-only .lg-item.lg-prev-slide { + -moz-transform: skew(10deg, 0deg); + -o-transform: skew(10deg, 0deg); + -ms-transform: skew(10deg, 0deg); + -webkit-transform: skew(10deg, 0deg); + transform: skew(10deg, 0deg); } + .lg-css3.lg-slide-skew-only .lg-item.lg-next-slide { + -moz-transform: skew(10deg, 0deg); + -o-transform: skew(10deg, 0deg); + -ms-transform: skew(10deg, 0deg); + -webkit-transform: skew(10deg, 0deg); + transform: skew(10deg, 0deg); } + .lg-css3.lg-slide-skew-only .lg-item.lg-current { + -moz-transform: skew(0deg, 0deg); + -o-transform: skew(0deg, 0deg); + -ms-transform: skew(0deg, 0deg); + -webkit-transform: skew(0deg, 0deg); + transform: skew(0deg, 0deg); + opacity: 1; } + .lg-css3.lg-slide-skew-only .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-only .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-only .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-skew-only-rev .lg-item { + opacity: 0; } + .lg-css3.lg-slide-skew-only-rev .lg-item.lg-prev-slide { + -moz-transform: skew(-10deg, 0deg); + -o-transform: skew(-10deg, 0deg); + -ms-transform: skew(-10deg, 0deg); + -webkit-transform: skew(-10deg, 0deg); + transform: skew(-10deg, 0deg); } + .lg-css3.lg-slide-skew-only-rev .lg-item.lg-next-slide { + -moz-transform: skew(-10deg, 0deg); + -o-transform: skew(-10deg, 0deg); + -ms-transform: skew(-10deg, 0deg); + -webkit-transform: skew(-10deg, 0deg); + transform: skew(-10deg, 0deg); } + .lg-css3.lg-slide-skew-only-rev .lg-item.lg-current { + -moz-transform: skew(0deg, 0deg); + -o-transform: skew(0deg, 0deg); + -ms-transform: skew(0deg, 0deg); + -webkit-transform: skew(0deg, 0deg); + transform: skew(0deg, 0deg); + opacity: 1; } + .lg-css3.lg-slide-skew-only-rev .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-only-rev .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-only-rev .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-skew-only-y .lg-item { + opacity: 0; } + .lg-css3.lg-slide-skew-only-y .lg-item.lg-prev-slide { + -moz-transform: skew(0deg, 10deg); + -o-transform: skew(0deg, 10deg); + -ms-transform: skew(0deg, 10deg); + -webkit-transform: skew(0deg, 10deg); + transform: skew(0deg, 10deg); } + .lg-css3.lg-slide-skew-only-y .lg-item.lg-next-slide { + -moz-transform: skew(0deg, 10deg); + -o-transform: skew(0deg, 10deg); + -ms-transform: skew(0deg, 10deg); + -webkit-transform: skew(0deg, 10deg); + transform: skew(0deg, 10deg); } + .lg-css3.lg-slide-skew-only-y .lg-item.lg-current { + -moz-transform: skew(0deg, 0deg); + -o-transform: skew(0deg, 0deg); + -ms-transform: skew(0deg, 0deg); + -webkit-transform: skew(0deg, 0deg); + transform: skew(0deg, 0deg); + opacity: 1; } + .lg-css3.lg-slide-skew-only-y .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-only-y .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-only-y .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-skew-only-y-rev .lg-item { + opacity: 0; } + .lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-prev-slide { + -moz-transform: skew(0deg, -10deg); + -o-transform: skew(0deg, -10deg); + -ms-transform: skew(0deg, -10deg); + -webkit-transform: skew(0deg, -10deg); + transform: skew(0deg, -10deg); } + .lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-next-slide { + -moz-transform: skew(0deg, -10deg); + -o-transform: skew(0deg, -10deg); + -ms-transform: skew(0deg, -10deg); + -webkit-transform: skew(0deg, -10deg); + transform: skew(0deg, -10deg); } + .lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-current { + -moz-transform: skew(0deg, 0deg); + -o-transform: skew(0deg, 0deg); + -ms-transform: skew(0deg, 0deg); + -webkit-transform: skew(0deg, 0deg); + transform: skew(0deg, 0deg); + opacity: 1; } + .lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-skew .lg-item { + opacity: 0; } + .lg-css3.lg-slide-skew .lg-item.lg-prev-slide { + -moz-transform: skew(20deg, 0deg) translate3d(-100%, 0%, 0px); + -o-transform: skew(20deg, 0deg) translate3d(-100%, 0%, 0px); + -ms-transform: skew(20deg, 0deg) translate3d(-100%, 0%, 0px); + -webkit-transform: skew(20deg, 0deg) translate3d(-100%, 0%, 0px); + transform: skew(20deg, 0deg) translate3d(-100%, 0%, 0px); } + .lg-css3.lg-slide-skew .lg-item.lg-next-slide { + -moz-transform: skew(20deg, 0deg) translate3d(100%, 0%, 0px); + -o-transform: skew(20deg, 0deg) translate3d(100%, 0%, 0px); + -ms-transform: skew(20deg, 0deg) translate3d(100%, 0%, 0px); + -webkit-transform: skew(20deg, 0deg) translate3d(100%, 0%, 0px); + transform: skew(20deg, 0deg) translate3d(100%, 0%, 0px); } + .lg-css3.lg-slide-skew .lg-item.lg-current { + -moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + opacity: 1; } + .lg-css3.lg-slide-skew .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew .lg-item.lg-next-slide, .lg-css3.lg-slide-skew .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-skew-rev .lg-item { + opacity: 0; } + .lg-css3.lg-slide-skew-rev .lg-item.lg-prev-slide { + -moz-transform: skew(-20deg, 0deg) translate3d(-100%, 0%, 0px); + -o-transform: skew(-20deg, 0deg) translate3d(-100%, 0%, 0px); + -ms-transform: skew(-20deg, 0deg) translate3d(-100%, 0%, 0px); + -webkit-transform: skew(-20deg, 0deg) translate3d(-100%, 0%, 0px); + transform: skew(-20deg, 0deg) translate3d(-100%, 0%, 0px); } + .lg-css3.lg-slide-skew-rev .lg-item.lg-next-slide { + -moz-transform: skew(-20deg, 0deg) translate3d(100%, 0%, 0px); + -o-transform: skew(-20deg, 0deg) translate3d(100%, 0%, 0px); + -ms-transform: skew(-20deg, 0deg) translate3d(100%, 0%, 0px); + -webkit-transform: skew(-20deg, 0deg) translate3d(100%, 0%, 0px); + transform: skew(-20deg, 0deg) translate3d(100%, 0%, 0px); } + .lg-css3.lg-slide-skew-rev .lg-item.lg-current { + -moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + opacity: 1; } + .lg-css3.lg-slide-skew-rev .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-rev .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-rev .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-skew-cross .lg-item { + opacity: 0; } + .lg-css3.lg-slide-skew-cross .lg-item.lg-prev-slide { + -moz-transform: skew(0deg, 60deg) translate3d(-100%, 0%, 0px); + -o-transform: skew(0deg, 60deg) translate3d(-100%, 0%, 0px); + -ms-transform: skew(0deg, 60deg) translate3d(-100%, 0%, 0px); + -webkit-transform: skew(0deg, 60deg) translate3d(-100%, 0%, 0px); + transform: skew(0deg, 60deg) translate3d(-100%, 0%, 0px); } + .lg-css3.lg-slide-skew-cross .lg-item.lg-next-slide { + -moz-transform: skew(0deg, 60deg) translate3d(100%, 0%, 0px); + -o-transform: skew(0deg, 60deg) translate3d(100%, 0%, 0px); + -ms-transform: skew(0deg, 60deg) translate3d(100%, 0%, 0px); + -webkit-transform: skew(0deg, 60deg) translate3d(100%, 0%, 0px); + transform: skew(0deg, 60deg) translate3d(100%, 0%, 0px); } + .lg-css3.lg-slide-skew-cross .lg-item.lg-current { + -moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + opacity: 1; } + .lg-css3.lg-slide-skew-cross .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-cross .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-cross .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-skew-cross-rev .lg-item { + opacity: 0; } + .lg-css3.lg-slide-skew-cross-rev .lg-item.lg-prev-slide { + -moz-transform: skew(0deg, -60deg) translate3d(-100%, 0%, 0px); + -o-transform: skew(0deg, -60deg) translate3d(-100%, 0%, 0px); + -ms-transform: skew(0deg, -60deg) translate3d(-100%, 0%, 0px); + -webkit-transform: skew(0deg, -60deg) translate3d(-100%, 0%, 0px); + transform: skew(0deg, -60deg) translate3d(-100%, 0%, 0px); } + .lg-css3.lg-slide-skew-cross-rev .lg-item.lg-next-slide { + -moz-transform: skew(0deg, -60deg) translate3d(100%, 0%, 0px); + -o-transform: skew(0deg, -60deg) translate3d(100%, 0%, 0px); + -ms-transform: skew(0deg, -60deg) translate3d(100%, 0%, 0px); + -webkit-transform: skew(0deg, -60deg) translate3d(100%, 0%, 0px); + transform: skew(0deg, -60deg) translate3d(100%, 0%, 0px); } + .lg-css3.lg-slide-skew-cross-rev .lg-item.lg-current { + -moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + opacity: 1; } + .lg-css3.lg-slide-skew-cross-rev .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-cross-rev .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-cross-rev .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-skew-ver .lg-item { + opacity: 0; } + .lg-css3.lg-slide-skew-ver .lg-item.lg-prev-slide { + -moz-transform: skew(60deg, 0deg) translate3d(0, -100%, 0px); + -o-transform: skew(60deg, 0deg) translate3d(0, -100%, 0px); + -ms-transform: skew(60deg, 0deg) translate3d(0, -100%, 0px); + -webkit-transform: skew(60deg, 0deg) translate3d(0, -100%, 0px); + transform: skew(60deg, 0deg) translate3d(0, -100%, 0px); } + .lg-css3.lg-slide-skew-ver .lg-item.lg-next-slide { + -moz-transform: skew(60deg, 0deg) translate3d(0, 100%, 0px); + -o-transform: skew(60deg, 0deg) translate3d(0, 100%, 0px); + -ms-transform: skew(60deg, 0deg) translate3d(0, 100%, 0px); + -webkit-transform: skew(60deg, 0deg) translate3d(0, 100%, 0px); + transform: skew(60deg, 0deg) translate3d(0, 100%, 0px); } + .lg-css3.lg-slide-skew-ver .lg-item.lg-current { + -moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + opacity: 1; } + .lg-css3.lg-slide-skew-ver .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-ver .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-ver .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-skew-ver-rev .lg-item { + opacity: 0; } + .lg-css3.lg-slide-skew-ver-rev .lg-item.lg-prev-slide { + -moz-transform: skew(-60deg, 0deg) translate3d(0, -100%, 0px); + -o-transform: skew(-60deg, 0deg) translate3d(0, -100%, 0px); + -ms-transform: skew(-60deg, 0deg) translate3d(0, -100%, 0px); + -webkit-transform: skew(-60deg, 0deg) translate3d(0, -100%, 0px); + transform: skew(-60deg, 0deg) translate3d(0, -100%, 0px); } + .lg-css3.lg-slide-skew-ver-rev .lg-item.lg-next-slide { + -moz-transform: skew(-60deg, 0deg) translate3d(0, 100%, 0px); + -o-transform: skew(-60deg, 0deg) translate3d(0, 100%, 0px); + -ms-transform: skew(-60deg, 0deg) translate3d(0, 100%, 0px); + -webkit-transform: skew(-60deg, 0deg) translate3d(0, 100%, 0px); + transform: skew(-60deg, 0deg) translate3d(0, 100%, 0px); } + .lg-css3.lg-slide-skew-ver-rev .lg-item.lg-current { + -moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + opacity: 1; } + .lg-css3.lg-slide-skew-ver-rev .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-ver-rev .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-ver-rev .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-skew-ver-cross .lg-item { + opacity: 0; } + .lg-css3.lg-slide-skew-ver-cross .lg-item.lg-prev-slide { + -moz-transform: skew(0deg, 20deg) translate3d(0, -100%, 0px); + -o-transform: skew(0deg, 20deg) translate3d(0, -100%, 0px); + -ms-transform: skew(0deg, 20deg) translate3d(0, -100%, 0px); + -webkit-transform: skew(0deg, 20deg) translate3d(0, -100%, 0px); + transform: skew(0deg, 20deg) translate3d(0, -100%, 0px); } + .lg-css3.lg-slide-skew-ver-cross .lg-item.lg-next-slide { + -moz-transform: skew(0deg, 20deg) translate3d(0, 100%, 0px); + -o-transform: skew(0deg, 20deg) translate3d(0, 100%, 0px); + -ms-transform: skew(0deg, 20deg) translate3d(0, 100%, 0px); + -webkit-transform: skew(0deg, 20deg) translate3d(0, 100%, 0px); + transform: skew(0deg, 20deg) translate3d(0, 100%, 0px); } + .lg-css3.lg-slide-skew-ver-cross .lg-item.lg-current { + -moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + opacity: 1; } + .lg-css3.lg-slide-skew-ver-cross .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-ver-cross .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-ver-cross .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-slide-skew-ver-cross-rev .lg-item { + opacity: 0; } + .lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-prev-slide { + -moz-transform: skew(0deg, -20deg) translate3d(0, -100%, 0px); + -o-transform: skew(0deg, -20deg) translate3d(0, -100%, 0px); + -ms-transform: skew(0deg, -20deg) translate3d(0, -100%, 0px); + -webkit-transform: skew(0deg, -20deg) translate3d(0, -100%, 0px); + transform: skew(0deg, -20deg) translate3d(0, -100%, 0px); } + .lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-next-slide { + -moz-transform: skew(0deg, -20deg) translate3d(0, 100%, 0px); + -o-transform: skew(0deg, -20deg) translate3d(0, 100%, 0px); + -ms-transform: skew(0deg, -20deg) translate3d(0, 100%, 0px); + -webkit-transform: skew(0deg, -20deg) translate3d(0, 100%, 0px); + transform: skew(0deg, -20deg) translate3d(0, 100%, 0px); } + .lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-current { + -moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + -webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px); + opacity: 1; } + .lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-lollipop .lg-item { + opacity: 0; } + .lg-css3.lg-lollipop .lg-item.lg-prev-slide { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); } + .lg-css3.lg-lollipop .lg-item.lg-next-slide { + -moz-transform: translate3d(0, 0, 0) scale(0.5); + -o-transform: translate3d(0, 0, 0) scale(0.5); + -ms-transform: translate3d(0, 0, 0) scale(0.5); + -webkit-transform: translate3d(0, 0, 0) scale(0.5); + transform: translate3d(0, 0, 0) scale(0.5); } + .lg-css3.lg-lollipop .lg-item.lg-current { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; } + .lg-css3.lg-lollipop .lg-item.lg-prev-slide, .lg-css3.lg-lollipop .lg-item.lg-next-slide, .lg-css3.lg-lollipop .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-lollipop-rev .lg-item { + opacity: 0; } + .lg-css3.lg-lollipop-rev .lg-item.lg-prev-slide { + -moz-transform: translate3d(0, 0, 0) scale(0.5); + -o-transform: translate3d(0, 0, 0) scale(0.5); + -ms-transform: translate3d(0, 0, 0) scale(0.5); + -webkit-transform: translate3d(0, 0, 0) scale(0.5); + transform: translate3d(0, 0, 0) scale(0.5); } + .lg-css3.lg-lollipop-rev .lg-item.lg-next-slide { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); } + .lg-css3.lg-lollipop-rev .lg-item.lg-current { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; } + .lg-css3.lg-lollipop-rev .lg-item.lg-prev-slide, .lg-css3.lg-lollipop-rev .lg-item.lg-next-slide, .lg-css3.lg-lollipop-rev .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-rotate .lg-item { + opacity: 0; } + .lg-css3.lg-rotate .lg-item.lg-prev-slide { + -moz-transform: rotate(-360deg); + -o-transform: rotate(-360deg); + -ms-transform: rotate(-360deg); + -webkit-transform: rotate(-360deg); + transform: rotate(-360deg); } + .lg-css3.lg-rotate .lg-item.lg-next-slide { + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } + .lg-css3.lg-rotate .lg-item.lg-current { + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -ms-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + opacity: 1; } + .lg-css3.lg-rotate .lg-item.lg-prev-slide, .lg-css3.lg-rotate .lg-item.lg-next-slide, .lg-css3.lg-rotate .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-rotate-rev .lg-item { + opacity: 0; } + .lg-css3.lg-rotate-rev .lg-item.lg-prev-slide { + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } + .lg-css3.lg-rotate-rev .lg-item.lg-next-slide { + -moz-transform: rotate(-360deg); + -o-transform: rotate(-360deg); + -ms-transform: rotate(-360deg); + -webkit-transform: rotate(-360deg); + transform: rotate(-360deg); } + .lg-css3.lg-rotate-rev .lg-item.lg-current { + -moz-transform: rotate(0deg); + -o-transform: rotate(0deg); + -ms-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + opacity: 1; } + .lg-css3.lg-rotate-rev .lg-item.lg-prev-slide, .lg-css3.lg-rotate-rev .lg-item.lg-next-slide, .lg-css3.lg-rotate-rev .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } +.lg-css3.lg-tube .lg-item { + opacity: 0; } + .lg-css3.lg-tube .lg-item.lg-prev-slide { + -moz-transform: scale3d(1, 0, 1) translate3d(-100%, 0, 0); + -o-transform: scale3d(1, 0, 1) translate3d(-100%, 0, 0); + -ms-transform: scale3d(1, 0, 1) translate3d(-100%, 0, 0); + -webkit-transform: scale3d(1, 0, 1) translate3d(-100%, 0, 0); + transform: scale3d(1, 0, 1) translate3d(-100%, 0, 0); } + .lg-css3.lg-tube .lg-item.lg-next-slide { + -moz-transform: scale3d(1, 0, 1) translate3d(100%, 0, 0); + -o-transform: scale3d(1, 0, 1) translate3d(100%, 0, 0); + -ms-transform: scale3d(1, 0, 1) translate3d(100%, 0, 0); + -webkit-transform: scale3d(1, 0, 1) translate3d(100%, 0, 0); + transform: scale3d(1, 0, 1) translate3d(100%, 0, 0); } + .lg-css3.lg-tube .lg-item.lg-current { + -moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + -webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + transform: scale3d(1, 1, 1) translate3d(0, 0, 0); + opacity: 1; } + .lg-css3.lg-tube .lg-item.lg-prev-slide, .lg-css3.lg-tube .lg-item.lg-next-slide, .lg-css3.lg-tube .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; } + +/*# sourceMappingURL=lg-transitions.css.map */ diff --git a/vendors/lightgallery/src/css/lg-transitions.css.map b/vendors/lightgallery/src/css/lg-transitions.css.map new file mode 100644 index 000000000..37599e9e0 --- /dev/null +++ b/vendors/lightgallery/src/css/lg-transitions.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../sass/lg-transitions.scss","../sass/lg-mixins.scss"], +"names": [], +"file": "lg-transitions.css" +} diff --git a/vendors/lightgallery/src/css/lightgallery.css b/vendors/lightgallery/src/css/lightgallery.css new file mode 100644 index 000000000..d28f1ce44 --- /dev/null +++ b/vendors/lightgallery/src/css/lightgallery.css @@ -0,0 +1,843 @@ +@font-face { + font-family: 'lg'; + src: url("../fonts/lg.eot?n1z373"); + src: url("../fonts/lg.eot?#iefixn1z373") format("embedded-opentype"), url("../fonts/lg.woff?n1z373") format("woff"), url("../fonts/lg.ttf?n1z373") format("truetype"), url("../fonts/lg.svg?n1z373#lg") format("svg"); + font-weight: normal; + font-style: normal; +} +.lg-icon { + font-family: 'lg'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.lg-actions .lg-next, .lg-actions .lg-prev { + background-color: rgba(0, 0, 0, 0.45); + border-radius: 2px; + color: #999; + cursor: pointer; + display: block; + font-size: 22px; + margin-top: -10px; + padding: 8px 10px 9px; + position: absolute; + top: 50%; + z-index: 1080; +} +.lg-actions .lg-next.disabled, .lg-actions .lg-prev.disabled { + pointer-events: none; + opacity: 0.5; +} +.lg-actions .lg-next:hover, .lg-actions .lg-prev:hover { + color: #FFF; +} +.lg-actions .lg-next { + right: 20px; +} +.lg-actions .lg-next:before { + content: "\e095"; +} +.lg-actions .lg-prev { + left: 20px; +} +.lg-actions .lg-prev:after { + content: "\e094"; +} + +@-webkit-keyframes lg-right-end { + 0% { + left: 0; + } + 50% { + left: -30px; + } + 100% { + left: 0; + } +} +@-moz-keyframes lg-right-end { + 0% { + left: 0; + } + 50% { + left: -30px; + } + 100% { + left: 0; + } +} +@-ms-keyframes lg-right-end { + 0% { + left: 0; + } + 50% { + left: -30px; + } + 100% { + left: 0; + } +} +@keyframes lg-right-end { + 0% { + left: 0; + } + 50% { + left: -30px; + } + 100% { + left: 0; + } +} +@-webkit-keyframes lg-left-end { + 0% { + left: 0; + } + 50% { + left: 30px; + } + 100% { + left: 0; + } +} +@-moz-keyframes lg-left-end { + 0% { + left: 0; + } + 50% { + left: 30px; + } + 100% { + left: 0; + } +} +@-ms-keyframes lg-left-end { + 0% { + left: 0; + } + 50% { + left: 30px; + } + 100% { + left: 0; + } +} +@keyframes lg-left-end { + 0% { + left: 0; + } + 50% { + left: 30px; + } + 100% { + left: 0; + } +} +.lg-outer.lg-right-end .lg-object { + -webkit-animation: lg-right-end 0.3s; + -o-animation: lg-right-end 0.3s; + animation: lg-right-end 0.3s; + position: relative; +} +.lg-outer.lg-left-end .lg-object { + -webkit-animation: lg-left-end 0.3s; + -o-animation: lg-left-end 0.3s; + animation: lg-left-end 0.3s; + position: relative; +} + +.lg-toolbar { + z-index: 1082; + left: 0; + position: absolute; + top: 0; + width: 100%; + background-color: rgba(0, 0, 0, 0.45); +} +.lg-toolbar .lg-icon { + color: #999; + cursor: pointer; + float: right; + font-size: 24px; + height: 47px; + line-height: 27px; + padding: 10px 0; + text-align: center; + width: 50px; + text-decoration: none !important; + outline: medium none; + -webkit-transition: color 0.2s linear; + -o-transition: color 0.2s linear; + transition: color 0.2s linear; +} +.lg-toolbar .lg-icon:hover { + color: #FFF; +} +.lg-toolbar .lg-close:after { + content: "\e070"; +} +.lg-toolbar .lg-download:after { + content: "\e0f2"; +} + +.lg-sub-html { + background-color: rgba(0, 0, 0, 0.45); + bottom: 0; + color: #EEE; + font-size: 16px; + left: 0; + padding: 10px 40px; + position: fixed; + right: 0; + text-align: center; + z-index: 1080; +} +.lg-sub-html h4 { + margin: 0; + font-size: 13px; + font-weight: bold; +} +.lg-sub-html p { + font-size: 12px; + margin: 5px 0 0; +} + +#lg-counter { + color: #999; + display: inline-block; + font-size: 16px; + padding-left: 20px; + padding-top: 12px; + vertical-align: middle; +} + +.lg-toolbar, .lg-prev, .lg-next { + opacity: 1; + -webkit-transition: -webkit-transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, color 0.2s linear; + -moz-transition: -moz-transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, color 0.2s linear; + -o-transition: -o-transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, color 0.2s linear; + transition: transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, color 0.2s linear; +} + +.lg-hide-items .lg-prev { + opacity: 0; + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); +} +.lg-hide-items .lg-next { + opacity: 0; + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); +} +.lg-hide-items .lg-toolbar { + opacity: 0; + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); +} + +body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-object { + -webkit-transform: scale3d(0.5, 0.5, 0.5); + transform: scale3d(0.5, 0.5, 0.5); + opacity: 0; + -webkit-transition: -webkit-transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important; + -moz-transition: -moz-transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important; + -o-transition: -o-transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important; + transition: transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important; + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} +body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item.lg-complete .lg-object { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + opacity: 1; +} + +.lg-outer .lg-thumb-outer { + background-color: #0D0A0A; + bottom: 0; + position: absolute; + width: 100%; + z-index: 1080; + max-height: 350px; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s; + -moz-transition: -moz-transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s; + -o-transition: -o-transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s; + transition: transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s; +} +.lg-outer .lg-thumb-outer.lg-grab .lg-thumb-item { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: -o-grab; + cursor: -ms-grab; + cursor: grab; +} +.lg-outer .lg-thumb-outer.lg-grabbing .lg-thumb-item { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: -o-grabbing; + cursor: -ms-grabbing; + cursor: grabbing; +} +.lg-outer .lg-thumb-outer.lg-dragging .lg-thumb { + -webkit-transition-duration: 0s !important; + transition-duration: 0s !important; +} +.lg-outer.lg-thumb-open .lg-thumb-outer { + -webkit-transform: translate3d(0, 0%, 0); + transform: translate3d(0, 0%, 0); +} +.lg-outer .lg-thumb { + padding: 10px 0; + height: 100%; + margin-bottom: -5px; +} +.lg-outer .lg-thumb-item { + border-radius: 5px; + cursor: pointer; + float: left; + overflow: hidden; + height: 100%; + border: 2px solid #FFF; + border-radius: 4px; + margin-bottom: 5px; +} +@media (min-width: 1025px) { + .lg-outer .lg-thumb-item { + -webkit-transition: border-color 0.25s ease; + -o-transition: border-color 0.25s ease; + transition: border-color 0.25s ease; + } +} +.lg-outer .lg-thumb-item.active, .lg-outer .lg-thumb-item:hover { + border-color: #a90707; +} +.lg-outer .lg-thumb-item img { + width: 100%; + height: 100%; + object-fit: cover; +} +.lg-outer.lg-has-thumb .lg-item { + padding-bottom: 120px; +} +.lg-outer.lg-can-toggle .lg-item { + padding-bottom: 0; +} +.lg-outer.lg-pull-caption-up .lg-sub-html { + -webkit-transition: bottom 0.25s ease; + -o-transition: bottom 0.25s ease; + transition: bottom 0.25s ease; +} +.lg-outer.lg-pull-caption-up.lg-thumb-open .lg-sub-html { + bottom: 100px; +} +.lg-outer .lg-toogle-thumb { + background-color: #0D0A0A; + border-radius: 2px 2px 0 0; + color: #999; + cursor: pointer; + font-size: 24px; + height: 39px; + line-height: 27px; + padding: 5px 0; + position: absolute; + right: 20px; + text-align: center; + top: -39px; + width: 50px; +} +.lg-outer .lg-toogle-thumb:after { + content: "\e1ff"; +} +.lg-outer .lg-toogle-thumb:hover { + color: #FFF; +} + +.lg-outer .lg-video-cont { + display: inline-block; + vertical-align: middle; + max-width: 1140px; + max-height: 100%; + width: 100%; + padding: 0 5px; +} +.lg-outer .lg-video { + width: 100%; + height: 0; + padding-bottom: 56.25%; + overflow: hidden; + position: relative; +} +.lg-outer .lg-video .lg-object { + display: inline-block; + position: absolute; + top: 0; + left: 0; + width: 100% !important; + height: 100% !important; +} +.lg-outer .lg-video .lg-video-play { + width: 84px; + height: 59px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -42px; + margin-top: -30px; + z-index: 1080; + cursor: pointer; +} +.lg-outer .lg-has-vimeo .lg-video-play { + background: url("../img/vimeo-play.png") no-repeat scroll 0 0 transparent; +} +.lg-outer .lg-has-vimeo:hover .lg-video-play { + background: url("../img/vimeo-play.png") no-repeat scroll 0 -58px transparent; +} +.lg-outer .lg-has-html5 .lg-video-play { + background: transparent url("../img/video-play.png") no-repeat scroll 0 0; + height: 64px; + margin-left: -32px; + margin-top: -32px; + width: 64px; + opacity: 0.8; +} +.lg-outer .lg-has-html5:hover .lg-video-play { + opacity: 1; +} +.lg-outer .lg-has-youtube .lg-video-play { + background: url("../img/youtube-play.png") no-repeat scroll 0 0 transparent; +} +.lg-outer .lg-has-youtube:hover .lg-video-play { + background: url("../img/youtube-play.png") no-repeat scroll 0 -60px transparent; +} +.lg-outer .lg-video-object { + width: 100% !important; + height: 100% !important; + position: absolute; + top: 0; + left: 0; +} +.lg-outer .lg-has-video .lg-video-object { + visibility: hidden; +} +.lg-outer .lg-has-video.lg-video-playing .lg-object, .lg-outer .lg-has-video.lg-video-playing .lg-video-play { + display: none; +} +.lg-outer .lg-has-video.lg-video-playing .lg-video-object { + visibility: visible; +} + +.lg-progress-bar { + background-color: #333; + height: 5px; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 1083; + opacity: 0; + -webkit-transition: opacity 0.08s ease 0s; + -moz-transition: opacity 0.08s ease 0s; + -o-transition: opacity 0.08s ease 0s; + transition: opacity 0.08s ease 0s; +} +.lg-progress-bar .lg-progress { + background-color: #a90707; + height: 5px; + width: 0; +} +.lg-progress-bar.lg-start .lg-progress { + width: 100%; +} +.lg-show-autoplay .lg-progress-bar { + opacity: 1; +} + +.lg-autoplay-button:after { + content: "\e01d"; +} +.lg-show-autoplay .lg-autoplay-button:after { + content: "\e01a"; +} + +.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-img-wrap, .lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-image { + -webkit-transition-duration: 0s; + transition-duration: 0s; +} +.lg-outer .lg-item.lg-complete.lg-zoomable .lg-img-wrap { + -webkit-transition: left 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, top 0.3s cubic-bezier(0, 0, 0.25, 1) 0s; + -moz-transition: left 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, top 0.3s cubic-bezier(0, 0, 0.25, 1) 0s; + -o-transition: left 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, top 0.3s cubic-bezier(0, 0, 0.25, 1) 0s; + transition: left 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, top 0.3s cubic-bezier(0, 0, 0.25, 1) 0s; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; +} +.lg-outer .lg-item.lg-complete.lg-zoomable .lg-image { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + -webkit-transition: -webkit-transform 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.15s !important; + -moz-transition: -moz-transform 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.15s !important; + -o-transition: -o-transform 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.15s !important; + transition: transform 0.3s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.15s !important; + -webkit-transform-origin: 0 0; + -moz-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; +} + +#lg-zoom-in:after { + content: "\e311"; +} + +#lg-actual-size { + font-size: 20px; +} +#lg-actual-size:after { + content: "\e033"; +} + +#lg-zoom-out { + opacity: 0.5; + pointer-events: none; +} +#lg-zoom-out:after { + content: "\e312"; +} +.lg-zoomed #lg-zoom-out { + opacity: 1; + pointer-events: auto; +} + +.lg-outer .lg-pager-outer { + bottom: 60px; + left: 0; + position: absolute; + right: 0; + text-align: center; + z-index: 1080; + height: 10px; +} +.lg-outer .lg-pager-outer.lg-pager-hover .lg-pager-cont { + overflow: visible; +} +.lg-outer .lg-pager-cont { + cursor: pointer; + display: inline-block; + overflow: hidden; + position: relative; + vertical-align: top; + margin: 0 5px; +} +.lg-outer .lg-pager-cont:hover .lg-pager-thumb-cont { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.lg-outer .lg-pager-cont.lg-pager-active .lg-pager { + box-shadow: 0 0 0 2px white inset; +} +.lg-outer .lg-pager-thumb-cont { + background-color: #fff; + color: #FFF; + bottom: 100%; + height: 83px; + left: 0; + margin-bottom: 20px; + margin-left: -60px; + opacity: 0; + padding: 5px; + position: absolute; + width: 120px; + border-radius: 3px; + -webkit-transition: opacity 0.15s ease 0s, -webkit-transform 0.15s ease 0s; + -moz-transition: opacity 0.15s ease 0s, -moz-transform 0.15s ease 0s; + -o-transition: opacity 0.15s ease 0s, -o-transform 0.15s ease 0s; + transition: opacity 0.15s ease 0s, transform 0.15s ease 0s; + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); +} +.lg-outer .lg-pager-thumb-cont img { + width: 100%; + height: 100%; +} +.lg-outer .lg-pager { + background-color: rgba(255, 255, 255, 0.5); + border-radius: 50%; + box-shadow: 0 0 0 8px rgba(255, 255, 255, 0.7) inset; + display: block; + height: 12px; + -webkit-transition: box-shadow 0.3s ease 0s; + -o-transition: box-shadow 0.3s ease 0s; + transition: box-shadow 0.3s ease 0s; + width: 12px; +} +.lg-outer .lg-pager:hover, .lg-outer .lg-pager:focus { + box-shadow: 0 0 0 8px white inset; +} +.lg-outer .lg-caret { + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-top: 10px dashed; + bottom: -10px; + display: inline-block; + height: 0; + left: 50%; + margin-left: -5px; + position: absolute; + vertical-align: middle; + width: 0; +} + +.lg-fullscreen:after { + content: "\e20c"; +} +.lg-fullscreen-on .lg-fullscreen:after { + content: "\e20d"; +} + +.group { + *zoom: 1; +} + +.group:before, .group:after { + display: table; + content: ""; + line-height: 0; +} + +.group:after { + clear: both; +} + +.lg-outer { + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + z-index: 1050; + opacity: 0; + -webkit-transition: opacity 0.15s ease 0s; + -o-transition: opacity 0.15s ease 0s; + transition: opacity 0.15s ease 0s; +} +.lg-outer * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.lg-outer.lg-visible { + opacity: 1; +} +.lg-outer.lg-css3 .lg-item.lg-prev-slide, .lg-outer.lg-css3 .lg-item.lg-next-slide, .lg-outer.lg-css3 .lg-item.lg-current { + -webkit-transition-duration: inherit !important; + transition-duration: inherit !important; + -webkit-transition-timing-function: inherit !important; + transition-timing-function: inherit !important; +} +.lg-outer.lg-css3.lg-dragging .lg-item.lg-prev-slide, .lg-outer.lg-css3.lg-dragging .lg-item.lg-next-slide, .lg-outer.lg-css3.lg-dragging .lg-item.lg-current { + -webkit-transition-duration: 0s !important; + transition-duration: 0s !important; + opacity: 1; +} +.lg-outer.lg-grab img.lg-object { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: -o-grab; + cursor: -ms-grab; + cursor: grab; +} +.lg-outer.lg-grabbing img.lg-object { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: -o-grabbing; + cursor: -ms-grabbing; + cursor: grabbing; +} +.lg-outer .lg { + height: 100%; + width: 100%; + position: relative; + overflow: hidden; + margin-left: auto; + margin-right: auto; + max-width: 100%; + max-height: 100%; +} +.lg-outer .lg-inner { + width: 100%; + height: 100%; + position: absolute; + left: 0; + top: 0; + white-space: nowrap; +} +.lg-outer .lg-item { + background: url("../img/loading.gif") no-repeat scroll center center transparent; + display: none !important; +} +.lg-outer.lg-css3 .lg-prev-slide, .lg-outer.lg-css3 .lg-current, .lg-outer.lg-css3 .lg-next-slide { + display: inline-block !important; +} +.lg-outer.lg-css .lg-current { + display: inline-block !important; +} +.lg-outer .lg-item, .lg-outer .lg-img-wrap { + display: inline-block; + text-align: center; + position: absolute; + width: 100%; + height: 100%; +} +.lg-outer .lg-item:before, .lg-outer .lg-img-wrap:before { + content: ""; + display: inline-block; + height: 50%; + width: 1px; + margin-right: -1px; +} +.lg-outer .lg-img-wrap { + position: absolute; + padding: 0 5px; + left: 0; + right: 0; + top: 0; + bottom: 0; +} +.lg-outer .lg-item.lg-complete { + background-image: none; +} +.lg-outer .lg-item.lg-current { + z-index: 1060; +} +.lg-outer .lg-image { + display: inline-block; + vertical-align: middle; + max-width: 100%; + max-height: 100%; + width: auto !important; + height: auto !important; +} +.lg-outer.lg-show-after-load .lg-item .lg-object, .lg-outer.lg-show-after-load .lg-item .lg-video-play { + opacity: 0; + -webkit-transition: opacity 0.15s ease 0s; + -o-transition: opacity 0.15s ease 0s; + transition: opacity 0.15s ease 0s; +} +.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-object, .lg-outer.lg-show-after-load .lg-item.lg-complete .lg-video-play { + opacity: 1; +} +.lg-outer .lg-empty-html { + display: none; +} +.lg-outer.lg-hide-download #lg-download { + display: none; +} + +.lg-backdrop { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1040; + background-color: #000; + opacity: 0; + -webkit-transition: opacity 0.15s ease 0s; + -o-transition: opacity 0.15s ease 0s; + transition: opacity 0.15s ease 0s; +} +.lg-backdrop.in { + opacity: 1; +} + +.lg-css3.lg-no-trans .lg-prev-slide, .lg-css3.lg-no-trans .lg-next-slide, .lg-css3.lg-no-trans .lg-current { + -webkit-transition: none 0s ease 0s !important; + -moz-transition: none 0s ease 0s !important; + -o-transition: none 0s ease 0s !important; + transition: none 0s ease 0s !important; +} +.lg-css3.lg-use-css3 .lg-item { + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; +} +.lg-css3.lg-use-left .lg-item { + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; +} +.lg-css3.lg-fade .lg-item { + opacity: 0; +} +.lg-css3.lg-fade .lg-item.lg-current { + opacity: 1; +} +.lg-css3.lg-fade .lg-item.lg-prev-slide, .lg-css3.lg-fade .lg-item.lg-next-slide, .lg-css3.lg-fade .lg-item.lg-current { + -webkit-transition: opacity 0.1s ease 0s; + -moz-transition: opacity 0.1s ease 0s; + -o-transition: opacity 0.1s ease 0s; + transition: opacity 0.1s ease 0s; +} +.lg-css3.lg-slide.lg-use-css3 .lg-item { + opacity: 0; +} +.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} +.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); +} +.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1; +} +.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide, .lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide, .lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current { + -webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; +} +.lg-css3.lg-slide.lg-use-left .lg-item { + opacity: 0; + position: absolute; + left: 0; +} +.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide { + left: -100%; +} +.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide { + left: 100%; +} +.lg-css3.lg-slide.lg-use-left .lg-item.lg-current { + left: 0; + opacity: 1; +} +.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide, .lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide, .lg-css3.lg-slide.lg-use-left .lg-item.lg-current { + -webkit-transition: left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -moz-transition: left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + -o-transition: left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; + transition: left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; +} + +/*# sourceMappingURL=lightgallery.css.map */ diff --git a/vendors/lightgallery/src/css/lightgallery.css.map b/vendors/lightgallery/src/css/lightgallery.css.map new file mode 100644 index 000000000..c34247efe --- /dev/null +++ b/vendors/lightgallery/src/css/lightgallery.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../sass/lg-fonts.scss","../sass/lg-theme-default.scss","../sass/lg-variables.scss","../sass/lg-mixins.scss","../sass/lg-thumbnail.scss","../sass/lg-video.scss","../sass/lg-autoplay.scss","../sass/lg-zoom.scss","../sass/lg-pager.scss","../sass/lg-fullscreen.scss","../sass/lightgallery.scss"], +"names": [], +"file": "lightgallery.css" +} diff --git a/vendors/lightgallery/src/fonts/lg.eot b/vendors/lightgallery/src/fonts/lg.eot new file mode 100644 index 0000000000000000000000000000000000000000..1eb39169ca7a41fa2d0b5e6b699b164cba839abb GIT binary patch literal 2904 zcmai0O>A355T1Q6v76*MiJf0U+SqX&QwQQSu45<#LWNo)CBn4N7OD{7xW;zn*p}@` z%>l{17g31xkMYLrK8hbczz-Rv^cy0A!G& zKnhf(H03BuPC86eG!0F24p?^HMP-s{`i;~6nH~oX0Qmv!z4&r0|K<1dr(rY-`EoK= z%wz0@d=2BiWM=jK>y6^)kiR2pe>;_ko$WYK{f)@l5B+QkfOT2^8S(<;gQ?}x`B}1D zfXsg8GP!uH4?H7xX?-EJZ^SNRPd4f8xvYur5 z7jcQ&p<9!F0`ieDioYlzI@qp-1k&D1b3{81`9|Xg&BjFY>Gpy+ieQeas+nus9`TE7_ZlUg^6c)7>>mHA(!hM%$1WI?i3tCS8zy(guF1B&h-g@dILD36-le9P*=+8g{X*XnyA#H)B*bl?D=$#5tE-x-X$@jV1B)So0Aw^>0~~sggr2Y3=H9g)E@5cHOU3 z!Aun%G__h)rHERsX>cQ|fEg?Exsq}3zbc%!0h+z{9tJ3&$?#-MtI~ z#^o?1QPda3_gwgSP+0FpxH?x=7E+}*L8VeSd|Z(P8$~ypCTs|!apib8Tr%uZ3)t3{ zocM0?8Pytk=ze%aF2c9DnR!AUlRoW&OSBq}>Zk}iz_1gsh zgE)%@VUGTPf{kL5*V)S+>NPY5#?v52%@)D9iN+(hirEzv#-qf@St6@=(Zpqvgx}=b zz=us9CwkY91$fZJJ84AVhSy_t(Q{-mc^h{33zP50y>u0_XyYsu`q<BW%*6$j7HNT0&JYRa z@`-FQw^E2FrgDWO(uzY)6#a|ys_u@{GLp)HOCWR+VL50V(iHdt0vic1!ukZ7A5rE> zjV21kbS~>WJT?9QuScU?Mt>@iT*<@=dmo;L>O?MEawZemL?Kp6oOLd(I_KlL#au2s pMJJF$7Ugmx501|Zk3mk*Szt@Fihf=%;vy{Bb_yqiUtf=*{{ZoLH + + + + + +{ + "fontFamily": "lg", + "majorVersion": 1, + "minorVersion": 0, + "fontURL": "https://github.com/sachinchoolur/lightGallery", + "copyright": "sachin", + "license": "MLT", + "licenseURL": "http://opensource.org/licenses/MIT", + "version": "Version 1.0", + "fontId": "lg", + "psName": "lg", + "subFamily": "Regular", + "fullName": "lg", + "description": "Font generated by IcoMoon." +} + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vendors/lightgallery/src/fonts/lg.ttf b/vendors/lightgallery/src/fonts/lg.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d33b8e5e8612e0059a83354aa4b80782acf7af14 GIT binary patch literal 2760 zcmai0O>7%Q6n?Xt*iEudV&|8TCU#uM)PXpS>ljL*p+YT@5@Fi)9x4Pl?qa8Myq4`q z%>l{17lA~9MjR?QpvqaHs$7uZ&?7=zP@PB|fRJ1eNIjs!p~yDh%&t?nQrmH6=Kan4 zzIi)48)8J%MP-s{=Jm7T*&YuK!15jXJE_%V{_}4a&JwXv=vUIoVjgoZ^c$EDq_gYq z-fR>Rs`gC+LgN4`o(M7w5=v2|CX+pEXj+j=KlG zg3j|ztR^q!X@usXSD|}z$yNQ{*VmSy-zAc6=8a+rJkdI@b3e)Q&+J2Lhi^mr5ta|E znf*l(*1_Xi8UyVI+dR>pN50j#Me{N`oV*sz<`n`*<9!r9YnDaSD7Dc=*hf$enL1(f z?u_gl+==YucRt?v`}fAKYtPfDH5wwzecu(~Q}*1##~OR%e~$k#etZ1W@zVJ4m@-DA zHRNmMAriCLWh|v2}OE?VOFxMUMt2{S!{d zK>yHS-|W!fK)=)Bp9oGykH+Tu5F>@O@?{|Mj{tIaw#6R>2@h_%L&BQH7lM~FyE~Gf{?)QFcPuN!#>{ygx56>5BIPNe4IO@ZMr0f zq%FLu#GFIUpfeZ?#)e{Y=+2$v%|B_QDZzv_2})qUc(1TVJjotw%VNj-PnPjV%jO~$ z$6aZ|qFhVwa>gE4ecRJ_UFZRcK1qYtEOt24dQ|c5mN#HWOdL7YXaVU75n;6d>w zZ}Kb;v|h_&+4wT(n%xtax6%2`d&TbD#(SA}v9c3)*ciPbd^=vJ!wM9 zO8A-z)LwcSXP&nvJE7RaAnV@e=Aid&nTc47vqVnzqHUK+VqsfugB-VIoap^L4%nl% zy^}^5Zg_#!MbDALmR)$d*KD~P_tJIftc|l&=p$QZD2Zgt5_Pkawk%T{J7UXikk8n1 zI}Ng@Y}o;O%$7UpD9hV&7oDSsExW+x3tR4{SLugrnzEG6luG&Hv2ZxOQp&6?Pp6F4 za50(6tmIM|!^o}`!r2wXoK9x5dSRV1RKhP$MLI@d{L-`nJwt1>Ow*JigH~ZJQWA0o zzMPm1*t3W!z?X$JE%Ka3R2DxS_H_%hb>-5cN=vjzDrX3SMqbYqjkQ8bpEe3<&`Lqq zi{YgOb)S|+$^bzf&_%#<&=j<3$OQmf1h|F!b@VV$7D(0fLUF~&d5=ub;3LgB6~WX% zn3s-V`HWRAYdoW;*Rsh1ok3t47+GwkV7X2ixso@n=k!9dq@VXLuX`6##*$&=rs-IluxJgur1R%#syKtB}8)QX`B%L-`8W>|FhvLHvj+t literal 0 HcmV?d00001 diff --git a/vendors/lightgallery/src/fonts/lg.woff b/vendors/lightgallery/src/fonts/lg.woff new file mode 100644 index 0000000000000000000000000000000000000000..bd370be88d40b733dbacc2e04819ed6b02e3c292 GIT binary patch literal 2836 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
      X}UWz08V_@o{j+otpay;*D-dGqNeK?82 zSFiTSQS#Yy(sZh>b1?x_Iy(PWMH{Xk&4b<6p#R2H>n8GFv%E#oV`YvN?= zi_Obrz;S0auSuLkk*;)Eea!7-D#HgoG~1%;`pTlr$kwA!SYv5Hb@s^k`eOGwCzk~a z44pOVeyM09!0A4!9JF%*RvIcs?0x)!z;|x15(61ONWg9>jWbY25)o6#90_S zBkzEJL8RDZAq4FO;<9}JBqP(rhmMv(Xt-=w0?w;n2+Q-Z6JZz1SQXy*rYdhb#A}!T z6jm<9(+ASK13}iUG1jK@cW-*Ls1F`enRoB@hW$MGfZ0Ddlw3JJcD3*I<=4UYBq&Kt zdx6n~Ga+iBn-)^siIr{;g+XqZQ3(60A^lh*h0mcm_&wr77U#cT_l<5Df>f?+4i9vL z+H$SSIIb6^k{*fy-@`Bc+~D^sK#prh?9&+!^R)o0Dnm#Dn#%l)L$ew;bK@$f)1YzT z+tcPYU#s;ihbknaK_3TLkDl1k{!x-r`d;9_C<`NZMtg|=+Y#TCty4@sQ&cI=!%D)= z9g)}MM`aQ>a(H^>oacx1S*Z@_zKbOhJ7cLsvpk8eL5ybc84 zmawSM^R1<-C>oW@M4Qk3n1B$!P-z@{|3$f@OCci~ElxA}5VEL`UcY6JhC;zeQ^I6O zZC>Pl&5mL`RG|d`rv2lD<&){98$3NqC1+G=nF+gtx>wTy@W#^Yr%uefE>$4HyrTKY z76s%`4(T6s>vp_k<;yp-3GM8@CAfWp<4n6{@DEGk|KBf7+fm!Ebh4 z9~)86xSCIKdQPWWo!iT(AM3`W%;sLBk^3>M=j(KZR z4$o>R27`PC%ZWGxgJPQa2o@)t*EZ;LMMRMRZl@3{^JAI4Rw|VF<~>aL=ZoPVFtYAk zN2naA?`#;M>vhY7@?NQKLvl$pp+#m=Y4+A~k%(^e+;GXHDi2sU4OBge4Kso;(wa23 z=aEuEvV|SqSaFX4iB&*s?4)oNK}LMKcv%5SKuho48->H#2L7ClkPwYn`8wp;D}&T( zzOQcq@F&0fH>M~Z)cXq7NoQeO1BJ9DT)a9oskWcVLi9T-Qx?|Ioll@~ttfy;FNL8Sm}6CV{U%4WtvMXoBArxt^}(4HL?*dKs8~ zAXmyu(qDL>>lr|hu|2A4SzL8v$2W_nen4qQ%sI|NVJbug?bx|e37DQJ#-fXZ!a_-;JeW;taBCZunjBFR`G}lFa*K7F(I){-27070Ix>pF{Sn~Z3BZ(m@Q~E&SIDL@U9UV&o|?gi zZ;gy6;}icj7~20a5QLc3QEGVWmee*C#F*(|pUwa>(y6>YXtX{Q-K58J1o#S7_BT6& z4nGTs=xWn_z{_<3ZA){<9aRBUsa@Gr-fzsXnVZMYJGw_P8jBxOHD|vAutqo}pvZ2; z!VuRbn0j;tXuH_IbJSJ~=q38?+M9e>;BUXb6!~9=*@?_aJFRx!CNL={0=#T(^v5l# zMpcZ{c>>@Q!$8LMF*`TF`MHy_*RtwEL0FQ6RIt7a1!U}C0dUd?Gi zM$X1StY`6#kv}nv=O_i`-co(z5@!t{3BBQHb+2PyoW-{|P8+I@GIuz_y7aZ^0&g^J z1J>6cAe6LatWY?g`uJ>xo; literal 0 HcmV?d00001 diff --git a/vendors/lightgallery/src/img/video-play.png b/vendors/lightgallery/src/img/video-play.png new file mode 100644 index 0000000000000000000000000000000000000000..197672353d011e18a3bcc4d1f0bf07b76cd8681e GIT binary patch literal 4526 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%0A8&G26?(m3x7{fTZEqghd!D5) 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 literal 0 HcmV?d00001 diff --git a/vendors/lightgallery/src/js/.jshintrc b/vendors/lightgallery/src/js/.jshintrc new file mode 100644 index 000000000..4dd755879 --- /dev/null +++ b/vendors/lightgallery/src/js/.jshintrc @@ -0,0 +1,21 @@ +{ + "curly": true, + "eqeqeq": true, + "immed": true, + "latedef": true, + "newcap": true, + "noarg": true, + "sub": true, + "undef": true, + "unused": true, + "boss": true, + "eqnull": true, + "browser": true, + "predef": [ + "jQuery", + "console", + "$f", + "picturefill", + "videojs" + ] +} diff --git a/vendors/lightgallery/src/js/lg-autoplay.js b/vendors/lightgallery/src/js/lg-autoplay.js new file mode 100644 index 000000000..48d1d1481 --- /dev/null +++ b/vendors/lightgallery/src/js/lg-autoplay.js @@ -0,0 +1,187 @@ +/** + * Autoplay Plugin + * @version 1.2.0 + * @author Sachin N - @sachinchoolur + * @license MIT License (MIT) + */ + +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + autoplay: false, + pause: 5000, + progressBar: true, + fourceAutoplay: false, + autoplayControls: true, + appendAutoplayControlsTo: '.lg-toolbar' + }; + + /** + * Creates the autoplay plugin. + * @param {object} element - lightGallery element + */ + var Autoplay = function(element) { + + this.core = $(element).data('lightGallery'); + + this.$el = $(element); + + // Execute only if items are above 1 + if (this.core.$items.length < 2) { + return false; + } + + this.core.s = $.extend({}, defaults, this.core.s); + this.interval = false; + + // Identify if slide happened from autoplay + this.fromAuto = true; + + // Identify if autoplay canceled from touch/drag + this.canceledOnTouch = false; + + // save fourceautoplay value + this.fourceAutoplayTemp = this.core.s.fourceAutoplay; + + // do not allow progress bar if browser does not support css3 transitions + if (!this.core.doCss()) { + this.core.s.progressBar = false; + } + + this.init(); + + return this; + }; + + Autoplay.prototype.init = function() { + var _this = this; + + // append autoplay controls + if (_this.core.s.autoplayControls) { + _this.controls(); + } + + // Create progress bar + if (_this.core.s.progressBar) { + _this.core.$outer.find('.lg').append('
      '); + } + + // set progress + _this.progress(); + + // Start autoplay + if (_this.core.s.autoplay) { + _this.startlAuto(); + } + + // cancel interval on touchstart and dragstart + _this.$el.on('onDragstart.lg.tm touchstart.lg.tm', function() { + if (_this.interval) { + _this.cancelAuto(); + _this.canceledOnTouch = true; + } + }); + + // restore autoplay if autoplay canceled from touchstart / dragstart + _this.$el.on('onDragend.lg.tm touchend.lg.tm onSlideClick.lg.tm', function() { + if (!_this.interval && _this.canceledOnTouch) { + _this.startlAuto(); + _this.canceledOnTouch = false; + } + }); + + }; + + Autoplay.prototype.progress = function() { + + var _this = this; + var _$progressBar; + var _$progress; + + _this.$el.on('onBeforeSlide.lg.tm', function() { + + // start progress bar animation + if (_this.core.s.progressBar && _this.fromAuto) { + _$progressBar = _this.core.$outer.find('.lg-progress-bar'); + _$progress = _this.core.$outer.find('.lg-progress'); + if (_this.interval) { + _$progress.removeAttr('style'); + _$progressBar.removeClass('lg-start'); + setTimeout(function() { + _$progress.css('transition', 'width ' + (_this.core.s.speed + _this.core.s.pause) + 'ms ease 0s'); + _$progressBar.addClass('lg-start'); + }, 20); + } + } + + // Remove setinterval if slide is triggered manually and fourceautoplay is false + if (!_this.fromAuto && !_this.core.s.fourceAutoplay) { + _this.cancelAuto(); + } + + _this.fromAuto = false; + + }); + }; + + // Manage autoplay via play/stop buttons + Autoplay.prototype.controls = function() { + var _this = this; + var _html = ''; + + // Append autoplay controls + $(this.core.s.appendAutoplayControlsTo).append(_html); + + _this.core.$outer.find('.lg-autoplay-button').on('click.lg', function() { + if ($(_this.core.$outer).hasClass('lg-show-autoplay')) { + _this.cancelAuto(); + _this.core.s.fourceAutoplay = false; + } else { + if (!_this.interval) { + _this.startlAuto(); + _this.core.s.fourceAutoplay = _this.fourceAutoplayTemp; + } + } + }); + }; + + // Autostart gallery + Autoplay.prototype.startlAuto = function() { + var _this = this; + + _this.core.$outer.find('.lg-progress').css('transition', 'width ' + (_this.core.s.speed + _this.core.s.pause) + 'ms ease 0s'); + _this.core.$outer.addClass('lg-show-autoplay'); + _this.core.$outer.find('.lg-progress-bar').addClass('lg-start'); + + _this.interval = setInterval(function() { + if (_this.core.index + 1 < _this.core.$items.length) { + _this.core.index++; + } else { + _this.core.index = 0; + } + + _this.fromAuto = true; + _this.core.slide(_this.core.index, false, false); + }, _this.core.s.speed + _this.core.s.pause); + }; + + // cancel Autostart + Autoplay.prototype.cancelAuto = function() { + clearInterval(this.interval); + this.interval = false; + this.core.$outer.find('.lg-progress').removeAttr('style'); + this.core.$outer.removeClass('lg-show-autoplay'); + this.core.$outer.find('.lg-progress-bar').removeClass('lg-start'); + }; + + Autoplay.prototype.destroy = function() { + + this.cancelAuto(); + this.core.$outer.find('.lg-progress-bar').remove(); + }; + + $.fn.lightGallery.modules.autoplay = Autoplay; + +})(jQuery, window, document); diff --git a/vendors/lightgallery/src/js/lg-fullscreen.js b/vendors/lightgallery/src/js/lg-fullscreen.js new file mode 100644 index 000000000..bb9e405cf --- /dev/null +++ b/vendors/lightgallery/src/js/lg-fullscreen.js @@ -0,0 +1,94 @@ +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + fullScreen: true + }; + + var Fullscreen = function(element) { + + // get lightGallery core plugin data + this.core = $(element).data('lightGallery'); + + this.$el = $(element); + + // extend module defalut settings with lightGallery core settings + this.core.s = $.extend({}, defaults, this.core.s); + + this.init(); + + return this; + }; + + Fullscreen.prototype.init = function() { + var fullScreen = ''; + if (this.core.s.fullScreen) { + + // check for fullscreen browser support + if (!document.fullscreenEnabled && !document.webkitFullscreenEnabled && + !document.mozFullScreenEnabled && !document.msFullscreenEnabled) { + return; + } else { + fullScreen = ''; + this.core.$outer.find('.lg-toolbar').append(fullScreen); + this.fullScreen(); + } + } + }; + + Fullscreen.prototype.requestFullscreen = function() { + var el = document.documentElement; + if (el.requestFullscreen) { + el.requestFullscreen(); + } else if (el.msRequestFullscreen) { + el.msRequestFullscreen(); + } else if (el.mozRequestFullScreen) { + el.mozRequestFullScreen(); + } else if (el.webkitRequestFullscreen) { + el.webkitRequestFullscreen(); + } + }; + + Fullscreen.prototype.exitFullscreen = function() { + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.msExitFullscreen) { + document.msExitFullscreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.webkitExitFullscreen) { + document.webkitExitFullscreen(); + } + }; + + // https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Using_full_screen_mode + Fullscreen.prototype.fullScreen = function() { + var _this = this; + + $(document).on('fullscreenchange.lg webkitfullscreenchange.lg mozfullscreenchange.lg MSFullscreenChange.lg', function() { + _this.core.$outer.toggleClass('lg-fullscreen-on'); + }); + + this.core.$outer.find('.lg-fullscreen').on('click.lg', function() { + if (!document.fullscreenElement && + !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement) { + _this.requestFullscreen(); + } else { + _this.exitFullscreen(); + } + }); + + }; + + Fullscreen.prototype.destroy = function() { + + // exit from fullscreen if activated + this.exitFullscreen(); + + $(document).off('fullscreenchange.lg webkitfullscreenchange.lg mozfullscreenchange.lg MSFullscreenChange.lg'); + }; + + $.fn.lightGallery.modules.fullscreen = Fullscreen; + +})(jQuery, window, document); diff --git a/vendors/lightgallery/src/js/lg-hash.js b/vendors/lightgallery/src/js/lg-hash.js new file mode 100644 index 000000000..9cd458b5f --- /dev/null +++ b/vendors/lightgallery/src/js/lg-hash.js @@ -0,0 +1,70 @@ +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + hash: true + }; + + var Hash = function(element) { + + this.core = $(element).data('lightGallery'); + + this.core.s = $.extend({}, defaults, this.core.s); + + if (this.core.s.hash) { + this.oldHash = window.location.hash; + this.init(); + } + + return this; + }; + + Hash.prototype.init = function() { + var _this = this; + var _hash; + + // Change hash value on after each slide transition + _this.core.$el.on('onAfterSlide.lg.tm', function(event, prevIndex, index) { + window.location.hash = 'lg=' + _this.core.s.galleryId + '&slide=' + index; + }); + + // Listen hash change and change the slide according to slide value + $(window).on('hashchange.lg.hash', function() { + _hash = window.location.hash; + var _idx = parseInt(_hash.split('&slide=')[1], 10); + + // it galleryId doesn't exist in the url close the gallery + if ((_hash.indexOf('lg=' + _this.core.s.galleryId) > -1)) { + _this.core.slide(_idx, false, false); + } else if (_this.core.lGalleryOn) { + _this.core.destroy(); + } + + }); + }; + + Hash.prototype.destroy = function() { + + if (!this.core.s.hash) { + return; + } + + // Reset to old hash value + if (this.oldHash && this.oldHash.indexOf('lg=' + this.core.s.galleryId) < 0) { + window.location.hash = this.oldHash; + } else { + if (history.pushState) { + history.pushState('', document.title, window.location.pathname + window.location.search); + } else { + window.location.hash = ''; + } + } + + this.core.$el.off('.lg.hash'); + + }; + + $.fn.lightGallery.modules.hash = Hash; + +})(jQuery, window, document); \ No newline at end of file diff --git a/vendors/lightgallery/src/js/lg-pager.js b/vendors/lightgallery/src/js/lg-pager.js new file mode 100644 index 000000000..324de282f --- /dev/null +++ b/vendors/lightgallery/src/js/lg-pager.js @@ -0,0 +1,82 @@ +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + pager: false + }; + + var Pager = function(element) { + + this.core = $(element).data('lightGallery'); + + this.$el = $(element); + this.core.s = $.extend({}, defaults, this.core.s); + if (this.core.s.pager && this.core.$items.length > 1) { + this.init(); + } + + return this; + }; + + Pager.prototype.init = function() { + var _this = this; + var pagerList = ''; + var $pagerCont; + var $pagerOuter; + var timeout; + + _this.core.$outer.find('.lg').append('
      '); + + if (_this.core.s.dynamic) { + for (var i = 0; i < _this.core.s.dynamicEl.length; i++) { + pagerList += '
      '; + } + } else { + _this.core.$items.each(function() { + + if (!_this.core.s.exThumbImage) { + pagerList += '
      '; + } else { + pagerList += '
      '; + } + + }); + } + + $pagerOuter = _this.core.$outer.find('.lg-pager-outer'); + + $pagerOuter.html(pagerList); + + $pagerCont = _this.core.$outer.find('.lg-pager-cont'); + $pagerCont.on('click.lg touchend.lg', function() { + var _$this = $(this); + _this.core.index = _$this.index(); + _this.core.slide(_this.core.index, false, false); + }); + + $pagerOuter.on('mouseover.lg', function() { + clearTimeout(timeout); + $pagerOuter.addClass('lg-pager-hover'); + }); + + $pagerOuter.on('mouseout.lg', function() { + timeout = setTimeout(function() { + $pagerOuter.removeClass('lg-pager-hover'); + }); + }); + + _this.core.$el.on('onBeforeSlide.lg.tm', function(e, prevIndex, index) { + $pagerCont.removeClass('lg-pager-active'); + $pagerCont.eq(index).addClass('lg-pager-active'); + }); + + }; + + Pager.prototype.destroy = function() { + + }; + + $.fn.lightGallery.modules.pager = Pager; + +})(jQuery, window, document); diff --git a/vendors/lightgallery/src/js/lg-thumbnail.js b/vendors/lightgallery/src/js/lg-thumbnail.js new file mode 100644 index 000000000..0331acbea --- /dev/null +++ b/vendors/lightgallery/src/js/lg-thumbnail.js @@ -0,0 +1,451 @@ +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + thumbnail: true, + + animateThumb: true, + currentPagerPosition: 'middle', + + thumbWidth: 100, + thumbContHeight: 100, + thumbMargin: 5, + + exThumbImage: false, + showThumbByDefault: true, + toogleThumb: true, + pullCaptionUp: true, + + enableThumbDrag: true, + enableThumbSwipe: true, + swipeThreshold: 50, + + loadYoutubeThumbnail: true, + youtubeThumbSize: 1, + + loadVimeoThumbnail: true, + vimeoThumbSize: 'thumbnail_small', + + loadDailymotionThumbnail: true + }; + + var Thumbnail = function(element) { + + // get lightGallery core plugin data + this.core = $(element).data('lightGallery'); + + // extend module default settings with lightGallery core settings + this.core.s = $.extend({}, defaults, this.core.s); + + this.$el = $(element); + this.$thumbOuter = null; + this.thumbOuterWidth = 0; + this.thumbTotalWidth = (this.core.$items.length * (this.core.s.thumbWidth + this.core.s.thumbMargin)); + this.thumbIndex = this.core.index; + + // Thumbnail animation value + this.left = 0; + + this.init(); + + return this; + }; + + Thumbnail.prototype.init = function() { + var _this = this; + if (this.core.s.thumbnail && this.core.$items.length > 1) { + if (this.core.s.showThumbByDefault) { + setTimeout(function(){ + _this.core.$outer.addClass('lg-thumb-open'); + }, 700); + } + + if (this.core.s.pullCaptionUp) { + this.core.$outer.addClass('lg-pull-caption-up'); + } + + this.build(); + if (this.core.s.animateThumb) { + if (this.core.s.enableThumbDrag && !this.core.isTouch && this.core.doCss()) { + this.enableThumbDrag(); + } + + if (this.core.s.enableThumbSwipe && this.core.isTouch && this.core.doCss()) { + this.enableThumbSwipe(); + } + + this.thumbClickable = false; + } else { + this.thumbClickable = true; + } + + this.toogle(); + this.thumbkeyPress(); + } + }; + + Thumbnail.prototype.build = function() { + var _this = this; + var thumbList = ''; + var vimeoErrorThumbSize = ''; + var $thumb; + var html = '
      ' + + '
      ' + + '
      ' + + '
      '; + + switch (this.core.s.vimeoThumbSize) { + case 'thumbnail_large': + vimeoErrorThumbSize = '640'; + break; + case 'thumbnail_medium': + vimeoErrorThumbSize = '200x150'; + break; + case 'thumbnail_small': + vimeoErrorThumbSize = '100x75'; + } + + _this.core.$outer.addClass('lg-has-thumb'); + + _this.core.$outer.find('.lg').append(html); + + _this.$thumbOuter = _this.core.$outer.find('.lg-thumb-outer'); + _this.thumbOuterWidth = _this.$thumbOuter.width(); + + if (_this.core.s.animateThumb) { + _this.core.$outer.find('.lg-thumb').css({ + width: _this.thumbTotalWidth + 'px', + position: 'relative' + }); + } + + if (this.core.s.animateThumb) { + _this.$thumbOuter.css('height', _this.core.s.thumbContHeight + 'px'); + } + + function getThumb(src, thumb, index) { + var isVideo = _this.core.isVideo(src, index) || {}; + var thumbImg; + var vimeoId = ''; + + if (isVideo.youtube || isVideo.vimeo || isVideo.dailymotion) { + if (isVideo.youtube) { + if (_this.core.s.loadYoutubeThumbnail) { + thumbImg = '//img.youtube.com/vi/' + isVideo.youtube[1] + '/' + _this.core.s.youtubeThumbSize + '.jpg'; + } else { + thumbImg = thumb; + } + } else if (isVideo.vimeo) { + if (_this.core.s.loadVimeoThumbnail) { + thumbImg = '//i.vimeocdn.com/video/error_' + vimeoErrorThumbSize + '.jpg'; + vimeoId = isVideo.vimeo[1]; + } else { + thumbImg = thumb; + } + } else if (isVideo.dailymotion) { + if (_this.core.s.loadDailymotionThumbnail) { + thumbImg = '//www.dailymotion.com/thumbnail/video/' + isVideo.dailymotion[1]; + } else { + thumbImg = thumb; + } + } + } else { + thumbImg = thumb; + } + + thumbList += '
      '; + vimeoId = ''; + } + + if (_this.core.s.dynamic) { + for (var i = 0; i < _this.core.s.dynamicEl.length; i++) { + getThumb(_this.core.s.dynamicEl[i].src, _this.core.s.dynamicEl[i].thumb, i); + } + } else { + _this.core.$items.each(function(i) { + + if (!_this.core.s.exThumbImage) { + getThumb($(this).attr('href') || $(this).attr('data-src'), $(this).find('img').attr('src'), i); + } else { + getThumb($(this).attr('href') || $(this).attr('data-src'), $(this).attr(_this.core.s.exThumbImage), i); + } + + }); + } + + _this.core.$outer.find('.lg-thumb').html(thumbList); + + $thumb = _this.core.$outer.find('.lg-thumb-item'); + + // Load vimeo thumbnails + $thumb.each(function() { + var $this = $(this); + var vimeoVideoId = $this.attr('data-vimeo-id'); + + if (vimeoVideoId) { + $.getJSON('//www.vimeo.com/api/v2/video/' + vimeoVideoId + '.json?callback=?', { + format: 'json' + }, function(data) { + $this.find('img').attr('src', data[0][_this.core.s.vimeoThumbSize]); + }); + } + }); + + // manage active class for thumbnail + $thumb.eq(_this.core.index).addClass('active'); + _this.core.$el.on('onBeforeSlide.lg.tm', function() { + $thumb.removeClass('active'); + $thumb.eq(_this.core.index).addClass('active'); + }); + + $thumb.on('click.lg touchend.lg', function() { + var _$this = $(this); + setTimeout(function() { + + // In IE9 and bellow touch does not support + // Go to slide if browser does not support css transitions + if ((_this.thumbClickable && !_this.core.lgBusy) || !_this.core.doCss()) { + _this.core.index = _$this.index(); + _this.core.slide(_this.core.index, false, true); + } + }, 50); + }); + + _this.core.$el.on('onBeforeSlide.lg.tm', function() { + _this.animateThumb(_this.core.index); + }); + + $(window).on('resize.lg.thumb orientationchange.lg.thumb', function() { + setTimeout(function() { + _this.animateThumb(_this.core.index); + _this.thumbOuterWidth = _this.$thumbOuter.width(); + }, 200); + }); + + }; + + Thumbnail.prototype.setTranslate = function(value) { + // jQuery supports Automatic CSS prefixing since jQuery 1.8.0 + this.core.$outer.find('.lg-thumb').css({ + transform: 'translate3d(-' + (value) + 'px, 0px, 0px)' + }); + }; + + Thumbnail.prototype.animateThumb = function(index) { + var $thumb = this.core.$outer.find('.lg-thumb'); + if (this.core.s.animateThumb) { + var position; + switch (this.core.s.currentPagerPosition) { + case 'left': + position = 0; + break; + case 'middle': + position = (this.thumbOuterWidth / 2) - (this.core.s.thumbWidth / 2); + break; + case 'right': + position = this.thumbOuterWidth - this.core.s.thumbWidth; + } + this.left = ((this.core.s.thumbWidth + this.core.s.thumbMargin) * index - 1) - position; + if (this.left > (this.thumbTotalWidth - this.thumbOuterWidth)) { + this.left = this.thumbTotalWidth - this.thumbOuterWidth; + } + + if (this.left < 0) { + this.left = 0; + } + + if (this.core.lGalleryOn) { + if (!$thumb.hasClass('on')) { + this.core.$outer.find('.lg-thumb').css('transition-duration', this.core.s.speed + 'ms'); + } + + if (!this.core.doCss()) { + $thumb.animate({ + left: -this.left + 'px' + }, this.core.s.speed); + } + } else { + if (!this.core.doCss()) { + $thumb.css('left', -this.left + 'px'); + } + } + + this.setTranslate(this.left); + + } + }; + + // Enable thumbnail dragging and swiping + Thumbnail.prototype.enableThumbDrag = function() { + + var _this = this; + var startCoords = 0; + var endCoords = 0; + var isDraging = false; + var isMoved = false; + var tempLeft = 0; + + _this.$thumbOuter.addClass('lg-grab'); + + _this.core.$outer.find('.lg-thumb').on('mousedown.lg.thumb', function(e) { + if (_this.thumbTotalWidth > _this.thumbOuterWidth) { + // execute only on .lg-object + e.preventDefault(); + startCoords = e.pageX; + isDraging = true; + + // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723 + _this.core.$outer.scrollLeft += 1; + _this.core.$outer.scrollLeft -= 1; + + // * + _this.thumbClickable = false; + _this.$thumbOuter.removeClass('lg-grab').addClass('lg-grabbing'); + } + }); + + $(window).on('mousemove.lg.thumb', function(e) { + if (isDraging) { + tempLeft = _this.left; + isMoved = true; + endCoords = e.pageX; + + _this.$thumbOuter.addClass('lg-dragging'); + + tempLeft = tempLeft - (endCoords - startCoords); + + if (tempLeft > (_this.thumbTotalWidth - _this.thumbOuterWidth)) { + tempLeft = _this.thumbTotalWidth - _this.thumbOuterWidth; + } + + if (tempLeft < 0) { + tempLeft = 0; + } + + // move current slide + _this.setTranslate(tempLeft); + + } + }); + + $(window).on('mouseup.lg.thumb', function() { + if (isMoved) { + isMoved = false; + _this.$thumbOuter.removeClass('lg-dragging'); + + _this.left = tempLeft; + + if (Math.abs(endCoords - startCoords) < _this.core.s.swipeThreshold) { + _this.thumbClickable = true; + } + + } else { + _this.thumbClickable = true; + } + + if (isDraging) { + isDraging = false; + _this.$thumbOuter.removeClass('lg-grabbing').addClass('lg-grab'); + } + }); + + }; + + Thumbnail.prototype.enableThumbSwipe = function() { + var _this = this; + var startCoords = 0; + var endCoords = 0; + var isMoved = false; + var tempLeft = 0; + + _this.core.$outer.find('.lg-thumb').on('touchstart.lg', function(e) { + if (_this.thumbTotalWidth > _this.thumbOuterWidth) { + e.preventDefault(); + startCoords = e.originalEvent.targetTouches[0].pageX; + _this.thumbClickable = false; + } + }); + + _this.core.$outer.find('.lg-thumb').on('touchmove.lg', function(e) { + if (_this.thumbTotalWidth > _this.thumbOuterWidth) { + e.preventDefault(); + endCoords = e.originalEvent.targetTouches[0].pageX; + isMoved = true; + + _this.$thumbOuter.addClass('lg-dragging'); + + tempLeft = _this.left; + + tempLeft = tempLeft - (endCoords - startCoords); + + if (tempLeft > (_this.thumbTotalWidth - _this.thumbOuterWidth)) { + tempLeft = _this.thumbTotalWidth - _this.thumbOuterWidth; + } + + if (tempLeft < 0) { + tempLeft = 0; + } + + // move current slide + _this.setTranslate(tempLeft); + + } + }); + + _this.core.$outer.find('.lg-thumb').on('touchend.lg', function() { + if (_this.thumbTotalWidth > _this.thumbOuterWidth) { + + if (isMoved) { + isMoved = false; + _this.$thumbOuter.removeClass('lg-dragging'); + if (Math.abs(endCoords - startCoords) < _this.core.s.swipeThreshold) { + _this.thumbClickable = true; + } + + _this.left = tempLeft; + } else { + _this.thumbClickable = true; + } + } else { + _this.thumbClickable = true; + } + }); + + }; + + Thumbnail.prototype.toogle = function() { + var _this = this; + if (_this.core.s.toogleThumb) { + _this.core.$outer.addClass('lg-can-toggle'); + _this.$thumbOuter.append(''); + _this.core.$outer.find('.lg-toogle-thumb').on('click.lg', function() { + _this.core.$outer.toggleClass('lg-thumb-open'); + }); + } + }; + + Thumbnail.prototype.thumbkeyPress = function() { + var _this = this; + $(window).on('keydown.lg.thumb', function(e) { + if (e.keyCode === 38) { + e.preventDefault(); + _this.core.$outer.addClass('lg-thumb-open'); + } else if (e.keyCode === 40) { + e.preventDefault(); + _this.core.$outer.removeClass('lg-thumb-open'); + } + }); + }; + + Thumbnail.prototype.destroy = function() { + if (this.core.s.thumbnail && this.core.$items.length > 1) { + $(window).off('resize.lg.thumb orientationchange.lg.thumb keydown.lg.thumb'); + this.$thumbOuter.remove(); + this.core.$outer.removeClass('lg-has-thumb'); + } + }; + + $.fn.lightGallery.modules.Thumbnail = Thumbnail; + +})(jQuery, window, document); diff --git a/vendors/lightgallery/src/js/lg-video.js b/vendors/lightgallery/src/js/lg-video.js new file mode 100644 index 000000000..da7706c35 --- /dev/null +++ b/vendors/lightgallery/src/js/lg-video.js @@ -0,0 +1,289 @@ +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + videoMaxWidth: '855px', + youtubePlayerParams: false, + vimeoPlayerParams: false, + dailymotionPlayerParams: false, + vkPlayerParams: false, + videojs: false, + videojsOptions: {} + }; + + var Video = function(element) { + + this.core = $(element).data('lightGallery'); + + this.$el = $(element); + this.core.s = $.extend({}, defaults, this.core.s); + this.videoLoaded = false; + + this.init(); + + return this; + }; + + Video.prototype.init = function() { + var _this = this; + + // Event triggered when video url found without poster + _this.core.$el.on('hasVideo.lg.tm', function(event, index, src, html) { + _this.core.$slide.eq(index).find('.lg-video').append(_this.loadVideo(src, 'lg-object', true, index, html)); + if (html) { + if (_this.core.s.videojs) { + try { + videojs(_this.core.$slide.eq(index).find('.lg-html5').get(0), _this.core.s.videojsOptions, function() { + if (!_this.videoLoaded) { + this.play(); + } + }); + } catch (e) { + console.error('Make sure you have included videojs'); + } + } else { + _this.core.$slide.eq(index).find('.lg-html5').get(0).play(); + } + } + }); + + // Set max width for video + _this.core.$el.on('onAferAppendSlide.lg.tm', function(event, index) { + _this.core.$slide.eq(index).find('.lg-video-cont').css('max-width', _this.core.s.videoMaxWidth); + _this.videoLoaded = true; + }); + + var loadOnClick = function($el) { + // check slide has poster + if ($el.find('.lg-object').hasClass('lg-has-poster') && $el.find('.lg-object').is(':visible')) { + + // check already video element present + if (!$el.hasClass('lg-has-video')) { + + $el.addClass('lg-video-playing lg-has-video'); + + var _src; + var _html; + var _loadVideo = function(_src, _html) { + + $el.find('.lg-video').append(_this.loadVideo(_src, '', false, _this.core.index, _html)); + + if (_html) { + if (_this.core.s.videojs) { + try { + videojs(_this.core.$slide.eq(_this.core.index).find('.lg-html5').get(0), _this.core.s.videojsOptions, function() { + this.play(); + }); + } catch (e) { + console.error('Make sure you have included videojs'); + } + } else { + _this.core.$slide.eq(_this.core.index).find('.lg-html5').get(0).play(); + } + } + + }; + + if (_this.core.s.dynamic) { + + _src = _this.core.s.dynamicEl[_this.core.index].src; + _html = _this.core.s.dynamicEl[_this.core.index].html; + + _loadVideo(_src, _html); + + } else { + + _src = _this.core.$items.eq(_this.core.index).attr('href') || _this.core.$items.eq(_this.core.index).attr('data-src'); + _html = _this.core.$items.eq(_this.core.index).attr('data-html'); + + _loadVideo(_src, _html); + + } + + var $tempImg = $el.find('.lg-object'); + $el.find('.lg-video').append($tempImg); + + // @todo loading icon for html5 videos also + // for showing the loading indicator while loading video + if (!$el.find('.lg-video-object').hasClass('lg-html5')) { + $el.removeClass('lg-complete'); + $el.find('.lg-video-object').on('load.lg error.lg', function() { + $el.addClass('lg-complete'); + }); + } + + } else { + + var youtubePlayer = $el.find('.lg-youtube').get(0); + var vimeoPlayer = $el.find('.lg-vimeo').get(0); + var dailymotionPlayer = $el.find('.lg-dailymotion').get(0); + var html5Player = $el.find('.lg-html5').get(0); + if (youtubePlayer) { + youtubePlayer.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*'); + } else if (vimeoPlayer) { + try { + $f(vimeoPlayer).api('play'); + } catch (e) { + console.error('Make sure you have included froogaloop2 js'); + } + } else if (dailymotionPlayer) { + dailymotionPlayer.contentWindow.postMessage('play', '*'); + + } else if (html5Player) { + if (_this.core.s.videojs) { + try { + videojs(html5Player).play(); + } catch (e) { + console.error('Make sure you have included videojs'); + } + } else { + html5Player.play(); + } + } + + $el.addClass('lg-video-playing'); + + } + } + }; + + if (_this.core.doCss() && _this.core.$items.length > 1 && ((_this.core.s.enableSwipe && _this.core.isTouch) || (_this.core.s.enableDrag && !_this.core.isTouch))) { + _this.core.$el.on('onSlideClick.lg.tm', function() { + var $el = _this.core.$slide.eq(_this.core.index); + loadOnClick($el); + }); + } else { + + // For IE 9 and bellow + _this.core.$slide.on('click.lg', function() { + loadOnClick($(this)); + }); + } + + _this.core.$el.on('onBeforeSlide.lg.tm', function(event, prevIndex, index) { + + var $videoSlide = _this.core.$slide.eq(prevIndex); + var youtubePlayer = $videoSlide.find('.lg-youtube').get(0); + var vimeoPlayer = $videoSlide.find('.lg-vimeo').get(0); + var dailymotionPlayer = $videoSlide.find('.lg-dailymotion').get(0); + var vkPlayer = $videoSlide.find('.lg-vk').get(0); + var html5Player = $videoSlide.find('.lg-html5').get(0); + if (youtubePlayer) { + youtubePlayer.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*'); + } else if (vimeoPlayer) { + try { + $f(vimeoPlayer).api('pause'); + } catch (e) { + console.error('Make sure you have included froogaloop2 js'); + } + } else if (dailymotionPlayer) { + dailymotionPlayer.contentWindow.postMessage('pause', '*'); + + } else if (html5Player) { + if (_this.core.s.videojs) { + try { + videojs(html5Player).pause(); + } catch (e) { + console.error('Make sure you have included videojs'); + } + } else { + html5Player.pause(); + } + } if (vkPlayer) { + $(vkPlayer).attr('src', $(vkPlayer).attr('src').replace('&autoplay', '&noplay')); + } + + var _src; + if (_this.core.s.dynamic) { + _src = _this.core.s.dynamicEl[index].src; + } else { + _src = _this.core.$items.eq(index).attr('href') || _this.core.$items.eq(index).attr('data-src'); + + } + + var _isVideo = _this.core.isVideo(_src, index) || {}; + if (_isVideo.youtube || _isVideo.vimeo || _isVideo.dailymotion || _isVideo.vk) { + _this.core.$outer.addClass('lg-hide-download'); + } + + //$videoSlide.addClass('lg-complete'); + + }); + + _this.core.$el.on('onAfterSlide.lg.tm', function(event, prevIndex) { + _this.core.$slide.eq(prevIndex).removeClass('lg-video-playing'); + }); + }; + + Video.prototype.loadVideo = function(src, addClass, noposter, index, html) { + var video = ''; + var autoplay = 1; + var a = ''; + var isVideo = this.core.isVideo(src, index) || {}; + + // Enable autoplay for first video if poster doesn't exist + if (noposter) { + if (this.videoLoaded) { + autoplay = 0; + } else { + autoplay = 1; + } + } + + if (isVideo.youtube) { + + a = '?wmode=opaque&autoplay=' + autoplay + '&enablejsapi=1'; + if (this.core.s.youtubePlayerParams) { + a = a + '&' + $.param(this.core.s.youtubePlayerParams); + } + + video = ''; + + } else if (isVideo.vimeo) { + + a = '?autoplay=' + autoplay + '&api=1'; + if (this.core.s.vimeoPlayerParams) { + a = a + '&' + $.param(this.core.s.vimeoPlayerParams); + } + + video = ''; + + } else if (isVideo.dailymotion) { + + a = '?wmode=opaque&autoplay=' + autoplay + '&api=postMessage'; + if (this.core.s.dailymotionPlayerParams) { + a = a + '&' + $.param(this.core.s.dailymotionPlayerParams); + } + + video = ''; + + } else if (isVideo.html5) { + var fL = html.substring(0, 1); + if (fL === '.' || fL === '#') { + html = $(html).html(); + } + + video = html; + + } else if (isVideo.vk) { + + a = '&autoplay=' + autoplay; + if (this.core.s.vkPlayerParams) { + a = a + '&' + $.param(this.core.s.vkPlayerParams); + } + + video = ''; + + } + + return video; + }; + + Video.prototype.destroy = function() { + this.videoLoaded = false; + }; + + $.fn.lightGallery.modules.video = Video; + +})(jQuery, window, document); diff --git a/vendors/lightgallery/src/js/lg-zoom.js b/vendors/lightgallery/src/js/lg-zoom.js new file mode 100644 index 000000000..663d82c4b --- /dev/null +++ b/vendors/lightgallery/src/js/lg-zoom.js @@ -0,0 +1,474 @@ +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + scale: 1, + zoom: true, + actualSize: true, + enableZoomAfter: 300 + }; + + var Zoom = function(element) { + + this.core = $(element).data('lightGallery'); + + this.core.s = $.extend({}, defaults, this.core.s); + + if (this.core.s.zoom && this.core.doCss()) { + this.init(); + + // Store the zoomable timeout value just to clear it while closing + this.zoomabletimeout = false; + + // Set the initial value center + this.pageX = $(window).width() / 2; + this.pageY = ($(window).height() / 2) + $(window).scrollTop(); + } + + return this; + }; + + Zoom.prototype.init = function() { + + var _this = this; + var zoomIcons = ''; + + if (_this.core.s.actualSize) { + zoomIcons += ''; + } + + this.core.$outer.find('.lg-toolbar').append(zoomIcons); + + // Add zoomable class + _this.core.$el.on('onSlideItemLoad.lg.tm.zoom', function(event, index, delay) { + + // delay will be 0 except first time + var _speed = _this.core.s.enableZoomAfter + delay; + + // set _speed value 0 if gallery opened from direct url and if it is first slide + if ($('body').hasClass('lg-from-hash') && delay) { + + // will execute only once + _speed = 0; + } else { + + // Remove lg-from-hash to enable starting animation. + $('body').removeClass('lg-from-hash'); + } + + _this.zoomabletimeout = setTimeout(function() { + _this.core.$slide.eq(index).addClass('lg-zoomable'); + }, _speed + 30); + }); + + var scale = 1; + /** + * @desc Image zoom + * Translate the wrap and scale the image to get better user experience + * + * @param {String} scaleVal - Zoom decrement/increment value + */ + var zoom = function(scaleVal) { + + var $image = _this.core.$outer.find('.lg-current .lg-image'); + var _x; + var _y; + + // Find offset manually to avoid issue after zoom + var offsetX = ($(window).width() - $image.width()) / 2; + var offsetY = (($(window).height() - $image.height()) / 2) + $(window).scrollTop(); + + _x = _this.pageX - offsetX; + _y = _this.pageY - offsetY; + + var x = (scaleVal - 1) * (_x); + var y = (scaleVal - 1) * (_y); + + $image.css('transform', 'scale3d(' + scaleVal + ', ' + scaleVal + ', 1)').attr('data-scale', scaleVal); + + $image.parent().css({ + left: -x + 'px', + top: -y + 'px' + }).attr('data-x', x).attr('data-y', y); + }; + + var callScale = function() { + if (scale > 1) { + _this.core.$outer.addClass('lg-zoomed'); + } else { + _this.resetZoom(); + } + + if (scale < 1) { + scale = 1; + } + + zoom(scale); + }; + + var actualSize = function(event, $image, index, fromIcon) { + var w = $image.width(); + var nw; + if (_this.core.s.dynamic) { + nw = _this.core.s.dynamicEl[index].width || $image[0].naturalWidth || w; + } else { + nw = _this.core.$items.eq(index).attr('data-width') || $image[0].naturalWidth || w; + } + + var _scale; + + if (_this.core.$outer.hasClass('lg-zoomed')) { + scale = 1; + } else { + if (nw > w) { + _scale = nw / w; + scale = _scale || 2; + } + } + + if (fromIcon) { + _this.pageX = $(window).width() / 2; + _this.pageY = ($(window).height() / 2) + $(window).scrollTop(); + } else { + _this.pageX = event.pageX || event.originalEvent.targetTouches[0].pageX; + _this.pageY = event.pageY || event.originalEvent.targetTouches[0].pageY; + } + + callScale(); + setTimeout(function() { + _this.core.$outer.removeClass('lg-grabbing').addClass('lg-grab'); + }, 10); + }; + + var tapped = false; + + // event triggered after appending slide content + _this.core.$el.on('onAferAppendSlide.lg.tm.zoom', function(event, index) { + + // Get the current element + var $image = _this.core.$slide.eq(index).find('.lg-image'); + + $image.on('dblclick', function(event) { + actualSize(event, $image, index); + }); + + $image.on('touchstart', function(event) { + if (!tapped) { + tapped = setTimeout(function() { + tapped = null; + }, 300); + } else { + clearTimeout(tapped); + tapped = null; + actualSize(event, $image, index); + } + + event.preventDefault(); + }); + + }); + + // Update zoom on resize and orientationchange + $(window).on('resize.lg.zoom scroll.lg.zoom orientationchange.lg.zoom', function() { + _this.pageX = $(window).width() / 2; + _this.pageY = ($(window).height() / 2) + $(window).scrollTop(); + zoom(scale); + }); + + $('#lg-zoom-out').on('click.lg', function() { + if (_this.core.$outer.find('.lg-current .lg-image').length) { + scale -= _this.core.s.scale; + callScale(); + } + }); + + $('#lg-zoom-in').on('click.lg', function() { + if (_this.core.$outer.find('.lg-current .lg-image').length) { + scale += _this.core.s.scale; + callScale(); + } + }); + + $('#lg-actual-size').on('click.lg', function(event) { + actualSize(event, _this.core.$slide.eq(_this.core.index).find('.lg-image'), _this.core.index, true); + }); + + // Reset zoom on slide change + _this.core.$el.on('onBeforeSlide.lg.tm', function() { + scale = 1; + _this.resetZoom(); + }); + + // Drag option after zoom + if (!_this.core.isTouch) { + _this.zoomDrag(); + } + + if (_this.core.isTouch) { + _this.zoomSwipe(); + } + + }; + + // Reset zoom effect + Zoom.prototype.resetZoom = function() { + this.core.$outer.removeClass('lg-zoomed'); + this.core.$slide.find('.lg-img-wrap').removeAttr('style data-x data-y'); + this.core.$slide.find('.lg-image').removeAttr('style data-scale'); + + // Reset pagx pagy values to center + this.pageX = $(window).width() / 2; + this.pageY = ($(window).height() / 2) + $(window).scrollTop(); + }; + + Zoom.prototype.zoomSwipe = function() { + var _this = this; + var startCoords = {}; + var endCoords = {}; + var isMoved = false; + + // Allow x direction drag + var allowX = false; + + // Allow Y direction drag + var allowY = false; + + _this.core.$slide.on('touchstart.lg', function(e) { + + if (_this.core.$outer.hasClass('lg-zoomed')) { + var $image = _this.core.$slide.eq(_this.core.index).find('.lg-object'); + + allowY = $image.outerHeight() * $image.attr('data-scale') > _this.core.$outer.find('.lg').height(); + allowX = $image.outerWidth() * $image.attr('data-scale') > _this.core.$outer.find('.lg').width(); + if ((allowX || allowY)) { + e.preventDefault(); + startCoords = { + x: e.originalEvent.targetTouches[0].pageX, + y: e.originalEvent.targetTouches[0].pageY + }; + } + } + + }); + + _this.core.$slide.on('touchmove.lg', function(e) { + + if (_this.core.$outer.hasClass('lg-zoomed')) { + + var _$el = _this.core.$slide.eq(_this.core.index).find('.lg-img-wrap'); + var distanceX; + var distanceY; + + e.preventDefault(); + isMoved = true; + + endCoords = { + x: e.originalEvent.targetTouches[0].pageX, + y: e.originalEvent.targetTouches[0].pageY + }; + + // reset opacity and transition duration + _this.core.$outer.addClass('lg-zoom-dragging'); + + if (allowY) { + distanceY = (-Math.abs(_$el.attr('data-y'))) + (endCoords.y - startCoords.y); + } else { + distanceY = -Math.abs(_$el.attr('data-y')); + } + + if (allowX) { + distanceX = (-Math.abs(_$el.attr('data-x'))) + (endCoords.x - startCoords.x); + } else { + distanceX = -Math.abs(_$el.attr('data-x')); + } + + if ((Math.abs(endCoords.x - startCoords.x) > 15) || (Math.abs(endCoords.y - startCoords.y) > 15)) { + _$el.css({ + left: distanceX + 'px', + top: distanceY + 'px' + }); + } + + } + + }); + + _this.core.$slide.on('touchend.lg', function() { + if (_this.core.$outer.hasClass('lg-zoomed')) { + if (isMoved) { + isMoved = false; + _this.core.$outer.removeClass('lg-zoom-dragging'); + _this.touchendZoom(startCoords, endCoords, allowX, allowY); + + } + } + }); + + }; + + Zoom.prototype.zoomDrag = function() { + + var _this = this; + var startCoords = {}; + var endCoords = {}; + var isDraging = false; + var isMoved = false; + + // Allow x direction drag + var allowX = false; + + // Allow Y direction drag + var allowY = false; + + _this.core.$slide.on('mousedown.lg.zoom', function(e) { + + // execute only on .lg-object + var $image = _this.core.$slide.eq(_this.core.index).find('.lg-object'); + + allowY = $image.outerHeight() * $image.attr('data-scale') > _this.core.$outer.find('.lg').height(); + allowX = $image.outerWidth() * $image.attr('data-scale') > _this.core.$outer.find('.lg').width(); + + if (_this.core.$outer.hasClass('lg-zoomed')) { + if ($(e.target).hasClass('lg-object') && (allowX || allowY)) { + e.preventDefault(); + startCoords = { + x: e.pageX, + y: e.pageY + }; + + isDraging = true; + + // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723 + _this.core.$outer.scrollLeft += 1; + _this.core.$outer.scrollLeft -= 1; + + _this.core.$outer.removeClass('lg-grab').addClass('lg-grabbing'); + } + } + }); + + $(window).on('mousemove.lg.zoom', function(e) { + if (isDraging) { + var _$el = _this.core.$slide.eq(_this.core.index).find('.lg-img-wrap'); + var distanceX; + var distanceY; + + isMoved = true; + endCoords = { + x: e.pageX, + y: e.pageY + }; + + // reset opacity and transition duration + _this.core.$outer.addClass('lg-zoom-dragging'); + + if (allowY) { + distanceY = (-Math.abs(_$el.attr('data-y'))) + (endCoords.y - startCoords.y); + } else { + distanceY = -Math.abs(_$el.attr('data-y')); + } + + if (allowX) { + distanceX = (-Math.abs(_$el.attr('data-x'))) + (endCoords.x - startCoords.x); + } else { + distanceX = -Math.abs(_$el.attr('data-x')); + } + + _$el.css({ + left: distanceX + 'px', + top: distanceY + 'px' + }); + } + }); + + $(window).on('mouseup.lg.zoom', function(e) { + + if (isDraging) { + isDraging = false; + _this.core.$outer.removeClass('lg-zoom-dragging'); + + // Fix for chrome mouse move on click + if (isMoved && ((startCoords.x !== endCoords.x) || (startCoords.y !== endCoords.y))) { + endCoords = { + x: e.pageX, + y: e.pageY + }; + _this.touchendZoom(startCoords, endCoords, allowX, allowY); + + } + + isMoved = false; + } + + _this.core.$outer.removeClass('lg-grabbing').addClass('lg-grab'); + + }); + }; + + Zoom.prototype.touchendZoom = function(startCoords, endCoords, allowX, allowY) { + + var _this = this; + var _$el = _this.core.$slide.eq(_this.core.index).find('.lg-img-wrap'); + var $image = _this.core.$slide.eq(_this.core.index).find('.lg-object'); + var distanceX = (-Math.abs(_$el.attr('data-x'))) + (endCoords.x - startCoords.x); + var distanceY = (-Math.abs(_$el.attr('data-y'))) + (endCoords.y - startCoords.y); + var minY = (_this.core.$outer.find('.lg').height() - $image.outerHeight()) / 2; + var maxY = Math.abs(($image.outerHeight() * Math.abs($image.attr('data-scale'))) - _this.core.$outer.find('.lg').height() + minY); + var minX = (_this.core.$outer.find('.lg').width() - $image.outerWidth()) / 2; + var maxX = Math.abs(($image.outerWidth() * Math.abs($image.attr('data-scale'))) - _this.core.$outer.find('.lg').width() + minX); + + if ((Math.abs(endCoords.x - startCoords.x) > 15) || (Math.abs(endCoords.y - startCoords.y) > 15)) { + if (allowY) { + if (distanceY <= -maxY) { + distanceY = -maxY; + } else if (distanceY >= -minY) { + distanceY = -minY; + } + } + + if (allowX) { + if (distanceX <= -maxX) { + distanceX = -maxX; + } else if (distanceX >= -minX) { + distanceX = -minX; + } + } + + if (allowY) { + _$el.attr('data-y', Math.abs(distanceY)); + } else { + distanceY = -Math.abs(_$el.attr('data-y')); + } + + if (allowX) { + _$el.attr('data-x', Math.abs(distanceX)); + } else { + distanceX = -Math.abs(_$el.attr('data-x')); + } + + _$el.css({ + left: distanceX + 'px', + top: distanceY + 'px' + }); + + } + }; + + Zoom.prototype.destroy = function() { + + var _this = this; + + // Unbind all events added by lightGallery zoom plugin + _this.core.$el.off('.lg.zoom'); + $(window).off('.lg.zoom'); + _this.core.$slide.off('.lg.zoom'); + _this.core.$el.off('.lg.tm.zoom'); + _this.resetZoom(); + clearTimeout(_this.zoomabletimeout); + _this.zoomabletimeout = false; + }; + + $.fn.lightGallery.modules.zoom = Zoom; + +})(jQuery, window, document); \ No newline at end of file diff --git a/vendors/lightgallery/src/js/lightgallery.js b/vendors/lightgallery/src/js/lightgallery.js new file mode 100644 index 000000000..4c42e7345 --- /dev/null +++ b/vendors/lightgallery/src/js/lightgallery.js @@ -0,0 +1,1314 @@ +(function($, window, document, undefined) { + + 'use strict'; + + var defaults = { + + mode: 'lg-slide', + + // Ex : 'ease' + cssEasing: 'ease', + + //'for jquery animation' + easing: 'linear', + speed: 600, + height: '100%', + width: '100%', + addClass: '', + startClass: 'lg-start-zoom', + backdropDuration: 150, + hideBarsDelay: 6000, + + useLeft: false, + + closable: true, + loop: true, + escKey: true, + keyPress: true, + controls: true, + slideEndAnimatoin: true, + hideControlOnEnd: false, + mousewheel: true, + + getCaptionFromTitleOrAlt: true, + + // .lg-item || '.lg-sub-html' + appendSubHtmlTo: '.lg-sub-html', + + subHtmlSelectorRelative: false, + + /** + * @desc number of preload slides + * will exicute only after the current slide is fully loaded. + * + * @ex you clicked on 4th image and if preload = 1 then 3rd slide and 5th + * slide will be loaded in the background after the 4th slide is fully loaded.. + * if preload is 2 then 2nd 3rd 5th 6th slides will be preloaded.. ... ... + * + */ + preload: 1, + showAfterLoad: true, + selector: '', + selectWithin: '', + nextHtml: '', + prevHtml: '', + + // 0, 1 + index: false, + + iframeMaxWidth: '100%', + + download: true, + counter: true, + appendCounterTo: '.lg-toolbar', + + swipeThreshold: 50, + enableSwipe: true, + enableDrag: true, + + dynamic: false, + dynamicEl: [], + galleryId: 1 + }; + + function Plugin(element, options) { + + // Current lightGallery element + this.el = element; + + // Current jquery element + this.$el = $(element); + + // lightGallery settings + this.s = $.extend({}, defaults, options); + + // When using dynamic mode, ensure dynamicEl is an array + if (this.s.dynamic && this.s.dynamicEl !== 'undefined' && this.s.dynamicEl.constructor === Array && !this.s.dynamicEl.length) { + throw ('When using dynamic mode, you must also define dynamicEl as an Array.'); + } + + // lightGallery modules + this.modules = {}; + + // false when lightgallery complete first slide; + this.lGalleryOn = false; + + this.lgBusy = false; + + // Timeout function for hiding controls; + this.hideBartimeout = false; + + // To determine browser supports for touch events; + this.isTouch = ('ontouchstart' in document.documentElement); + + // Disable hideControlOnEnd if sildeEndAnimation is true + if (this.s.slideEndAnimatoin) { + this.s.hideControlOnEnd = false; + } + + // Gallery items + if (this.s.dynamic) { + this.$items = this.s.dynamicEl; + } else { + if (this.s.selector === 'this') { + this.$items = this.$el; + } else if (this.s.selector !== '') { + if (this.s.selectWithin) { + this.$items = $(this.s.selectWithin).find(this.s.selector); + } else { + this.$items = this.$el.find($(this.s.selector)); + } + } else { + this.$items = this.$el.children(); + } + } + + // .lg-item + this.$slide = ''; + + // .lg-outer + this.$outer = ''; + + this.init(); + + return this; + } + + Plugin.prototype.init = function() { + + var _this = this; + + // s.preload should not be more than $item.length + if (_this.s.preload > _this.$items.length) { + _this.s.preload = _this.$items.length; + } + + // if dynamic option is enabled execute immediately + var _hash = window.location.hash; + if (_hash.indexOf('lg=' + this.s.galleryId) > 0) { + + _this.index = parseInt(_hash.split('&slide=')[1], 10); + + $('body').addClass('lg-from-hash'); + if (!$('body').hasClass('lg-on')) { + setTimeout(function() { + _this.build(_this.index); + $('body').addClass('lg-on'); + }); + } + } + + if (_this.s.dynamic) { + + _this.$el.trigger('onBeforeOpen.lg'); + + _this.index = _this.s.index || 0; + + // prevent accidental double execution + if (!$('body').hasClass('lg-on')) { + setTimeout(function() { + _this.build(_this.index); + $('body').addClass('lg-on'); + }); + } + } else { + + // Using different namespace for click because click event should not unbind if selector is same object('this') + _this.$items.on('click.lgcustom', function(event) { + + // For IE8 + try { + event.preventDefault(); + event.preventDefault(); + } catch (er) { + event.returnValue = false; + } + + _this.$el.trigger('onBeforeOpen.lg'); + + _this.index = _this.s.index || _this.$items.index(this); + + // prevent accidental double execution + if (!$('body').hasClass('lg-on')) { + _this.build(_this.index); + $('body').addClass('lg-on'); + } + }); + } + + }; + + Plugin.prototype.build = function(index) { + + var _this = this; + + _this.structure(); + + // module constructor + $.each($.fn.lightGallery.modules, function(key) { + _this.modules[key] = new $.fn.lightGallery.modules[key](_this.el); + }); + + // initiate slide function + _this.slide(index, false, false); + + if (_this.s.keyPress) { + _this.keyPress(); + } + + if (_this.$items.length > 1) { + + _this.arrow(); + + setTimeout(function() { + _this.enableDrag(); + _this.enableSwipe(); + }, 50); + + if (_this.s.mousewheel) { + _this.mousewheel(); + } + } + + _this.counter(); + + _this.closeGallery(); + + _this.$el.trigger('onAfterOpen.lg'); + + // Hide controllers if mouse doesn't move for some period + _this.$outer.on('mousemove.lg click.lg touchstart.lg', function() { + + _this.$outer.removeClass('lg-hide-items'); + + clearTimeout(_this.hideBartimeout); + + // Timeout will be cleared on each slide movement also + _this.hideBartimeout = setTimeout(function() { + _this.$outer.addClass('lg-hide-items'); + }, _this.s.hideBarsDelay); + + }); + + }; + + Plugin.prototype.structure = function() { + var list = ''; + var controls = ''; + var i = 0; + var subHtmlCont = ''; + var template; + var _this = this; + + $('body').append('
      '); + $('.lg-backdrop').css('transition-duration', this.s.backdropDuration + 'ms'); + + // Create gallery items + for (i = 0; i < this.$items.length; i++) { + list += '
      '; + } + + // Create controlls + if (this.s.controls && this.$items.length > 1) { + controls = '
      ' + + '
      ' + this.s.prevHtml + '
      ' + + '
      ' + this.s.nextHtml + '
      ' + + '
      '; + } + + if (this.s.appendSubHtmlTo === '.lg-sub-html') { + subHtmlCont = '
      '; + } + + template = '
      ' + + '
      ' + + '
      ' + list + '
      ' + + '
      ' + + '' + + '
      ' + + controls + + subHtmlCont + + '
      ' + + '
      '; + + $('body').append(template); + this.$outer = $('.lg-outer'); + this.$slide = this.$outer.find('.lg-item'); + + if (this.s.useLeft) { + this.$outer.addClass('lg-use-left'); + + // Set mode lg-slide if use left is true; + this.s.mode = 'lg-slide'; + } else { + this.$outer.addClass('lg-use-css3'); + } + + // For fixed height gallery + _this.setTop(); + $(window).on('resize.lg orientationchange.lg', function() { + setTimeout(function() { + _this.setTop(); + }, 100); + }); + + // add class lg-current to remove initial transition + this.$slide.eq(this.index).addClass('lg-current'); + + // add Class for css support and transition mode + if (this.doCss()) { + this.$outer.addClass('lg-css3'); + } else { + this.$outer.addClass('lg-css'); + + // Set speed 0 because no animation will happen if browser doesn't support css3 + this.s.speed = 0; + } + + this.$outer.addClass(this.s.mode); + + if (this.s.enableDrag && this.$items.length > 1) { + this.$outer.addClass('lg-grab'); + } + + if (this.s.showAfterLoad) { + this.$outer.addClass('lg-show-after-load'); + } + + if (this.doCss()) { + var $inner = this.$outer.find('.lg-inner'); + $inner.css('transition-timing-function', this.s.cssEasing); + $inner.css('transition-duration', this.s.speed + 'ms'); + } + + $('.lg-backdrop').addClass('in'); + + setTimeout(function() { + _this.$outer.addClass('lg-visible'); + }, this.s.backdropDuration); + + if (this.s.download) { + this.$outer.find('.lg-toolbar').append('
      '); + } + + // Store the current scroll top value to scroll back after closing the gallery.. + this.prevScrollTop = $(window).scrollTop(); + + }; + + // For fixed height gallery + Plugin.prototype.setTop = function() { + if (this.s.height !== '100%') { + var wH = $(window).height(); + var top = (wH - parseInt(this.s.height, 10)) / 2; + var $lGallery = this.$outer.find('.lg'); + if (wH >= parseInt(this.s.height, 10)) { + $lGallery.css('top', top + 'px'); + } else { + $lGallery.css('top', '0px'); + } + } + }; + + // Find css3 support + Plugin.prototype.doCss = function() { + // check for css animation support + var support = function() { + var transition = ['transition', 'MozTransition', 'WebkitTransition', 'OTransition', 'msTransition', 'KhtmlTransition']; + var root = document.documentElement; + var i = 0; + for (i = 0; i < transition.length; i++) { + if (transition[i] in root.style) { + return true; + } + } + }; + + if (support()) { + return true; + } + + return false; + }; + + /** + * @desc Check the given src is video + * @param {String} src + * @return {Object} video type + * Ex:{ youtube : ["//www.youtube.com/watch?v=c0asJgSyxcY", "c0asJgSyxcY"] } + */ + Plugin.prototype.isVideo = function(src, index) { + + var html; + if (this.s.dynamic) { + html = this.s.dynamicEl[index].html; + } else { + html = this.$items.eq(index).attr('data-html'); + } + + if (!src && html) { + return { + html5: true + }; + } + + var youtube = src.match(/\/\/(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=|embed\/)?([a-z0-9\-\_\%]+)/i); + var vimeo = src.match(/\/\/(?:www\.)?vimeo.com\/([0-9a-z\-_]+)/i); + var dailymotion = src.match(/\/\/(?:www\.)?dai.ly\/([0-9a-z\-_]+)/i); + var vk = src.match(/\/\/(?:www\.)?(?:vk\.com|vkontakte\.ru)\/(?:video_ext\.php\?)(.*)/i); + + if (youtube) { + return { + youtube: youtube + }; + } else if (vimeo) { + return { + vimeo: vimeo + }; + } else if (dailymotion) { + return { + dailymotion: dailymotion + }; + } else if (vk) { + return { + vk: vk + }; + } + }; + + /** + * @desc Create image counter + * Ex: 1/10 + */ + Plugin.prototype.counter = function() { + if (this.s.counter) { + $(this.s.appendCounterTo).append('
      ' + (parseInt(this.index, 10) + 1) + ' / ' + this.$items.length + '
      '); + } + }; + + /** + * @desc add sub-html into the slide + * @param {Number} index - index of the slide + */ + Plugin.prototype.addHtml = function(index) { + var subHtml = null; + var subHtmlUrl; + var $currentEle; + if (this.s.dynamic) { + if (this.s.dynamicEl[index].subHtmlUrl) { + subHtmlUrl = this.s.dynamicEl[index].subHtmlUrl; + } else { + subHtml = this.s.dynamicEl[index].subHtml; + } + } else { + $currentEle = this.$items.eq(index); + if ($currentEle.attr('data-sub-html-url')) { + subHtmlUrl = $currentEle.attr('data-sub-html-url'); + } else { + subHtml = $currentEle.attr('data-sub-html'); + if (this.s.getCaptionFromTitleOrAlt && !subHtml) { + subHtml = $currentEle.attr('title') || $currentEle.find('img').first().attr('alt'); + } + } + } + + if (!subHtmlUrl) { + if (typeof subHtml !== 'undefined' && subHtml !== null) { + + // get first letter of subhtml + // if first letter starts with . or # get the html form the jQuery object + var fL = subHtml.substring(0, 1); + if (fL === '.' || fL === '#') { + if (this.s.subHtmlSelectorRelative && !this.s.dynamic) { + subHtml = $currentEle.find(subHtml).html(); + } else { + subHtml = $(subHtml).html(); + } + } + } else { + subHtml = ''; + } + } + + if (this.s.appendSubHtmlTo === '.lg-sub-html') { + + if (subHtmlUrl) { + this.$outer.find(this.s.appendSubHtmlTo).load(subHtmlUrl); + } else { + this.$outer.find(this.s.appendSubHtmlTo).html(subHtml); + } + + } else { + + if (subHtmlUrl) { + this.$slide.eq(index).load(subHtmlUrl); + } else { + this.$slide.eq(index).append(subHtml); + } + } + + // Add lg-empty-html class if title doesn't exist + if (typeof subHtml !== 'undefined' && subHtml !== null) { + if (subHtml === '') { + this.$outer.find(this.s.appendSubHtmlTo).addClass('lg-empty-html'); + } else { + this.$outer.find(this.s.appendSubHtmlTo).removeClass('lg-empty-html'); + } + } + + this.$el.trigger('onAfterAppendSubHtml.lg', [index]); + }; + + /** + * @desc Preload slides + * @param {Number} index - index of the slide + */ + Plugin.prototype.preload = function(index) { + var i = 1; + var j = 1; + for (i = 1; i <= this.s.preload; i++) { + if (i >= this.$items.length - index) { + break; + } + + this.loadContent(index + i, false, 0); + } + + for (j = 1; j <= this.s.preload; j++) { + if (index - j < 0) { + break; + } + + this.loadContent(index - j, false, 0); + } + }; + + /** + * @desc Load slide content into slide. + * @param {Number} index - index of the slide. + * @param {Boolean} rec - if true call loadcontent() function again. + * @param {Boolean} delay - delay for adding complete class. it is 0 except first time. + */ + Plugin.prototype.loadContent = function(index, rec, delay) { + + var _this = this; + var _hasPoster = false; + var _$img; + var _src; + var _poster; + var _srcset; + var _sizes; + var _html; + var getResponsiveSrc = function(srcItms) { + var rsWidth = []; + var rsSrc = []; + for (var i = 0; i < srcItms.length; i++) { + var __src = srcItms[i].split(' '); + + // Manage empty space + if (__src[0] === '') { + __src.splice(0, 1); + } + + rsSrc.push(__src[0]); + rsWidth.push(__src[1]); + } + + var wWidth = $(window).width(); + for (var j = 0; j < rsWidth.length; j++) { + if (parseInt(rsWidth[j], 10) > wWidth) { + _src = rsSrc[j]; + break; + } + } + }; + + if (_this.s.dynamic) { + + if (_this.s.dynamicEl[index].poster) { + _hasPoster = true; + _poster = _this.s.dynamicEl[index].poster; + } + + _html = _this.s.dynamicEl[index].html; + _src = _this.s.dynamicEl[index].src; + + if (_this.s.dynamicEl[index].responsive) { + var srcDyItms = _this.s.dynamicEl[index].responsive.split(','); + getResponsiveSrc(srcDyItms); + } + + _srcset = _this.s.dynamicEl[index].srcset; + _sizes = _this.s.dynamicEl[index].sizes; + + } else { + + if (_this.$items.eq(index).attr('data-poster')) { + _hasPoster = true; + _poster = _this.$items.eq(index).attr('data-poster'); + } + + _html = _this.$items.eq(index).attr('data-html'); + _src = _this.$items.eq(index).attr('href') || _this.$items.eq(index).attr('data-src'); + + if (_this.$items.eq(index).attr('data-responsive')) { + var srcItms = _this.$items.eq(index).attr('data-responsive').split(','); + getResponsiveSrc(srcItms); + } + + _srcset = _this.$items.eq(index).attr('data-srcset'); + _sizes = _this.$items.eq(index).attr('data-sizes'); + + } + + //if (_src || _srcset || _sizes || _poster) { + + var iframe = false; + if (_this.s.dynamic) { + if (_this.s.dynamicEl[index].iframe) { + iframe = true; + } + } else { + if (_this.$items.eq(index).attr('data-iframe') === 'true') { + iframe = true; + } + } + + var _isVideo = _this.isVideo(_src, index); + if (!_this.$slide.eq(index).hasClass('lg-loaded')) { + if (iframe) { + _this.$slide.eq(index).prepend('
      '); + } else if (_hasPoster) { + var videoClass = ''; + if (_isVideo && _isVideo.youtube) { + videoClass = 'lg-has-youtube'; + } else if (_isVideo && _isVideo.vimeo) { + videoClass = 'lg-has-vimeo'; + } else { + videoClass = 'lg-has-html5'; + } + + _this.$slide.eq(index).prepend('
      '); + + } else if (_isVideo) { + _this.$slide.eq(index).prepend('
      '); + _this.$el.trigger('hasVideo.lg', [index, _src, _html]); + } else { + _this.$slide.eq(index).prepend('
      '); + } + + _this.$el.trigger('onAferAppendSlide.lg', [index]); + + _$img = _this.$slide.eq(index).find('.lg-object'); + if (_sizes) { + _$img.attr('sizes', _sizes); + } + + if (_srcset) { + _$img.attr('srcset', _srcset); + try { + picturefill({ + elements: [_$img[0]] + }); + } catch (e) { + console.error('Make sure you have included Picturefill version 2'); + } + } + + if (this.s.appendSubHtmlTo !== '.lg-sub-html') { + _this.addHtml(index); + } + + _this.$slide.eq(index).addClass('lg-loaded'); + } + + _this.$slide.eq(index).find('.lg-object').on('load.lg error.lg', function() { + + // For first time add some delay for displaying the start animation. + var _speed = 0; + + // Do not change the delay value because it is required for zoom plugin. + // If gallery opened from direct url (hash) speed value should be 0 + if (delay && !$('body').hasClass('lg-from-hash')) { + _speed = delay; + } + + setTimeout(function() { + _this.$slide.eq(index).addClass('lg-complete'); + _this.$el.trigger('onSlideItemLoad.lg', [index, delay || 0]); + }, _speed); + + }); + + // @todo check load state for html5 videos + if (_isVideo && _isVideo.html5 && !_hasPoster) { + _this.$slide.eq(index).addClass('lg-complete'); + } + + if (rec === true) { + if (!_this.$slide.eq(index).hasClass('lg-complete')) { + _this.$slide.eq(index).find('.lg-object').on('load.lg error.lg', function() { + _this.preload(index); + }); + } else { + _this.preload(index); + } + } + + //} + }; + + /** + * @desc slide function for lightgallery + ** Slide() gets call on start + ** ** Set lg.on true once slide() function gets called. + ** Call loadContent() on slide() function inside setTimeout + ** ** On first slide we do not want any animation like slide of fade + ** ** So on first slide( if lg.on if false that is first slide) loadContent() should start loading immediately + ** ** Else loadContent() should wait for the transition to complete. + ** ** So set timeout s.speed + 50 + <=> ** loadContent() will load slide content in to the particular slide + ** ** It has recursion (rec) parameter. if rec === true loadContent() will call preload() function. + ** ** preload will execute only when the previous slide is fully loaded (images iframe) + ** ** avoid simultaneous image load + <=> ** Preload() will check for s.preload value and call loadContent() again accoring to preload value + ** loadContent() <====> Preload(); + + * @param {Number} index - index of the slide + * @param {Boolean} fromTouch - true if slide function called via touch event or mouse drag + * @param {Boolean} fromThumb - true if slide function called via thumbnail click + */ + Plugin.prototype.slide = function(index, fromTouch, fromThumb) { + + var _prevIndex = this.$outer.find('.lg-current').index(); + var _this = this; + + // Prevent if multiple call + // Required for hsh plugin + if (_this.lGalleryOn && (_prevIndex === index)) { + return; + } + + var _length = this.$slide.length; + var _time = _this.lGalleryOn ? this.s.speed : 0; + var _next = false; + var _prev = false; + + if (!_this.lgBusy) { + + if (this.s.download) { + var _src; + if (_this.s.dynamic) { + _src = _this.s.dynamicEl[index].downloadUrl !== false && (_this.s.dynamicEl[index].downloadUrl || _this.s.dynamicEl[index].src); + } else { + _src = _this.$items.eq(index).attr('data-download-url') !== 'false' && (_this.$items.eq(index).attr('data-download-url') || _this.$items.eq(index).attr('href') || _this.$items.eq(index).attr('data-src')); + + } + + if (_src) { + $('#lg-download').attr('href', _src); + _this.$outer.removeClass('lg-hide-download'); + } else { + _this.$outer.addClass('lg-hide-download'); + } + } + + this.$el.trigger('onBeforeSlide.lg', [_prevIndex, index, fromTouch, fromThumb]); + + _this.lgBusy = true; + + clearTimeout(_this.hideBartimeout); + + // Add title if this.s.appendSubHtmlTo === lg-sub-html + if (this.s.appendSubHtmlTo === '.lg-sub-html') { + + // wait for slide animation to complete + setTimeout(function() { + _this.addHtml(index); + }, _time); + } + + this.arrowDisable(index); + + if (!fromTouch) { + + // remove all transitions + _this.$outer.addClass('lg-no-trans'); + + this.$slide.removeClass('lg-prev-slide lg-next-slide'); + + if (index < _prevIndex) { + _prev = true; + if ((index === 0) && (_prevIndex === _length - 1) && !fromThumb) { + _prev = false; + _next = true; + } + } else if (index > _prevIndex) { + _next = true; + if ((index === _length - 1) && (_prevIndex === 0) && !fromThumb) { + _prev = true; + _next = false; + } + } + + if (_prev) { + + //prevslide + this.$slide.eq(index).addClass('lg-prev-slide'); + this.$slide.eq(_prevIndex).addClass('lg-next-slide'); + } else if (_next) { + + // next slide + this.$slide.eq(index).addClass('lg-next-slide'); + this.$slide.eq(_prevIndex).addClass('lg-prev-slide'); + } + + // give 50 ms for browser to add/remove class + setTimeout(function() { + _this.$slide.removeClass('lg-current'); + + //_this.$slide.eq(_prevIndex).removeClass('lg-current'); + _this.$slide.eq(index).addClass('lg-current'); + + // reset all transitions + _this.$outer.removeClass('lg-no-trans'); + }, 50); + } else { + + var touchPrev = index - 1; + var touchNext = index + 1; + + if ((index === 0) && (_prevIndex === _length - 1)) { + + // next slide + touchNext = 0; + touchPrev = _length - 1; + } else if ((index === _length - 1) && (_prevIndex === 0)) { + + // prev slide + touchNext = 0; + touchPrev = _length - 1; + } + + this.$slide.removeClass('lg-prev-slide lg-current lg-next-slide'); + _this.$slide.eq(touchPrev).addClass('lg-prev-slide'); + _this.$slide.eq(touchNext).addClass('lg-next-slide'); + _this.$slide.eq(index).addClass('lg-current'); + } + + if (_this.lGalleryOn) { + setTimeout(function() { + _this.loadContent(index, true, 0); + }, this.s.speed + 50); + + setTimeout(function() { + _this.lgBusy = false; + _this.$el.trigger('onAfterSlide.lg', [_prevIndex, index, fromTouch, fromThumb]); + }, this.s.speed); + + } else { + _this.loadContent(index, true, _this.s.backdropDuration); + + _this.lgBusy = false; + _this.$el.trigger('onAfterSlide.lg', [_prevIndex, index, fromTouch, fromThumb]); + } + + _this.lGalleryOn = true; + + if (this.s.counter) { + $('#lg-counter-current').text(index + 1); + } + + } + + }; + + /** + * @desc Go to next slide + * @param {Boolean} fromTouch - true if slide function called via touch event + */ + Plugin.prototype.goToNextSlide = function(fromTouch) { + var _this = this; + if (!_this.lgBusy) { + if ((_this.index + 1) < _this.$slide.length) { + _this.index++; + _this.$el.trigger('onBeforeNextSlide.lg', [_this.index]); + _this.slide(_this.index, fromTouch, false); + } else { + if (_this.s.loop) { + _this.index = 0; + _this.$el.trigger('onBeforeNextSlide.lg', [_this.index]); + _this.slide(_this.index, fromTouch, false); + } else if (_this.s.slideEndAnimatoin) { + _this.$outer.addClass('lg-right-end'); + setTimeout(function() { + _this.$outer.removeClass('lg-right-end'); + }, 400); + } + } + } + }; + + /** + * @desc Go to previous slide + * @param {Boolean} fromTouch - true if slide function called via touch event + */ + Plugin.prototype.goToPrevSlide = function(fromTouch) { + var _this = this; + if (!_this.lgBusy) { + if (_this.index > 0) { + _this.index--; + _this.$el.trigger('onBeforePrevSlide.lg', [_this.index, fromTouch]); + _this.slide(_this.index, fromTouch, false); + } else { + if (_this.s.loop) { + _this.index = _this.$items.length - 1; + _this.$el.trigger('onBeforePrevSlide.lg', [_this.index, fromTouch]); + _this.slide(_this.index, fromTouch, false); + } else if (_this.s.slideEndAnimatoin) { + _this.$outer.addClass('lg-left-end'); + setTimeout(function() { + _this.$outer.removeClass('lg-left-end'); + }, 400); + } + } + } + }; + + Plugin.prototype.keyPress = function() { + var _this = this; + if (this.$items.length > 1) { + $(window).on('keyup.lg', function(e) { + if (_this.$items.length > 1) { + if (e.keyCode === 37) { + e.preventDefault(); + _this.goToPrevSlide(); + } + + if (e.keyCode === 39) { + e.preventDefault(); + _this.goToNextSlide(); + } + } + }); + } + + $(window).on('keydown.lg', function(e) { + if (_this.s.escKey === true && e.keyCode === 27) { + e.preventDefault(); + if (!_this.$outer.hasClass('lg-thumb-open')) { + _this.destroy(); + } else { + _this.$outer.removeClass('lg-thumb-open'); + } + } + }); + }; + + Plugin.prototype.arrow = function() { + var _this = this; + this.$outer.find('.lg-prev').on('click.lg', function() { + _this.goToPrevSlide(); + }); + + this.$outer.find('.lg-next').on('click.lg', function() { + _this.goToNextSlide(); + }); + }; + + Plugin.prototype.arrowDisable = function(index) { + + // Disable arrows if s.hideControlOnEnd is true + if (!this.s.loop && this.s.hideControlOnEnd) { + if ((index + 1) < this.$slide.length) { + this.$outer.find('.lg-next').removeAttr('disabled').removeClass('disabled'); + } else { + this.$outer.find('.lg-next').attr('disabled', 'disabled').addClass('disabled'); + } + + if (index > 0) { + this.$outer.find('.lg-prev').removeAttr('disabled').removeClass('disabled'); + } else { + this.$outer.find('.lg-prev').attr('disabled', 'disabled').addClass('disabled'); + } + } + }; + + Plugin.prototype.setTranslate = function($el, xValue, yValue) { + // jQuery supports Automatic CSS prefixing since jQuery 1.8.0 + if (this.s.useLeft) { + $el.css('left', xValue); + } else { + $el.css({ + transform: 'translate3d(' + (xValue) + 'px, ' + yValue + 'px, 0px)' + }); + } + }; + + Plugin.prototype.touchMove = function(startCoords, endCoords) { + + var distance = endCoords - startCoords; + + if (Math.abs(distance) > 15) { + // reset opacity and transition duration + this.$outer.addClass('lg-dragging'); + + // move current slide + this.setTranslate(this.$slide.eq(this.index), distance, 0); + + // move next and prev slide with current slide + this.setTranslate($('.lg-prev-slide'), -this.$slide.eq(this.index).width() + distance, 0); + this.setTranslate($('.lg-next-slide'), this.$slide.eq(this.index).width() + distance, 0); + } + }; + + Plugin.prototype.touchEnd = function(distance) { + var _this = this; + + // keep slide animation for any mode while dragg/swipe + if (_this.s.mode !== 'lg-slide') { + _this.$outer.addClass('lg-slide'); + } + + this.$slide.not('.lg-current, .lg-prev-slide, .lg-next-slide').css('opacity', '0'); + + // set transition duration + setTimeout(function() { + _this.$outer.removeClass('lg-dragging'); + if ((distance < 0) && (Math.abs(distance) > _this.s.swipeThreshold)) { + _this.goToNextSlide(true); + } else if ((distance > 0) && (Math.abs(distance) > _this.s.swipeThreshold)) { + _this.goToPrevSlide(true); + } else if (Math.abs(distance) < 5) { + + // Trigger click if distance is less than 5 pix + _this.$el.trigger('onSlideClick.lg'); + } + + _this.$slide.removeAttr('style'); + }); + + // remove slide class once drag/swipe is completed if mode is not slide + setTimeout(function() { + if (!_this.$outer.hasClass('lg-dragging') && _this.s.mode !== 'lg-slide') { + _this.$outer.removeClass('lg-slide'); + } + }, _this.s.speed + 100); + + }; + + Plugin.prototype.enableSwipe = function() { + var _this = this; + var startCoords = 0; + var endCoords = 0; + var isMoved = false; + + if (_this.s.enableSwipe && _this.isTouch && _this.doCss()) { + + _this.$slide.on('touchstart.lg', function(e) { + if (!_this.$outer.hasClass('lg-zoomed') && !_this.lgBusy) { + e.preventDefault(); + _this.manageSwipeClass(); + startCoords = e.originalEvent.targetTouches[0].pageX; + } + }); + + _this.$slide.on('touchmove.lg', function(e) { + if (!_this.$outer.hasClass('lg-zoomed')) { + e.preventDefault(); + endCoords = e.originalEvent.targetTouches[0].pageX; + _this.touchMove(startCoords, endCoords); + isMoved = true; + } + }); + + _this.$slide.on('touchend.lg', function() { + if (!_this.$outer.hasClass('lg-zoomed')) { + if (isMoved) { + isMoved = false; + _this.touchEnd(endCoords - startCoords); + } else { + _this.$el.trigger('onSlideClick.lg'); + } + } + }); + } + + }; + + Plugin.prototype.enableDrag = function() { + var _this = this; + var startCoords = 0; + var endCoords = 0; + var isDraging = false; + var isMoved = false; + if (_this.s.enableDrag && !_this.isTouch && _this.doCss()) { + _this.$slide.on('mousedown.lg', function(e) { + // execute only on .lg-object + if (!_this.$outer.hasClass('lg-zoomed')) { + if ($(e.target).hasClass('lg-object') || $(e.target).hasClass('lg-video-play')) { + e.preventDefault(); + + if (!_this.lgBusy) { + _this.manageSwipeClass(); + startCoords = e.pageX; + isDraging = true; + + // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723 + _this.$outer.scrollLeft += 1; + _this.$outer.scrollLeft -= 1; + + // * + + _this.$outer.removeClass('lg-grab').addClass('lg-grabbing'); + + _this.$el.trigger('onDragstart.lg'); + } + + } + } + }); + + $(window).on('mousemove.lg', function(e) { + if (isDraging) { + isMoved = true; + endCoords = e.pageX; + _this.touchMove(startCoords, endCoords); + _this.$el.trigger('onDragmove.lg'); + } + }); + + $(window).on('mouseup.lg', function(e) { + if (isMoved) { + isMoved = false; + _this.touchEnd(endCoords - startCoords); + _this.$el.trigger('onDragend.lg'); + } else if ($(e.target).hasClass('lg-object') || $(e.target).hasClass('lg-video-play')) { + _this.$el.trigger('onSlideClick.lg'); + } + + // Prevent execution on click + if (isDraging) { + isDraging = false; + _this.$outer.removeClass('lg-grabbing').addClass('lg-grab'); + } + }); + + } + }; + + Plugin.prototype.manageSwipeClass = function() { + var touchNext = this.index + 1; + var touchPrev = this.index - 1; + var length = this.$slide.length; + if (this.s.loop) { + if (this.index === 0) { + touchPrev = length - 1; + } else if (this.index === length - 1) { + touchNext = 0; + } + } + + this.$slide.removeClass('lg-next-slide lg-prev-slide'); + if (touchPrev > -1) { + this.$slide.eq(touchPrev).addClass('lg-prev-slide'); + } + + this.$slide.eq(touchNext).addClass('lg-next-slide'); + }; + + Plugin.prototype.mousewheel = function() { + var _this = this; + _this.$outer.on('mousewheel.lg', function(e) { + + if (!e.deltaY) { + return; + } + + if (e.deltaY > 0) { + _this.goToPrevSlide(); + } else { + _this.goToNextSlide(); + } + + e.preventDefault(); + }); + + }; + + Plugin.prototype.closeGallery = function() { + + var _this = this; + var mousedown = false; + this.$outer.find('.lg-close').on('click.lg', function() { + _this.destroy(); + }); + + if (_this.s.closable) { + + // If you drag the slide and release outside gallery gets close on chrome + // for preventing this check mousedown and mouseup happened on .lg-item or lg-outer + _this.$outer.on('mousedown.lg', function(e) { + + if ($(e.target).is('.lg-outer') || $(e.target).is('.lg-item ') || $(e.target).is('.lg-img-wrap')) { + mousedown = true; + } else { + mousedown = false; + } + + }); + + _this.$outer.on('mouseup.lg', function(e) { + + if ($(e.target).is('.lg-outer') || $(e.target).is('.lg-item ') || $(e.target).is('.lg-img-wrap') && mousedown) { + if (!_this.$outer.hasClass('lg-dragging')) { + _this.destroy(); + } + } + + }); + + } + + }; + + Plugin.prototype.destroy = function(d) { + + var _this = this; + + if (!d) { + _this.$el.trigger('onBeforeClose.lg'); + } + + $(window).scrollTop(_this.prevScrollTop); + + /** + * if d is false or undefined destroy will only close the gallery + * plugins instance remains with the element + * + * if d is true destroy will completely remove the plugin + */ + + if (d) { + if (!_this.s.dynamic) { + // only when not using dynamic mode is $items a jquery collection + this.$items.off('click.lg click.lgcustom'); + } + + $.removeData(_this.el, 'lightGallery'); + } + + // Unbind all events added by lightGallery + this.$el.off('.lg.tm'); + + // Distroy all lightGallery modules + $.each($.fn.lightGallery.modules, function(key) { + if (_this.modules[key]) { + _this.modules[key].destroy(); + } + }); + + this.lGalleryOn = false; + + clearTimeout(_this.hideBartimeout); + this.hideBartimeout = false; + $(window).off('.lg'); + $('body').removeClass('lg-on lg-from-hash'); + + if (_this.$outer) { + _this.$outer.removeClass('lg-visible'); + } + + $('.lg-backdrop').removeClass('in'); + + setTimeout(function() { + if (_this.$outer) { + _this.$outer.remove(); + } + + $('.lg-backdrop').remove(); + + if (!d) { + _this.$el.trigger('onCloseAfter.lg'); + } + + }, _this.s.backdropDuration + 50); + }; + + $.fn.lightGallery = function(options) { + return this.each(function() { + if (!$.data(this, 'lightGallery')) { + $.data(this, 'lightGallery', new Plugin(this, options)); + } else { + try { + $(this).data('lightGallery').init(); + } catch (err) { + console.error('lightGallery has not initiated properly'); + } + } + }); + }; + + $.fn.lightGallery.modules = {}; + +})(jQuery, window, document); diff --git a/vendors/lightgallery/src/sass/lg-animations.scss b/vendors/lightgallery/src/sass/lg-animations.scss new file mode 100644 index 000000000..9a47e417e --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-animations.scss @@ -0,0 +1,714 @@ +.lg-css3 { + // Remove all transition effects + &.lg-no-trans { + .lg-prev-slide, .lg-next-slide, .lg-current { + @include transitionCustom(none 0s ease 0s !important); + } + } + + &.lg-use-css3 { + .lg-item { + will-change: transform, opacity; + } + } + + &.lg-use-left { + .lg-item { + will-change: left, opacity; + } + } + + &.lg-zoom-in { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include scale3d(2, 2, 2); + } + + &.lg-next-slide { + @include scale3d(2, 2, 2); + } + + &.lg-current { + @include scale3d(1, 1, 1); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-zoom-out { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include scale3d(0, 0, 0); + } + + &.lg-next-slide { + @include scale3d(0, 0, 0); + } + + &.lg-current { + @include scale3d(1, 1, 1); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-zoom-out-in { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include scale3d(0, 0, 0); + } + + &.lg-next-slide { + @include scale3d(2, 2, 2); + } + + &.lg-current { + @include scale3d(1, 1, 1); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-zoom-in-out { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include scale3d(2, 2, 2); + } + + &.lg-next-slide { + @include scale3d(0, 0, 0); + } + + &.lg-current { + @include scale3d(1, 1, 1); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-soft-zoom { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include scale3d(1.2, 1.2, 1.2); + } + + &.lg-next-slide { + @include scale3d(0.8, 0.8, 0.8); + } + + &.lg-current { + @include scale3d(1, 1, 1); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-slide-circular { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0, 0, 0) translate3d(-100%, 0, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0, 0, 0) translate3d(100%, 0, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + // sec + &.lg-slide-circular-up { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0, 0, 0) translate3d(-100%, -100%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0, 0, 0) translate3d(100%, -100%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + // sec + &.lg-slide-circular-down { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0, 0, 0) translate3d(-100%, 100%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0, 0, 0) translate3d(100%, 100%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-slide-circular-vertical { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0, 0, 0) translate3d(0, -100%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0, 0, 0) translate3d(0, 100%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + // sec + &.lg-slide-circular-vertical-left { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0, 0, 0) translate3d(-100%, -100%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0, 0, 0) translate3d(-100%, 100%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + // sec + &.lg-slide-circular-vertical-down { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0, 0, 0) translate3d(100%, -100%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0, 0, 0) translate3d(100%, 100%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-slide-vertical { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include translate3d(0, -100%, 0); + } + + &.lg-next-slide { + @include translate3d(0, 100%, 0); + } + + &.lg-current { + @include translate3d(0, 0, 0); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-vertical-growth { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0.5, 0.5, 0.5) translate3d(0, -150%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0.5, 0.5, 0.5) translate3d(0, 150%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-only { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(60deg, 0deg)); + } + + &.lg-next-slide { + @include transform(skew(60deg, 0deg)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-only-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(-60deg, 0deg)); + } + + &.lg-next-slide { + @include transform(skew(-60deg, 0deg)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-only-y { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(0deg, 60deg)); + } + + &.lg-next-slide { + @include transform(skew(0deg, 60deg)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-only-y-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(0deg, -60deg)); + } + + &.lg-next-slide { + @include transform(skew(0deg, -60deg)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(60deg, 0deg) translate3d(-100%, 0%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(60deg, 0deg) translate3d(100%, 0%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(-60deg, 0deg) translate3d(-100%, 0%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(-60deg, 0deg) translate3d(100%, 0%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-cross { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(0deg, 60deg) translate3d(-100%, 0%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(0deg, 60deg) translate3d(100%, 0%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-cross-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(0deg, -60deg) translate3d(-100%, 0%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(0deg, -60deg) translate3d(100%, 0%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-ver { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(60deg, 0deg) translate3d(0, -100%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(60deg, 0deg) translate3d(0, 100%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-ver-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(-60deg, 0deg) translate3d(0, -100%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(-60deg, 0deg) translate3d(0, 100%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-ver-cross { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(0deg, 60deg) translate3d(0, -100%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(0deg, 60deg) translate3d(0, 100%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-ver-cross-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(0deg, -60deg) translate3d(0, -100%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(0deg, -60deg) translate3d(0, 100%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-lollipop { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include translate3d(-100%, 0, 0); + } + + &.lg-next-slide { + @include transform(translate3d(0, 0, 0) scale(0.5)); + } + + &.lg-current { + @include translate3d(0, 0, 0); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-lollipop-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(translate3d(0, 0, 0) scale(0.5)); + } + + &.lg-next-slide { + @include translate3d(100%, 0, 0); + } + + &.lg-current { + @include translate3d(0, 0, 0); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-rotate { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(rotate(-360deg)); + } + + &.lg-next-slide { + @include transform(rotate(360deg)); + } + + &.lg-current { + @include transform(rotate(0deg)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-rotate-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(rotate(360deg)); + } + + &.lg-next-slide { + @include transform(rotate(-360deg)); + } + + &.lg-current { + @include transform(rotate(0deg)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-tube { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(1, 0, 1) translate3d(-100%, 0, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(1, 0, 1) translate3d(100%, 0, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } +} \ No newline at end of file diff --git a/vendors/lightgallery/src/sass/lg-autoplay.scss b/vendors/lightgallery/src/sass/lg-autoplay.scss new file mode 100644 index 000000000..0a2da002e --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-autoplay.scss @@ -0,0 +1,36 @@ +.lg-progress-bar { + background-color: $lg-progress-bar-bg; + height: $lg-progress-bar-height; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: $zindex-progressbar; + opacity: 0; + @include transitionCustom(opacity 0.08s ease 0s); + + .lg-progress { + background-color: $lg-progress-bar-active-bg; + height: $lg-progress-bar-height; + width: 0; + } + + &.lg-start { + .lg-progress { + width: 100%; + } + } + + .lg-show-autoplay & { + opacity: 1; + } +} + +.lg-autoplay-button { + &:after { + .lg-show-autoplay & { + content: "\e01a"; + } + content: "\e01d"; + } +} \ No newline at end of file diff --git a/vendors/lightgallery/src/sass/lg-fb-comment-box.scss b/vendors/lightgallery/src/sass/lg-fb-comment-box.scss new file mode 100644 index 000000000..96aaab0d2 --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-fb-comment-box.scss @@ -0,0 +1,46 @@ +@import "lg-variables"; +@import "lg-mixins"; +.lg-outer.fb-comments{ + .lg-img-wrap { + padding-right: 400px !important; + } + .fb-comments { + height: 100%; + overflow-y: auto; + position: absolute; + right: 0; + top: 0; + width: 420px; + z-index: 99999; + background: #fff url("#{$lg-path-images}/loading.gif") no-repeat scroll center center; + &.fb_iframe_widget { + background-image: none; + &.fb_iframe_widget_loader{ + background: #fff url("#{$lg-path-images}/loading.gif") no-repeat scroll center center; + } + } + } + .lg-toolbar { + right: 420px; + width: auto; + } + .lg-actions .lg-next { + right: 420px; + } + .lg-item { + background-image: none; + &.lg-complete{ + .lg-img-wrap{ + background-image: none; + } + } + } + .lg-img-wrap { + background: url("#{$lg-path-images}/loading.gif") no-repeat scroll center center transparent; + } + + .lg-sub-html { + padding: 0; + position: static; + } +} diff --git a/vendors/lightgallery/src/sass/lg-fonts.scss b/vendors/lightgallery/src/sass/lg-fonts.scss new file mode 100644 index 000000000..091e6f91e --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-fonts.scss @@ -0,0 +1,22 @@ +// font icons support +@font-face { + font-family: 'lg'; + src: url("#{$lg-path-fonts}/lg.eot?n1z373"); + src: url("#{$lg-path-fonts}/lg.eot?#iefixn1z373") format("embedded-opentype"), url("#{$lg-path-fonts}/lg.woff?n1z373") format("woff"), url("#{$lg-path-fonts}/lg.ttf?n1z373") format("truetype"), url("#{$lg-path-fonts}/lg.svg?n1z373#lg") format("svg"); + font-weight: normal; + font-style: normal; +} + + +.lg-icon { + font-family: 'lg'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} \ No newline at end of file diff --git a/vendors/lightgallery/src/sass/lg-fullscreen.scss b/vendors/lightgallery/src/sass/lg-fullscreen.scss new file mode 100644 index 000000000..fd710357e --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-fullscreen.scss @@ -0,0 +1,9 @@ +.lg-fullscreen { + &:after { + content: "\e20c"; + + .lg-fullscreen-on & { + content: "\e20d"; + } + } +} \ No newline at end of file diff --git a/vendors/lightgallery/src/sass/lg-mixins.scss b/vendors/lightgallery/src/sass/lg-mixins.scss new file mode 100644 index 000000000..b0260d3a8 --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-mixins.scss @@ -0,0 +1,330 @@ +// Vendor Prefixes +// +// All vendor mixins are deprecated as of v3.2.0 due to the introduction of +// Autoprefixer in our Gruntfile. They will be removed in v4. + +// - Animations +// - Backface visibility +// - Box shadow +// - Box sizing +// - Content columns +// - Hyphens +// - Placeholder text +// - Transformations +// - Transitions +// - User Select +// - cursor grab + +// Animations +@mixin animation($animation) { + -webkit-animation: $animation; + -o-animation: $animation; + animation: $animation; +} + +@mixin animation-name($name) { + -webkit-animation-name: $name; + animation-name: $name; +} + +@mixin animation-duration($duration) { + -webkit-animation-duration: $duration; + animation-duration: $duration; +} + +@mixin animation-timing-function($timing-function) { + -webkit-animation-timing-function: $timing-function; + animation-timing-function: $timing-function; +} + +@mixin animation-delay($delay) { + -webkit-animation-delay: $delay; + animation-delay: $delay; +} + +@mixin animation-iteration-count($iteration-count) { + -webkit-animation-iteration-count: $iteration-count; + animation-iteration-count: $iteration-count; +} + +@mixin animation-direction($direction) { + -webkit-animation-direction: $direction; + animation-direction: $direction; +} + +@mixin animation-fill-mode($fill-mode) { + -webkit-animation-fill-mode: $fill-mode; + animation-fill-mode: $fill-mode; +} + +@mixin keyframes($name) { + @-webkit-keyframes #{$name} { + @content; + } + + @-moz-keyframes #{$name} { + @content; + } + + @-ms-keyframes #{$name} { + @content; + } + + @keyframes #{$name} { + @content; + } +} + +// Backface visibility +// Prevent browsers from flickering when using CSS 3D transforms. +// Default value is `visible`, but can be changed to `hidden` + +@mixin backface-visibility($visibility) { + -webkit-backface-visibility: $visibility; + -moz-backface-visibility: $visibility; + backface-visibility: $visibility; +} + +// Drop shadows +// +// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's +// supported browsers that have box shadow capabilities now support it. + +@mixin box-shadow($shadow...) { + -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1 + box-shadow: $shadow; +} + +// Box sizing +@mixin box-sizing($boxmodel) { + -webkit-box-sizing: $boxmodel; + -moz-box-sizing: $boxmodel; + box-sizing: $boxmodel; +} + +// CSS3 Content Columns +@mixin content-columns($column-count, $column-gap: $grid-gutter-width) { + -webkit-column-count: $column-count; + -moz-column-count: $column-count; + column-count: $column-count; + -webkit-column-gap: $column-gap; + -moz-column-gap: $column-gap; + column-gap: $column-gap; +} + +// Optional hyphenation +@mixin hyphens($mode: auto) { + word-wrap: break-word; + -webkit-hyphens: $mode; + -moz-hyphens: $mode; + -ms-hyphens: $mode; // IE10+ + -o-hyphens: $mode; + hyphens: $mode; +} + +// Transformations +@mixin scale($ratio...) { + -webkit-transform: scale($ratio); + -ms-transform: scale($ratio); // IE9 only + -o-transform: scale($ratio); + transform: scale($ratio); +} + +@mixin scaleX($ratio) { + -webkit-transform: scaleX($ratio); + -ms-transform: scaleX($ratio); // IE9 only + -o-transform: scaleX($ratio); + transform: scaleX($ratio); +} + +@mixin scaleY($ratio) { + -webkit-transform: scaleY($ratio); + -ms-transform: scaleY($ratio); // IE9 only + -o-transform: scaleY($ratio); + transform: scaleY($ratio); +} + +@mixin skew($x, $y) { + -webkit-transform: skewX($x) skewY($y); + -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+ + -o-transform: skewX($x) skewY($y); + transform: skewX($x) skewY($y); +} + +@mixin translate($x, $y) { + -webkit-transform: translate($x, $y); + -ms-transform: translate($x, $y); // IE9 only + -o-transform: translate($x, $y); + transform: translate($x, $y); +} + +@mixin translate3d($x, $y, $z) { + -webkit-transform: translate3d($x, $y, $z); + transform: translate3d($x, $y, $z); +} + +@mixin scale3d($x, $y, $z) { + -webkit-transform: scale3d($x, $y, $z); + transform: scale3d($x, $y, $z); +} + +@mixin rotate($degrees) { + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); // IE9 only + -o-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin rotateX($degrees) { + -webkit-transform: rotateX($degrees); + -ms-transform: rotateX($degrees); // IE9 only + -o-transform: rotateX($degrees); + transform: rotateX($degrees); +} + +@mixin rotateY($degrees) { + -webkit-transform: rotateY($degrees); + -ms-transform: rotateY($degrees); // IE9 only + -o-transform: rotateY($degrees); + transform: rotateY($degrees); +} + +@mixin perspective($perspective) { + -webkit-perspective: $perspective; + -moz-perspective: $perspective; + perspective: $perspective; +} + +@mixin perspective-origin($perspective) { + -webkit-perspective-origin: $perspective; + -moz-perspective-origin: $perspective; + perspective-origin: $perspective; +} + +@mixin transform-origin($origin) { + -webkit-transform-origin: $origin; + -moz-transform-origin: $origin; + -ms-transform-origin: $origin; // IE9 only + transform-origin: $origin; +} + +@mixin transform($transforms) { + -moz-transform: $transforms; + -o-transform: $transforms; + -ms-transform: $transforms; + -webkit-transform: $transforms; + transform: $transforms; +} + +// Transitions + +@mixin transition($transition...) { + -webkit-transition: $transition; + -o-transition: $transition; + transition: $transition; +} + +@mixin transition-property($transition-property...) { + -webkit-transition-property: $transition-property; + transition-property: $transition-property; +} + +@mixin transition-delay($transition-delay) { + -webkit-transition-delay: $transition-delay; + transition-delay: $transition-delay; +} + +@mixin transition-duration($transition-duration...) { + -webkit-transition-duration: $transition-duration; + transition-duration: $transition-duration; +} + +@mixin transition-timing-function($timing-function) { + -webkit-transition-timing-function: $timing-function; + transition-timing-function: $timing-function; +} + +@mixin transition-transform($transition...) { + -webkit-transition: -webkit-transform $transition; + -moz-transition: -moz-transform $transition; + -o-transition: -o-transform $transition; + transition: transform $transition; +} + +// transition custom + +@function prefix($property, $prefixes: webkit moz o ms) { + $vendor-prefixed-properties: transform background-clip background-size; + $result: (); + + @each $prefix in $prefixes { + @if index($vendor-prefixed-properties, $property) { + $property: -#{$prefix}-#{$property}; + } + $result: append($result, $property); + } + @return $result; +} + +@function trans-prefix($transition, $prefix: moz) { + $prefixed: (); + + @each $trans in $transition { + $prop-name: nth($trans, 1); + $vendor-prop-name: prefix($prop-name, $prefix); + $prop-vals: nth($trans, 2); + $prefixed: append($prefixed, $vendor-prop-name $prop-vals, comma); + } + @return $prefixed; +} + +@mixin transitionCustom($values...) { + $transitions: (); + + @each $declaration in $values { + $prop: nth($declaration, 1); + $prop-opts: (); + $length: length($declaration); + + @if $length >= 2 { + @for $i from 2 through $length { + $prop-opts: append($prop-opts, nth($declaration, $i)); + } + } + $trans: $prop, $prop-opts; + $transitions: append($transitions, $trans, comma); + } + -webkit-transition: trans-prefix($transitions, webkit); + -moz-transition: trans-prefix($transitions, moz); + -o-transition: trans-prefix($transitions, o); + transition: $values; +} + +// User select +// For selecting text on the page + +@mixin user-select($select) { + -webkit-user-select: $select; + -moz-user-select: $select; + -ms-user-select: $select; // IE10+ + user-select: $select; +} + +// mouse grab + +@mixin grab-cursor { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: -o-grab; + cursor: -ms-grab; + cursor: grab; +} + +@mixin grabbing-cursor { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: -o-grabbing; + cursor: -ms-grabbing; + cursor: grabbing; +} diff --git a/vendors/lightgallery/src/sass/lg-pager.scss b/vendors/lightgallery/src/sass/lg-pager.scss new file mode 100644 index 000000000..5138b5520 --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-pager.scss @@ -0,0 +1,89 @@ +.lg-outer { + .lg-pager-outer { + bottom: 60px; + left: 0; + position: absolute; + right: 0; + text-align: center; + z-index: $zindex-pager; + height: 10px; + + &.lg-pager-hover { + .lg-pager-cont { + overflow: visible; + } + } + } + + .lg-pager-cont { + cursor: pointer; + display: inline-block; + overflow: hidden; + position: relative; + vertical-align: top; + margin: 0 5px; + + &:hover { + .lg-pager-thumb-cont { + opacity: 1; + @include translate3d(0, 0, 0); + } + } + + &.lg-pager-active { + .lg-pager { + box-shadow: 0 0 0 2px white inset; + } + } + } + + .lg-pager-thumb-cont { + background-color: #fff; + color: #FFF; + bottom: 100%; + height: 83px; + left: 0; + margin-bottom: 20px; + margin-left: -60px; + opacity: 0; + padding: 5px; + position: absolute; + width: 120px; + border-radius: 3px; + @include transitionCustom(opacity 0.15s ease 0s, transform 0.15s ease 0s); + @include translate3d(0, 5px, 0); + + img { + width: 100%; + height: 100%; + } + } + + .lg-pager { + background-color: rgba(255, 255, 255, 0.5); + border-radius: 50%; + box-shadow: 0 0 0 8px rgba(255, 255, 255, 0.7) inset; + display: block; + height: 12px; + @include transition(box-shadow 0.3s ease 0s); + width: 12px; + + &:hover, &:focus { + box-shadow: 0 0 0 8px white inset; + } + } + + .lg-caret { + border-left: 10px solid transparent; + border-right: 10px solid transparent; + border-top: 10px dashed; + bottom: -10px; + display: inline-block; + height: 0; + left: 50%; + margin-left: -5px; + position: absolute; + vertical-align: middle; + width: 0; + } +} \ No newline at end of file diff --git a/vendors/lightgallery/src/sass/lg-theme-default.scss b/vendors/lightgallery/src/sass/lg-theme-default.scss new file mode 100644 index 000000000..4052bea10 --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-theme-default.scss @@ -0,0 +1,206 @@ +// default theme +.lg-actions { + .lg-next, .lg-prev { + background-color: $lg-next-prev-bg; + border-radius: $lg-border-radius-base; + color: $lg-next-prev-color; + cursor: pointer; + display: block; + font-size: 22px; + margin-top: -10px; + padding: 8px 10px 9px; + position: absolute; + top: 50%; + z-index: $zindex-controls; + + &.disabled { + pointer-events: none; + opacity: 0.5; + } + + &:hover { + color: $lg-next-prev-hover-color; + } + } + + .lg-next { + right: 20px; + + &:before { + content: "\e095"; + } + } + + .lg-prev { + left: 20px; + + &:after { + content: "\e094"; + } + } +} + +@include keyframes(lg-right-end) { + 0% { + left: 0; + } + + 50% { + left: -30px; + } + + 100% { + left: 0; + } +} + + +@include keyframes(lg-left-end) { + 0% { + left: 0; + } + + 50% { + left: 30px; + } + + 100% { + left: 0; + } +} + + +.lg-outer { + &.lg-right-end { + .lg-object { + @include animation(lg-right-end 0.3s); + position: relative; + } + } + + &.lg-left-end { + .lg-object { + @include animation(lg-left-end 0.3s); + position: relative; + } + } +} + +// lg toolbar +.lg-toolbar { + z-index: $zindex-toolbar; + left: 0; + position: absolute; + top: 0; + width: 100%; + background-color: $lg-toolbar-bg; + + .lg-icon { + color: $lg-toolbar-icon-color; + cursor: pointer; + float: right; + font-size: 24px; + height: 47px; + line-height: 27px; + padding: 10px 0; + text-align: center; + width: 50px; + text-decoration: none !important; + outline: medium none; + @include transition(color 0.2s linear); + + &:hover { + color: $lg-toolbar-icon-hover-color; + } + } + + .lg-close { + &:after { + content: "\e070"; + } + } + + .lg-download { + &:after { + content: "\e0f2"; + } + } +} + +// lightGallery title +.lg-sub-html { + background-color: $lg-sub-html-bg; + bottom: 0; + color: $lg-sub-html-color; + font-size: 16px; + left: 0; + padding: 10px 40px; + position: fixed; + right: 0; + text-align: center; + z-index: $zindex-subhtml; + + h4 { + margin: 0; + font-size: 13px; + font-weight: bold; + } + + p { + font-size: 12px; + margin: 5px 0 0; + } +} + +// lg image counter +#lg-counter { + color: $lg-icon-color; + display: inline-block; + font-size: $lg-counter-font-size; + padding-left: 20px; + padding-top: 12px; + vertical-align: middle; +} + +// for idle state +.lg-toolbar, .lg-prev, .lg-next { + opacity: 1; + @include transitionCustom(transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, color 0.2s linear); +} + +.lg-hide-items { + .lg-prev { + opacity: 0; + @include translate3d(-10px, 0, 0); + } + + .lg-next { + opacity: 0; + @include translate3d(10px, 0, 0); + } + + .lg-toolbar { + opacity: 0; + @include translate3d(0, -10px, 0); + } +} + +// Starting effect +body:not(.lg-from-hash){ + .lg-outer { + &.lg-start-zoom{ + .lg-object{ + @include scale3d(0.5, 0.5, 0.5); + opacity: 0; + @include transitionCustom(transform 250ms cubic-bezier(0, 0, 0.25, 1) 0s, opacity 250ms cubic-bezier(0, 0, 0.25, 1) !important); + @include transform-origin(50% 50%); + } + .lg-item.lg-complete{ + .lg-object{ + @include scale3d(1, 1, 1); + opacity: 1; + } + } + } + } +} \ No newline at end of file diff --git a/vendors/lightgallery/src/sass/lg-thumbnail.scss b/vendors/lightgallery/src/sass/lg-thumbnail.scss new file mode 100644 index 000000000..574694598 --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-thumbnail.scss @@ -0,0 +1,111 @@ +.lg-outer { + .lg-thumb-outer { + background-color: $lg-thumb-bg; + bottom: 0; + position: absolute; + width: 100%; + z-index: $zindex-thumbnail; + max-height: 350px; + @include translate3d(0, 100%, 0); + @include transitionCustom(transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s); + + &.lg-grab { + .lg-thumb-item { + @include grab-cursor; + } + } + + &.lg-grabbing { + .lg-thumb-item { + @include grabbing-cursor; + } + } + + &.lg-dragging { + .lg-thumb { + @include transition-duration(0s !important); + } + } + } + &.lg-thumb-open{ + .lg-thumb-outer { + @include translate3d(0, 0%, 0); + } + } + + .lg-thumb { + padding: 10px 0; + height: 100%; + margin-bottom: -5px; + } + + .lg-thumb-item { + border-radius: 5px; + cursor: pointer; + float: left; + overflow: hidden; + height: 100%; + border: 2px solid #FFF; + border-radius: 4px; + margin-bottom: 5px; + @media (min-width: 1025px) { + @include transition(border-color 0.25s ease); + } + + &.active, &:hover { + border-color: $lg-theme-highlight; + } + + img { + width: 100%; + height: 100%; + object-fit: cover; + } + } + + &.lg-has-thumb { + .lg-item { + padding-bottom: 120px; + } + } + + &.lg-can-toggle { + .lg-item { + padding-bottom: 0; + } + } + &.lg-pull-caption-up{ + .lg-sub-html { + @include transition(bottom 0.25s ease); + } + &.lg-thumb-open{ + .lg-sub-html { + bottom: 100px; + } + } + } + + .lg-toogle-thumb { + background-color: $lg-thumb-toggle-bg; + border-radius: $lg-border-radius-base $lg-border-radius-base 0 0; + color: $lg-thumb-toggle-color; + cursor: pointer; + font-size: 24px; + height: 39px; + line-height: 27px; + padding: 5px 0; + position: absolute; + right: 20px; + text-align: center; + top: -39px; + width: 50px; + + &:after { + content: "\e1ff"; + } + + &:hover { + color: $lg-thumb-toggle-hover-color; + } + } +} \ No newline at end of file diff --git a/vendors/lightgallery/src/sass/lg-transitions.scss b/vendors/lightgallery/src/sass/lg-transitions.scss new file mode 100644 index 000000000..f8d9b71fe --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-transitions.scss @@ -0,0 +1,766 @@ +@import "lg-variables"; +@import "lg-mixins"; + +.lg-css3 { + &.lg-zoom-in { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include scale3d(1.3, 1.3, 1.3); + } + + &.lg-next-slide { + @include scale3d(1.3, 1.3, 1.3); + } + + &.lg-current { + @include scale3d(1, 1, 1); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-zoom-in-big { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include scale3d(2, 2, 2); + } + + &.lg-next-slide { + @include scale3d(2, 2, 2); + } + + &.lg-current { + @include scale3d(1, 1, 1); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-zoom-out { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include scale3d(0.7, 0.7, 0.7); + } + + &.lg-next-slide { + @include scale3d(0.7, 0.7, 0.7); + } + + &.lg-current { + @include scale3d(1, 1, 1); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + &.lg-zoom-out-big { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include scale3d(0, 0, 0); + } + + &.lg-next-slide { + @include scale3d(0, 0, 0); + } + + &.lg-current { + @include scale3d(1, 1, 1); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-zoom-out-in { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include scale3d(0, 0, 0); + } + + &.lg-next-slide { + @include scale3d(2, 2, 2); + } + + &.lg-current { + @include scale3d(1, 1, 1); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-zoom-in-out { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include scale3d(2, 2, 2); + } + + &.lg-next-slide { + @include scale3d(0, 0, 0); + } + + &.lg-current { + @include scale3d(1, 1, 1); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-soft-zoom { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include scale3d(1.1, 1.1, 1.1); + } + + &.lg-next-slide { + @include scale3d(0.9, 0.9, 0.9); + } + + &.lg-current { + @include scale3d(1, 1, 1); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-scale-up { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-slide-circular { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0, 0, 0) translate3d(-100%, 0, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0, 0, 0) translate3d(100%, 0, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + // sec + &.lg-slide-circular-up { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0, 0, 0) translate3d(-100%, -100%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0, 0, 0) translate3d(100%, -100%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + // sec + &.lg-slide-circular-down { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0, 0, 0) translate3d(-100%, 100%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0, 0, 0) translate3d(100%, 100%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-slide-circular-vertical { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0, 0, 0) translate3d(0, -100%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0, 0, 0) translate3d(0, 100%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + // sec + &.lg-slide-circular-vertical-left { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0, 0, 0) translate3d(-100%, -100%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0, 0, 0) translate3d(-100%, 100%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + // sec + &.lg-slide-circular-vertical-down { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0, 0, 0) translate3d(100%, -100%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0, 0, 0) translate3d(100%, 100%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s); + } + } + } + + &.lg-slide-vertical { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include translate3d(0, -100%, 0); + } + + &.lg-next-slide { + @include translate3d(0, 100%, 0); + } + + &.lg-current { + @include translate3d(0, 0, 0); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-vertical-growth { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(0.5, 0.5, 0.5) translate3d(0, -150%, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(0.5, 0.5, 0.5) translate3d(0, 150%, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-only { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(10deg, 0deg)); + } + + &.lg-next-slide { + @include transform(skew(10deg, 0deg)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-only-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(-10deg, 0deg)); + } + + &.lg-next-slide { + @include transform(skew(-10deg, 0deg)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-only-y { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(0deg, 10deg)); + } + + &.lg-next-slide { + @include transform(skew(0deg, 10deg)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-only-y-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(0deg, -10deg)); + } + + &.lg-next-slide { + @include transform(skew(0deg, -10deg)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(20deg, 0deg) translate3d(-100%, 0%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(20deg, 0deg) translate3d(100%, 0%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(-20deg, 0deg) translate3d(-100%, 0%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(-20deg, 0deg) translate3d(100%, 0%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-cross { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(0deg, 60deg) translate3d(-100%, 0%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(0deg, 60deg) translate3d(100%, 0%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-cross-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(0deg, -60deg) translate3d(-100%, 0%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(0deg, -60deg) translate3d(100%, 0%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-ver { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(60deg, 0deg) translate3d(0, -100%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(60deg, 0deg) translate3d(0, 100%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-ver-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(-60deg, 0deg) translate3d(0, -100%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(-60deg, 0deg) translate3d(0, 100%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-ver-cross { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(0deg, 20deg) translate3d(0, -100%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(0deg, 20deg) translate3d(0, 100%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-slide-skew-ver-cross-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(skew(0deg, -20deg) translate3d(0, -100%, 0px)); + } + + &.lg-next-slide { + @include transform(skew(0deg, -20deg) translate3d(0, 100%, 0px)); + } + + &.lg-current { + @include transform(skew(0deg, 0deg) translate3d(0%, 0%, 0px)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-lollipop { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include translate3d(-100%, 0, 0); + } + + &.lg-next-slide { + @include transform(translate3d(0, 0, 0) scale(0.5)); + } + + &.lg-current { + @include translate3d(0, 0, 0); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-lollipop-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(translate3d(0, 0, 0) scale(0.5)); + } + + &.lg-next-slide { + @include translate3d(100%, 0, 0); + } + + &.lg-current { + @include translate3d(0, 0, 0); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-rotate { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(rotate(-360deg)); + } + + &.lg-next-slide { + @include transform(rotate(360deg)); + } + + &.lg-current { + @include transform(rotate(0deg)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-rotate-rev { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(rotate(360deg)); + } + + &.lg-next-slide { + @include transform(rotate(-360deg)); + } + + &.lg-current { + @include transform(rotate(0deg)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-tube { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include transform(scale3d(1, 0, 1) translate3d(-100%, 0, 0)); + } + + &.lg-next-slide { + @include transform(scale3d(1, 0, 1) translate3d(100%, 0, 0)); + } + + &.lg-current { + @include transform(scale3d(1, 1, 1) translate3d(0, 0, 0)); + opacity: 1; + } + + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } +} \ No newline at end of file diff --git a/vendors/lightgallery/src/sass/lg-variables.scss b/vendors/lightgallery/src/sass/lg-variables.scss new file mode 100644 index 000000000..bfa8ba6ca --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-variables.scss @@ -0,0 +1,57 @@ +$backdrop-opacity: 1 !default; +$lg-toolbar-bg: rgba(0, 0, 0, 0.45) !default; +$lg-border-radius-base: 2px !default; +$lg-theme-highlight: rgb(169, 7, 7) !default; +$lg-theme: #0D0A0A !default; + +// basic icon colours +$lg-icon-bg: rgba(0, 0, 0, 0.45) !default; +$lg-icon-color: #999 !default; +$lg-icon-hover-color: #FFF !default; + +// counter +$lg-counter-color: #e6e6e6 !default; +$lg-counter-font-size: 16px !default; + +// Next prev icons +$lg-next-prev-bg: $lg-icon-bg !default; +$lg-next-prev-color: $lg-icon-color !default; +$lg-next-prev-hover-color: $lg-icon-hover-color !default; + +// toolbar icons +$lg-toolbar-icon-color: $lg-icon-color !default; +$lg-toolbar-icon-hover-color: $lg-icon-hover-color !default; + +// autoplay progress bar +$lg-progress-bar-bg: #333 !default; +$lg-progress-bar-active-bg: $lg-theme-highlight !default; +$lg-progress-bar-height: 5px !default; + +// paths +$lg-path-fonts: '../fonts'!default; +$lg-path-images: '../img'!default; + +// Zoom plugin +$zoom-transition-duration: 0.3s !default; + +// Sub html - titile +$lg-sub-html-bg: rgba(0, 0, 0, 0.45) !default; +$lg-sub-html-color: #EEE !default; + +// thumbnail toggle button +$lg-thumb-toggle-bg: #0D0A0A !default; +$lg-thumb-toggle-color: $lg-icon-color !default; +$lg-thumb-toggle-hover-color: $lg-icon-hover-color !default; +$lg-thumb-bg: #0D0A0A !default; + +// z-index +$zindex-outer: 1050 !default; +$zindex-progressbar: 1083 !default; +$zindex-controls: 1080 !default; +$zindex-toolbar: 1082 !default; +$zindex-subhtml: 1080 !default; +$zindex-thumbnail: 1080 !default; +$zindex-pager: 1080 !default; +$zindex-playbutton: 1080 !default; +$zindex-item: 1060 !default; +$zindex-backdrop: 1040 !default; diff --git a/vendors/lightgallery/src/sass/lg-video.scss b/vendors/lightgallery/src/sass/lg-video.scss new file mode 100644 index 000000000..48e68e2eb --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-video.scss @@ -0,0 +1,103 @@ +.lg-outer { + .lg-video-cont { + display: inline-block; + vertical-align: middle; + max-width: 1140px; + max-height: 100%; + width: 100%; + padding: 0 5px; + } + + .lg-video { + width: 100%; + height: 0; + padding-bottom: 56.25%; + overflow: hidden; + position: relative; + + .lg-object { + display: inline-block; + position: absolute; + top: 0; + left: 0; + width: 100% !important; + height: 100% !important; + } + + .lg-video-play { + width: 84px; + height: 59px; + position: absolute; + left: 50%; + top: 50%; + margin-left: -42px; + margin-top: -30px; + z-index: $zindex-playbutton; + cursor: pointer; + } + } + + .lg-has-vimeo{ + .lg-video-play{ + background: url("#{$lg-path-images}/vimeo-play.png") no-repeat scroll 0 0 transparent; + } + &:hover{ + .lg-video-play{ + background: url("#{$lg-path-images}/vimeo-play.png") no-repeat scroll 0 -58px transparent; + } + + } + } + + .lg-has-html5{ + .lg-video-play{ + background: transparent url("#{$lg-path-images}/video-play.png") no-repeat scroll 0 0; + height: 64px; + margin-left: -32px; + margin-top: -32px; + width: 64px; + opacity: 0.8; + } + &:hover{ + .lg-video-play{ + opacity: 1 + } + + } + } + + .lg-has-youtube{ + .lg-video-play{ + background: url("#{$lg-path-images}/youtube-play.png") no-repeat scroll 0 0 transparent; + } + &:hover{ + .lg-video-play{ + background: url("#{$lg-path-images}/youtube-play.png") no-repeat scroll 0 -60px transparent; + } + + } + } + .lg-video-object { + width: 100% !important; + height: 100% !important; + position: absolute; + top: 0; + left: 0; + } + + .lg-has-video { + .lg-video-object { + visibility: hidden; + } + + &.lg-video-playing { + .lg-object, .lg-video-play { + display: none; + } + + .lg-video-object { + visibility: visible; + } + } + } +} \ No newline at end of file diff --git a/vendors/lightgallery/src/sass/lg-zoom.scss b/vendors/lightgallery/src/sass/lg-zoom.scss new file mode 100644 index 000000000..3d5d1fce6 --- /dev/null +++ b/vendors/lightgallery/src/sass/lg-zoom.scss @@ -0,0 +1,56 @@ +.lg-outer { + // reset transition duration + &.lg-css3.lg-zoom-dragging { + .lg-item.lg-complete.lg-zoomable { + .lg-img-wrap, .lg-image { + @include transition-duration(0s); + } + } + } + + .lg-item.lg-complete.lg-zoomable{ + + .lg-img-wrap { + @include transitionCustom(left $zoom-transition-duration cubic-bezier(0, 0, 0.25, 1) 0s, top $zoom-transition-duration cubic-bezier(0, 0, 0.25, 1) 0s); + @include translate3d(0, 0, 0); + @include backface-visibility(hidden); + } + + .lg-image { + // Translate required for zoom + @include scale3d(1, 1, 1); + @include transitionCustom(transform $zoom-transition-duration cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.15s !important); + @include transform-origin(0 0); + @include backface-visibility(hidden); + } + } + +} + +// zoom buttons +#lg-zoom-in { + &:after { + content: "\e311"; + } +} + +#lg-actual-size { + font-size: 20px; + &:after { + content: "\e033"; + } +} + +#lg-zoom-out { + opacity: 0.5; + pointer-events: none; + + &:after { + content: "\e312"; + } + + .lg-zoomed & { + opacity: 1; + pointer-events: auto; + } +} \ No newline at end of file diff --git a/vendors/lightgallery/src/sass/lightgallery.scss b/vendors/lightgallery/src/sass/lightgallery.scss new file mode 100644 index 000000000..94ad014fa --- /dev/null +++ b/vendors/lightgallery/src/sass/lightgallery.scss @@ -0,0 +1,290 @@ +// Core variables and mixins +@import "lg-variables"; +@import "lg-mixins"; +@import "lg-fonts"; +@import "lg-theme-default"; +@import "lg-thumbnail"; +@import "lg-video"; +@import "lg-autoplay"; +@import "lg-zoom"; +@import "lg-pager"; +@import "lg-fullscreen"; + +// Clearfix +.group { + *zoom: 1; +} + +.group:before, .group:after { + display: table; + content: ""; + line-height: 0; +} + +.group:after { + clear: both; +} + +// lightgallery core +.lg-outer { + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + z-index: $zindex-outer; + opacity: 0; + // For start/end transition + @include transition(opacity 0.15s ease 0s); + + * { + @include box-sizing(border-box); + } + + &.lg-visible { + opacity: 1; + } + + // Set transition speed and timing function + &.lg-css3 { + .lg-item { + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transition-duration(inherit !important); + @include transition-timing-function(inherit !important); + } + } + } + + // Remove transition while dragging + &.lg-css3.lg-dragging { + .lg-item { + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transition-duration(0s !important); + opacity: 1; + } + } + } + + // Set cursor grab while dragging + &.lg-grab { + img.lg-object { + @include grab-cursor; + } + } + + &.lg-grabbing { + img.lg-object { + @include grabbing-cursor; + } + } + + .lg { + height: 100%; + width: 100%; + position: relative; + overflow: hidden; + margin-left: auto; + margin-right: auto; + max-width: 100%; + max-height: 100%; + } + + .lg-inner { + width: 100%; + height: 100%; + position: absolute; + left: 0; + top: 0; + white-space: nowrap; + } + + .lg-item { + background: url("#{$lg-path-images}/loading.gif") no-repeat scroll center center transparent; + display: none !important; + } + &.lg-css3{ + .lg-prev-slide, .lg-current, .lg-next-slide{ + display: inline-block !important; + } + } + &.lg-css{ + .lg-current{ + display: inline-block !important; + } + } + + .lg-item, .lg-img-wrap { + display: inline-block; + text-align: center; + position: absolute; + width: 100%; + height: 100%; + + &:before { + content: ""; + display: inline-block; + height: 50%; + width: 1px; + margin-right: -1px; + } + } + + .lg-img-wrap { + position: absolute; + padding: 0 5px; + left: 0; + right: 0; + top: 0; + bottom: 0 + } + + .lg-item { + &.lg-complete { + background-image: none; + } + + &.lg-current { + z-index: $zindex-item; + } + } + + .lg-image { + display: inline-block; + vertical-align: middle; + max-width: 100%; + max-height: 100%; + width: auto !important; + height: auto !important; + } + + &.lg-show-after-load { + .lg-item { + .lg-object, .lg-video-play { + opacity: 0; + @include transition(opacity 0.15s ease 0s); + } + + &.lg-complete { + .lg-object, .lg-video-play { + opacity: 1; + } + } + } + } + + // Hide title div if empty + .lg-empty-html { + display: none; + } + + &.lg-hide-download{ + #lg-download{ + display: none; + } + } +} +.lg-backdrop{ + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: $zindex-backdrop; + background-color: #000; + opacity: 0; + @include transition(opacity 0.15s ease 0s); + &.in{ + opacity: $backdrop-opacity; + } +} + +// Default slide animations. Should be placed at the bottom of the animation css +.lg-css3 { + + // Remove all transition effects + &.lg-no-trans { + .lg-prev-slide, .lg-next-slide, .lg-current { + @include transitionCustom(none 0s ease 0s !important); + } + } + + &.lg-use-css3 { + .lg-item { + @include backface-visibility(hidden); + } + } + + &.lg-use-left { + .lg-item { + @include backface-visibility(hidden); + } + } + + // Fade mode + &.lg-fade { + .lg-item { + opacity: 0; + + &.lg-current { + opacity: 1; + } + + // transition timing property and duration will be over written from javascript + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(opacity 0.1s ease 0s); + } + } + } + + &.lg-slide { + &.lg-use-css3 { + .lg-item { + opacity: 0; + + &.lg-prev-slide { + @include translate3d(-100%, 0, 0); + } + + &.lg-next-slide { + @include translate3d(100%, 0, 0); + } + + &.lg-current { + @include translate3d(0, 0, 0); + opacity: 1; + } + + // transition timing property and duration will be over written from javascript + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + + &.lg-use-left { + .lg-item { + opacity: 0; + position: absolute; + left: 0; + + &.lg-prev-slide { + left: -100%; + } + + &.lg-next-slide { + left: 100%; + } + + &.lg-current { + left: 0; + opacity: 1; + } + + // transition timing property and duration will be over written from javascript + &.lg-prev-slide, &.lg-next-slide, &.lg-current { + @include transitionCustom(left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); + } + } + } + } +} \ No newline at end of file diff --git a/vendors/lightgallery/src/sass/prepros.cfg b/vendors/lightgallery/src/sass/prepros.cfg new file mode 100644 index 000000000..efca44505 --- /dev/null +++ b/vendors/lightgallery/src/sass/prepros.cfg @@ -0,0 +1,490 @@ +[ + { + "About This File": "This is Prepros config file, https://prepros.io . Please do not edit this file, doing so can crash Prepros." + }, + { + "data": { + "id": "", + "cfgVersion": 2, + "name": "LG", + "path": "", + "files": { + "8ff90eb8": { + "id": "8ff90eb8", + "path": "lg-animations.scss", + "output": "lg-animations.css", + "name": "lg-animations.scss", + "category": "CSS", + "autoCompile": true, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": false, + "parents": [], + "type": "sass" + }, + "26f18653": { + "id": "26f18653", + "path": "lg-autoplay.scss", + "output": "lg-autoplay.css", + "name": "lg-autoplay.scss", + "category": "CSS", + "autoCompile": false, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": true, + "parents": [ + "f80b85a1" + ], + "type": "sass" + }, + "94edd1e7": { + "id": "94edd1e7", + "path": "lg-fb-comment-box.scss", + "output": "lg-fb-comment-box.css", + "name": "lg-fb-comment-box.scss", + "category": "CSS", + "autoCompile": true, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": false, + "parents": [], + "type": "sass" + }, + "fb5b0eff": { + "id": "fb5b0eff", + "path": "lg-fonts.scss", + "output": "lg-fonts.css", + "name": "lg-fonts.scss", + "category": "CSS", + "autoCompile": false, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": true, + "parents": [ + "f80b85a1" + ], + "type": "sass" + }, + "9e150360": { + "id": "9e150360", + "path": "lg-fullscreen.scss", + "output": "lg-fullscreen.css", + "name": "lg-fullscreen.scss", + "category": "CSS", + "autoCompile": false, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": true, + "parents": [ + "f80b85a1" + ], + "type": "sass" + }, + "11b5aed8": { + "id": "11b5aed8", + "path": "lg-mixins.scss", + "output": "lg-mixins.css", + "name": "lg-mixins.scss", + "category": "CSS", + "autoCompile": false, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": true, + "parents": [ + "94edd1e7", + "6018a35b", + "f80b85a1" + ], + "type": "sass" + }, + "06548c3d": { + "id": "06548c3d", + "path": "lg-pager.scss", + "output": "lg-pager.css", + "name": "lg-pager.scss", + "category": "CSS", + "autoCompile": false, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": true, + "parents": [ + "f80b85a1" + ], + "type": "sass" + }, + "7dbddfad": { + "id": "7dbddfad", + "path": "lg-theme-default.scss", + "output": "lg-theme-default.css", + "name": "lg-theme-default.scss", + "category": "CSS", + "autoCompile": false, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": true, + "parents": [ + "f80b85a1" + ], + "type": "sass" + }, + "ccc7c5d4": { + "id": "ccc7c5d4", + "path": "lg-thumbnail.scss", + "output": "lg-thumbnail.css", + "name": "lg-thumbnail.scss", + "category": "CSS", + "autoCompile": false, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": true, + "parents": [ + "f80b85a1" + ], + "type": "sass" + }, + "6018a35b": { + "id": "6018a35b", + "path": "lg-transitions.scss", + "output": "lg-transitions.css", + "name": "lg-transitions.scss", + "category": "CSS", + "autoCompile": true, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": false, + "parents": [], + "type": "sass" + }, + "36a5e0f7": { + "id": "36a5e0f7", + "path": "lg-variables.scss", + "output": "lg-variables.css", + "name": "lg-variables.scss", + "category": "CSS", + "autoCompile": false, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": true, + "parents": [ + "94edd1e7", + "6018a35b", + "f80b85a1" + ], + "type": "sass" + }, + "70ef8df4": { + "id": "70ef8df4", + "path": "lg-video.scss", + "output": "lg-video.css", + "name": "lg-video.scss", + "category": "CSS", + "autoCompile": false, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": true, + "parents": [ + "f80b85a1" + ], + "type": "sass" + }, + "0690cbf9": { + "id": "0690cbf9", + "path": "lg-zoom.scss", + "output": "lg-zoom.css", + "name": "lg-zoom.scss", + "category": "CSS", + "autoCompile": false, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": false, + "imported": true, + "parents": [ + "f80b85a1" + ], + "type": "sass" + }, + "f80b85a1": { + "id": "f80b85a1", + "path": "lightgallery.scss", + "output": "C:/wamp/www/lightgallery-github/lightGallery/lightgallery/css/lightgallery.css", + "name": "lightgallery.scss", + "category": "CSS", + "autoCompile": true, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": true, + "fullCompass": false, + "outputStyle": "expanded", + "customOutput": true, + "imported": false, + "parents": [], + "type": "sass" + } + }, + "deploymentHistory": {}, + "config": { + "watch": "", + "liveRefresh": true, + "useCustomServer": false, + "port": 0, + "useCustomPort": false, + "customServerUrl": "", + "watchedFileExtensions": "less, sass, scss, styl, md, markdown, coffee, js, jade, haml, slim, ls, html,htm, css, rb, php, asp, aspx, cfm, chm, cms, do, erb, jsp, mhtml, mspx, pl, py, shtml, cshtml, cs,vb, vbs, tpl, ctp, kit, png, jpg, jpeg", + "excludePatterns": "Prepros Build, node_modules, .git, .idea, .sass-cache, .hg, .svn, .cache, config.rb, prepros.cfg, .DS_Store, bower_components", + "autoprefixerBrowsers": "last 4 versions", + "liveRefreshDelay": 0, + "disableImportAutoCompile": true, + "browserFlow": { + "enabled": false, + "mouseSync": true, + "scrollSync": true, + "keyboardSync": true, + "animateCss": true + }, + "deployment": { + "ftpHost": "", + "ftpPort": "21", + "ftpUsePrivateKey": false, + "ftpPrivateKey": "", + "ftpRemotePath": "", + "ftpUserName": "", + "ftpPassword": "", + "ftpType": "FTP", + "ftpSecure": false, + "ftpUploadOnModify": false, + "ftpRefreshAfterUpload": false, + "ignorePreprocessableFiles": true, + "copyPath": "Prepros Build", + "excludePatterns": ".map, Prepros Build, config.rb, prepros.cfg, node_modules, .git, .idea, .sass-cache, .hg, .svn, .cache, .DS_Store, bower_components" + }, + "css": { + "path": "css/", + "outputType": "REPLACE_SEGMENT", + "segmentToReplace": "less, sass, stylus, scss, styl", + "segmentToReplaceWith": "css", + "preprocessableFilesDirs": "less/\nsass/\nstylus/\nscss/\nstyl/\n" + }, + "minCss": { + "path": "", + "outputType": "RELATIVE_FILEDIR", + "segmentToReplace": "", + "segmentToReplaceWith": "", + "types": "", + "preprocessableFilesDirs": "", + "filePrefix": "-dist" + }, + "html": { + "segmentToReplace": "jade, haml, slim, markdown, md, kit", + "segmentToReplaceWith": "html", + "path": "html/", + "extension": ".html", + "outputType": "REPLACE_SEGMENT", + "preprocessableFilesDirs": "jade/\nhaml/\nslim/\nmarkdown/\nmd/\nkit" + }, + "js": { + "segmentToReplace": "coffee, coffeescript, coffeescripts, ls, livescript, livescripts", + "segmentToReplaceWith": "html", + "extension": ".html", + "outputType": "REPLACE_SEGMENT", + "preprocessableFilesDirs": "coffee/\ncoffeescript/\ncoffeescripts/\nls/\nlivescript/\nlivescripts", + "path": "js/" + }, + "minJs": { + "path": "", + "outputType": "RELATIVE_FILEDIR", + "segmentToReplace": "", + "segmentToReplaceWith": "", + "types": "", + "preprocessableFilesDirs": "", + "filePrefix": "-dist" + }, + "compilers": { + "less": { + "autoCompile": true, + "autoprefixer": false, + "compress": false, + "sourceMaps": false + }, + "sass": { + "autoCompile": true, + "autoprefixer": false, + "sourceMaps": false, + "libSass": true, + "compass": false, + "fullCompass": false, + "outputStyle": "expanded" + }, + "stylus": { + "autoCompile": true, + "sourceMaps": false, + "autoprefixer": false, + "nib": false, + "compress": false + }, + "markdown": { + "autoCompile": true, + "sanitize": false, + "gfm": true, + "wrapWithHtml": false + }, + "coffee": { + "autoCompile": true, + "bare": false, + "uglify": false, + "mangle": true, + "iced": false, + "sourceMaps": false + }, + "livescript": { + "autoCompile": true, + "bare": false, + "uglify": false, + "mangle": true + }, + "javascript": { + "autoCompile": false, + "uglify": true, + "mangle": true, + "babel": false, + "sourceMaps": false + }, + "jade": { + "autoCompile": true, + "pretty": true + }, + "haml": { + "autoCompile": true, + "pretty": true, + "doubleQuotes": false + }, + "kit": { + "autoCompile": true, + "minifyHtml": false + }, + "slim": { + "autoCompile": true, + "pretty": true, + "indent": "default" + }, + "css": { + "autoCompile": false, + "sourceMaps": false, + "compress": true, + "cssnext": false, + "autoprefixer": false + }, + "uglify": { + "compress": { + "sequences": true, + "properties": true, + "dead_code": true, + "drop_debugger": true, + "unsafe": false, + "unsafe_comps": false, + "conditionals": true, + "comparisons": true, + "evaluate": true, + "booleans": true, + "loops": true, + "unused": true, + "hoist_funs": true, + "keep_fargs": false, + "hoist_vars": false, + "if_return": true, + "join_vars": true, + "cascade": true, + "side_effects": true, + "pure_getters": false, + "negate_iife": true, + "screw_ie8": false, + "drop_console": false, + "angular": false, + "warnings": true, + "pure_funcs": null, + "global_defs": null + }, + "output": { + "quote_keys": false, + "space_colon": true, + "ascii_only": false, + "unescape_regexps": false, + "inline_script": false, + "beautify": false, + "bracketize": false, + "semicolons": true, + "comments": false, + "preserve_line": false, + "screw_ie8": false, + "preamble": null + } + } + } + } + } + } +] \ No newline at end of file diff --git a/webpack.config.builder.js b/webpack.config.builder.js index 1b570bc2b..610ba773b 100644 --- a/webpack.config.builder.js +++ b/webpack.config.builder.js @@ -1,92 +1,92 @@ - -var - path = require('path'), - webpack = require('webpack'), - devPath = path.resolve(__dirname, 'dev'), - CopyWebpackPlugin = require('copy-webpack-plugin'), - WebpackNotifierPlugin = require('webpack-notifier'), - loose = true; - -process.noDeprecation = true; -module.exports = function(publicPath, pro) { - return { - entry: { - 'js/boot': path.join(__dirname, 'dev', 'boot.js'), - 'js/app': path.join(__dirname, 'dev', 'app.js'), - 'js/admin': path.join(__dirname, 'dev', 'admin.js') - }, - output: { - pathinfo: true, - path: path.join(__dirname, 'rainloop', 'v', '0.0.0', 'static'), - filename: '[name].js', - publicPath: publicPath || 'rainloop/v/0.0.0/static/' - }, - plugins: [ - // new webpack.optimize.ModuleConcatenationPlugin(), - new webpack.DefinePlugin({ - 'RL_COMMUNITY': !pro, - 'process.env': { - NODE_ENV: '"production"' - } - }), - new WebpackNotifierPlugin(), - new CopyWebpackPlugin([ - {from: 'node_modules/openpgp/dist/openpgp.min.js', to: 'js/min/openpgp.min.js'}, - {from: 'node_modules/openpgp/dist/openpgp.worker.min.js', to: 'js/min/openpgp.worker.min.js'} - ]) - ], - resolve: { - modules: [devPath, 'node_modules'], - extensions: ['.js'], - alias: { - 'Opentip$': __dirname + '/dev/External/Opentip.js', - 'ko$': __dirname + '/dev/External/ko.js' - } - }, - module: { - rules: [ - { - test: /\.js$/, - loader: 'babel-loader', - include: [devPath], - options: { - cacheDirectory: true, - presets: [['env', { - loose: loose, - modules: false, - targets: { - browsers: ['last 3 versions', 'ie >= 9', 'firefox esr'] - } - }], 'stage-0'], - plugins: ['transform-runtime', 'transform-decorators-legacy'] - } - }, - { - test: /\.(html|css)$/, - loader: 'raw-loader', - include: [devPath] - }, - { - test: /\.json$/, - loader: 'json-loader', - include: [devPath] - } - ] - }, - externals: { - 'window': 'window', - 'progressJs': 'window.progressJs', - 'moment': 'window.moment', - 'ifvisible': 'window.ifvisible', - 'crossroads': 'window.crossroads', - 'hasher': 'window.hasher', - 'Jua': 'window.Jua', - 'Autolinker': 'window.Autolinker', - 'ssm': 'window.ssm', - 'key': 'window.key', - '_': 'window._', - 'qr': 'window.qr', - '$': 'window.jQuery' - } - }; -}; + +const + path = require('path'), + webpack = require('webpack'), + devPath = path.resolve(__dirname, 'dev'), + CopyWebpackPlugin = require('copy-webpack-plugin'), + WebpackNotifierPlugin = require('webpack-notifier'), + loose = true; + +process.noDeprecation = true; +module.exports = function(publicPath, pro) { + return { + entry: { + 'js/boot': path.join(__dirname, 'dev', 'boot.js'), + 'js/app': path.join(__dirname, 'dev', 'app.js'), + 'js/admin': path.join(__dirname, 'dev', 'admin.js') + }, + output: { + pathinfo: true, + path: path.join(__dirname, 'rainloop', 'v', '0.0.0', 'static'), + filename: '[name].js', + publicPath: publicPath || 'rainloop/v/0.0.0/static/' + }, + plugins: [ + // new webpack.optimize.ModuleConcatenationPlugin(), + new webpack.DefinePlugin({ + 'RL_COMMUNITY': !pro, + 'process.env': { + NODE_ENV: '"production"' + } + }), + new WebpackNotifierPlugin(), + new CopyWebpackPlugin([ + {from: 'node_modules/openpgp/dist/openpgp.min.js', to: 'js/min/openpgp.min.js'}, + {from: 'node_modules/openpgp/dist/openpgp.worker.min.js', to: 'js/min/openpgp.worker.min.js'} + ]) + ], + resolve: { + modules: [devPath, 'node_modules'], + extensions: ['.js'], + alias: { + 'Opentip$': path.join(__dirname, 'dev', 'External', 'Opentip.js'), + 'ko$': path.join(__dirname, 'dev', 'External', 'ko.js') + } + }, + module: { + rules: [ + { + test: /\.js$/, + loader: 'babel-loader', + include: [devPath], + options: { + cacheDirectory: true, + presets: [['env', { + loose: loose, + modules: false, + targets: { + browsers: ['last 3 versions', 'ie >= 9', 'firefox esr'] + } + }], 'stage-0'], + plugins: ['transform-runtime', 'transform-decorators-legacy'] + } + }, + { + test: /\.(html|css)$/, + loader: 'raw-loader', + include: [devPath] + }, + { + test: /\.json$/, + loader: 'json-loader', + include: [devPath] + } + ] + }, + externals: { + 'window': 'window', + 'progressJs': 'window.progressJs', + 'moment': 'window.moment', + 'ifvisible': 'window.ifvisible', + 'crossroads': 'window.crossroads', + 'hasher': 'window.hasher', + 'Jua': 'window.Jua', + 'Autolinker': 'window.Autolinker', + 'ssm': 'window.ssm', + 'key': 'window.key', + '_': 'window._', + 'qr': 'window.qr', + '$': 'window.jQuery' + } + }; +}; diff --git a/webpack.config.js b/webpack.config.js index 62f928f13..e78be6d2b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,2 +1,2 @@ - -module.exports = require('./webpack.config.builder')(); + +module.exports = require('./webpack.config.builder')(); diff --git a/yarn.lock b/yarn.lock index 3a53f7047..34b3fc5aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -71,10 +71,6 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" -"Progress.js@github:usablica/progress.js#v0.1.0": - version "0.1.0" - resolved "https://codeload.github.com/usablica/progress.js/tar.gz/acba45829bfea7ba073aedca7d70fcf47e22317b" - abbrev@1: version "1.1.0" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" @@ -122,9 +118,9 @@ acorn@^5.0.0, acorn@^5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" -acorn@^5.4.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.0.tgz#1abb587fbf051f94e3de20e6b26ef910b1828298" +acorn@^5.5.0: + version "5.5.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" ajv-keywords@^1.0.0: version "1.5.1" @@ -1264,7 +1260,7 @@ bytes@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" -cacache@^10.0.1: +cacache@^10.0.4: version "10.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" dependencies: @@ -1416,9 +1412,9 @@ classnames@2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" -clean-css@4.1.9: - version "4.1.9" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.9.tgz#35cee8ae7687a49b98034f70de00c4edd3826301" +clean-css@4.1.11: + version "4.1.11" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" dependencies: source-map "0.5.x" @@ -1567,11 +1563,11 @@ copy-concurrently@^1.0.0: rimraf "^2.5.4" run-queue "^1.0.0" -copy-webpack-plugin@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.0.tgz#9cb012163317666ea47479d2a8c57daca3557da5" +copy-webpack-plugin@4.5.1: + version "4.5.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.1.tgz#fc4f68f4add837cc5e13d111b20715793225d29c" dependencies: - cacache "^10.0.1" + cacache "^10.0.4" find-cache-dir "^1.0.0" globby "^7.1.1" is-glob "^4.0.0" @@ -1891,7 +1887,7 @@ element-dataset@2.2.6: elliptic@^6.0.0: version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + resolved "https://codeload.github.com/openpgpjs/elliptic/tar.gz/e187e706e11fa51bcd20e46e5119054be4e2a4a6" dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2062,9 +2058,9 @@ eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" -eslint@4.18.2: - version "4.18.2" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.18.2.tgz#0f81267ad1012e7d2051e186a9004cc2267b8d45" +eslint@4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" @@ -2075,7 +2071,7 @@ eslint@4.18.2: doctrine "^2.1.0" eslint-scope "^3.7.1" eslint-visitor-keys "^1.0.0" - espree "^3.5.2" + espree "^3.5.4" esquery "^1.0.0" esutils "^2.0.2" file-entry-cache "^2.0.0" @@ -2097,6 +2093,7 @@ eslint@4.18.2: path-is-inside "^1.0.2" pluralize "^7.0.0" progress "^2.0.0" + regexpp "^1.0.1" require-uncached "^1.0.3" semver "^5.3.0" strip-ansi "^4.0.0" @@ -2153,11 +2150,11 @@ espree@^3.5.0: acorn "^5.1.1" acorn-jsx "^3.0.0" -espree@^3.5.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" +espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" dependencies: - acorn "^5.4.0" + acorn "^5.5.0" acorn-jsx "^3.0.0" esprima@^4.0.0: @@ -2721,12 +2718,12 @@ gulp-chmod@2.0.0: stat-mode "^0.2.0" through2 "^2.0.0" -gulp-clean-css@3.9.2: - version "3.9.2" - resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.9.2.tgz#b280e6f56bf8bee39e697e77aaa72d3e7e7d3bd5" +gulp-clean-css@3.9.3: + version "3.9.3" + resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.9.3.tgz#47bf7ad62f44970f86e4ac4bdeed68ad904e65c5" dependencies: - clean-css "4.1.9" - plugin-error "0.1.2" + clean-css "4.1.11" + plugin-error "1.0.1" through2 "2.0.3" vinyl-sourcemaps-apply "0.2.1" @@ -2774,9 +2771,9 @@ gulp-filter@5.1.0: plugin-error "^0.1.2" streamfilter "^1.0.5" -gulp-header@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-2.0.1.tgz#7bd8abef277ac783e13864b795917836e7fc3838" +gulp-header@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-2.0.5.tgz#16e229c73593ade301168024fea68dab75d9d38c" dependencies: concat-with-sourcemaps "*" lodash.template "^4.4.0" @@ -3463,7 +3460,7 @@ jquery@2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.4.tgz#2c89d6889b5eac522a7eea32c14521559c6cbf02" -jquery@>=1.2.3, jquery@>=1.7.0, jquery@^3.1.1: +jquery@>=1.2.3, jquery@^3.1.1: version "3.2.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" @@ -3621,12 +3618,6 @@ liftoff@^2.1.0: rechoir "^0.6.2" resolve "^1.1.7" -lightgallery@1.2.21: - version "1.2.21" - resolved "https://registry.yarnpkg.com/lightgallery/-/lightgallery-1.2.21.tgz#8f4ba26a1b99bc583507eb1540291b156aa90aaf" - dependencies: - jquery ">=1.7.0" - livereload-js@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" @@ -4685,7 +4676,16 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" -plugin-error@0.1.2, plugin-error@^0.1.2: +plugin-error@1.0.1, plugin-error@^1.0.0, plugin-error@^1.0.1, plugin-error@~1.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + +plugin-error@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" dependencies: @@ -4695,15 +4695,6 @@ plugin-error@0.1.2, plugin-error@^0.1.2: arr-union "^2.0.1" extend-shallow "^1.1.2" -plugin-error@^1.0.0, plugin-error@^1.0.1, plugin-error@~1.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" - dependencies: - ansi-colors "^1.0.1" - arr-diff "^4.0.0" - arr-union "^3.1.0" - extend-shallow "^3.0.2" - pluralize@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" @@ -4993,6 +4984,10 @@ regex-cache@^0.4.2: dependencies: is-equal-shallow "^0.1.3" +regexpp@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.0.1.tgz#d857c3a741dce075c2848dcb019a0a975b190d43" + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -5184,7 +5179,7 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -schema-utils@^0.4.3: +schema-utils@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" dependencies: @@ -5251,9 +5246,9 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" -simplestatemanager@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/simplestatemanager/-/simplestatemanager-4.0.2.tgz#70536bcb81abedf731e545aa6c4f19a3f22ad773" +simplestatemanager@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/simplestatemanager/-/simplestatemanager-4.1.0.tgz#4830106037c188dd66251965bf8e9bc0c9f126ef" slash@^1.0.0: version "1.0.0" @@ -5494,12 +5489,12 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -style-loader@0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.20.2.tgz#851b373c187890331776e9cde359eea9c95ecd00" +style-loader@0.20.3: + version "0.20.3" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.20.3.tgz#ebef06b89dec491bcb1fdb3452e913a6fd1c10c4" dependencies: loader-utils "^1.1.0" - schema-utils "^0.4.3" + schema-utils "^0.4.5" supports-color@^0.2.0: version "0.2.0" @@ -5902,9 +5897,9 @@ watchpack@^1.4.0: chokidar "^1.7.0" graceful-fs "^4.1.2" -webpack-notifier@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/webpack-notifier/-/webpack-notifier-1.5.1.tgz#cf5f6b9a1711f80969bbc4f7bd15d40ea7b18761" +webpack-notifier@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/webpack-notifier/-/webpack-notifier-1.6.0.tgz#ffac8e55ff8c469752b8c1bbb011a16f10986e02" dependencies: node-notifier "^5.1.2" object-assign "^4.1.0" From 841c4d59e3d8c4b15431e235b4806954ebbae35d Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Sun, 29 Apr 2018 00:19:53 +0300 Subject: [PATCH 54/83] Update devDependencies and translations --- Makefile | 2 +- docker-compose.yml | 16 +- package.json | 14 +- .../app/localization/admin/_source.en.yml | 66 +- .../v/0.0.0/app/localization/admin/cs_CZ.yml | 52 +- .../v/0.0.0/app/localization/admin/da_DK.yml | 52 +- .../v/0.0.0/app/localization/admin/de_DE.yml | 50 +- .../v/0.0.0/app/localization/admin/en_US.yml | 52 +- .../v/0.0.0/app/localization/admin/es_ES.yml | 38 +- .../v/0.0.0/app/localization/admin/fa_IR.yml | 50 +- .../v/0.0.0/app/localization/admin/fi_FI.yml | 52 +- .../v/0.0.0/app/localization/admin/fr_FR.yml | 52 +- .../v/0.0.0/app/localization/admin/hu_HU.yml | 50 +- .../v/0.0.0/app/localization/admin/it_IT.yml | 52 +- .../v/0.0.0/app/localization/admin/ja_JP.yml | 54 +- .../v/0.0.0/app/localization/admin/lt_LT.yml | 50 +- .../v/0.0.0/app/localization/admin/nb_NO.yml | 52 +- .../v/0.0.0/app/localization/admin/nl_NL.yml | 48 +- .../v/0.0.0/app/localization/admin/pl_PL.yml | 52 +- .../v/0.0.0/app/localization/admin/pt_BR.yml | 52 +- .../v/0.0.0/app/localization/admin/ru_RU.yml | 52 +- .../v/0.0.0/app/localization/admin/sk_SK.yml | 8 +- .../v/0.0.0/app/localization/admin/sl_SI.yml | 52 +- .../v/0.0.0/app/localization/admin/sv_SE.yml | 52 +- .../v/0.0.0/app/localization/admin/zh_CN.yml | 48 +- .../app/localization/webmail/_source.en.yml | 84 +- .../0.0.0/app/localization/webmail/ar_SA.yml | 22 +- .../0.0.0/app/localization/webmail/bg_BG.yml | 33 +- .../0.0.0/app/localization/webmail/cs_CZ.yml | 28 +- .../0.0.0/app/localization/webmail/da_DK.yml | 27 +- .../0.0.0/app/localization/webmail/de_DE.yml | 30 +- .../0.0.0/app/localization/webmail/el_GR.yml | 18 +- .../0.0.0/app/localization/webmail/en_GB.yml | 44 +- .../0.0.0/app/localization/webmail/en_US.yml | 37 +- .../0.0.0/app/localization/webmail/es_ES.yml | 187 +-- .../0.0.0/app/localization/webmail/et_EE.yml | 30 +- .../0.0.0/app/localization/webmail/fa_IR.yml | 30 +- .../0.0.0/app/localization/webmail/fi_FI.yml | 28 +- .../0.0.0/app/localization/webmail/fr_FR.yml | 32 +- .../0.0.0/app/localization/webmail/hu_HU.yml | 32 +- .../0.0.0/app/localization/webmail/is_IS.yml | 30 +- .../0.0.0/app/localization/webmail/it_IT.yml | 33 +- .../0.0.0/app/localization/webmail/ja_JP.yml | 34 +- .../0.0.0/app/localization/webmail/ko_KR.yml | 21 +- .../0.0.0/app/localization/webmail/lt_LT.yml | 30 +- .../0.0.0/app/localization/webmail/lv_LV.yml | 30 +- .../0.0.0/app/localization/webmail/nb_NO.yml | 32 +- .../0.0.0/app/localization/webmail/nl_NL.yml | 30 +- .../0.0.0/app/localization/webmail/pl_PL.yml | 30 +- .../0.0.0/app/localization/webmail/pt_BR.yml | 30 +- .../0.0.0/app/localization/webmail/pt_PT.yml | 30 +- .../0.0.0/app/localization/webmail/ru_RU.yml | 34 +- .../0.0.0/app/localization/webmail/sk_SK.yml | 30 +- .../0.0.0/app/localization/webmail/sl_SI.yml | 30 +- .../0.0.0/app/localization/webmail/tr_TR.yml | 26 +- .../0.0.0/app/localization/webmail/uk_UA.yml | 30 +- .../0.0.0/app/localization/webmail/zh_CN.yml | 28 +- .../0.0.0/app/localization/webmail/zh_TW.yml | 30 +- yarn.lock | 1322 ++++++++++------- 59 files changed, 1950 insertions(+), 1690 deletions(-) diff --git a/Makefile b/Makefile index caffc8329..e077968f7 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ status: @docker-compose ps tx: - @docker-compose run --no-deps --rm tx tx pull -a + @docker-compose run --no-deps --rm tx tx pull -a -s -f -d console-node: @docker-compose run --no-deps --rm node sh diff --git a/docker-compose.yml b/docker-compose.yml index 6820e9834..22dfd5e51 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,7 +36,7 @@ services: MYSQL_DATABASE: rainloop volumes: - mysql:/var/lib/mysql - - ./.docker/.cache/mysql/tmp:/tmp + - tmp:/tmp php: build: context: ./.docker/php @@ -49,18 +49,19 @@ services: - mail volumes: - ./:/var/www + # - ./build/local/:/var/www - ./.docker/php/rainloop.ini:/usr/local/etc/php/conf.d/rainloop.ini - - ./.docker/.cache/php/tmp:/tmp + - tmp:/tmp node: build: context: ./.docker/node hostname: node container_name: rl.node working_dir: /var/www - command: sh -c 'yarn install' + command: sh -c 'yarn --version' volumes: - ./:/var/www - - ./.docker/.cache/node/tmp:/tmp + - tmp:/tmp nginx: image: nginx:latest hostname: nginx @@ -72,9 +73,10 @@ services: - 80:80 volumes: - ./:/var/www + # - ./build/local/:/var/www - ./.docker/nginx/ssl:/etc/nginx/ssl - ./.docker/nginx/default.conf:/etc/nginx/conf.d/default.conf - - ./.docker/.cache/nginx/tmp:/tmp + - tmp:/tmp tx: build: context: ./.docker/tx @@ -85,7 +87,7 @@ services: volumes: - ./:/var/www - ./.docker/.cache/tx/root:/root - - ./.docker/.cache/tx/tmp:/tmp + - tmp:/tmp volumes: mysql: @@ -94,3 +96,5 @@ volumes: driver: local mailstate: driver: local + tmp: + driver: local diff --git a/package.json b/package.json index 9db25ef4d..13eeeb687 100644 --- a/package.json +++ b/package.json @@ -53,8 +53,8 @@ ], "devDependencies": { "autolinker": "1.6.2", - "babel-core": "6.26.0", - "babel-eslint": "8.2.2", + "babel-core": "6.26.3", + "babel-eslint": "8.2.3", "babel-loader": "7.1.4", "babel-plugin-transform-decorators-legacy": "1.3.4", "babel-plugin-transform-runtime": "6.23.0", @@ -105,9 +105,9 @@ "knockout": "3.4.2", "knockout-transformations": "2.1.0", "knockout-sortable": "1.1.0", - "lozad": "1.3.0", + "lozad": "1.4.0", "matchmedia-polyfill": "0.3.0", - "moment": "2.21.0", + "moment": "2.22.1", "node-fs": "0.1.7", "node-notifier": "5.2.1", "normalize.css": "8.0.0", @@ -118,9 +118,9 @@ "rimraf": "2.6.2", "run-sequence": "2.2.1", "simplestatemanager": "4.1.0", - "style-loader": "0.20.3", - "underscore": "1.8.3", - "webpack": "3.11.0", + "style-loader": "0.21.0", + "underscore": "1.9.0", + "webpack": "4.6.0", "webpack-notifier": "1.6.0" } } diff --git a/rainloop/v/0.0.0/app/localization/admin/_source.en.yml b/rainloop/v/0.0.0/app/localization/admin/_source.en.yml index 920616d21..ed6cbed26 100644 --- a/rainloop/v/0.0.0/app/localization/admin/_source.en.yml +++ b/rainloop/v/0.0.0/app/localization/admin/_source.en.yml @@ -34,14 +34,14 @@ en: LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Allow additional accounts" LABEL_ALLOW_IDENTITIES: "Allow multiple identities" LABEL_ALLOW_TEMPLATES: "Allow templates" - ALERT_WARNING: "Warning!" ALERT_DATA_ACCESS: "RainLoop data folder is accessible. Please configure your web server to hide the data folder from external access. Read more here:" + ALERT_WARNING: "Warning!" HTML_ALERT_WEAK_PASSWORD: | - You are using the default admin password. -
      - For security reasons please - change - password to something else now. + You are using the default admin password. +
      + For security reasons please + change + password to something else now. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Login Screen" LABEL_DEFAULT_DOMAIN: "Default Domain" @@ -85,18 +85,18 @@ en: ALERT_NOTICE: "Notice!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Don't use this database type with a large number of active users." HTML_ALERT_DOES_NOT_SUPPORTED: | - Your system doesn't support contacts. -
      - You need to install or enable PDO (SQLite / MySQL / PostgreSQL) extension on your server. + Your system doesn't support contacts. +
      + You need to install or enable PDO (SQLite / MySQL / PostgreSQL) extension on your server. TAB_DOMAINS: LEGEND_DOMAINS: "Domains" BUTTON_ADD_DOMAIN: "Add Domain" BUTTON_ADD_ALIAS: "Add Alias" DELETE_ARE_YOU_SURE: "Are you sure?" HTML_DOMAINS_HELPER: | - List of domains webmail is allowed to access. -
      - Click on the name to configure the domain. + List of domains webmail is allowed to access. +
      + Click on the name to configure the domain. TAB_SECURITY: LEGEND_SECURITY: "Security" LABEL_ALLOW_TWO_STEP: "Allow 2-Step Verification" @@ -155,8 +155,8 @@ en: HTML_ALERT_TOP_1: "RainLoop Webmail is licensed under" HTML_ALERT_TOP_2: "You are free to use it for your personal projects." HTML_ALERT_TOP_3: | - Commercial use (with additional features) of RainLoop Webmail requires getting a - subscription. + Commercial use (with additional features) of RainLoop Webmail requires getting a + subscription. TYPE_PREMIUM_LIFETIME: "Lifetime" LABEL_SUB_EXPIRES: "Subscription expires" BUTTON_ACTIVATE: "Activate Subscription Key for this domain" @@ -184,11 +184,11 @@ en: ERROR_INVALID_SUBS_KEY: "Invalid Subscription Key" SUBS_KEY_ACTIVATED: "Subscription Key Activated Successfully" HTML_DESC: | - After activation, premium subscription for %DOMAIN% will be extended. -
      - Note that subscription key can be activated for a single domain only. -

      - Once started, the process of activation cannot be aborted or cancelled. + After activation, premium subscription for %DOMAIN% will be extended. +
      + Note that subscription key can be activated for a single domain only. +

      + Once started, the process of activation cannot be aborted or cancelled. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Add Alias" LABEL_ALIAS: "Alias" @@ -226,8 +226,8 @@ en: BUTTON_UPDATE: "Update" NEW_DOMAIN_DESC: "This domain configuration will allow you to work
      with %NAME% email addresses." WHITE_LIST_ALERT: | - List of domain users webmail is allowed to access. - Use a space as delimiter. + List of domain users webmail is allowed to access. + Use a space as delimiter. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Nothing to configure" @@ -254,14 +254,14 @@ en: CONNECTION_ERROR: "Can't connect to server" CAPTCHA_ERROR: "Incorrect CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. - Log in using email credentials and enable this feature in account settings. + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. - Log in using email credentials and enable this feature in account settings. + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. - Log in using email credentials and enable this feature in account settings. + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. DOMAIN_NOT_ALLOWED: "Domain is not allowed" ACCOUNT_NOT_ALLOWED: "Account is not allowed" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" @@ -312,13 +312,13 @@ en: PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is required for this application." NO_SCRIPT_DESC: | - JavaScript support is not available in your browser. - Please enable JavaScript support in your browser settings and retry. + JavaScript support is not available in your browser. + Please enable JavaScript support in your browser settings and retry. NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "Your browser is outdated." BAD_BROWSER_DESC: | - To use all the features of the application, - download and install one of these browsers: + To use all the features of the application, + download and install one of these browsers: diff --git a/rainloop/v/0.0.0/app/localization/admin/cs_CZ.yml b/rainloop/v/0.0.0/app/localization/admin/cs_CZ.yml index f1b43f969..ab8d3ccf7 100644 --- a/rainloop/v/0.0.0/app/localization/admin/cs_CZ.yml +++ b/rainloop/v/0.0.0/app/localization/admin/cs_CZ.yml @@ -35,10 +35,10 @@ cs_CZ: LABEL_ALLOW_TEMPLATES: "Povolit šablony" ALERT_WARNING: "Upozornění!" HTML_ALERT_WEAK_PASSWORD: | - Používáte výchozí administrátorské heslo. -
      - Z bezpečnostních důvodů jeji prosím - změnte. + Používáte výchozí administrátorské heslo. +
      + Z bezpečnostních důvodů jeji prosím + změnte. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Přihlašovací obrazovka" LABEL_DEFAULT_DOMAIN: "Výchozí doména" @@ -82,18 +82,18 @@ cs_CZ: ALERT_NOTICE: "Upozornění!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nepoužívejte tento typ databáze při velkém počtu aktivních uživatelů." HTML_ALERT_DOES_NOT_SUPPORTED: | - Váš systém nepodporuje kontakty. -
      - Je potřeba nainstalovat nebo povolit PDO (SQLite / MySQL / PostgreSQL) - rozšíření na vašem serveru. + Váš systém nepodporuje kontakty. +
      + Je potřeba nainstalovat nebo povolit PDO (SQLite / MySQL / PostgreSQL) + rozšíření na vašem serveru. TAB_DOMAINS: LEGEND_DOMAINS: "Domény" BUTTON_ADD_DOMAIN: "Přidat Doménu" DELETE_ARE_YOU_SURE: "Jste si jistí?" HTML_DOMAINS_HELPER: | - Seznam domén, ke kterým je možné přistupovat přes webmail. -
      - Klikněte na jméno domény pro její konfiguraci. + Seznam domén, ke kterým je možné přistupovat přes webmail. +
      + Klikněte na jméno domény pro její konfiguraci. TAB_SECURITY: LEGEND_SECURITY: "Zabezpečení" LABEL_ALLOW_TWO_STEP: "Povolit dvoufázové ověření" @@ -152,9 +152,9 @@ cs_CZ: HTML_ALERT_TOP_1: "RainLoop Webmail je licencován pod" HTML_ALERT_TOP_2: "Můžete tento nástroj volně používat pro vaše osobní projekty." HTML_ALERT_TOP_3: | - Komerční užívání (s přidanými doplňky) RainLoop Webmail vyžaduje získání + Komerční užívání (s přidanými doplňky) RainLoop Webmail vyžaduje získání - licence. + licence. TYPE_PREMIUM_LIFETIME: "Lifetime" LABEL_SUB_EXPIRES: "Licence vyprší" BUTTON_ACTIVATE: "Aktivační licenční klíč pro tuto doménu" @@ -182,11 +182,11 @@ cs_CZ: ERROR_INVALID_SUBS_KEY: "Nevalidní licenční klíč" SUBS_KEY_ACTIVATED: "Licenční klíč byl úspěšně aktivován" HTML_DESC: | - Po aktivaci bude prémiové licence pro doménu %DOMAIN% prodloužena. -
      - Aktivační klíč lze použít pouze pro jednu doménu. -

      - Jakmile začnete proces aktivace, nelze ho přerušit nebo ukončit. + Po aktivaci bude prémiové licence pro doménu %DOMAIN% prodloužena. +
      + Aktivační klíč lze použít pouze pro jednu doménu. +

      + Jakmile začnete proces aktivace, nelze ho přerušit nebo ukončit. POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Přidat Doménu" TITLE_ADD_DOMAIN_WITH_NAME: "Přidat Doménu \"%NAME%\"" @@ -218,8 +218,8 @@ cs_CZ: BUTTON_UPDATE: "Aktualizovat" NEW_DOMAIN_DESC: "Konfigurace této domény umožní používat %NAME% adresy." WHITE_LIST_ALERT: | - Seznam domén s povoleným uživatelským přístupem - Použijte mezeru pro jejich oddělení. + Seznam domén s povoleným uživatelským přístupem + Použijte mezeru pro jejich oddělení. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Není zde nic ke konfiguraci" @@ -304,13 +304,13 @@ cs_CZ: PHP_VERSION_ERROR_DESC: "Vaše verze PHP (%VERSION%) je nižší než požadovaná 5.3.0!" NO_SCRIPT_TITLE: "Tato aplikace vyžaduje JavaScript." NO_SCRIPT_DESC: | - Váš internetový prohlížeč nepodporuje JavaScript. - Prosím povolte podporu JavaScriptu v nastavení vašeho internetového prohlížeče a zkuste to znovu. + Váš internetový prohlížeč nepodporuje JavaScript. + Prosím povolte podporu JavaScriptu v nastavení vašeho internetového prohlížeče a zkuste to znovu. NO_COOKIE_TITLE: "Tato aplikace vyžaduje podporu Cookies." NO_COOKIE_DESC: | - Váš internetový prohlížeč nepodporuje Cookies. - Prosím povolte podporu Cookies v nastavení vašeho internetového prohlížeče a zkuste to znovu. + Váš internetový prohlížeč nepodporuje Cookies. + Prosím povolte podporu Cookies v nastavení vašeho internetového prohlížeče a zkuste to znovu. BAD_BROWSER_TITLE: "Používáte zastaralý internetový prohlížeč." BAD_BROWSER_DESC: | - Abyste mohli využívat všechny funkcie této aplikace, - použijte některý z následujících internetových prohlížečů: + Abyste mohli využívat všechny funkcie této aplikace, + použijte některý z následujících internetových prohlížečů: diff --git a/rainloop/v/0.0.0/app/localization/admin/da_DK.yml b/rainloop/v/0.0.0/app/localization/admin/da_DK.yml index e9a78593a..1b9eddbae 100644 --- a/rainloop/v/0.0.0/app/localization/admin/da_DK.yml +++ b/rainloop/v/0.0.0/app/localization/admin/da_DK.yml @@ -36,11 +36,11 @@ da_DK: LABEL_ALLOW_TEMPLATES: "Tillad skabeloner" ALERT_WARNING: "Advarsler!" HTML_ALERT_WEAK_PASSWORD: | - Du bruger standard admin adgangskoden. -
      - Af sikkerhedsmæssige hensyn bør du venligst - ændre - adgangskoden til noget andet snarest. + Du bruger standard admin adgangskoden. +
      + Af sikkerhedsmæssige hensyn bør du venligst + ændre + adgangskoden til noget andet snarest. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Log ind skærm" LABEL_DEFAULT_DOMAIN: "Standard domæne" @@ -84,18 +84,18 @@ da_DK: ALERT_NOTICE: "Underretning!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Brug ikke denne database type med større antal af aktive brugere." HTML_ALERT_DOES_NOT_SUPPORTED: | - Dit system ser ikke ud til at understøtte kontakter. -
      - Du skal installere og aktivere PDO (SQLite / MySQL / PostgreSQL) udvidelsen på din server. + Dit system ser ikke ud til at understøtte kontakter. +
      + Du skal installere og aktivere PDO (SQLite / MySQL / PostgreSQL) udvidelsen på din server. TAB_DOMAINS: LEGEND_DOMAINS: "Domæner" BUTTON_ADD_DOMAIN: "Tilføj domæne" BUTTON_ADD_ALIAS: "Tilføj alias" DELETE_ARE_YOU_SURE: "Er du sikker?" HTML_DOMAINS_HELPER: | - Liste over domæner webmail er tilladt adgang til. -
      - Klik på navnet for at konfigurere domænet. + Liste over domæner webmail er tilladt adgang til. +
      + Klik på navnet for at konfigurere domænet. TAB_SECURITY: LEGEND_SECURITY: "Sikkerhed" LABEL_ALLOW_TWO_STEP: "Tillad 2-trins verifikation" @@ -154,8 +154,8 @@ da_DK: HTML_ALERT_TOP_1: "RainLoop Webmail er licenseret under" HTML_ALERT_TOP_2: "Du er velkommen til at bruge det til personlige projekter." HTML_ALERT_TOP_3: | - Kommercielt brug (med ekstra funktioner) af RainLoop Webmail kræver et - abonnement. + Kommercielt brug (med ekstra funktioner) af RainLoop Webmail kræver et + abonnement. TYPE_PREMIUM_LIFETIME: "Livstid" LABEL_SUB_EXPIRES: "Abonnement udløber" BUTTON_ACTIVATE: "Aktiver abonnements kode for dette domæne" @@ -183,11 +183,11 @@ da_DK: ERROR_INVALID_SUBS_KEY: "Ugyldig abonnements kode" SUBS_KEY_ACTIVATED: "Abonnements kode aktivering var succesfuld" HTML_DESC: | - Efter aktiveren, vil abonnementet for %DOMAIN% blive forlænget. -
      - Bemærk at en abonnements kode kun kan blive aktiveret for et enkelt domæne. -

      - Når aktiverings processen er startet kan den ikke afbrydes eller annulleres. + Efter aktiveren, vil abonnementet for %DOMAIN% blive forlænget. +
      + Bemærk at en abonnements kode kun kan blive aktiveret for et enkelt domæne. +

      + Når aktiverings processen er startet kan den ikke afbrydes eller annulleres. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Tilføj alias" LABEL_ALIAS: "Alias" @@ -225,8 +225,8 @@ da_DK: BUTTON_UPDATE: "Opdater" NEW_DOMAIN_DESC: "Denne domæne konfiguration tillader %NAME% e-mail adresser." WHITE_LIST_ALERT: | - Liste med godkendte domæne for webmail opsætning. - Brug mellemrum til at separere domæner. + Liste med godkendte domæne for webmail opsætning. + Brug mellemrum til at separere domæner. POPUPS_PLUGIN: TITLE_PLUGIN: "Tilføjelse" DESC_NOTHING_TO_CONFIGURE: "Intet at opsætte" @@ -311,13 +311,13 @@ da_DK: PHP_VERSION_ERROR_DESC: "PHP versionen (%VERSION%) er for gammel. Minimum 5.3.0 er nødvendig!" NO_SCRIPT_TITLE: "JavaScript er nødvendig for dette program." NO_SCRIPT_DESC: | - JavaScript er slået fra i din browser. - Slå JavaScript til og prøv igen. + JavaScript er slået fra i din browser. + Slå JavaScript til og prøv igen. NO_COOKIE_TITLE: "Cookies er nødvendige for dette program." NO_COOKIE_DESC: | - Cookies er slået fra i din browser. - Slå Cookies til og prøv igen. + Cookies er slået fra i din browser. + Slå Cookies til og prøv igen. BAD_BROWSER_TITLE: "Din browser er forældet." BAD_BROWSER_DESC: | - Enkle funktioner fungere ikke med denne browser. - For at bruge alle funktioner, hent en af følgende: + Enkle funktioner fungere ikke med denne browser. + For at bruge alle funktioner, hent en af følgende: diff --git a/rainloop/v/0.0.0/app/localization/admin/de_DE.yml b/rainloop/v/0.0.0/app/localization/admin/de_DE.yml index c5662ca8c..f1660dae9 100644 --- a/rainloop/v/0.0.0/app/localization/admin/de_DE.yml +++ b/rainloop/v/0.0.0/app/localization/admin/de_DE.yml @@ -36,10 +36,10 @@ de_DE: LABEL_ALLOW_TEMPLATES: "Vorlagen erlauben" ALERT_WARNING: "Warnung!" HTML_ALERT_WEAK_PASSWORD: | - Sie verwenden das Standard-Admin-Passwort. -
      - Bitte ändern Sie - aus Sicherheitsgründen das Passwort jetzt. + Sie verwenden das Standard-Admin-Passwort. +
      + Bitte ändern Sie + aus Sicherheitsgründen das Passwort jetzt. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Anmeldebildschirm" LABEL_DEFAULT_DOMAIN: "Standarddomain" @@ -83,18 +83,18 @@ de_DE: ALERT_NOTICE: "Hinweis!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Verwenden Sie diesen Datenbanktyp nicht bei einer hohen Anzahl aktiver Benutzer." HTML_ALERT_DOES_NOT_SUPPORTED: | - Ihr System unterstützt keine Kontakte. -
      - Sie müssen die PDO-Erweiterung (SQLite / MySQL / PostgreSQL) auf Ihrem Server installieren oder aktivieren. + Ihr System unterstützt keine Kontakte. +
      + Sie müssen die PDO-Erweiterung (SQLite / MySQL / PostgreSQL) auf Ihrem Server installieren oder aktivieren. TAB_DOMAINS: LEGEND_DOMAINS: "Domains" BUTTON_ADD_DOMAIN: "Domain hinzufügen" BUTTON_ADD_ALIAS: "Alias hinzufügen" DELETE_ARE_YOU_SURE: "Sind Sie sicher?" HTML_DOMAINS_HELPER: | - Liste der Domains, die Webmail abrufen darf. -
      - Klicken Sie auf den Namen, um die Domain zu konfigurieren. + Liste der Domains, die Webmail abrufen darf. +
      + Klicken Sie auf den Namen, um die Domain zu konfigurieren. TAB_SECURITY: LEGEND_SECURITY: "Sicherheit" LABEL_ALLOW_TWO_STEP: "Zwei-Faktor-Authentifizierung erlauben" @@ -153,8 +153,8 @@ de_DE: HTML_ALERT_TOP_1: "RainLoop Webmail steht unter folgender Lizenz:" HTML_ALERT_TOP_2: "Sie dürfen es für persönliche Projekte nutzen." HTML_ALERT_TOP_3: | - Kommerzielle Nutzung (mit zusätzlichen Funktionen) von RainLoop Webmail erfordert eine - Subscription. + Kommerzielle Nutzung (mit zusätzlichen Funktionen) von RainLoop Webmail erfordert eine + Subscription. TYPE_PREMIUM_LIFETIME: "Lebenszeit" LABEL_SUB_EXPIRES: "Ablauf der Subscription" BUTTON_ACTIVATE: "Subscription-Schlüssel für diese Domain aktivieren" @@ -182,11 +182,11 @@ de_DE: ERROR_INVALID_SUBS_KEY: "Ungültiger Subscription-Schlüssel" SUBS_KEY_ACTIVATED: "Subscription-Schlüssel erfolgreich aktiviert" HTML_DESC: | - Nach der Aktivierung wird %DOMAIN% um die Premium-Subscription erweitert. -
      - Beachten Sie, dass ein Subscription-Schlüssel nur für eine einzelne Domain aktiviert werden kann. -

      - Nach dem Start kann der Aktivierungsprozess nicht unterbrochen oder abgebrochen werden. + Nach der Aktivierung wird %DOMAIN% um die Premium-Subscription erweitert. +
      + Beachten Sie, dass ein Subscription-Schlüssel nur für eine einzelne Domain aktiviert werden kann. +

      + Nach dem Start kann der Aktivierungsprozess nicht unterbrochen oder abgebrochen werden. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Alias hinzufügen" LABEL_ALIAS: "Alias" @@ -224,8 +224,8 @@ de_DE: BUTTON_UPDATE: "Aktualisieren" NEW_DOMAIN_DESC: "Diese Domain Konfiguration wird es dir möglich machen
      mit %NAME% Mailadressen zu arbeiten." WHITE_LIST_ALERT: | - Liste der User, die Webmail abrufen darf. - Verwenden Sie Leerzeichen als Trenner. + Liste der User, die Webmail abrufen darf. + Verwenden Sie Leerzeichen als Trenner. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Nichts zu konfigurieren" @@ -313,13 +313,13 @@ de_DE: PHP_VERSION_ERROR_DESC: "Ihre PHP Version (%VERSION%) ist älter als die notwendige Version: 5.3.0!" NO_SCRIPT_TITLE: "Diese Anwendung benötigt JavaScript." NO_SCRIPT_DESC: | - Ihr Browser unterstützt JavaScript nicht. - Aktivieren Sie bitte die JavaScript-Unterstützung in Ihrem Browser und versuchen Sie es erneut. + Ihr Browser unterstützt JavaScript nicht. + Aktivieren Sie bitte die JavaScript-Unterstützung in Ihrem Browser und versuchen Sie es erneut. NO_COOKIE_TITLE: "Diese Anwendung benötigt Cookies." NO_COOKIE_DESC: | - Ihr Browser unterstützt Cookies nicht. - Aktivieren Sie bitte die Cookie-Unterstützung in Ihrem Browser und versuchen Sie es erneut. + Ihr Browser unterstützt Cookies nicht. + Aktivieren Sie bitte die Cookie-Unterstützung in Ihrem Browser und versuchen Sie es erneut. BAD_BROWSER_TITLE: "Ihr Browser ist veraltet." BAD_BROWSER_DESC: | - Um alle Funktionen dieser Anwendung nutzen zu können, - sollten Sie einen der folgenden Browser herunterladen und installieren + Um alle Funktionen dieser Anwendung nutzen zu können, + sollten Sie einen der folgenden Browser herunterladen und installieren diff --git a/rainloop/v/0.0.0/app/localization/admin/en_US.yml b/rainloop/v/0.0.0/app/localization/admin/en_US.yml index bca514036..0b5bb0de6 100644 --- a/rainloop/v/0.0.0/app/localization/admin/en_US.yml +++ b/rainloop/v/0.0.0/app/localization/admin/en_US.yml @@ -35,11 +35,11 @@ en_US: LABEL_ALLOW_TEMPLATES: "Allow templates" ALERT_WARNING: "Warning!" HTML_ALERT_WEAK_PASSWORD: | - You are using the default admin password. -
      - For security reasons please - change - password to something else now. + You are using the default admin password. +
      + For security reasons please + change + password to something else now. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Login Screen" LABEL_DEFAULT_DOMAIN: "Default Domain" @@ -83,18 +83,18 @@ en_US: ALERT_NOTICE: "Notice!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Don't use this database type with a large number of active users." HTML_ALERT_DOES_NOT_SUPPORTED: | - Your system doesn't support contacts. -
      - You need to install or enable PDO (SQLite / MySQL / PostgreSQL) extension on your server. + Your system doesn't support contacts. +
      + You need to install or enable PDO (SQLite / MySQL / PostgreSQL) extension on your server. TAB_DOMAINS: LEGEND_DOMAINS: "Domains" BUTTON_ADD_DOMAIN: "Add Domain" BUTTON_ADD_ALIAS: "Add Alias" DELETE_ARE_YOU_SURE: "Are you sure?" HTML_DOMAINS_HELPER: | - List of domains webmail is allowed to access. -
      - Click on the name to configure the domain. + List of domains webmail is allowed to access. +
      + Click on the name to configure the domain. TAB_SECURITY: LEGEND_SECURITY: "Security" LABEL_ALLOW_TWO_STEP: "Allow 2-Step Verification" @@ -153,8 +153,8 @@ en_US: HTML_ALERT_TOP_1: "RainLoop Webmail is licensed under" HTML_ALERT_TOP_2: "You are free to use it for your personal projects." HTML_ALERT_TOP_3: | - Commercial use (with additional features) of RainLoop Webmail requires getting a - subscription. + Commercial use (with additional features) of RainLoop Webmail requires getting a + subscription. TYPE_PREMIUM_LIFETIME: "Lifetime" LABEL_SUB_EXPIRES: "Subscription expires" BUTTON_ACTIVATE: "Activate Subscription Key for this domain" @@ -182,11 +182,11 @@ en_US: ERROR_INVALID_SUBS_KEY: "Invalid Subscription Key" SUBS_KEY_ACTIVATED: "Subscription Key Activated Successfully" HTML_DESC: | - After activation, premium subscription for %DOMAIN% will be extended. -
      - Note that subscription key can be activated for a single domain only. -

      - Once started, the process of activation cannot be aborted or cancelled. + After activation, premium subscription for %DOMAIN% will be extended. +
      + Note that subscription key can be activated for a single domain only. +

      + Once started, the process of activation cannot be aborted or cancelled. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Add Alias" LABEL_ALIAS: "Alias" @@ -224,8 +224,8 @@ en_US: BUTTON_UPDATE: "Update" NEW_DOMAIN_DESC: "This domain configuration will allow you to work
      with %NAME% email addresses." WHITE_LIST_ALERT: | - List of domain users webmail is allowed to access. - Use a space as delimiter. + List of domain users webmail is allowed to access. + Use a space as delimiter. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Nothing to configure" @@ -310,13 +310,13 @@ en_US: PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is required for this application." NO_SCRIPT_DESC: | - JavaScript support is not available in your browser. - Please enable JavaScript support in your browser settings and retry. + JavaScript support is not available in your browser. + Please enable JavaScript support in your browser settings and retry. NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "Your browser is outdated." BAD_BROWSER_DESC: | - To use all the features of the application, - download and install one of these browsers: + To use all the features of the application, + download and install one of these browsers: diff --git a/rainloop/v/0.0.0/app/localization/admin/es_ES.yml b/rainloop/v/0.0.0/app/localization/admin/es_ES.yml index fa117f835..2f3fc40a5 100644 --- a/rainloop/v/0.0.0/app/localization/admin/es_ES.yml +++ b/rainloop/v/0.0.0/app/localization/admin/es_ES.yml @@ -36,11 +36,11 @@ es_ES: LABEL_ALLOW_TEMPLATES: "Permitir plantillas" ALERT_WARNING: "¡Atención!" HTML_ALERT_WEAK_PASSWORD: | - Estas utilizando la contraseña por defecto. -
      - Debido a razones de seguridad, debes - cambiar - tu contraseña inmediatamente. + Estas utilizando la contraseña por defecto. +
      + Debido a razones de seguridad, debes + cambiar + tu contraseña inmediatamente. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Pantalla de Ingreso" LABEL_DEFAULT_DOMAIN: "Dominio por defecto" @@ -84,18 +84,18 @@ es_ES: ALERT_NOTICE: "¡Advertencia!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "No utilices este tipo de Base de Datos para un número grande de usuarios." HTML_ALERT_DOES_NOT_SUPPORTED: | - Tu sistema no soporta el uso de Contactos. -
      - Debes instalar o habilitar el uso de PDO (SQLite / MySQL / PostgreSQL) en tu servidor. + Tu sistema no soporta el uso de Contactos. +
      + Debes instalar o habilitar el uso de PDO (SQLite / MySQL / PostgreSQL) en tu servidor. TAB_DOMAINS: LEGEND_DOMAINS: "Dominios" BUTTON_ADD_DOMAIN: "Agregar dominio" BUTTON_ADD_ALIAS: "Agregar alias" DELETE_ARE_YOU_SURE: "¿Estás seguro?" HTML_DOMAINS_HELPER: | - Lista de los dominios de correo al que se permite ingresar. -
      - Haz click en el nombre de un dominio para modificarlo. + Lista de los dominios de correo al que se permite ingresar. +
      + Haz click en el nombre de un dominio para modificarlo. TAB_SECURITY: LEGEND_SECURITY: "Seguridad" LABEL_ALLOW_TWO_STEP: "Activar la verificación de 2 pasos" @@ -154,8 +154,8 @@ es_ES: HTML_ALERT_TOP_1: "RainLoop Webmail está licenciado bajo" HTML_ALERT_TOP_2: "Eres libre de usarlo para un uso personal." HTML_ALERT_TOP_3: | - Para utilizar RainLoop Webmail de forma comercial (con características adicionales) debes adquirir una licencia - Premium. + Para utilizar RainLoop Webmail de forma comercial (con características adicionales) debes adquirir una licencia + Premium. TYPE_PREMIUM_LIFETIME: "De por vida" LABEL_SUB_EXPIRES: "La suscripción finaliza" BUTTON_ACTIVATE: "Activar clave de suscripción para este dominio" @@ -221,8 +221,8 @@ es_ES: BUTTON_UPDATE: "Actualizar" NEW_DOMAIN_DESC: "Esta configuración de Dominio le permitirá trabajar
      con direcciones de correo tipo @%NAME%." WHITE_LIST_ALERT: | - Lista de dominios con que los usuarios pueden ingresar. - Use un espacio como delimitador. + Lista de dominios con que los usuarios pueden ingresar. + Use un espacio como delimitador. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Nada para configurar" @@ -311,11 +311,11 @@ es_ES: PHP_VERSION_ERROR_DESC: "¡La versión de PHP (%VERSION%) es menor a la mínima requerida 5.3.0!" NO_SCRIPT_TITLE: "JavaScript es requerido para esta aplicación." NO_SCRIPT_DESC: | - JavaScript está desactivado. Por favor habilite JavaScript en la configuración de su navegador e inténtelo de nuevo. + JavaScript está desactivado. Por favor habilite JavaScript en la configuración de su navegador e inténtelo de nuevo. NO_COOKIE_TITLE: "Las Cookies son requeridas para esta aplicación." NO_COOKIE_DESC: | - Las Cookies están desactivadas. Por favor habilite las Cookies en la configuración de su navegador e inténtelo de nuevo. + Las Cookies están desactivadas. Por favor habilite las Cookies en la configuración de su navegador e inténtelo de nuevo. BAD_BROWSER_TITLE: "El navegador no está actualizado" BAD_BROWSER_DESC: | - Para usar todas las características de esta aplicación, - descargue e instale uno de estos navegadores: + Para usar todas las características de esta aplicación, + descargue e instale uno de estos navegadores: diff --git a/rainloop/v/0.0.0/app/localization/admin/fa_IR.yml b/rainloop/v/0.0.0/app/localization/admin/fa_IR.yml index b3919bdcc..68f6c7a1a 100644 --- a/rainloop/v/0.0.0/app/localization/admin/fa_IR.yml +++ b/rainloop/v/0.0.0/app/localization/admin/fa_IR.yml @@ -35,11 +35,11 @@ fa_IR: LABEL_ALLOW_TEMPLATES: "اجازه استفاده از پوسته‌ها" ALERT_WARNING: "اخطار!" HTML_ALERT_WEAK_PASSWORD: |+ - شما در حال استفاده از گذرواژه پیش‌فرض کاربر مدیر هستید. -
      - بدلیل رعایت مسائل امنیتی - گذرواژه - را به کلمه دیگری تغییر دهید. + شما در حال استفاده از گذرواژه پیش‌فرض کاربر مدیر هستید. +
      + بدلیل رعایت مسائل امنیتی + گذرواژه + را به کلمه دیگری تغییر دهید. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "صفحه ورود" @@ -84,18 +84,18 @@ fa_IR: ALERT_NOTICE: "توجه!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "از این پایگاه داده برای کاربران زیاد استفاده نکنید." HTML_ALERT_DOES_NOT_SUPPORTED: | - سیستم از تماس‌ها پشتیبانی نمی‌کند -
      - شما باید افزونه PDO (SQLite / MySQL / PostgreSQL) را نصب کنید یا اینکه فعال کنید. + سیستم از تماس‌ها پشتیبانی نمی‌کند +
      + شما باید افزونه PDO (SQLite / MySQL / PostgreSQL) را نصب کنید یا اینکه فعال کنید. TAB_DOMAINS: LEGEND_DOMAINS: "دامنه‌ها" BUTTON_ADD_DOMAIN: "اضافه‌کردن دامنه" BUTTON_ADD_ALIAS: "اضافه‌کردن نام مستعار" DELETE_ARE_YOU_SURE: "آیا مطمئن هستید؟" HTML_DOMAINS_HELPER: | - لیستی از دامنه‌هایی که وب‌میل اجازه دسترسی به آنها را دارد. -
      - روی دامنه دامنه جهت پیکربندی کلیک کنید. + لیستی از دامنه‌هایی که وب‌میل اجازه دسترسی به آنها را دارد. +
      + روی دامنه دامنه جهت پیکربندی کلیک کنید. TAB_SECURITY: LEGEND_SECURITY: "امنیت" LABEL_ALLOW_TWO_STEP: "اعتبارسنجی دو مرحله‌ای" @@ -154,7 +154,7 @@ fa_IR: HTML_ALERT_TOP_1: "وبمیل RainLoop تحت مجوز" HTML_ALERT_TOP_2: " شما برای استفاده از آن آزاد personal projects. هستید" HTML_ALERT_TOP_3: | - استفاده تجاری (با قابلیت‌های بیشتر) از RainLoop Webmail نیاز به پرداخت حق اشتراک دارد. + استفاده تجاری (با قابلیت‌های بیشتر) از RainLoop Webmail نیاز به پرداخت حق اشتراک دارد. TYPE_PREMIUM_LIFETIME: "مادام العمر" LABEL_SUB_EXPIRES: "انقضای حق اشتراک" BUTTON_ACTIVATE: "فعال‌کردن حق اشتراک این دامنه" @@ -182,11 +182,11 @@ fa_IR: ERROR_INVALID_SUBS_KEY: "کلید حق اشتراک نامعتبر" SUBS_KEY_ACTIVATED: "کلید حق اشتراک با موفقیت فعال شد" HTML_DESC: | - بعد از فعال‌سازی، سطح بالاتر اشتراک برای %DOMAIN% گسترش خواهد یافت. -
      - توجه کنید که کلید اشتراک فقط برای یک دامنه می‌تواند فعال شود. -

      - زمانی که شروع کردید، فرآیند فعال‌سازی قابل انصراف نیست. + بعد از فعال‌سازی، سطح بالاتر اشتراک برای %DOMAIN% گسترش خواهد یافت. +
      + توجه کنید که کلید اشتراک فقط برای یک دامنه می‌تواند فعال شود. +

      + زمانی که شروع کردید، فرآیند فعال‌سازی قابل انصراف نیست. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "اضافه کردن نام مستعار" LABEL_ALIAS: "مستعار" @@ -224,8 +224,8 @@ fa_IR: BUTTON_UPDATE: "بروزرسانی" NEW_DOMAIN_DESC: "این تنظیمات دامنه به شما اجازه کار کردن
      با پست الکترونیک %NAME% را می‌دهد." WHITE_LIST_ALERT: | - لیستی از دامنه‌ها که کاربران وب‌میل می‌توانند به آنها دسترسی داشته باشند. - از فاصله جهت جدا کردن استفاده کنید. + لیستی از دامنه‌ها که کاربران وب‌میل می‌توانند به آنها دسترسی داشته باشند. + از فاصله جهت جدا کردن استفاده کنید. POPUPS_PLUGIN: TITLE_PLUGIN: "افزونه" DESC_NOTHING_TO_CONFIGURE: "چیزی برای پیکربندی نیست" @@ -313,13 +313,13 @@ fa_IR: PHP_VERSION_ERROR_DESC: "نسخه PHP شما (%VERSION%) کمتر از حداقل نسخه مورد انتظار 5.3.0 هست!" NO_SCRIPT_TITLE: "جاوا‌اسکریپت برای این برنامه مورد نیاز است." NO_SCRIPT_DESC: | - پشتیبانی از جاوااسکریپت در مرورگر شما وجود ندارد. - لطفا پشتیبانی از جاوا‌اسکریپت را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. + پشتیبانی از جاوااسکریپت در مرورگر شما وجود ندارد. + لطفا پشتیبانی از جاوا‌اسکریپت را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. NO_COOKIE_TITLE: "Cookie باید بر روی مرورگر شما جهت استفاده از برنامه فعال باشد." NO_COOKIE_DESC: | - پشتیبانی از Cookie در مرورگر شما فعال نیست. - لطفا Cookie را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. + پشتیبانی از Cookie در مرورگر شما فعال نیست. + لطفا Cookie را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. BAD_BROWSER_TITLE: "نسخه مرورگر شما قدیمی است." BAD_BROWSER_DESC: | - برای استفاده از تمام قابلیتهای برنامه، - یکی از مرورگرهای زیر را دریافت و نصب کنید. + برای استفاده از تمام قابلیتهای برنامه، + یکی از مرورگرهای زیر را دریافت و نصب کنید. diff --git a/rainloop/v/0.0.0/app/localization/admin/fi_FI.yml b/rainloop/v/0.0.0/app/localization/admin/fi_FI.yml index 81b804ecc..fe6852c8e 100644 --- a/rainloop/v/0.0.0/app/localization/admin/fi_FI.yml +++ b/rainloop/v/0.0.0/app/localization/admin/fi_FI.yml @@ -35,11 +35,11 @@ fi_FI: LABEL_ALLOW_TEMPLATES: "Salli mallipohjat" ALERT_WARNING: "Varoitus!" HTML_ALERT_WEAK_PASSWORD: | - Sinulla on käytössäsi hallintatunnuksen oletussalasana. -
      - Tietoturvasyistä, ole ystävällinen ja - vaihda - salasanasi nyt. + Sinulla on käytössäsi hallintatunnuksen oletussalasana. +
      + Tietoturvasyistä, ole ystävällinen ja + vaihda + salasanasi nyt. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Kirjautumissivu" LABEL_DEFAULT_DOMAIN: "Oletus domain" @@ -83,18 +83,18 @@ fi_FI: ALERT_NOTICE: "Huomio!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Älä käytä tätä tietokantatyyppiä suurella määrällä aktiivisia käyttäjiä." HTML_ALERT_DOES_NOT_SUPPORTED: | - Järjestelmäsi ei tue yhteystietoja. -
      - Asenna tai aktivoi PDO (SQLite / MySQL / PostgreSQL) lisäosa palvelimellasi. + Järjestelmäsi ei tue yhteystietoja. +
      + Asenna tai aktivoi PDO (SQLite / MySQL / PostgreSQL) lisäosa palvelimellasi. TAB_DOMAINS: LEGEND_DOMAINS: "Domainit" BUTTON_ADD_DOMAIN: "Lisää domain" BUTTON_ADD_ALIAS: "Lisää alias" DELETE_ARE_YOU_SURE: "Oletko varma?" HTML_DOMAINS_HELPER: | - Lista domaineista joilla webmaililla on pääsy. -
      - Klikkaa nimeä konfiguroidaksesi domain. + Lista domaineista joilla webmaililla on pääsy. +
      + Klikkaa nimeä konfiguroidaksesi domain. TAB_SECURITY: LEGEND_SECURITY: "Tietoturva" LABEL_ALLOW_TWO_STEP: "Salli 2 vaiheinen todentaminen" @@ -153,8 +153,8 @@ fi_FI: HTML_ALERT_TOP_1: "RainLoop Webmail on lisensoitu" HTML_ALERT_TOP_2: "Voit käyttää ilmaiseksi omissa projekteissasi. " HTML_ALERT_TOP_3: | - RainLoop Webmailin kaupallinen käyttö (lisäominaisuuksilla) vaatii - tilauksen. + RainLoop Webmailin kaupallinen käyttö (lisäominaisuuksilla) vaatii + tilauksen. TYPE_PREMIUM_LIFETIME: "Kesto" LABEL_SUB_EXPIRES: "Tilaus päättyy" BUTTON_ACTIVATE: "Aktivoi Tilaus Avain tälle verkkotunnukselle" @@ -182,11 +182,11 @@ fi_FI: ERROR_INVALID_SUBS_KEY: "Väärä tilausavain" SUBS_KEY_ACTIVATED: "Tilausavain aktivoitu onnistuneesti" HTML_DESC: | - Aktivoinninn jälkeen tilaus %DOMAIN% verkkotunnukselle jatkuu. -
      - Huomioi että tilausavain voidaan aktivoida vain yhdelle verkkotunnukselle. -

      - Aloituksen jälkeen aktivointia ei voi keskeyttää tai peruuttaa. + Aktivoinninn jälkeen tilaus %DOMAIN% verkkotunnukselle jatkuu. +
      + Huomioi että tilausavain voidaan aktivoida vain yhdelle verkkotunnukselle. +

      + Aloituksen jälkeen aktivointia ei voi keskeyttää tai peruuttaa. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Lisää Alias" LABEL_ALIAS: "Alias" @@ -224,8 +224,8 @@ fi_FI: BUTTON_UPDATE: "Päivitä" NEW_DOMAIN_DESC: "Tämän verkkotunnuksen asetukset sallivat käyttää
      %NAME% säkhöpostiosoitteita." WHITE_LIST_ALERT: | - Lista domain käyttäjistä joihin webmaililla on oikeus. - Erottele välilyönnillä. + Lista domain käyttäjistä joihin webmaililla on oikeus. + Erottele välilyönnillä. POPUPS_PLUGIN: TITLE_PLUGIN: "Lisäosa" DESC_NOTHING_TO_CONFIGURE: "Ei mitään asetettavaa" @@ -310,13 +310,13 @@ fi_FI: PHP_VERSION_ERROR_DESC: "PHP versiosi (%VERSION%) on alle vaaditun 5.3.0!" NO_SCRIPT_TITLE: "Javascript vaaditaan tälle sovellukselle." NO_SCRIPT_DESC: | - Selaimesi ei tue JavaScriptiä. - Salli JavaScript selaimessasi ja yritä uudelleen. + Selaimesi ei tue JavaScriptiä. + Salli JavaScript selaimessasi ja yritä uudelleen. NO_COOKIE_TITLE: "Esvästetuki vaaditaan tässä sovelluksessa." NO_COOKIE_DESC: | - Selaimesi ei tue evästeitä. - Salli evästeet selaimessasi ja yritä uudelleen. + Selaimesi ei tue evästeitä. + Salli evästeet selaimessasi ja yritä uudelleen. BAD_BROWSER_TITLE: "Selaimesi on vanhentunut." BAD_BROWSER_DESC: | - Käyttääksesi kaikki ominaisuuksia - lataa ja asenna jokin näistä selaimista: + Käyttääksesi kaikki ominaisuuksia + lataa ja asenna jokin näistä selaimista: diff --git a/rainloop/v/0.0.0/app/localization/admin/fr_FR.yml b/rainloop/v/0.0.0/app/localization/admin/fr_FR.yml index 70f1354ac..e4062d830 100644 --- a/rainloop/v/0.0.0/app/localization/admin/fr_FR.yml +++ b/rainloop/v/0.0.0/app/localization/admin/fr_FR.yml @@ -36,11 +36,11 @@ fr_FR: LABEL_ALLOW_TEMPLATES: "Autoriser les modèles" ALERT_WARNING: "ATTENTION !" HTML_ALERT_WEAK_PASSWORD: | - Vous utilisez le mot de passe administrateur par défaut. -
      - Pour des raisons de sécurité, veuillez - changer le mot de passe - dès maintenant. + Vous utilisez le mot de passe administrateur par défaut. +
      + Pour des raisons de sécurité, veuillez + changer le mot de passe + dès maintenant. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Ecran de connexion" LABEL_DEFAULT_DOMAIN: "Domaine par défaut" @@ -84,18 +84,18 @@ fr_FR: ALERT_NOTICE: "Avis !" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "N'utilisez pas ce type de base de données avec un grand nombre d'utilisateurs actifs." HTML_ALERT_DOES_NOT_SUPPORTED: | - Votre système ne supporte pas les contacts. -
      - Vous devez installer ou autoriser l'extension PDO (SQLite / MySQL / PostgreSQL) sur votre serveur. + Votre système ne supporte pas les contacts. +
      + Vous devez installer ou autoriser l'extension PDO (SQLite / MySQL / PostgreSQL) sur votre serveur. TAB_DOMAINS: LEGEND_DOMAINS: "Domaines" BUTTON_ADD_DOMAIN: "Ajouter un domaine" BUTTON_ADD_ALIAS: "Ajouter un alias" DELETE_ARE_YOU_SURE: "Êtes-vous sûr ?" HTML_DOMAINS_HELPER: | - Liste des domaines autorisés. -
      - Cliquez sur le nom pour configurer le domaine. + Liste des domaines autorisés. +
      + Cliquez sur le nom pour configurer le domaine. TAB_SECURITY: LEGEND_SECURITY: "Sécurité" LABEL_ALLOW_TWO_STEP: "Autoriser l'authentification en deux étapes" @@ -154,8 +154,8 @@ fr_FR: HTML_ALERT_TOP_1: "La licence RainLoop Webmail appartient à" HTML_ALERT_TOP_2: "Vous êtes libre de l'utiliser pour vos projets personnels" HTML_ALERT_TOP_3: | - L'usage commercial (avec des fonctionnalités supplémentaires) de RainLoop Webmail nécessite une - souscription. + L'usage commercial (avec des fonctionnalités supplémentaires) de RainLoop Webmail nécessite une + souscription. TYPE_PREMIUM_LIFETIME: "A vie" LABEL_SUB_EXPIRES: "La souscription expire" BUTTON_ACTIVATE: "Activer une clé de souscription pour ce domaine" @@ -183,11 +183,11 @@ fr_FR: ERROR_INVALID_SUBS_KEY: "Clé de souscription invalide" SUBS_KEY_ACTIVATED: "Activation de la clé de souscription réussie" HTML_DESC: | - Après l'activation, la souscription premium pour %DOMAIN% va être prolongée. -
      - Notez que la clé de souscription ne peut être activée que pour un seul domaine. -

      - Une fois lancé, le processus d'activation ne peut pas être annulé ou abandonné. + Après l'activation, la souscription premium pour %DOMAIN% va être prolongée. +
      + Notez que la clé de souscription ne peut être activée que pour un seul domaine. +

      + Une fois lancé, le processus d'activation ne peut pas être annulé ou abandonné. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Ajouter un alias" LABEL_ALIAS: "Alias" @@ -225,8 +225,8 @@ fr_FR: BUTTON_UPDATE: "Modifier" NEW_DOMAIN_DESC: "Cette configuration de domaine vous permettra de travailler
      avec %NAME% dans les adresses électroniques." WHITE_LIST_ALERT: | - Liste des utilisateurs du domaine auxquels le webmail est autorisé à accéder. - Utilisez un espace comme séparateur. + Liste des utilisateurs du domaine auxquels le webmail est autorisé à accéder. + Utilisez un espace comme séparateur. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Rien à configurer" @@ -314,13 +314,13 @@ fr_FR: PHP_VERSION_ERROR_DESC: "Votre version de PHP (% VERSION%) est inférieure au minimum requis 5.3.0!" NO_SCRIPT_TITLE: "JavaScript est nécessaire pour cette application." NO_SCRIPT_DESC: | - Le support de JavaScript n'est pas disponible dans votre navigateur. - Veuillez activer le support de JavaScript dans les paramètres de votre navigateur et réessayer. + Le support de JavaScript n'est pas disponible dans votre navigateur. + Veuillez activer le support de JavaScript dans les paramètres de votre navigateur et réessayer. NO_COOKIE_TITLE: "Le support des cookies est nécessaire pour cette application." NO_COOKIE_DESC: | - Le support des cookies n'est pas disponible dans votre navigateur. - Veuillez activer le support des cookies dans les paramètres de votre navigateur et réessayer. + Le support des cookies n'est pas disponible dans votre navigateur. + Veuillez activer le support des cookies dans les paramètres de votre navigateur et réessayer. BAD_BROWSER_TITLE: "Votre navigateur n'est pas à jour." BAD_BROWSER_DESC: | - Pour utiliser toutes les fonctionnalités de l'application, - téléchargez et installez l'un de ces navigateurs : + Pour utiliser toutes les fonctionnalités de l'application, + téléchargez et installez l'un de ces navigateurs : diff --git a/rainloop/v/0.0.0/app/localization/admin/hu_HU.yml b/rainloop/v/0.0.0/app/localization/admin/hu_HU.yml index 8ebf5b95c..df08e6c54 100644 --- a/rainloop/v/0.0.0/app/localization/admin/hu_HU.yml +++ b/rainloop/v/0.0.0/app/localization/admin/hu_HU.yml @@ -36,11 +36,11 @@ hu_HU: LABEL_ALLOW_TEMPLATES: "Sablonok engedélyezése" ALERT_WARNING: "Figyelmeztetés!" HTML_ALERT_WEAK_PASSWORD: | - Az alapértelmezett admin jelszót használod -
      - Biztonsági okokból kérlek - változtasd meg - a jelszót valami másra! + Az alapértelmezett admin jelszót használod +
      + Biztonsági okokból kérlek + változtasd meg + a jelszót valami másra! TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Bejelentkező képernyő" LABEL_DEFAULT_DOMAIN: "Alapértelmezett domain" @@ -84,18 +84,18 @@ hu_HU: ALERT_NOTICE: "Megjegyzés!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Ne használd ezt az adatbázis típust nagy számú aktív felhasználóval." HTML_ALERT_DOES_NOT_SUPPORTED: | - A rendszer nem támogatja a címtárat. -
      - Telepítened vagy engedélyezned kell egy PDO (SQLite / MySQL / PostgreSQL) kiterjesztést a szervereden. + A rendszer nem támogatja a címtárat. +
      + Telepítened vagy engedélyezned kell egy PDO (SQLite / MySQL / PostgreSQL) kiterjesztést a szervereden. TAB_DOMAINS: LEGEND_DOMAINS: "Domainek" BUTTON_ADD_DOMAIN: "Domain hozzáadás" BUTTON_ADD_ALIAS: "Álnév hozzáadás" DELETE_ARE_YOU_SURE: "Biztos vagy benne?" HTML_DOMAINS_HELPER: | - Hozzáféréshez engedélyezett domainek listája: -
      - A domain beállításához kattints a névre. + Hozzáféréshez engedélyezett domainek listája: +
      + A domain beállításához kattints a névre. TAB_SECURITY: LEGEND_SECURITY: "Biztonság" LABEL_ALLOW_TWO_STEP: "2 lépcsős hitelesítés engedélyezése" @@ -154,7 +154,7 @@ hu_HU: HTML_ALERT_TOP_1: "RainLoop Webmail licence:" HTML_ALERT_TOP_2: "Szabadon felhasználható a személyes projektjeidhez." HTML_ALERT_TOP_3: | - A RainLoop Webmail kereskedelmi használatához (további funkciókkal) előfizetés szükséges. + A RainLoop Webmail kereskedelmi használatához (további funkciókkal) előfizetés szükséges. TYPE_PREMIUM_LIFETIME: "Örökös" LABEL_SUB_EXPIRES: "Előfizetés lejár" BUTTON_ACTIVATE: "Előfizetési kulcs aktiválása ehhez a domainhez" @@ -182,11 +182,11 @@ hu_HU: ERROR_INVALID_SUBS_KEY: "Érvénytelen előfizetési kulcs" SUBS_KEY_ACTIVATED: "Előfizetési kulcs sikeresen aktiválva" HTML_DESC: | - Aktiválás után a %DOMAIN% prémium előfizetése meg lesz hosszabbítva. -
      - Egy előfizetési kulcs csak egy domainhez aktiválható. -

      - Miután elindult, az aktiválási folyamat nem szakítható meg vagy vonható vissza. + Aktiválás után a %DOMAIN% prémium előfizetése meg lesz hosszabbítva. +
      + Egy előfizetési kulcs csak egy domainhez aktiválható. +

      + Miután elindult, az aktiválási folyamat nem szakítható meg vagy vonható vissza. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Álnév hozzáadás" LABEL_ALIAS: "Álnév" @@ -224,8 +224,8 @@ hu_HU: BUTTON_UPDATE: "Frissítés" NEW_DOMAIN_DESC: "Ez a domain konfiguráció lehetővé teszi
      a %NAME% email címek használatát." WHITE_LIST_ALERT: | - Hozzáféréshez engedélyezett domainek listája. - Elválasztáshoz használd a szóközt. + Hozzáféréshez engedélyezett domainek listája. + Elválasztáshoz használd a szóközt. POPUPS_PLUGIN: TITLE_PLUGIN: "Beépülő" DESC_NOTHING_TO_CONFIGURE: "Nincs mit beállítani" @@ -310,13 +310,13 @@ hu_HU: PHP_VERSION_ERROR_DESC: "A PHP verziód (%VERSION%) kisebb mint a minimálisan szükséges 5.3.0!" NO_SCRIPT_TITLE: "Az alkalmazáshoz JavaScript szükséges." NO_SCRIPT_DESC: | - A JavaScript támogatás nem érhető el a böngésződben. - Kérlek engedélyezd böngésződben a JavaScript támogatást, majd próbáld újra. + A JavaScript támogatás nem érhető el a böngésződben. + Kérlek engedélyezd böngésződben a JavaScript támogatást, majd próbáld újra. NO_COOKIE_TITLE: "Az alkalmazáshoz Cookie támogatásra van szükség." NO_COOKIE_DESC: | - A Cookie támogatás nem érhető el a böngésződben. - Kérlek engedélyezd böngésződben a Cookie támogatást, majd próbáld újra. + A Cookie támogatás nem érhető el a böngésződben. + Kérlek engedélyezd böngésződben a Cookie támogatást, majd próbáld újra. BAD_BROWSER_TITLE: "A böngésződ elavult." BAD_BROWSER_DESC: | - Az alkalmazás összes funkciójának használatához - tölts le és telepítsd az alábbi böngészők egyikét: + Az alkalmazás összes funkciójának használatához + tölts le és telepítsd az alábbi böngészők egyikét: diff --git a/rainloop/v/0.0.0/app/localization/admin/it_IT.yml b/rainloop/v/0.0.0/app/localization/admin/it_IT.yml index 22016ea7e..e5b381f02 100644 --- a/rainloop/v/0.0.0/app/localization/admin/it_IT.yml +++ b/rainloop/v/0.0.0/app/localization/admin/it_IT.yml @@ -36,11 +36,11 @@ it_IT: LABEL_ALLOW_TEMPLATES: "Permetti di creare template" ALERT_WARNING: "Attenzione!" HTML_ALERT_WEAK_PASSWORD: | - Stai usando la password di amministrazione predefinita. -
      - Per ragioni di sicurezza, - cambiala - con una nuova password immediatamente. + Stai usando la password di amministrazione predefinita. +
      + Per ragioni di sicurezza, + cambiala + con una nuova password immediatamente. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Schermata di accesso" LABEL_DEFAULT_DOMAIN: "Dominio predefinito" @@ -84,18 +84,18 @@ it_IT: ALERT_NOTICE: "Attenzione!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Non usare questo tipo di database con un alto numero di utenti attivi." HTML_ALERT_DOES_NOT_SUPPORTED: | - Il tuo server non supporta il salvataggio dei contatti. -
      - Devi abilitare l'estensione PDO (SQLite / MySQL / PostgreSQL) sul tuo server. + Il tuo server non supporta il salvataggio dei contatti. +
      + Devi abilitare l'estensione PDO (SQLite / MySQL / PostgreSQL) sul tuo server. TAB_DOMAINS: LEGEND_DOMAINS: "Domini" BUTTON_ADD_DOMAIN: "Aggiungi dominio" BUTTON_ADD_ALIAS: "Aggiungi alias" DELETE_ARE_YOU_SURE: "Ne sei sicuro?" HTML_DOMAINS_HELPER: | - Lista di domini a cui la webmail è abilitata ad accedere. -
      - Clicca su un nome per configurare quel dominio. + Lista di domini a cui la webmail è abilitata ad accedere. +
      + Clicca su un nome per configurare quel dominio. TAB_SECURITY: LEGEND_SECURITY: "Security" LABEL_ALLOW_TWO_STEP: "Abilita l'autenticazione a due fattori" @@ -154,8 +154,8 @@ it_IT: HTML_ALERT_TOP_1: "RainLoop Webmail è rilasciato sotto la licenza" HTML_ALERT_TOP_2: "Sei libero di usarla per i tuoi progetti personali." HTML_ALERT_TOP_3: | - L'uso commerciale (con funzionalità aggiuntive) di RainLoop Webmail richiede di ottenere una - licenza. + L'uso commerciale (con funzionalità aggiuntive) di RainLoop Webmail richiede di ottenere una + licenza. TYPE_PREMIUM_LIFETIME: "A vita" LABEL_SUB_EXPIRES: "La licenza scade il" BUTTON_ACTIVATE: "Attiva una chiave di licenza per questo dominio" @@ -183,11 +183,11 @@ it_IT: ERROR_INVALID_SUBS_KEY: "Chiave di licenza non valida" SUBS_KEY_ACTIVATED: "Chiave di licenza attivata correttamente" HTML_DESC: | - Dopo l'attivazione, la licenza Premium per %DOMAIN% sarà estesa. -
      - Una chiave di licenza può essere attivata su un solo dominio. -

      - Una volta iniziato, il processo di attivazione non potrà essere bloccato od annullato. + Dopo l'attivazione, la licenza Premium per %DOMAIN% sarà estesa. +
      + Una chiave di licenza può essere attivata su un solo dominio. +

      + Una volta iniziato, il processo di attivazione non potrà essere bloccato od annullato. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Aggiungi alias" LABEL_ALIAS: "Alias" @@ -225,8 +225,8 @@ it_IT: BUTTON_UPDATE: "Aggiorna" NEW_DOMAIN_DESC: "La configurazione di questo dominio ti permette di lavorare
      con %NAME% indirizzi email." WHITE_LIST_ALERT: | - Lista di domini a cui gli utenti sono autorizzati ad accedere. - Utilizzare uno spazio come separatore. + Lista di domini a cui gli utenti sono autorizzati ad accedere. + Utilizzare uno spazio come separatore. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Niente da configurare" @@ -314,13 +314,13 @@ it_IT: PHP_VERSION_ERROR_DESC: "La versione di PHP corrente (%VERSION%) è più vecchia di quella minima supportata (PHP 5.3.0)" NO_SCRIPT_TITLE: "Questa applicazione richiede JacaScript" NO_SCRIPT_DESC: | - Il supporto a JavaScript è disabilitato nel browser. - Abilita JavaScript e ricarica la pagina. + Il supporto a JavaScript è disabilitato nel browser. + Abilita JavaScript e ricarica la pagina. NO_COOKIE_TITLE: "Questa applicazione richiede i cookie" NO_COOKIE_DESC: | - Il supporto ai cookie è disabilitato nel browser. - Abilita i cookie e ricarica la pagina. + Il supporto ai cookie è disabilitato nel browser. + Abilita i cookie e ricarica la pagina. BAD_BROWSER_TITLE: "Il tuo browser è troppo vecchio" BAD_BROWSER_DESC: | - Per usare tutte le funzionalità dell'applicazione, - scarica ed installa uno dei seguenti browser: + Per usare tutte le funzionalità dell'applicazione, + scarica ed installa uno dei seguenti browser: diff --git a/rainloop/v/0.0.0/app/localization/admin/ja_JP.yml b/rainloop/v/0.0.0/app/localization/admin/ja_JP.yml index 4e99643eb..640e92855 100644 --- a/rainloop/v/0.0.0/app/localization/admin/ja_JP.yml +++ b/rainloop/v/0.0.0/app/localization/admin/ja_JP.yml @@ -36,11 +36,11 @@ ja_JP: LABEL_ALLOW_TEMPLATES: "テンプレートを許可する" ALERT_WARNING: "警告!" HTML_ALERT_WEAK_PASSWORD: | - デフォルトの管理者パスワードを使用しています。 -
      - セキュリティ上の理由から、いますぐパスワードを - 変更 - してください。 + デフォルトの管理者パスワードを使用しています。 +
      + セキュリティ上の理由から、いますぐパスワードを + 変更 + してください。 TAB_LOGIN: LEGEND_LOGIN_SCREEN: "ログイン画面" LABEL_DEFAULT_DOMAIN: "デフォルトドメイン" @@ -84,19 +84,19 @@ ja_JP: ALERT_NOTICE: "注意!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "アクティブユーザーの数が多いとき、このデータベース・タイプを使用しないでください。" HTML_ALERT_DOES_NOT_SUPPORTED: | - このシステムでは連絡先はサポートされていません。 -
      - サーバーへPDO (SQLite / MySQL / PostgreSQL) - 拡張モジュールのインストールが必要です。 + このシステムでは連絡先はサポートされていません。 +
      + サーバーへPDO (SQLite / MySQL / PostgreSQL) + 拡張モジュールのインストールが必要です。 TAB_DOMAINS: LEGEND_DOMAINS: "ドメイン" BUTTON_ADD_DOMAIN: "ドメインを追加" BUTTON_ADD_ALIAS: "エイリアスを追加" DELETE_ARE_YOU_SURE: "よろしいですか?" HTML_DOMAINS_HELPER: | - ドメインの一覧は、Web メールのアクセスを許可されています。 -
      - ドメインを設定するには、名前をクリックしてください。 + ドメインの一覧は、Web メールのアクセスを許可されています。 +
      + ドメインを設定するには、名前をクリックしてください。 TAB_SECURITY: LEGEND_SECURITY: "セキュリティ" LABEL_ALLOW_TWO_STEP: "2段階認証を使用する" @@ -155,8 +155,8 @@ ja_JP: HTML_ALERT_TOP_1: "RainLoop Webmail is licensed under" HTML_ALERT_TOP_2: "You are free to use it for your personal projects." HTML_ALERT_TOP_3: | - RainLoop Webmailの(付加的な機能を備えた)商業的使用は、 - サブスクリプションを取得する必要があります。 + RainLoop Webmailの(付加的な機能を備えた)商業的使用は、 + サブスクリプションを取得する必要があります。 TYPE_PREMIUM_LIFETIME: "ライフタイム" LABEL_SUB_EXPIRES: "サブスクリプションの有効期限切れ" BUTTON_ACTIVATE: "このドメインサブスクリプションキーをアクティベートする" @@ -184,11 +184,11 @@ ja_JP: ERROR_INVALID_SUBS_KEY: "無効なサブスクリプションキー" SUBS_KEY_ACTIVATED: "サブスクリプションキーのアクティベートに成功しました" HTML_DESC: | - %DOMAIN% のプレミアムサブスクリプションをアクティベートした後、拡張されます。 -
      - そのサブスクリプションキーは、1つのドメインのみアクティベートできます。 -

      - 一度アクティベーションの処理を開始すると、中止またはキャンセルすることはできません。 + %DOMAIN% のプレミアムサブスクリプションをアクティベートした後、拡張されます。 +
      + そのサブスクリプションキーは、1つのドメインのみアクティベートできます。 +

      + 一度アクティベーションの処理を開始すると、中止またはキャンセルすることはできません。 POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "エイリアスを追加" LABEL_ALIAS: "エイリアス" @@ -226,8 +226,8 @@ ja_JP: BUTTON_UPDATE: "更新" NEW_DOMAIN_DESC: "このドメイン設定を使用すると、 %NAME% メールアドレスで動作するようになります。" WHITE_LIST_ALERT: | - ドメインの一覧は、Web メールのアクセスを許可されています。 - 区切り文字としてスペースを使用してください。 + ドメインの一覧は、Web メールのアクセスを許可されています。 + 区切り文字としてスペースを使用してください。 POPUPS_PLUGIN: TITLE_PLUGIN: "プラグイン" DESC_NOTHING_TO_CONFIGURE: "何も設定されていません" @@ -309,13 +309,13 @@ ja_JP: PHP_VERSION_ERROR_DESC: "PHP バージョン (%VERSION%) が、 最低バージョンの 5.3.0 よりも低いです!" NO_SCRIPT_TITLE: "このアプリケーションでは JavaScript が必要です。" NO_SCRIPT_DESC: | - ブラウザで JavaScript が、有効になっていません。 - JavaScript を有効にして、再度試してください。 + ブラウザで JavaScript が、有効になっていません。 + JavaScript を有効にして、再度試してください。 NO_COOKIE_TITLE: "このアプリケーションでは Cookie が必要です。" NO_COOKIE_DESC: | - ブラウザで Cookie が、有効になっていません。 - Cookie を有効にして、再度試してください。 + ブラウザで Cookie が、有効になっていません。 + Cookie を有効にして、再度試してください。 BAD_BROWSER_TITLE: "お使いのブラウザが古いです。" BAD_BROWSER_DESC: | - アプリケーションのすべての機能を使用するには、 - これらのブラウザの1つをダウンロードしてインストールします: + アプリケーションのすべての機能を使用するには、 + これらのブラウザの1つをダウンロードしてインストールします: diff --git a/rainloop/v/0.0.0/app/localization/admin/lt_LT.yml b/rainloop/v/0.0.0/app/localization/admin/lt_LT.yml index 53caceff6..7a7b2300c 100644 --- a/rainloop/v/0.0.0/app/localization/admin/lt_LT.yml +++ b/rainloop/v/0.0.0/app/localization/admin/lt_LT.yml @@ -36,11 +36,11 @@ lt_LT: LABEL_ALLOW_TEMPLATES: "Leisti šablonus" ALERT_WARNING: "Dėmesio!" HTML_ALERT_WEAK_PASSWORD: |+ - Naudojate numatytąjį administratoriaus slaptažodį. -
      - Dėl Jūsų saugumo prašome - pakeiskite - slaptažodį kitu. + Naudojate numatytąjį administratoriaus slaptažodį. +
      + Dėl Jūsų saugumo prašome + pakeiskite + slaptažodį kitu. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Prisijungimo langas" @@ -85,17 +85,17 @@ lt_LT: ALERT_NOTICE: "Pastaba!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nenaudokite šio duomenų bazės tipo, jei turite daug aktyvių vartotojų" HTML_ALERT_DOES_NOT_SUPPORTED: | - Jūsų sistema nepalaiko kontaktų sąrašo. - Reikia įdiegti ar įjungti PDO (SĄLite / MySQL / PostgreSQL) plėtinius jūsų serveryje. + Jūsų sistema nepalaiko kontaktų sąrašo. + Reikia įdiegti ar įjungti PDO (SĄLite / MySQL / PostgreSQL) plėtinius jūsų serveryje. TAB_DOMAINS: LEGEND_DOMAINS: "Domenai" BUTTON_ADD_DOMAIN: "Pridėti Domeną" BUTTON_ADD_ALIAS: "Pridėti Alias" DELETE_ARE_YOU_SURE: "Ar jūs įsitikinę?" HTML_DOMAINS_HELPER: | - Leidžiamų Domenų sąrašas -
      - Spauskite ant pavadinimo norėdami redaguoti. + Leidžiamų Domenų sąrašas +
      + Spauskite ant pavadinimo norėdami redaguoti. TAB_SECURITY: LEGEND_SECURITY: "Sauga" LABEL_ALLOW_TWO_STEP: "Leisti 2-jų žingsnių patikrinimą" @@ -154,8 +154,8 @@ lt_LT: HTML_ALERT_TOP_1: "RainLoop Webmail licencijuotas" HTML_ALERT_TOP_2: "Jūs galite nemokamai naudoti savo asmeniniams projektams." HTML_ALERT_TOP_3: | - Komerciniam RainLoop Webmail naudojimui (su papildomomis galimybėmis) turite įsigyti - prenumeratą. + Komerciniam RainLoop Webmail naudojimui (su papildomomis galimybėmis) turite įsigyti + prenumeratą. TYPE_PREMIUM_LIFETIME: "Visam laikui" LABEL_SUB_EXPIRES: "Prenumerata baigiasi" BUTTON_ACTIVATE: "Aktyvuoti prenumeratos raktą šiam domenui" @@ -183,11 +183,11 @@ lt_LT: ERROR_INVALID_SUBS_KEY: "Neteisingas prenumeratos raktas" SUBS_KEY_ACTIVATED: "Prenumeratos raktas sėkmingai aktyvuotas" HTML_DESC: | - Aktyvavus premium prenumeratą, papildomos galimybės domenui %DOMAIN% bus įjungtos. -
      - Įsidėmėkite, kad prenumeratos raktas gali būti aktyvuotas tik vienam domenui. -

      - Pradėjus aktyvavimo procesą jis nebegalės būti atšauktas. + Aktyvavus premium prenumeratą, papildomos galimybės domenui %DOMAIN% bus įjungtos. +
      + Įsidėmėkite, kad prenumeratos raktas gali būti aktyvuotas tik vienam domenui. +

      + Pradėjus aktyvavimo procesą jis nebegalės būti atšauktas. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Pridėti Alias" LABEL_ALIAS: "Alias" @@ -225,8 +225,8 @@ lt_LT: BUTTON_UPDATE: "Atnaujinti" NEW_DOMAIN_DESC: "Šie nustatymai leis jums dirbti
      su %NAME% domeno pašto adresais." WHITE_LIST_ALERT: | - Domeno vartotojų sąrašas, kuriems leista naudotis web paštu. - Naudokite tarpo simbolį kaip skyriklį. + Domeno vartotojų sąrašas, kuriems leista naudotis web paštu. + Naudokite tarpo simbolį kaip skyriklį. POPUPS_PLUGIN: TITLE_PLUGIN: "Įskiepis" DESC_NOTHING_TO_CONFIGURE: "Nėra ką konfiguruoti" @@ -311,13 +311,13 @@ lt_LT: PHP_VERSION_ERROR_DESC: "Jūsų PHP versija (%VERSION%) žemesnė, nei reikalaujama 5.3.0!" NO_SCRIPT_TITLE: "Šiai aplikacijai reikalinga JavaScript." NO_SCRIPT_DESC: | - JavaScript nepalaikoma Jūsų naršyklėje. - Įjunkite JavaScript palaikymą naršyklėje ir bandykite vėl. + JavaScript nepalaikoma Jūsų naršyklėje. + Įjunkite JavaScript palaikymą naršyklėje ir bandykite vėl. NO_COOKIE_TITLE: "Slapukų palaikymas būtinas šiai aplikacijai." NO_COOKIE_DESC: | - Slapukų palaikymas negalimas jūsų naršyklėje. - Įjunkite slapukų palaikymą naršyklėje ir bandykite vėl. + Slapukų palaikymas negalimas jūsų naršyklėje. + Įjunkite slapukų palaikymą naršyklėje ir bandykite vėl. BAD_BROWSER_TITLE: "Jūsų naršyklė pasenusi." BAD_BROWSER_DESC: | - Norint naudotis visais šios aplikacijos privalumais, - parsisiųskite ir įsidiekite vieną iš šių naršyklių: + Norint naudotis visais šios aplikacijos privalumais, + parsisiųskite ir įsidiekite vieną iš šių naršyklių: diff --git a/rainloop/v/0.0.0/app/localization/admin/nb_NO.yml b/rainloop/v/0.0.0/app/localization/admin/nb_NO.yml index b15cca18e..1d4bf2454 100644 --- a/rainloop/v/0.0.0/app/localization/admin/nb_NO.yml +++ b/rainloop/v/0.0.0/app/localization/admin/nb_NO.yml @@ -36,11 +36,11 @@ nb_NO: LABEL_ALLOW_TEMPLATES: "Tillat bruk av maler" ALERT_WARNING: "Advarsel!" HTML_ALERT_WEAK_PASSWORD: | - Du bruker forvalgt admin-passord. -
      - Av sikkerhetshensyn bør du - endre - passordet umiddelbart. + Du bruker forvalgt admin-passord. +
      + Av sikkerhetshensyn bør du + endre + passordet umiddelbart. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Innloggingsskjerm" LABEL_DEFAULT_DOMAIN: "Standard-domene" @@ -84,18 +84,18 @@ nb_NO: ALERT_NOTICE: "Varsel!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Ikke bruk denne databasetypen hvis dette systemet har mange brukere." HTML_ALERT_DOES_NOT_SUPPORTED: | - Dette systemet støtter ikke kontakter. -
      - Du må installere eller slå på utvidelsen PDO (SQLite / MySQL / PostgreSQL) på tjeneren. + Dette systemet støtter ikke kontakter. +
      + Du må installere eller slå på utvidelsen PDO (SQLite / MySQL / PostgreSQL) på tjeneren. TAB_DOMAINS: LEGEND_DOMAINS: "Domener" BUTTON_ADD_DOMAIN: "Legg til domene" BUTTON_ADD_ALIAS: "Legg til alias" DELETE_ARE_YOU_SURE: "Er du sikker?" HTML_DOMAINS_HELPER: | - Liste over domener som programmet kan få tilgang til. -
      - Trykk på et navn for å sette opp domenet. + Liste over domener som programmet kan få tilgang til. +
      + Trykk på et navn for å sette opp domenet. TAB_SECURITY: LEGEND_SECURITY: "Sikkerhet" LABEL_ALLOW_TWO_STEP: "Tillat tostegsbekreftelse" @@ -154,8 +154,8 @@ nb_NO: HTML_ALERT_TOP_1: "RainLoop Webmail er utgitt på betingelsene i" HTML_ALERT_TOP_2: "Du står fritt til å bruke programmet til personlige formål." HTML_ALERT_TOP_3: | - Hvis du vil bruke RainLoop Webmail kommersielt (med ekstrafunksjoner), må du kjøpe et - abonnement. + Hvis du vil bruke RainLoop Webmail kommersielt (med ekstrafunksjoner), må du kjøpe et + abonnement. TYPE_PREMIUM_LIFETIME: "Livstid" LABEL_SUB_EXPIRES: "Abonnement utgår" BUTTON_ACTIVATE: "Ta i bruk abonnementsnøkkel for dette domenet" @@ -183,11 +183,11 @@ nb_NO: ERROR_INVALID_SUBS_KEY: "Ugyldig abonnementsnøkkel" SUBS_KEY_ACTIVATED: "Abonnementsnøkkelen er nå i bruk" HTML_DESC: | - Premium-abonnement for %DOMAIN% fonyes. -
      - Nøkkelen kan bare tas i bruk for ett domene. -

      - Du kan ikke angre på å ta en nøkkel i bruk. + Premium-abonnement for %DOMAIN% fonyes. +
      + Nøkkelen kan bare tas i bruk for ett domene. +

      + Du kan ikke angre på å ta en nøkkel i bruk. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Legg til alias" LABEL_ALIAS: "Alias" @@ -225,8 +225,8 @@ nb_NO: BUTTON_UPDATE: "Oppdater" NEW_DOMAIN_DESC: "Dette domeneoppsettet lar deg jobbe
      med e-postadresser ved %NAME%." WHITE_LIST_ALERT: | - Liste over domenebrukere som programmet skal ha tilgang til. - Hold verdier adskilt med mellomrom. + Liste over domenebrukere som programmet skal ha tilgang til. + Hold verdier adskilt med mellomrom. POPUPS_PLUGIN: TITLE_PLUGIN: "Tillegg" DESC_NOTHING_TO_CONFIGURE: "Ingenting å sette opp" @@ -311,13 +311,13 @@ nb_NO: PHP_VERSION_ERROR_DESC: "PHP-installasjonen din (%VERSION%) er eldre enn versjon 5.3.0" NO_SCRIPT_TITLE: "Dette programmet krever Javascript." NO_SCRIPT_DESC: | - Nettleseren din støtter ikke Javascript. - Slå på Javascript-støtte i nettleserens innstillinger, og prøv på nytt. + Nettleseren din støtter ikke Javascript. + Slå på Javascript-støtte i nettleserens innstillinger, og prøv på nytt. NO_COOKIE_TITLE: "Dette programmet krever støtte for informasjonskapsler («cookies»)." NO_COOKIE_DESC: | - Nettleseren din støtter ikke bruk av informasjonskapsler («cookies»). - Slå på cookie-støtte i nettleserens innstillinger, og prøv på nytt. + Nettleseren din støtter ikke bruk av informasjonskapsler («cookies»). + Slå på cookie-støtte i nettleserens innstillinger, og prøv på nytt. BAD_BROWSER_TITLE: "Nettleseren din er utdatert." BAD_BROWSER_DESC: | - Hvis du vil bruke alle funksjonene i programmet, - må du laste ned og installere en av disse nettleserne: + Hvis du vil bruke alle funksjonene i programmet, + må du laste ned og installere en av disse nettleserne: diff --git a/rainloop/v/0.0.0/app/localization/admin/nl_NL.yml b/rainloop/v/0.0.0/app/localization/admin/nl_NL.yml index 1e8da9fce..998a7e41a 100644 --- a/rainloop/v/0.0.0/app/localization/admin/nl_NL.yml +++ b/rainloop/v/0.0.0/app/localization/admin/nl_NL.yml @@ -36,10 +36,10 @@ nl_NL: LABEL_ALLOW_TEMPLATES: "Sta templates toe" ALERT_WARNING: "Waarschuwing!" HTML_ALERT_WEAK_PASSWORD: | - U gebruikt het standaard beheer wachtwoord. -
      - Wijzig - a.u.b. voor uw veiligheid direct het wachtwoord. + U gebruikt het standaard beheer wachtwoord. +
      + Wijzig + a.u.b. voor uw veiligheid direct het wachtwoord. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Inlogscherm" LABEL_DEFAULT_DOMAIN: "Standaard domein" @@ -83,18 +83,18 @@ nl_NL: ALERT_NOTICE: "Aandacht!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Gegruik deze database soort niet met een groot aantal actieve gebrukers." HTML_ALERT_DOES_NOT_SUPPORTED: | - Uw systeem ondersteund geen contactpersonen. -
      - U moet een PDO (SQLite / MySQL / PostgreSQL) extentie op uw server installeren of activeren. + Uw systeem ondersteund geen contactpersonen. +
      + U moet een PDO (SQLite / MySQL / PostgreSQL) extentie op uw server installeren of activeren. TAB_DOMAINS: LEGEND_DOMAINS: "Domeinen" BUTTON_ADD_DOMAIN: "Domein toevoegen" BUTTON_ADD_ALIAS: "Voeg alias toe" DELETE_ARE_YOU_SURE: "Weet u het zeker?" HTML_DOMAINS_HELPER: | - Lijst van toegestane domeinen. -
      - Klik op de domeinnaam om deze te configureren. + Lijst van toegestane domeinen. +
      + Klik op de domeinnaam om deze te configureren. TAB_SECURITY: LEGEND_SECURITY: "Beveiliging" LABEL_ALLOW_TWO_STEP: "2-Stap verificatie toestaan" @@ -153,7 +153,7 @@ nl_NL: HTML_ALERT_TOP_1: "RainLoop Webmail is gelicentieerd onder de" HTML_ALERT_TOP_2: "U staat u vrij om dit voor uw persoonlijk project te gebruiken." HTML_ALERT_TOP_3: | - Voor commercieel gebruik (met additionele functies) van RainLoop Webmail moet u een activatie code. + Voor commercieel gebruik (met additionele functies) van RainLoop Webmail moet u een activatie code. TYPE_PREMIUM_LIFETIME: "Levenslang" LABEL_SUB_EXPIRES: "Activatie verloopt" BUTTON_ACTIVATE: "Activeer de activatie code voor dit domein." @@ -181,11 +181,11 @@ nl_NL: ERROR_INVALID_SUBS_KEY: "Onjuiste activatie code" SUBS_KEY_ACTIVATED: "Activatie code is al succesvol geactiveerd" HTML_DESC: | - Na activatie wordt het premium abonnement voor %DOMAIN% verlengd. -
      - Let op: een activatie code kan slechts voor één domein worden gebruikt. -

      - Het activatieproces kan niet meer worden afgebroken of geannuleerd nadat het is gestart. + Na activatie wordt het premium abonnement voor %DOMAIN% verlengd. +
      + Let op: een activatie code kan slechts voor één domein worden gebruikt. +

      + Het activatieproces kan niet meer worden afgebroken of geannuleerd nadat het is gestart. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Voeg alias toe" LABEL_ALIAS: "Alias" @@ -223,8 +223,8 @@ nl_NL: BUTTON_UPDATE: "Update" NEW_DOMAIN_DESC: "Dit domein stelt u in staat om
      met %NAME% e-mail adressen te werken." WHITE_LIST_ALERT: | - Lijst van gebruikers die dit domein mogen gebruiken. - Gebruik een spatie als scheidingsteken. + Lijst van gebruikers die dit domein mogen gebruiken. + Gebruik een spatie als scheidingsteken. POPUPS_PLUGIN: TITLE_PLUGIN: "Invoegtoepassing" DESC_NOTHING_TO_CONFIGURE: "Niets om te configureren" @@ -309,13 +309,13 @@ nl_NL: PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is required for this application." NO_SCRIPT_DESC: | - JavaScript support is not available in your browser. - Please enable JavaScript support in your browser settings and retry. + JavaScript support is not available in your browser. + Please enable JavaScript support in your browser settings and retry. NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "Your browser is outdated." BAD_BROWSER_DESC: | - Om alle functies van deze applicatie te gebruiken, - download en installeer een van de volgende browsers: + Om alle functies van deze applicatie te gebruiken, + download en installeer een van de volgende browsers: diff --git a/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml b/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml index 5ab7025b3..3925ff5d7 100644 --- a/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml +++ b/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml @@ -36,11 +36,11 @@ pl_PL: LABEL_ALLOW_TEMPLATES: "Zezwól na używanie szablonów" ALERT_WARNING: "Ostrzeżenie!" HTML_ALERT_WEAK_PASSWORD: | - Korzystasz z domyślnego hasła administratora. -
      - Ze względów bezpieczeństwa, proszę - zmienić hasło - na inne. + Korzystasz z domyślnego hasła administratora. +
      + Ze względów bezpieczeństwa, proszę + zmienić hasło + na inne. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Logowanie" LABEL_DEFAULT_DOMAIN: "Domyślna domena:" @@ -84,18 +84,18 @@ pl_PL: ALERT_NOTICE: "Powiadomienie!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nie używaj tej bazy danych z dużą ilością aktywnych użytkowników." HTML_ALERT_DOES_NOT_SUPPORTED: | - Twój system nie zawiera wsparcia dla obsługi kontaktów. -
      - Musisz zainstalować lub uruchomić na serwerze jedno z rozszerzeń PDO (SQLite / MySQL / PostgreSQL). + Twój system nie zawiera wsparcia dla obsługi kontaktów. +
      + Musisz zainstalować lub uruchomić na serwerze jedno z rozszerzeń PDO (SQLite / MySQL / PostgreSQL). TAB_DOMAINS: LEGEND_DOMAINS: "Domeny" BUTTON_ADD_DOMAIN: "Dodaj domenę" BUTTON_ADD_ALIAS: "Dodaj Alias" DELETE_ARE_YOU_SURE: "Czy na pewno?" HTML_DOMAINS_HELPER: | - Lista domen, do których można uzyskać dostęp poprzez tego klienta. -
      - Kliknij na nazwę, aby skonfigurować domenę. + Lista domen, do których można uzyskać dostęp poprzez tego klienta. +
      + Kliknij na nazwę, aby skonfigurować domenę. TAB_SECURITY: LEGEND_SECURITY: "Bezpieczeństwo" LABEL_ALLOW_TWO_STEP: "Zezwól na dwuskładnikową autoryzację" @@ -154,8 +154,8 @@ pl_PL: HTML_ALERT_TOP_1: "RainLoop Webmail korzysta z licencji:" HTML_ALERT_TOP_2: "Możesz używać tego klienta za darmo, tylko dla prywatnych (własnych) projektów." HTML_ALERT_TOP_3: | - Do komercyjnego użytku (używania dodatkowych opcji) RainLoop Webmail, wymagane jest posiadanie - ważnej subskrypcji. + Do komercyjnego użytku (używania dodatkowych opcji) RainLoop Webmail, wymagane jest posiadanie + ważnej subskrypcji. TYPE_PREMIUM_LIFETIME: "Dożywotnia" LABEL_SUB_EXPIRES: "Subskrypcja wygasa:" BUTTON_ACTIVATE: "Aktywuj klucz" @@ -183,11 +183,11 @@ pl_PL: ERROR_INVALID_SUBS_KEY: "Niepoprawny klucz subskrypcji" SUBS_KEY_ACTIVATED: "Aktywowano klucz subskrypcji" HTML_DESC: | - Subskrypcja premium dla domeny: %DOMAIN%, zostanie przedłużona po aktywacji. -
      - Zwróc uwagę, że klucz subskrypcji może być aktywowany tylko dla jednej domeny. -

      - Po uruchomieniu aktywacji, nie można jej przerwac lub anulować. + Subskrypcja premium dla domeny: %DOMAIN%, zostanie przedłużona po aktywacji. +
      + Zwróc uwagę, że klucz subskrypcji może być aktywowany tylko dla jednej domeny. +

      + Po uruchomieniu aktywacji, nie można jej przerwac lub anulować. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Dodaj Alias" LABEL_ALIAS: "Alias" @@ -225,8 +225,8 @@ pl_PL: BUTTON_UPDATE: "Zaktualizuj" NEW_DOMAIN_DESC: "Konfiguracja tej domeny pozwala na pracę
      z adresami email: %NAME%" WHITE_LIST_ALERT: | - Lista użytkowników domeny, którzy mogą uzyskać dostęp poprzez tego klienta. - Użyj spacji do rozdzielenia. + Lista użytkowników domeny, którzy mogą uzyskać dostęp poprzez tego klienta. + Użyj spacji do rozdzielenia. POPUPS_PLUGIN: TITLE_PLUGIN: "Wtyczka: " DESC_NOTHING_TO_CONFIGURE: "Brak opcji do skonfigurowania" @@ -314,13 +314,13 @@ pl_PL: PHP_VERSION_ERROR_DESC: "Twoja wersja PHP: (%VERSION%), jest niższa niż minimalna: 5.3.0!" NO_SCRIPT_TITLE: "Ta aplikacja do poprawnej pracy wymaga javascript-u." NO_SCRIPT_DESC: | - Twoja przeglądarka nie obsługuje javascript-u. - Proszę o jego włączenie i ponowną próbę. + Twoja przeglądarka nie obsługuje javascript-u. + Proszę o jego włączenie i ponowną próbę. NO_COOKIE_TITLE: "Obsługa plików cookies jest wymagana dla poprawnego działania skryptu." NO_COOKIE_DESC: | - Twoja przeglądarka nie obsługuje plików cookies. - Proszę o ich włączenie i ponowną próbę. + Twoja przeglądarka nie obsługuje plików cookies. + Proszę o ich włączenie i ponowną próbę. BAD_BROWSER_TITLE: "Posiadasz nieaktualną wersję przeglądarki." BAD_BROWSER_DESC: | - W celu wykorzystania wszystkich funkcji tej aplikacji, - zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek: + W celu wykorzystania wszystkich funkcji tej aplikacji, + zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek: diff --git a/rainloop/v/0.0.0/app/localization/admin/pt_BR.yml b/rainloop/v/0.0.0/app/localization/admin/pt_BR.yml index e68f462c1..0179fb8f1 100644 --- a/rainloop/v/0.0.0/app/localization/admin/pt_BR.yml +++ b/rainloop/v/0.0.0/app/localization/admin/pt_BR.yml @@ -36,11 +36,11 @@ pt_BR: LABEL_ALLOW_TEMPLATES: "Permitir templates" ALERT_WARNING: "Aviso!" HTML_ALERT_WEAK_PASSWORD: | - Você está usando a senha administrativa padrão. -
      - Por motivo de segurança por favor - troque a senha - agora. + Você está usando a senha administrativa padrão. +
      + Por motivo de segurança por favor + troque a senha + agora. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Tela de entrada" LABEL_DEFAULT_DOMAIN: "Domínio padrão" @@ -84,18 +84,18 @@ pt_BR: ALERT_NOTICE: "Aviso!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Não use este tipo de banco de dados com um grande número de usuários ativos." HTML_ALERT_DOES_NOT_SUPPORTED: | - O seu sistema não suporta o uso dos contatos. -
      - Você precisa instalar ou habilitar a extensão PDO (SQLite / MySQL / PostgreSQL) em seu servidor. + O seu sistema não suporta o uso dos contatos. +
      + Você precisa instalar ou habilitar a extensão PDO (SQLite / MySQL / PostgreSQL) em seu servidor. TAB_DOMAINS: LEGEND_DOMAINS: "Domínios" BUTTON_ADD_DOMAIN: "Adicionar Domínio" BUTTON_ADD_ALIAS: "Adicionar apelido (Alias)" DELETE_ARE_YOU_SURE: "Você tem certeza?" HTML_DOMAINS_HELPER: | - Lista dos domínios com acesso permitido ao webmail. -
      - Clique no domínio para configurá-lo. + Lista dos domínios com acesso permitido ao webmail. +
      + Clique no domínio para configurá-lo. TAB_SECURITY: LEGEND_SECURITY: "Segurança" LABEL_ALLOW_TWO_STEP: "Permitir verificação em duas etapas (Login 2-Step)" @@ -154,8 +154,8 @@ pt_BR: HTML_ALERT_TOP_1: "RainLoop Webmail é licenciado sob" HTML_ALERT_TOP_2: "Você é livre para usá-lo em seus projetos pessoais." HTML_ALERT_TOP_3: | - Uso comercial (com recursos adicionais) do RainLoop Webmail - requer uma assinatura. + Uso comercial (com recursos adicionais) do RainLoop Webmail + requer uma assinatura. TYPE_PREMIUM_LIFETIME: "Lifetime" LABEL_SUB_EXPIRES: "A assinatura expira em" BUTTON_ACTIVATE: "Ative a chave de assinatura para este domínio" @@ -183,11 +183,11 @@ pt_BR: ERROR_INVALID_SUBS_KEY: "Chave de assinatura inválida" SUBS_KEY_ACTIVATED: "Chave de assinatura ativada com sucesso" HTML_DESC: | - Após a ativação, a assinatura premium para %DOMAIN% será extendida. -
      - Note que chave de assinatura é ativada apenas para um único domínio. -

      - Uma vez iniciado, o processo de ativação não poderá ser interrompido ou cancelado. + Após a ativação, a assinatura premium para %DOMAIN% será extendida. +
      + Note que chave de assinatura é ativada apenas para um único domínio. +

      + Uma vez iniciado, o processo de ativação não poderá ser interrompido ou cancelado. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Adicionar apelido (Alias)" LABEL_ALIAS: "Apelido (Alias)" @@ -225,8 +225,8 @@ pt_BR: BUTTON_UPDATE: "Atualizar" NEW_DOMAIN_DESC: "Esta configuração de domínio lhe permitirá trabalhar
      com endereços de e-mail do %NAME%." WHITE_LIST_ALERT: | - Filtrar com lista dos únicos usuários do domínio que terão acesso ao webmail. - Use um espaço como delimitador. + Filtrar com lista dos únicos usuários do domínio que terão acesso ao webmail. + Use um espaço como delimitador. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Nada para configurar" @@ -311,13 +311,13 @@ pt_BR: PHP_VERSION_ERROR_DESC: "Sua versão PHP (%VERSION%) é menor do que o mínimo exigido 5.3.0!" NO_SCRIPT_TITLE: "JavaScript é necessário para esta aplicação." NO_SCRIPT_DESC: | - O JavaScript não está disponível em seu navegador. - Por favor ative o suporte a JavaScript nas configurações do seu navegador e tente novamente. + O JavaScript não está disponível em seu navegador. + Por favor ative o suporte a JavaScript nas configurações do seu navegador e tente novamente. NO_COOKIE_TITLE: "É necessário suporte a cookies para esta aplicação." NO_COOKIE_DESC: | - Os Cookies não estão disponíveis em seu navegador. - Por favor ative o suporte a Cookies nas configurações do seu navegador e tente novamente. + Os Cookies não estão disponíveis em seu navegador. + Por favor ative o suporte a Cookies nas configurações do seu navegador e tente novamente. BAD_BROWSER_TITLE: "Seu navegador está desatualizado." BAD_BROWSER_DESC: | - Para usar todos os recursos do aplicativo, - baixe e instale um desses navegadores: + Para usar todos os recursos do aplicativo, + baixe e instale um desses navegadores: diff --git a/rainloop/v/0.0.0/app/localization/admin/ru_RU.yml b/rainloop/v/0.0.0/app/localization/admin/ru_RU.yml index 5c859f99b..17bfde0f3 100644 --- a/rainloop/v/0.0.0/app/localization/admin/ru_RU.yml +++ b/rainloop/v/0.0.0/app/localization/admin/ru_RU.yml @@ -26,6 +26,7 @@ ru_RU: LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Разрешить выбор языка на экране настроек" LABEL_ALLOW_THEMES_ON_SETTINGS: "Разрешить выбор темы на экране настроек" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Allow background selection on settings screen" + LABEL_NEW_FOLDER_MOVE: "Новая кнопка \"переместить в папку\"" LABEL_SHOW_THUMBNAILS: "Показывать миниатюры (для вложений)" LABEL_ALLOW_GRAVATAR: "Разрешить граватары" LEGEND_MAIN: "Основное" @@ -33,12 +34,13 @@ ru_RU: LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Разрешить дополнительные аккаунты" LABEL_ALLOW_IDENTITIES: "Разрешить множественные профили" LABEL_ALLOW_TEMPLATES: "Разрешить шаблоны" + ALERT_DATA_ACCESS: "Папка данных RainLoop доступна. Пожалуйста, настройте свой веб-сервер так, чтобы скрыть папку данных с внешнего доступа. Подробнее здесь:" ALERT_WARNING: "Внимание!" HTML_ALERT_WEAK_PASSWORD: | - Вы используете пароль администратора по умолчанию. -
      - По соображениям безопасности, пожалуйста, - измените пароль прямо сейчас. + Вы используете пароль администратора по умолчанию. +
      + По соображениям безопасности, пожалуйста, + измените пароль прямо сейчас. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Cтраница Входа" LABEL_DEFAULT_DOMAIN: "Основной домен" @@ -82,18 +84,18 @@ ru_RU: ALERT_NOTICE: "Внимание!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Не используйте этот тип базы данных с большим числом активных пользователей." HTML_ALERT_DOES_NOT_SUPPORTED: | - Ваша система не поддерживает контакты. -
      - Вам необходимо установить или включить PDO (SQLite / MySQL / PostgreSQL) расширения на вашем сервере. + Ваша система не поддерживает контакты. +
      + Вам необходимо установить или включить PDO (SQLite / MySQL / PostgreSQL) расширения на вашем сервере. TAB_DOMAINS: LEGEND_DOMAINS: "Домены" BUTTON_ADD_DOMAIN: "Добавить домен" BUTTON_ADD_ALIAS: "Добавить Алиас" DELETE_ARE_YOU_SURE: "Вы уверены?" HTML_DOMAINS_HELPER: | - Список доменов к которым разрешен доступ. -
      - Нажмите на имя, чтобы настроить домен. + Список доменов к которым разрешен доступ. +
      + Нажмите на имя, чтобы настроить домен. TAB_SECURITY: LEGEND_SECURITY: "Безопасность" LABEL_ALLOW_TWO_STEP: "Разрешить 2-шаговую проверку" @@ -152,8 +154,8 @@ ru_RU: HTML_ALERT_TOP_1: "Код RainLoop Webmail лицензирован под" HTML_ALERT_TOP_2: "Вы можете свободно использовать его в своих личных проектах." HTML_ALERT_TOP_3: | - Коммерческое использование (с дополнительными функциями) RainLoop Webmail требует получение - лицензии. + Коммерческое использование (с дополнительными функциями) RainLoop Webmail требует получение + лицензии. TYPE_PREMIUM_LIFETIME: "бесконечная" LABEL_SUB_EXPIRES: "Подписка истекает" BUTTON_ACTIVATE: "Активировать ключ для этого домена" @@ -181,11 +183,11 @@ ru_RU: ERROR_INVALID_SUBS_KEY: "Неверный ключ подписки" SUBS_KEY_ACTIVATED: "Ключ подписки активирован удачно" HTML_DESC: | - После активации премиум подписка для %DOMAIN% будет продлена. -
      - Обратите внимание, что ключ может быть активирован только один раз. -

      - После запуска процесс активации не может быть прерван или отменен. + После активации премиум подписка для %DOMAIN% будет продлена. +
      + Обратите внимание, что ключ может быть активирован только один раз. +

      + После запуска процесс активации не может быть прерван или отменен. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Добавить Алиас" LABEL_ALIAS: "Алиас" @@ -223,8 +225,8 @@ ru_RU: BUTTON_UPDATE: "Обновить" NEW_DOMAIN_DESC: "Эта конфигурация позволит вам работать
      с %NAME% адресами." WHITE_LIST_ALERT: | - Список пользователей домена к которым разрешен доступ. - Используйте пробел в качестве разделителя. + Список пользователей домена к которым разрешен доступ. + Используйте пробел в качестве разделителя. POPUPS_PLUGIN: TITLE_PLUGIN: "Плагин" DESC_NOTHING_TO_CONFIGURE: "Без настроек" @@ -309,13 +311,13 @@ ru_RU: PHP_VERSION_ERROR_DESC: "Ваша версия PHP (%VERSION%) ниже требуемой 5.3.0!" NO_SCRIPT_TITLE: "Для работы приложения необходим JavaScript." NO_SCRIPT_DESC: | - По-видимому, JavaScript либо не поддерживается вашим браузером, либо отключен. - Включите JavaScript, изменив настройки браузера, затем повторите попытку. + По-видимому, JavaScript либо не поддерживается вашим браузером, либо отключен. + Включите JavaScript, изменив настройки браузера, затем повторите попытку. NO_COOKIE_TITLE: "Для работы приложения необходимы Cookie." NO_COOKIE_DESC: | - По-видимому, Cookie либо не поддерживаются вашим браузером, либо отключены. - Включите Cookie, изменив настройки браузера, затем повторите попытку. + По-видимому, Cookie либо не поддерживаются вашим браузером, либо отключены. + Включите Cookie, изменив настройки браузера, затем повторите попытку. BAD_BROWSER_TITLE: "Ваш браузер устарел." BAD_BROWSER_DESC: | - Чтобы использовать все возможности приложения, - загрузите и установите один из этих браузеров + Чтобы использовать все возможности приложения, + загрузите и установите один из этих браузеров diff --git a/rainloop/v/0.0.0/app/localization/admin/sk_SK.yml b/rainloop/v/0.0.0/app/localization/admin/sk_SK.yml index 60ea44a4e..dfe63b1ad 100644 --- a/rainloop/v/0.0.0/app/localization/admin/sk_SK.yml +++ b/rainloop/v/0.0.0/app/localization/admin/sk_SK.yml @@ -195,10 +195,10 @@ sk_SK: PHP_VERSION_ERROR_DESC: "Vaša PHP verzia (%VERSION%) je nižšia ako minimálne vyžadovaná 5.3.0!" NO_SCRIPT_TITLE: "Táto aplikácia vyžaduje JavaScript." NO_SCRIPT_DESC: | - Váš internetový prehliadač nepodporuje JavaScript. - Prosím povoľte podporu JavaScriptu v nastaveniach vášho internetového prehliadača a skúste to znova. + Váš internetový prehliadač nepodporuje JavaScript. + Prosím povoľte podporu JavaScriptu v nastaveniach vášho internetového prehliadača a skúste to znova. NO_COOKIE_TITLE: "Táto aplikácia vyžaduje podporu Cookies." NO_COOKIE_DESC: | - Váš internetový prehliadač nepodporuje Cookies. - Prosím povoľte podporu Cookies v nastaveniach vášho internetového prehliadača a skúste to znova. + Váš internetový prehliadač nepodporuje Cookies. + Prosím povoľte podporu Cookies v nastaveniach vášho internetového prehliadača a skúste to znova. BAD_BROWSER_TITLE: "Používate zastaralý internetový prehliadač." diff --git a/rainloop/v/0.0.0/app/localization/admin/sl_SI.yml b/rainloop/v/0.0.0/app/localization/admin/sl_SI.yml index fd2c35d3f..13ef86afa 100644 --- a/rainloop/v/0.0.0/app/localization/admin/sl_SI.yml +++ b/rainloop/v/0.0.0/app/localization/admin/sl_SI.yml @@ -36,11 +36,11 @@ sl_SI: LABEL_ALLOW_TEMPLATES: "Dovoli predloge" ALERT_WARNING: "Pozor!" HTML_ALERT_WEAK_PASSWORD: | - V uporabi je privzeto geslo administratorja -
      - Iz varnostnih razlogov - spremenite - geslo v nekaj drugega. + V uporabi je privzeto geslo administratorja +
      + Iz varnostnih razlogov + spremenite + geslo v nekaj drugega. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Prijavni zaslon" LABEL_DEFAULT_DOMAIN: "Privzeta domena" @@ -84,18 +84,18 @@ sl_SI: ALERT_NOTICE: "Obvestilo!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Ta tip podatkovne baze ni priporočljiv za večje število uporabnikov." HTML_ALERT_DOES_NOT_SUPPORTED: | - Sistem ne podpira stikov. -
      - Namestite ali omogočite PDO (SQLite / MySQL / PostgreSQL) razširitev na strežniku. + Sistem ne podpira stikov. +
      + Namestite ali omogočite PDO (SQLite / MySQL / PostgreSQL) razširitev na strežniku. TAB_DOMAINS: LEGEND_DOMAINS: "Domene" BUTTON_ADD_DOMAIN: "Dodaj domeno" BUTTON_ADD_ALIAS: "Dodaj vzdevek" DELETE_ARE_YOU_SURE: "Ste prepričani?" HTML_DOMAINS_HELPER: | - Seznam domen, do katerih je omogočen dostop. -
      - Kliknite ime za konfiguracijo domene. + Seznam domen, do katerih je omogočen dostop. +
      + Kliknite ime za konfiguracijo domene. TAB_SECURITY: LEGEND_SECURITY: "Varnost" LABEL_ALLOW_TWO_STEP: "Dovoli 2-stopenjsko overjanje" @@ -154,8 +154,8 @@ sl_SI: HTML_ALERT_TOP_1: "RainLoop Webmail izdana pod licenco" HTML_ALERT_TOP_2: "Smete jo prosto in zastonj uporabljati za osebne projekte." HTML_ALERT_TOP_3: | - Za komercialno uporabo (z dodatnimi funkcijami) RainLoop Webmail je potrebno pridobiti - naročnino. + Za komercialno uporabo (z dodatnimi funkcijami) RainLoop Webmail je potrebno pridobiti + naročnino. TYPE_PREMIUM_LIFETIME: "Obdobje" LABEL_SUB_EXPIRES: "Naročnina poteče" BUTTON_ACTIVATE: "Aktiviraj naročniški ključ za to domeno" @@ -183,11 +183,11 @@ sl_SI: ERROR_INVALID_SUBS_KEY: "Neveljaven naročniški ključ" SUBS_KEY_ACTIVATED: "Naročniški ključ je bil uspešno aktiviran" HTML_DESC: | - Po aktivaciji bo premium naročnina za %DOMAIN% podaljšana. -
      - Naročniški ključ je lahko uporabljen zgolj za eno domeno. -

      - Po začetku procesa aktivacije ni mogoče prekiniti ali preklicati. + Po aktivaciji bo premium naročnina za %DOMAIN% podaljšana. +
      + Naročniški ključ je lahko uporabljen zgolj za eno domeno. +

      + Po začetku procesa aktivacije ni mogoče prekiniti ali preklicati. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Dodajanje domene" LABEL_ALIAS: "Vzdevek" @@ -225,8 +225,8 @@ sl_SI: BUTTON_UPDATE: "Posodobi" NEW_DOMAIN_DESC: "Ta konfiguiracija domene bo omogočala delo
      z %NAME% e-naslovi." WHITE_LIST_ALERT: | - Seznam uporabnikov domene, do katerih je omogočen dostop. - Uporabnike ločite s presledkom. + Seznam uporabnikov domene, do katerih je omogočen dostop. + Uporabnike ločite s presledkom. POPUPS_PLUGIN: TITLE_PLUGIN: "Vtičnik" DESC_NOTHING_TO_CONFIGURE: "Ni nastavitev za spreminjati" @@ -311,13 +311,13 @@ sl_SI: PHP_VERSION_ERROR_DESC: "Vaša PHP verzija (%VERSION%) je manjša kot potrebna 5.3.0!" NO_SCRIPT_TITLE: "Ta aplikacija potrebuje omogočen JavaScript." NO_SCRIPT_DESC: | - Brskalnik nima podpore za JavaScript. - Omogočite JavaScript v brskalniku in poskusite znova. + Brskalnik nima podpore za JavaScript. + Omogočite JavaScript v brskalniku in poskusite znova. NO_COOKIE_TITLE: "Ta aplikacije potrebuje omogočene piškotke." NO_COOKIE_DESC: | - Brskalnik nima omogočenih piškotkov. - Omogočite piškotke v brskalniku in poskusite znova. + Brskalnik nima omogočenih piškotkov. + Omogočite piškotke v brskalniku in poskusite znova. BAD_BROWSER_TITLE: "Brskalnik je zastarel." BAD_BROWSER_DESC: | - Za uporabo vseh funkcij te aplikacije - prenesite in namestite enega od teh brskalnikov: + Za uporabo vseh funkcij te aplikacije + prenesite in namestite enega od teh brskalnikov: diff --git a/rainloop/v/0.0.0/app/localization/admin/sv_SE.yml b/rainloop/v/0.0.0/app/localization/admin/sv_SE.yml index ea90928c7..fd9912cb9 100644 --- a/rainloop/v/0.0.0/app/localization/admin/sv_SE.yml +++ b/rainloop/v/0.0.0/app/localization/admin/sv_SE.yml @@ -36,11 +36,11 @@ sv_SE: LABEL_ALLOW_TEMPLATES: "Tillåt mallar" ALERT_WARNING: "Advarsel!" HTML_ALERT_WEAK_PASSWORD: | - Du använder standardlösenord. -
      - För säkerhetsskäl - ändra - lösenord till något annat + Du använder standardlösenord. +
      + För säkerhetsskäl + ändra + lösenord till något annat TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Inloggningsskärm" LABEL_DEFAULT_DOMAIN: "Standarddomän" @@ -84,18 +84,18 @@ sv_SE: ALERT_NOTICE: "Notis" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Använd inte denna typ av databas med ett stort antal aktiva användare." HTML_ALERT_DOES_NOT_SUPPORTED: | - Systemet stöder inte kontakter -
      - Du behöver installera eller aktivera SUB (SQLite/MySQL/PostgreSQL) förlängning på server. + Systemet stöder inte kontakter +
      + Du behöver installera eller aktivera SUB (SQLite/MySQL/PostgreSQL) förlängning på server. TAB_DOMAINS: LEGEND_DOMAINS: "Domäner" BUTTON_ADD_DOMAIN: "Lägg till domän" BUTTON_ADD_ALIAS: "Lägg till Alias" DELETE_ARE_YOU_SURE: "Är du säker?" HTML_DOMAINS_HELPER: | - Lista med domäner webmail tillåts access. -
      - Klicka på namnet för att konfigurera domain. + Lista med domäner webmail tillåts access. +
      + Klicka på namnet för att konfigurera domain. TAB_SECURITY: LEGEND_SECURITY: "Säkerhet" LABEL_ALLOW_TWO_STEP: "Låt 2-tvåstegsverifiering" @@ -154,8 +154,8 @@ sv_SE: HTML_ALERT_TOP_1: "RainLoop Webmail är licensierat under" HTML_ALERT_TOP_2: "Du är gratis för att använda den för dina personliga projekt." HTML_ALERT_TOP_3: | - Kommersiellt bruk (med ytterligare funktioner) av RainLoop Webmail kräver att få - prenumerations. + Kommersiellt bruk (med ytterligare funktioner) av RainLoop Webmail kräver att få + prenumerations. TYPE_PREMIUM_LIFETIME: "Livstid" LABEL_SUB_EXPIRES: "Abonnemang löper ut" BUTTON_ACTIVATE: "Aktivera prenumerationsnyckel för den här domänen" @@ -183,11 +183,11 @@ sv_SE: ERROR_INVALID_SUBS_KEY: "Ogiltig prenumerationsnyckel" SUBS_KEY_ACTIVATED: "Lyckades aktivera prenumerationsnyckel" HTML_DESC: | - Efter aktivering, premium prenumeration för %DOMAIN% kommer att förängas. -
      - Observera att prenumerationsnyckel kan aktiveras för en enda domän. -

      - När processen för aktivering har påbörjats så kan den inte avbrytas. + Efter aktivering, premium prenumeration för %DOMAIN% kommer att förängas. +
      + Observera att prenumerationsnyckel kan aktiveras för en enda domän. +

      + När processen för aktivering har påbörjats så kan den inte avbrytas. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Lägg till Alias" LABEL_ALIAS: "Alias" @@ -225,8 +225,8 @@ sv_SE: BUTTON_UPDATE: "Uppdatera" NEW_DOMAIN_DESC: "Denna domän konfiguration gör att du kan arbeta
      med %NAME% e-postadresser." WHITE_LIST_ALERT: | - Lista över domänanvändare som tillåts. - Använda ett utrymme som avgränsare. + Lista över domänanvändare som tillåts. + Använda ett utrymme som avgränsare. POPUPS_PLUGIN: TITLE_PLUGIN: "Plugin" DESC_NOTHING_TO_CONFIGURE: "Inget att konfigurera" @@ -312,13 +312,13 @@ sv_SE: PHP_VERSION_ERROR_DESC: "Din PHP version (%VERSION%) är lägre än den minimala som krävs 5.3.0!" NO_SCRIPT_TITLE: "JavaScript krävs för denna applikation." NO_SCRIPT_DESC: | - JavaScript stöd är inte tillgängligt i din webläsare. - Vänligen aktivera JavaScript stöd i din webbläsares inställningar och försök igen. + JavaScript stöd är inte tillgängligt i din webläsare. + Vänligen aktivera JavaScript stöd i din webbläsares inställningar och försök igen. NO_COOKIE_TITLE: "Cookies stöd krävs för denna applikation." NO_COOKIE_DESC: | - Cookies stöd är inte tillgängligt i din webbläsare. - Vänligen aktivera Cookie stöd i webbläsarens inställningar och försök igen. + Cookies stöd är inte tillgängligt i din webbläsare. + Vänligen aktivera Cookie stöd i webbläsarens inställningar och försök igen. BAD_BROWSER_TITLE: "Din webbläsare är föråldrad." BAD_BROWSER_DESC: | - För att kunna använda alla funktioner i ansökan, - hämta och installera en av dessa webbläsare: + För att kunna använda alla funktioner i ansökan, + hämta och installera en av dessa webbläsare: diff --git a/rainloop/v/0.0.0/app/localization/admin/zh_CN.yml b/rainloop/v/0.0.0/app/localization/admin/zh_CN.yml index c6be31350..a43c67df3 100644 --- a/rainloop/v/0.0.0/app/localization/admin/zh_CN.yml +++ b/rainloop/v/0.0.0/app/localization/admin/zh_CN.yml @@ -35,11 +35,11 @@ zh_CN: LABEL_ALLOW_TEMPLATES: "允许使用模板" ALERT_WARNING: "警告" HTML_ALERT_WEAK_PASSWORD: | - 您正在使用默认的管理员密码 -
      - 安全起见,请立即将密码 - 更改 - 为其他的字符串。 + 您正在使用默认的管理员密码 +
      + 安全起见,请立即将密码 + 更改 + 为其他的字符串。 TAB_LOGIN: LEGEND_LOGIN_SCREEN: "登陆界面" LABEL_DEFAULT_DOMAIN: "默认域名" @@ -83,18 +83,18 @@ zh_CN: ALERT_NOTICE: "提示!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "如果有大量的活跃用户,请不要选择此数据库类型." HTML_ALERT_DOES_NOT_SUPPORTED: | - 你的系统不支持联系人 -
      - 你需要在你的服务器上安装或启用PDO (SQLite / MySQL / PostgreSQL) 组件. + 你的系统不支持联系人 +
      + 你需要在你的服务器上安装或启用PDO (SQLite / MySQL / PostgreSQL) 组件. TAB_DOMAINS: LEGEND_DOMAINS: "域名" BUTTON_ADD_DOMAIN: "添加域名" BUTTON_ADD_ALIAS: "添加别名" DELETE_ARE_YOU_SURE: "你确定吗?" HTML_DOMAINS_HELPER: | - 允许访问的域。 -
      - 点击域名进行设置。 + 允许访问的域。 +
      + 点击域名进行设置。 TAB_SECURITY: LEGEND_SECURITY: "安全" LABEL_ALLOW_TWO_STEP: "允许2步验证" @@ -153,7 +153,7 @@ zh_CN: HTML_ALERT_TOP_1: "RainLoop Webmail位于的许可证下" HTML_ALERT_TOP_2: "你可以自由地将它用于你的 私人 项目." HTML_ALERT_TOP_3: | - 商业版的RainLoop Webmail自带更多功能,需要订阅。 + 商业版的RainLoop Webmail自带更多功能,需要订阅。 TYPE_PREMIUM_LIFETIME: "永久" LABEL_SUB_EXPIRES: "订阅失效" BUTTON_ACTIVATE: "为此域名启用订阅密钥" @@ -181,10 +181,10 @@ zh_CN: ERROR_INVALID_SUBS_KEY: "无效的订阅密钥" SUBS_KEY_ACTIVATED: "订阅密钥成功启用" HTML_DESC: | - 激活后,域%DOMAIN%的订阅时间将会续展。 - 请注意,订阅密匙只可用于一个域。 -

      - 激活开始后,激活过程中不可被中断或取消。 + 激活后,域%DOMAIN%的订阅时间将会续展。 + 请注意,订阅密匙只可用于一个域。 +

      + 激活开始后,激活过程中不可被中断或取消。 POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "添加别名" LABEL_ALIAS: "别名" @@ -222,8 +222,8 @@ zh_CN: BUTTON_UPDATE: "更新" NEW_DOMAIN_DESC: "此域名配置将允许你
      %NAME%电子邮件地址一起工作." WHITE_LIST_ALERT: | - 允许访问的域用户。 - 使用空格分隔。 + 允许访问的域用户。 + 使用空格分隔。 POPUPS_PLUGIN: TITLE_PLUGIN: "插件" DESC_NOTHING_TO_CONFIGURE: "无可用配置" @@ -305,13 +305,13 @@ zh_CN: PHP_VERSION_ERROR_DESC: "您的PHP版本 (%VERSION%) 低于最低所需的 5.3.0!" NO_SCRIPT_TITLE: "此应用需要JavaScript支持!" NO_SCRIPT_DESC: | - 您的浏览器不支持JavaScript。 - 请启用浏览器的JavaScript支持并重试。 + 您的浏览器不支持JavaScript。 + 请启用浏览器的JavaScript支持并重试。 NO_COOKIE_TITLE: "此应用需要Cookies支持!" NO_COOKIE_DESC: | - 您的浏览器不支持Cookies。 - 请启用浏览器的Cookies支持并重试。 + 您的浏览器不支持Cookies。 + 请启用浏览器的Cookies支持并重试。 BAD_BROWSER_TITLE: "您的浏览器过时了。" BAD_BROWSER_DESC: | - 为了使用所有特性, - 下载并安装其中一款浏览器: + 为了使用所有特性, + 下载并安装其中一款浏览器: diff --git a/rainloop/v/0.0.0/app/localization/webmail/_source.en.yml b/rainloop/v/0.0.0/app/localization/webmail/_source.en.yml index 2f16f342b..f4f17c609 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/_source.en.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/_source.en.yml @@ -144,8 +144,8 @@ en: PRINT_LABEL_SUBJECT: "Subject" PRINT_LABEL_ATTACHMENTS: "Attachments" MESSAGE_LOADING: "Loading" - MESSAGE_VIEW_DESC: "Select message in list to view it here." - MESSAGE_VIEW_MOVE_DESC: "Click on folder name at the left panel to select destination." + MESSAGE_VIEW_DESC: "Select any message in the list to view it here." + MESSAGE_VIEW_MOVE_DESC: "Click folder name in the left panel to select the destination." PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" @@ -155,11 +155,11 @@ en: LINK_SAVE_TO_DROPBOX: "Save to Dropbox" READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" - BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - - Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." - There is no guarantee that the recipient has read or understood the message contents. + BODY: | + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + + Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." + There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "Searching..." CONTACTS: @@ -176,7 +176,7 @@ en: EMPTY_LIST: "No contacts here" EMPTY_SEARCH: "No contacts found" CLEAR_SEARCH: "Clear search" - CONTACT_VIEW_DESC: "Select contact in list to view it here." + CONTACT_VIEW_DESC: "Select contact in the list to view it here." LABEL_DISPLAY_NAME: "Display name" LABEL_EMAIL: "Email" LABEL_PHONE: "Phone" @@ -365,16 +365,16 @@ en: LABEL_ARCHIVE: "Archive" BUTTON_CANCEL: "Cancel" BUTTON_CLOSE: "Close" - NOTIFICATION_SENT: | - You haven't selected "Sent" system folder messages are put to after sending. - If you don't want to save sent message, please select "Do not use" option. + NOTIFICATION_SENT: | + You haven't selected "Sent" system folder messages are put to after sending. + If you don't want to save sent message, please select "Do not use" option. NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing." - NOTIFICATION_SPAM: | - You haven't selected "Spam" system folder spamed messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. - NOTIFICATION_TRASH: | - You haven't selected "Trash" system folder deleted messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. + NOTIFICATION_SPAM: | + You haven't selected "Spam" system folder spamed messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. + NOTIFICATION_TRASH: | + You haven't selected "Trash" system folder deleted messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification (TOTP)" @@ -395,13 +395,13 @@ en: TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" - TWO_FACTOR_SECRET_DESC: > - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: > - If you can't receive codes via Google Authenticator (or other TOTP client), - you can use backup codes to sign in. After you’ve used a backup code to sign - in, it will become inactive. + TWO_FACTOR_SECRET_DESC: > + Import this info into your Google Authenticator client (or other TOTP client) + using the provided QR code below or by entering the code manually. + TWO_FACTOR_BACKUP_CODES_DESC: > + If you can't receive codes via Google Authenticator (or other TOTP client), + you can use backup codes to sign in. After you’ve used a backup code to sign + in, it will become inactive. TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." TITLES: LOADING: "Loading" @@ -642,15 +642,15 @@ en: ACCESS_ERROR: "Access error" CONNECTION_ERROR: "Can't connect to server" CAPTCHA_ERROR: "Incorrect CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. - Log in using email credentials and enable this feature in account settings. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. - Log in using email credentials and enable this feature in account settings. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - This social ID is not assigned for any email account yet. - Log in using email credentials and enable this feature in account settings. + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + This social ID is not assigned for any email account yet. Log in using email + credentials and enable this feature in account settings. DOMAIN_NOT_ALLOWED: "Domain is not allowed" ACCOUNT_NOT_ALLOWED: "Account is not allowed" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" @@ -700,14 +700,14 @@ en: PHP_EXSTENSIONS_ERROR_DESC: "Required PHP extension are not available in your PHP configuration!" PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is required for this application." - NO_SCRIPT_DESC: | - JavaScript support is not available in your browser. - Please enable JavaScript support in your browser settings and retry. + NO_SCRIPT_DESC: | + JavaScript support is not available in your browser. + Please enable JavaScript support in your browser settings and retry. NO_COOKIE_TITLE: "Cookies support is required for this application." - NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. + NO_COOKIE_DESC: | + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "Your browser is outdated." - BAD_BROWSER_DESC: | - To use all the features of the application, - download and install one of these browsers: + BAD_BROWSER_DESC: | + To use all the features of the application, + download and install one of these browsers: diff --git a/rainloop/v/0.0.0/app/localization/webmail/ar_SA.yml b/rainloop/v/0.0.0/app/localization/webmail/ar_SA.yml index 88db2a3e8..9741c6606 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/ar_SA.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/ar_SA.yml @@ -149,7 +149,7 @@ ar_SA: READ_RECEIPT: SUBJECT: "إعلام بالقراءة (تم عرضها) - %SUBJECT%" BODY: |- - هذا إعلام بأن الرسالة المرسلة قد تمت قرائتها %READ-RECEIPT%. + هذا إعلام بأن الرسالة المرسلة قد تمت قرائتها %READ-RECEIPT%. SUGGESTIONS: SEARCHING_DESC: "يتم البحث..." CONTACTS: @@ -356,15 +356,15 @@ ar_SA: BUTTON_CANCEL: "إلغاء" BUTTON_CLOSE: "إغلاق" NOTIFICATION_SENT: | - You haven't selected "Sent" system folder messages are put to after sending. - If you don't want to save sent message, please select "Do not use" option. + You haven't selected "Sent" system folder messages are put to after sending. + If you don't want to save sent message, please select "Do not use" option. NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing.\n" NOTIFICATION_SPAM: | - You haven't selected "Spam" system folder spamed messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. + You haven't selected "Spam" system folder spamed messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_TRASH: | - You haven't selected "Trash" system folder deleted messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. + You haven't selected "Trash" system folder deleted messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "التحقق الثنائي (TOTP)" @@ -685,11 +685,11 @@ ar_SA: PHP_VERSION_ERROR_DESC: "أقل من الإصدار المطلوب 5.3.0!(%VERSION%) PHP إصدار" NO_SCRIPT_TITLE: "الجافا سكريبت مطلوبة لهذا البرنامج" NO_SCRIPT_DESC: |- - إن متصفحك لايدعم الجافا سكريبت . يرجى تفعيل الدعم أو تجريب متصفح أخر + إن متصفحك لايدعم الجافا سكريبت . يرجى تفعيل الدعم أو تجريب متصفح أخر NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "متصفحك بحاجة الى تحديث" BAD_BROWSER_DESC: |- - لإصتخدام جميع ميزات هذا البرنامج يرجى تنزيل أحد المتصفحات التالية الداعمة: + لإصتخدام جميع ميزات هذا البرنامج يرجى تنزيل أحد المتصفحات التالية الداعمة: diff --git a/rainloop/v/0.0.0/app/localization/webmail/bg_BG.yml b/rainloop/v/0.0.0/app/localization/webmail/bg_BG.yml index bc422a760..53bbc3df1 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/bg_BG.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/bg_BG.yml @@ -145,19 +145,21 @@ bg_BG: PRINT_LABEL_ATTACHMENTS: "Прикрепени файлове" MESSAGE_LOADING: "Зареждане" MESSAGE_VIEW_DESC: "Изберете съобщение, за да го видите тук." + MESSAGE_VIEW_MOVE_DESC: "Изберете цел от папките в лявото поле" PGP_PASSWORD_INPUT_PLACEHOLDER: "Парола" PGP_SIGNED_MESSAGE_DESC: "Подписано с OpenPGP (кликни за проверка)" PGP_ENCRYPTED_MESSAGE_DESC: "Шифровано с OpenPGP (кликни за проверка)" LINK_DOWNLOAD_AS_ZIP: "Свали като ZIP файл" LINK_SAVE_TO_OWNCLOUD: "Запази в ownCloud" + LINK_SAVE_TO_CLOUD: "Запазване в облака" LINK_SAVE_TO_DROPBOX: "Запази в Dropbox" READ_RECEIPT: SUBJECT: "Обратна разписка (видяно) - %SUBJECT%" BODY: | - Това е обратна разписка за съобщението, което изпратихте до %READ-RECEIPT%. + Това е обратна разписка за съобщението, което изпратихте до %READ-RECEIPT%. - Note: Тази обратна разписка само указва, че съобщението е показано на компютъра на получателя. - Няма гаранция, че получателят е прочел или разбрал съдържанието на съобщението. + Note: Тази обратна разписка само указва, че съобщението е показано на компютъра на получателя. + Няма гаранция, че получателят е прочел или разбрал съдържанието на съобщението. SUGGESTIONS: SEARCHING_DESC: "Търсене..." CONTACTS: @@ -364,15 +366,15 @@ bg_BG: BUTTON_CANCEL: "Отказ" BUTTON_CLOSE: "Затвори" NOTIFICATION_SENT: | - Не сте избрали системна папка, в която изпратените съобщения "Изпратени" да бъдат съхранявани след изпращането им. - Ако нежелаете да запазвате изпратено съобщение, моля, изберете опцията "Не използвай". + Не сте избрали системна папка, в която изпратените съобщения "Изпратени" да бъдат съхранявани след изпращането им. + Ако нежелаете да запазвате изпратено съобщение, моля, изберете опцията "Не използвай". NOTIFICATION_DRAFTS: "Не сте избрали системна папка, в която съобщенията \"Чернови\" да бъдат съхранявани по време на съставянето на имейл." NOTIFICATION_SPAM: | - Не сте избрали системна папка, в която съобщенията "Спам" да бъдат поставяни. - Ако желаете да премахнете съобщенията окончателно, моля, изберете опцята "Не използвай". + Не сте избрали системна папка, в която съобщенията "Спам" да бъдат поставяни. + Ако желаете да премахнете съобщенията окончателно, моля, изберете опцята "Не използвай". NOTIFICATION_TRASH: | - Не сте избрали системна папка, в която изтритите съобщения "Отпадък" да бъдат поставяни. - Ако желаете да премахнете съобщенията окончателно, моля изберете опцията "Не използвай". + Не сте избрали системна папка, в която изтритите съобщения "Отпадък" да бъдат поставяни. + Ако желаете да премахнете съобщенията окончателно, моля изберете опцията "Не използвай". NOTIFICATION_ARCHIVE: "Не сте избрали истемна папка, в която архивираните съобщения \"Архив\" да бъдат поставяни." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Двустъпкова проверка" @@ -580,6 +582,7 @@ bg_BG: TITLE_PUBLIC: "Публичен" DELETING_ASK: "Сигурни ли сте?" GENERATE_ONLY_HTTPS: "Само през HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Автоматично запазване на чернова" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Помощ за клавишните комбинации" TAB_MAILBOX: "Пощенска кутия" @@ -698,13 +701,13 @@ bg_BG: PHP_VERSION_ERROR_DESC: "Вашата персия на PHP (%VERSION%) е по-стара от минималната 5.3.0!" NO_SCRIPT_TITLE: "За това приложение е необходим JavaScript." NO_SCRIPT_DESC: | - Поддръжката на JavaScript не е налична във вашия браузър. - Моля, разрешете поддръжката на JavaScript в настройките на вашия браузър и опитайте отново. + Поддръжката на JavaScript не е налична във вашия браузър. + Моля, разрешете поддръжката на JavaScript в настройките на вашия браузър и опитайте отново. NO_COOKIE_TITLE: "За това приложение е необходимо да се поддъжат Бисквитки." NO_COOKIE_DESC: | - Поддръжката на Бисквитки не е налична във вашия браузър. - Моля, разрешете поддръжката на Бисквитки в настройките на вашия браузър и опитайте отново. + Поддръжката на Бисквитки не е налична във вашия браузър. + Моля, разрешете поддръжката на Бисквитки в настройките на вашия браузър и опитайте отново. BAD_BROWSER_TITLE: "Вашият браузър е остарял." BAD_BROWSER_DESC: | - За да използвате всички функции на приложението, - изтеглете и инсталирайте един от тези браузъри: + За да използвате всички функции на приложението, + изтеглете и инсталирайте един от тези браузъри: diff --git a/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml b/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml index f638031f3..970aa02e6 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml @@ -153,9 +153,9 @@ cs_CZ: READ_RECEIPT: SUBJECT: "Potvrzení o zobrazení zprávy - %SUBJECT%" BODY: | - Toto je potrvzení o zaslání emailu na adresu %READ-RECEIPT%. + Toto je potrvzení o zaslání emailu na adresu %READ-RECEIPT%. - Poznámka: Toto potvrzení zajištujě, že zpráva byla zobrazena v poštovní schrnánce příjemce. Nezajišťuje, že ji příjemce čelt a rozuměl jí. + Poznámka: Toto potvrzení zajištujě, že zpráva byla zobrazena v poštovní schrnánce příjemce. Nezajišťuje, že ji příjemce čelt a rozuměl jí. SUGGESTIONS: SEARCHING_DESC: "Hledám..." CONTACTS: @@ -362,15 +362,15 @@ cs_CZ: BUTTON_CANCEL: "Zrušit" BUTTON_CLOSE: "Zavřít" NOTIFICATION_SENT: | - Nevybrali jste systémovou složku "Odeslané" kam budou uložené zprávy po jejich odeslání. - Pokud nechcete ukládat odeslané zprávy, vyberete možnost "Nepoužívat". + Nevybrali jste systémovou složku "Odeslané" kam budou uložené zprávy po jejich odeslání. + Pokud nechcete ukládat odeslané zprávy, vyberete možnost "Nepoužívat". NOTIFICATION_DRAFTS: "Nevybrali jste systémovou složku pro \"Koncepty\" kam jsou ukládány zprávy během jejich psaní." NOTIFICATION_SPAM: | - Nevybrali jste systémovou složku pro "Spam" kam je ukládána nevyžádaná pošta. - Pokud chcete tyto zprávy odstranit natrvalo, vyberte prosím možnost "Nepoužívat". + Nevybrali jste systémovou složku pro "Spam" kam je ukládána nevyžádaná pošta. + Pokud chcete tyto zprávy odstranit natrvalo, vyberte prosím možnost "Nepoužívat". NOTIFICATION_TRASH: | - Nevybrali jste systémovou složku pro "Koš" kam jsou zprávy přesunuté pro jejich odstranění. - Pokud chcete zprávy odstranit natrvalo, vyberte prosím možnost "Nepoužívat". + Nevybrali jste systémovou složku pro "Koš" kam jsou zprávy přesunuté pro jejich odstranění. + Pokud chcete zprávy odstranit natrvalo, vyberte prosím možnost "Nepoužívat". NOTIFICATION_ARCHIVE: "Nevybrali jste systémovou složku \"Archiv\", kam se ukládají archivované zprávy." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Dvoufázové ověření" @@ -692,13 +692,13 @@ cs_CZ: PHP_VERSION_ERROR_DESC: "Vaše verze PHP (%VERSION%) je nižší než požadovaná 5.3.0!" NO_SCRIPT_TITLE: "Tato aplikace vyžaduje JavaScript." NO_SCRIPT_DESC: | - Váš internetový prohlížeč nepodporuje JavaScript. - Prosím povolte podporu JavaScriptu v nastavení vašeho internetového prohlížeče a zkuste to znovu. + Váš internetový prohlížeč nepodporuje JavaScript. + Prosím povolte podporu JavaScriptu v nastavení vašeho internetového prohlížeče a zkuste to znovu. NO_COOKIE_TITLE: "Tato aplikace vyžaduje podporu Cookies." NO_COOKIE_DESC: | - Váš internetový prohlížeč nepodporuje Cookies. - Prosím povolte podporu Cookies v nastavení vašeho internetového prohlížeče a zkuste to znovu. + Váš internetový prohlížeč nepodporuje Cookies. + Prosím povolte podporu Cookies v nastavení vašeho internetového prohlížeče a zkuste to znovu. BAD_BROWSER_TITLE: "Používáte zastaralý internetový prohlížeč." BAD_BROWSER_DESC: | - Abyste mohli využívat všechny funkcie této aplikace, - použijte některý z následujících internetových prohlížečů: + Abyste mohli využívat všechny funkcie této aplikace, + použijte některý z následujících internetových prohlížečů: diff --git a/rainloop/v/0.0.0/app/localization/webmail/da_DK.yml b/rainloop/v/0.0.0/app/localization/webmail/da_DK.yml index 772593989..25afb6f62 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/da_DK.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/da_DK.yml @@ -155,10 +155,10 @@ da_DK: READ_RECEIPT: SUBJECT: "Kvittering for læsning af - %SUBJECT%" BODY: | - Kvittering for læsning af %READ-RECEIPT%. + Kvittering for læsning af %READ-RECEIPT%. - Bemærk: "Dette bekræfter bare at meddelelsen er blevet vist på modtagerens computer." - Der er ingen garanti for at modtager har læst meddelelsen. + Bemærk: "Dette bekræfter bare at meddelelsen er blevet vist på modtagerens computer." + Der er ingen garanti for at modtager har læst meddelelsen. SUGGESTIONS: SEARCHING_DESC: "Søger..." CONTACTS: @@ -365,13 +365,13 @@ da_DK: BUTTON_CANCEL: "Annuller" BUTTON_CLOSE: "Luk" NOTIFICATION_SENT: | - Du har ikke valgt en systemmappe til sendte meddelelser. + Du har ikke valgt en systemmappe til sendte meddelelser. NOTIFICATION_DRAFTS: "Du har ikke valgt en systemmappe til kladder." NOTIFICATION_SPAM: | - Du har ikke valgt en systemmappe til uønskede meddelelser. + Du har ikke valgt en systemmappe til uønskede meddelelser. NOTIFICATION_TRASH: | - Du har ikke valgt en systemmappe til slettede meddelelser. - Hvis du vil slette meddelelser permanent, vælg "Brug ikke". + Du har ikke valgt en systemmappe til slettede meddelelser. + Hvis du vil slette meddelelser permanent, vælg "Brug ikke". NOTIFICATION_ARCHIVE: "Du har ikke valgt en systemmappe til arkiverede meddelelser." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-trins verifikation (TOTP)" @@ -579,6 +579,7 @@ da_DK: TITLE_PUBLIC: "Offentlig" DELETING_ASK: "Er du sikker?" GENERATE_ONLY_HTTPS: "Kun HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Gem kladde automatisk" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Hjælp til tasteturgenveje" TAB_MAILBOX: "Postkasse" @@ -697,13 +698,13 @@ da_DK: PHP_VERSION_ERROR_DESC: "PHP versionen (%VERSION%) er for gammel. Minimum 5.3.0 er nødvendig!" NO_SCRIPT_TITLE: "JavaScript er nødvendigt for dette program." NO_SCRIPT_DESC: | - JavaScript er slået fra i din browser. - Slå JavaScript til og prøv igen. + JavaScript er slået fra i din browser. + Slå JavaScript til og prøv igen. NO_COOKIE_TITLE: "Cookies er nødvendige for dette program." NO_COOKIE_DESC: | - Cookies er slået fra i din browser. - Slå Cookies til og prøv igen. + Cookies er slået fra i din browser. + Slå Cookies til og prøv igen. BAD_BROWSER_TITLE: "Din browser er forældet." BAD_BROWSER_DESC: | - Enkelte funktioner fungerer ikke med denne browser. - For at bruge alle funktioner, hent en af følgende: + Enkelte funktioner fungerer ikke med denne browser. + For at bruge alle funktioner, hent en af følgende: diff --git a/rainloop/v/0.0.0/app/localization/webmail/de_DE.yml b/rainloop/v/0.0.0/app/localization/webmail/de_DE.yml index 2aec0ea97..2ca96aa36 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/de_DE.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/de_DE.yml @@ -155,10 +155,10 @@ de_DE: READ_RECEIPT: SUBJECT: "Empfangsbestätigung (angezeigt) - %SUBJECT%" BODY: | - Dies ist eine Empfangsbestätigung für die Nachricht, die Sie an %READ-RECEIPT% gesendet haben. + Dies ist eine Empfangsbestätigung für die Nachricht, die Sie an %READ-RECEIPT% gesendet haben. - Hinweis: Diese Empfangsbestätigung bestätigt nur, dass die Nachricht auf dem Computer des Empfängers angezeigt wurde. - Es besteht keine Garantie, dass der Empfänger den Inhalt der Nachricht gelesen oder verstanden hat. + Hinweis: Diese Empfangsbestätigung bestätigt nur, dass die Nachricht auf dem Computer des Empfängers angezeigt wurde. + Es besteht keine Garantie, dass der Empfänger den Inhalt der Nachricht gelesen oder verstanden hat. SUGGESTIONS: SEARCHING_DESC: "Suche läuft..." CONTACTS: @@ -365,15 +365,15 @@ de_DE: BUTTON_CANCEL: "Abbrechen" BUTTON_CLOSE: "Schließen" NOTIFICATION_SENT: | - Sie haben keinen "Gesendet"-Systemordner gewählt, in dem Nachrichten nach dem Versenden gespeichert werden. - Falls Sie versandte Nachrichten nicht speichern möchten, wählen Sie die Option "Nicht anwenden". + Sie haben keinen "Gesendet"-Systemordner gewählt, in dem Nachrichten nach dem Versenden gespeichert werden. + Falls Sie versandte Nachrichten nicht speichern möchten, wählen Sie die Option "Nicht anwenden". NOTIFICATION_DRAFTS: "Sie haben keinen \"Entwürfe\"-Systemordner gewählt, in dem Nachrichten beim Erstellen gespeichert werden." NOTIFICATION_SPAM: | - Sie haben keinen "Spam"-Systemordner gewählt, in dem die Spam-Nachrichten abgelegt werden. - Falls Sie Spam-Nachrichten endgültig löschen möchten, wählen Sie die Option "Nicht anwenden". + Sie haben keinen "Spam"-Systemordner gewählt, in dem die Spam-Nachrichten abgelegt werden. + Falls Sie Spam-Nachrichten endgültig löschen möchten, wählen Sie die Option "Nicht anwenden". NOTIFICATION_TRASH: | - Sie haben keinen "Papierkorb"-Systemordner gewählt, in dem die gelöschten Nachrichten abgelegt werden. - Falls Sie gelöschte Nachrichten endgültig löschen möchten, wählen Sie die Option "Nicht anwenden". + Sie haben keinen "Papierkorb"-Systemordner gewählt, in dem die gelöschten Nachrichten abgelegt werden. + Falls Sie gelöschte Nachrichten endgültig löschen möchten, wählen Sie die Option "Nicht anwenden". NOTIFICATION_ARCHIVE: "Sie haben keinen \"Archiv\"-Systemordner gewählt, in dem die archivierten Nachrichten abgelegt werden." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Zwei-Faktor-Authentifizierung" @@ -703,13 +703,13 @@ de_DE: PHP_VERSION_ERROR_DESC: "Ihre PHP Version (%VERSION%) ist älter als die notwendige Version: 5.3.0!" NO_SCRIPT_TITLE: "Diese Anwendung benötigt JavaScript." NO_SCRIPT_DESC: | - Ihr Browser unterstützt JavaScript nicht. - Aktivieren Sie bitte die JavaScript-Unterstützung in Ihrem Browser und versuchen Sie es erneut. + Ihr Browser unterstützt JavaScript nicht. + Aktivieren Sie bitte die JavaScript-Unterstützung in Ihrem Browser und versuchen Sie es erneut. NO_COOKIE_TITLE: "Diese Anwendung benötigt Cookies." NO_COOKIE_DESC: | - Ihr Browser unterstützt Cookies nicht. - Aktivieren Sie bitte die Cookie-Unterstützung in Ihrem Browser und versuchen Sie es erneut. + Ihr Browser unterstützt Cookies nicht. + Aktivieren Sie bitte die Cookie-Unterstützung in Ihrem Browser und versuchen Sie es erneut. BAD_BROWSER_TITLE: "Ihr Browser ist veraltet." BAD_BROWSER_DESC: | - Um alle Funktionen dieser Anwendung nutzen zu können, - sollten Sie einen der folgenden Browser herunterladen und installieren + Um alle Funktionen dieser Anwendung nutzen zu können, + sollten Sie einen der folgenden Browser herunterladen und installieren diff --git a/rainloop/v/0.0.0/app/localization/webmail/el_GR.yml b/rainloop/v/0.0.0/app/localization/webmail/el_GR.yml index 06698fa57..1a190bc8b 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/el_GR.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/el_GR.yml @@ -149,10 +149,10 @@ el_GR: READ_RECEIPT: SUBJECT: "Αποδεικτικό Ανάγνωσης (παρουσιάστηκε) - %SUBJECT%" BODY: | - Αυτή είναι ένα αποδεικτικό ανάγωσης από το μήνυμα που στείλατε προς %READ-RECEIPT%. + Αυτή είναι ένα αποδεικτικό ανάγωσης από το μήνυμα που στείλατε προς %READ-RECEIPT%. - Παρατήρηση: "Αυτή το αποδεικτικό ανάγνωσης είναι απλώς μια ένδειξη ότι το μήνυμα παρουσιάστηκε στον υπολογιστή του παραλήπτη." - Δεν υπάρχει καμία εγγύηση πως ο παραλήπτης διάβασε ή κατανόησε το περιεχόμενο του μηνύματος. + Παρατήρηση: "Αυτή το αποδεικτικό ανάγνωσης είναι απλώς μια ένδειξη ότι το μήνυμα παρουσιάστηκε στον υπολογιστή του παραλήπτη." + Δεν υπάρχει καμία εγγύηση πως ο παραλήπτης διάβασε ή κατανόησε το περιεχόμενο του μηνύματος. SUGGESTIONS: SEARCHING_DESC: "Αναζήτηση..." CONTACTS: @@ -359,15 +359,15 @@ el_GR: BUTTON_CANCEL: "Ακύρωση" BUTTON_CLOSE: "Κλείσιμο" NOTIFICATION_SENT: | - Δεν έχετε επιλέξει το φάκελο συστήματος "Απεσταλμένα" όπου θα τοποθετούνται τα μηνύματα μετά την αποστολή. - Αν δεν θέλετε να σώσετε τα απεσταλμένα μηνύματα, παρακαλώ επιλέξτε "Μην το χρησιμοποιείς". + Δεν έχετε επιλέξει το φάκελο συστήματος "Απεσταλμένα" όπου θα τοποθετούνται τα μηνύματα μετά την αποστολή. + Αν δεν θέλετε να σώσετε τα απεσταλμένα μηνύματα, παρακαλώ επιλέξτε "Μην το χρησιμοποιείς". NOTIFICATION_DRAFTS: "Δεν έχετε επιλέξει το φάκελο συστήματος \"Πρόχειρα\" όπου θα σώζονται τα μηνύματα κατά τη σύνθεσή τους." NOTIFICATION_SPAM: | - Δεν έχετε επιλέξει το φάκελο συστήματος "Ανεπιθύμητα" όπου θα τοποθετούνται τα ανεπιθύμητα μηνύματα. - Αν θέλετε να απορρίπτονται τα μηνύματα οριστικά, παρακαλώ επιλέξτε "Μην τον χρησιμοποιείς". + Δεν έχετε επιλέξει το φάκελο συστήματος "Ανεπιθύμητα" όπου θα τοποθετούνται τα ανεπιθύμητα μηνύματα. + Αν θέλετε να απορρίπτονται τα μηνύματα οριστικά, παρακαλώ επιλέξτε "Μην τον χρησιμοποιείς". NOTIFICATION_TRASH: | - Δεν έχετε επιλέξει τα φάκελο συστήματος "Απορρίμματα" όπου θα τοποθετούνται τα διαγραμμένα μηνύματα. - Αν επιθυμείτε να απορρίπτονται τα μηνύματα οριστικά, παρακαλώ επιλέξτε "Μην το χρησιμοποιείς". + Δεν έχετε επιλέξει τα φάκελο συστήματος "Απορρίμματα" όπου θα τοποθετούνται τα διαγραμμένα μηνύματα. + Αν επιθυμείτε να απορρίπτονται τα μηνύματα οριστικά, παρακαλώ επιλέξτε "Μην το χρησιμοποιείς". NOTIFICATION_ARCHIVE: "Δεν έχετε επιλέξει το φάκελο συστήματος \"Αρχείο\" όπου θα τοποθετούνται τα αρχειοθετημένα μηνύματα." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Επαλήθευση 2 επιπέδων (TOTP)" diff --git a/rainloop/v/0.0.0/app/localization/webmail/en_GB.yml b/rainloop/v/0.0.0/app/localization/webmail/en_GB.yml index ab8c2f155..fb777f9dc 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/en_GB.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/en_GB.yml @@ -17,6 +17,9 @@ en_GB: BUTTON_SETTINGS: "Settings" BUTTON_HELP: "Help" BUTTON_LOGOUT: "Logout" + MOBILE: + BUTTON_MOBILE_VERSION: "Mobile version" + BUTTON_DESKTOP_VERSION: "Desktop version" SEARCH: MAIN_INPUT_PLACEHOLDER: "Search" TITLE_ADV: "Advanced Search" @@ -99,6 +102,7 @@ en_GB: BUTTON_BACK: "Back" BUTTON_CLOSE: "Close" BUTTON_DELETE: "Delete" + BUTTON_UNSUBSCRIBE: "Unsubscribe from this list" BUTTON_ARCHIVE: "Archive" BUTTON_SPAM: "Spam" BUTTON_NOT_SPAM: "Not Spam" @@ -140,20 +144,22 @@ en_GB: PRINT_LABEL_SUBJECT: "Subject" PRINT_LABEL_ATTACHMENTS: "Attachments" MESSAGE_LOADING: "Loading" - MESSAGE_VIEW_DESC: "Select message in list to view it here." + MESSAGE_VIEW_DESC: "Select any message in the list to view it here." + MESSAGE_VIEW_MOVE_DESC: "Click folder name in the left panel to select the destination." PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" LINK_DOWNLOAD_AS_ZIP: "Download as zip" LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" + LINK_SAVE_TO_CLOUD: "Save to Cloud" LINK_SAVE_TO_DROPBOX: "Save to Dropbox" READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." - There is no guarantee that the recipient has read or understood the message contents. + Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." + There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "Searching..." CONTACTS: @@ -170,7 +176,7 @@ en_GB: EMPTY_LIST: "No contacts here" EMPTY_SEARCH: "No contacts found" CLEAR_SEARCH: "Clear search" - CONTACT_VIEW_DESC: "Select contact in list to view it here." + CONTACT_VIEW_DESC: "Select contact in the list to view it here." LABEL_DISPLAY_NAME: "Display name" LABEL_EMAIL: "Email" LABEL_PHONE: "Phone" @@ -360,15 +366,15 @@ en_GB: BUTTON_CANCEL: "Cancel" BUTTON_CLOSE: "Close" NOTIFICATION_SENT: | - You haven't selected "Sent" system folder messages are put to after sending. - If you don't want to save sent message, please select "Do not use" option. + You haven't selected "Sent" system folder messages are put to after sending. + If you don't want to save sent message, please select "Do not use" option. NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing." NOTIFICATION_SPAM: | - You haven't selected "Spam" system folder spamed messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. + You haven't selected "Spam" system folder spamed messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_TRASH: | - You haven't selected "Trash" system folder deleted messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. + You haven't selected "Trash" system folder deleted messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification (TOTP)" @@ -412,6 +418,7 @@ en_GB: ERROR_FILE_TYPE: "Invalid file type" ERROR_UNKNOWN: "An unknown file upload error occurred" EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "Rich formatting" TEXT_SWITCHER_CONFIRM: "Text formatting and images will be lost. Are you sure you want to continue?" SETTINGS_LABELS: @@ -458,6 +465,7 @@ en_GB: LABEL_AUTOLOGOUT: "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME: "Never" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hour(s)" SETTINGS_GENERAL: LEGEND_GENERAL: "General" LABEL_LANGUAGE: "Language" @@ -523,6 +531,7 @@ en_GB: SETTINGS_FOLDERS: LEGEND_FOLDERS: "Folder List" BUTTON_CREATE: "Create Folder" + BUTTON_SYSTEM: "System Folders" BUTTON_DELETE: "Delete" BUTTON_SUBSCRIBE: "Subscribe" BUTTON_UNSUBSCRIBE: "Unsubscribe" @@ -573,6 +582,7 @@ en_GB: TITLE_PUBLIC: "Public" DELETING_ASK: "Are you sure?" GENERATE_ONLY_HTTPS: "HTTPS only" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatically save draft" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" TAB_MAILBOX: "Mailbox" @@ -691,13 +701,13 @@ en_GB: PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is required for this application." NO_SCRIPT_DESC: | - JavaScript support is not available in your browser. - Please enable JavaScript support in your browser settings and retry. + JavaScript support is not available in your browser. + Please enable JavaScript support in your browser settings and retry. NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "Your browser is outdated." BAD_BROWSER_DESC: | - To use all the features of the application, - download and install one of these browsers: + To use all the features of the application, + download and install one of these browsers: diff --git a/rainloop/v/0.0.0/app/localization/webmail/en_US.yml b/rainloop/v/0.0.0/app/localization/webmail/en_US.yml index 94ee84875..1ded9fc48 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/en_US.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/en_US.yml @@ -144,20 +144,22 @@ en_US: PRINT_LABEL_SUBJECT: "Subject" PRINT_LABEL_ATTACHMENTS: "Attachments" MESSAGE_LOADING: "Loading" - MESSAGE_VIEW_DESC: "Select message in list to view it here." + MESSAGE_VIEW_DESC: "Select any message in the list to view it here." + MESSAGE_VIEW_MOVE_DESC: "Click folder name in the left panel to select the destination." PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" LINK_DOWNLOAD_AS_ZIP: "Download as zip" LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" + LINK_SAVE_TO_CLOUD: "Save to Cloud" LINK_SAVE_TO_DROPBOX: "Save to Dropbox" READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." - There is no guarantee that the recipient has read or understood the message contents. + Note: "This Return Receipt only acknowledges that the message was displayed on the recipient's computer." + There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "Searching..." CONTACTS: @@ -174,7 +176,7 @@ en_US: EMPTY_LIST: "No contacts here" EMPTY_SEARCH: "No contacts found" CLEAR_SEARCH: "Clear search" - CONTACT_VIEW_DESC: "Select contact in list to view it here." + CONTACT_VIEW_DESC: "Select contact in the list to view it here." LABEL_DISPLAY_NAME: "Display name" LABEL_EMAIL: "Email" LABEL_PHONE: "Phone" @@ -364,15 +366,15 @@ en_US: BUTTON_CANCEL: "Cancel" BUTTON_CLOSE: "Close" NOTIFICATION_SENT: | - You haven't selected "Sent" system folder messages are put to after sending. - If you don't want to save sent message, please select "Do not use" option. + You haven't selected "Sent" system folder messages are put to after sending. + If you don't want to save sent message, please select "Do not use" option. NOTIFICATION_DRAFTS: "You haven't selected \"Drafts\" system folder messages are saved to while composing." NOTIFICATION_SPAM: | - You haven't selected "Spam" system folder spamed messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. + You haven't selected "Spam" system folder spamed messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_TRASH: | - You haven't selected "Trash" system folder deleted messages are placed to. - If you wish to remove messages permanently, please select "Do not use" option. + You haven't selected "Trash" system folder deleted messages are placed to. + If you wish to remove messages permanently, please select "Do not use" option. NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification (TOTP)" @@ -580,6 +582,7 @@ en_US: TITLE_PUBLIC: "Public" DELETING_ASK: "Are you sure?" GENERATE_ONLY_HTTPS: "HTTPS only" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatically save draft" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" TAB_MAILBOX: "Mailbox" @@ -698,13 +701,13 @@ en_US: PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is required for this application." NO_SCRIPT_DESC: | - JavaScript support is not available in your browser. - Please enable JavaScript support in your browser settings and retry. + JavaScript support is not available in your browser. + Please enable JavaScript support in your browser settings and retry. NO_COOKIE_TITLE: "Cookies support is required for this application." NO_COOKIE_DESC: | - Cookies support is not available in your browser. - Please enable Cookie support in your browser settings and retry. + Cookies support is not available in your browser. + Please enable Cookie support in your browser settings and retry. BAD_BROWSER_TITLE: "Your browser is outdated." BAD_BROWSER_DESC: | - To use all the features of the application, - download and install one of these browsers: + To use all the features of the application, + download and install one of these browsers: diff --git a/rainloop/v/0.0.0/app/localization/webmail/es_ES.yml b/rainloop/v/0.0.0/app/localization/webmail/es_ES.yml index 4388175d3..2dd795bbc 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/es_ES.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/es_ES.yml @@ -33,12 +33,12 @@ es_ES: LABEL_ADV_UNSEEN: "No leído" LABEL_ADV_DATE: "Fecha" LABEL_ADV_DATE_ALL: "Todo" - LABEL_ADV_DATE_3_DAYS: "Hasta 3 días de antiguedad" - LABEL_ADV_DATE_7_DAYS: "Hasta una semana de antiguedad" - LABEL_ADV_DATE_MONTH: "Hasta 1 mes de antiguedad" - LABEL_ADV_DATE_3_MONTHS: "Hasta 3 meses de antiguedad" - LABEL_ADV_DATE_6_MONTHS: "Hasta 6 meses de antiguedad" - LABEL_ADV_DATE_YEAR: "Hasta 1 año de antiguedad" + LABEL_ADV_DATE_3_DAYS: "Hasta 3 días de antigüedad" + LABEL_ADV_DATE_7_DAYS: "Hasta una semana de antigüedad" + LABEL_ADV_DATE_MONTH: "Hasta 1 mes de antigüedad" + LABEL_ADV_DATE_3_MONTHS: "Hasta 3 meses de antigüedad" + LABEL_ADV_DATE_6_MONTHS: "Hasta 6 meses de antigüedad" + LABEL_ADV_DATE_YEAR: "Hasta 1 año de antigüedad" BUTTON_ADV_SEARCH: "Buscar" PREVIEW_POPUP: FULLSCREEN: "Cambiar a pantalla completa" @@ -116,7 +116,7 @@ es_ES: BUTTON_SHOW_IMAGES: "Mostrar imágenes externas" BUTTON_NOTIFY_READ_RECEIPT: "El remitente ha pedido que se le notifique cuando lea este mensaje." BUTTON_IN_NEW_WINDOW: "Ver en una ventana nueva" - BUTTON_THREAD_LIST: "Thread list" + BUTTON_THREAD_LIST: "Hilo" BUTTON_THREAD_PREV: "Anterior" BUTTON_THREAD_NEXT: "Siguiente" BUTTON_THREAD_MORE: "Más mensajes" @@ -144,7 +144,8 @@ es_ES: PRINT_LABEL_SUBJECT: "Asunto" PRINT_LABEL_ATTACHMENTS: "Adjuntos" MESSAGE_LOADING: "Cargando" - MESSAGE_VIEW_DESC: "Seleccione un mensaje en la lista para verlo aquí." + MESSAGE_VIEW_DESC: "Seleccione un mensaje de la lista para verlo aquí." + MESSAGE_VIEW_MOVE_DESC: "Haga clic en el nombre de la carpeta del panel izquierdo para seleccionar el destino." PGP_PASSWORD_INPUT_PLACEHOLDER: "Contraseña" PGP_SIGNED_MESSAGE_DESC: "Mensaje firmado mediante OpenPGP (click para verificar)" PGP_ENCRYPTED_MESSAGE_DESC: "Mensaje cifrado mediante OpenPGP (click para desencriptar)" @@ -154,10 +155,10 @@ es_ES: READ_RECEIPT: SUBJECT: "Acuse de recibo (se visualiza) - %SUBJECT%" BODY: | - Esta es una confirmación del correo que usted envió a %READ-RECEIPT%. + Esta es una confirmación del correo que usted envió a %READ-RECEIPT%. - Nota: Este acuse de recibo sólo reconoce que el mensaje se muestra en el ordenador del receptor. - No hay garantía de que el destinatario ha leído o entendido el contenido del mensaje. + Nota: Este acuse de recibo sólo reconoce que el mensaje se muestra en el ordenador del receptor. + No hay garantía de que el destinatario ha leído o entendido el contenido del mensaje. SUGGESTIONS: SEARCHING_DESC: "Buscando..." CONTACTS: @@ -174,7 +175,7 @@ es_ES: EMPTY_LIST: "No hay contactos aquí" EMPTY_SEARCH: "No se encontraron contactos" CLEAR_SEARCH: "Limpiar búsqueda" - CONTACT_VIEW_DESC: "Seleccionar un contacto en la lista para verlo aquí." + CONTACT_VIEW_DESC: "Seleccionar un contacto de la lista para verlo aquí." LABEL_DISPLAY_NAME: "Nombre a visualizar" LABEL_EMAIL: "Correo Electrónico" LABEL_PHONE: "Teléfono" @@ -330,28 +331,28 @@ es_ES: SELECT_FIELD_SUBJECT: "Asunto" SELECT_FIELD_HEADER: "Encabezado" SELECT_FIELD_SIZE: "Tamaño" - SELECT_TYPE_CONTAINS: "Contains" - SELECT_TYPE_NOT_CONTAINS: "Not Contains" - SELECT_TYPE_MATCHES: "Matches (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" + SELECT_TYPE_CONTAINS: "Contiene" + SELECT_TYPE_NOT_CONTAINS: "No Contiene" + SELECT_TYPE_MATCHES: "Coincide (* and ? supported)" + SELECT_TYPE_NOT_MATCHES: "No Coindide (* and ? supported)" SELECT_TYPE_REGEXP: "Regexp" SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Equal To" - SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Matching any of the following rules" - SELECT_MATCH_ALL: "Matching all of the following rules" - MARK_AS_READ_LABEL: "Mark as read" - REPLY_INTERVAL_LABEL: "Reply interval (days)" - KEEP_LABEL: "Keep" + SELECT_TYPE_EQUAL_TO: "Igual A" + SELECT_TYPE_NOT_EQUAL_TO: "Distinto De" + SELECT_TYPE_OVER: "Por Encima" + SELECT_TYPE_UNDER: "Por Debajo" + SELECT_MATCH_ANY: "Si coincide alguna de estas reglas" + SELECT_MATCH_ALL: "Si coinciden todas las reglas" + MARK_AS_READ_LABEL: "Marcar como leído" + REPLY_INTERVAL_LABEL: "Intervalo de respuesta (días)" + KEEP_LABEL: "Mantener" STOP_LABEL: "Don't stop processing rules" EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Subject (optional)" - VACATION_MESSAGE_LABEL: "Message" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Reject message" - ALL_INCOMING_MESSAGES_DESC: "All incoming messages" + VACATION_SUBJECT_LABEL: "Asunto (opcional)" + VACATION_MESSAGE_LABEL: "Mensaje" + VACATION_RECIPIENTS_LABEL: "Destinatarios (separados por coma)" + REJECT_MESSAGE_LABEL: "Rechazar mensaje" + ALL_INCOMING_MESSAGES_DESC: "Todos los mensajes entrantes" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Seleccione las carpetas del sistema" SELECT_CHOOSE_ONE: "Elija una" @@ -364,15 +365,15 @@ es_ES: BUTTON_CANCEL: "Cancelar" BUTTON_CLOSE: "Cerrar" NOTIFICATION_SENT: | - Usted no ha seleccionado la carpeta del sistema para guardar los "Enviados". - Si no desea guardar los mensajes enviados, por favor seleccione la opción "No usar". + Usted no ha seleccionado la carpeta del sistema para guardar los "Enviados". + Si no desea guardar los mensajes enviados, por favor seleccione la opción "No usar". NOTIFICATION_DRAFTS: "Usted no ha seleccionado la carpeta del sistema para guardar los \"Borradores\"." NOTIFICATION_SPAM: | - Usted no ha seleccionado la carpeta del sistema para alojar los mensajes marcados como "Spam". - Si desea eliminar los mensajes permanentemente, por favor seleccione la opción "No usar". + Usted no ha seleccionado la carpeta del sistema para alojar los mensajes marcados como "Spam". + Si desea eliminar los mensajes permanentemente, por favor seleccione la opción "No usar". NOTIFICATION_TRASH: | - Usted no ha seleccionado la carpeta del sistema para alojar los mensajes enviados a la "Papelera" . - Si desea eliminar los mensajes permanentemente, por favor seleccione la opción "No usar". + Usted no ha seleccionado la carpeta del sistema para alojar los mensajes enviados a la "Papelera" . + Si desea eliminar los mensajes permanentemente, por favor seleccione la opción "No usar". NOTIFICATION_ARCHIVE: "Usted no ha seleccionado la carpeta del sistema para alojar los mensajes enviados al \"Archivo\"." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Verificación de 2 Pasos" @@ -385,12 +386,12 @@ es_ES: BUTTON_ACTIVATE: "Activate" BUTTON_CLEAR: "Borrar" BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" + BUTTON_DONE: "Hecho" BUTTON_TEST: "Probar" - LINK_TEST: "test" + LINK_TEST: "probar" BUTTON_SHOW_SECRET: "Mostrar clave secreta" BUTTON_HIDE_SECRET: "Ocultar clave secreta" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." + TWO_FACTOR_REQUIRE_DESC: "Se requiere que configure la verificación de 2-pasos." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configurado" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "No configurado" TWO_FACTOR_SECRET_DESC: >- @@ -429,8 +430,8 @@ es_ES: LABEL_ACCOUNTS_NAME: "Cuentas" LABEL_IDENTITY_NAME: "Identidad" LABEL_IDENTITIES_NAME: "Identidades" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Templates" + LABEL_FILTERS_NAME: "Filtros" + LABEL_TEMPLATES_NAME: "Plantillas" LABEL_SECURITY_NAME: "Seguridad" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Temas" @@ -438,21 +439,21 @@ es_ES: LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Atrás" SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Vacation message" - SUBNAME_DISCARD: "Discard" + LEGEND_FILTERS: "Filtros" + BUTTON_SAVE: "Guardar" + BUTTON_ADD_FILTER: "Añadir un Filtro" + BUTTON_DELETE: "Borrar" + BUTTON_RAW_SCRIPT: "Usar Script Personalizado" + SUBNAME_NONE: "Ninguno" + SUBNAME_MOVE_TO: "Mover a \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Reenviar a \"%EMAIL%\"" + SUBNAME_REJECT: "Rechazar" + SUBNAME_VACATION_MESSAGE: "Mensaje de vacaciones" + SUBNAME_DISCARD: "Descartar" CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Are you sure?" - CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." + LOADING_PROCESS: "Actualizando lista de filtros" + DELETING_ASK: "¿Está seguro?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Estos cambios deben ser cambiados en el servidor." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Identidad" LABEL_DISPLAY_NAME: "Nombre" @@ -460,25 +461,25 @@ es_ES: LABEL_SIGNATURE: "Firma" LABEL_ADD_SIGNATURE_TO_ALL: "Agregar su firma a todos los mensajes salientes" SETTINGS_SECURITY: - LEGEND_SECURITY: "Security" + LEGEND_SECURITY: "Seguridad" LABEL_CONFIGURE_TWO_FACTOR: "Configurar verificación de 2-Pasos" - LABEL_AUTOLOGOUT: "Auto Logout" - AUTOLOGIN_NEVER_OPTION_NAME: "Never" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + LABEL_AUTOLOGOUT: "Salir Automáticamente" + AUTOLOGIN_NEVER_OPTION_NAME: "Nunca" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minuto(s)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hora(s)" SETTINGS_GENERAL: LEGEND_GENERAL: "General" LABEL_LANGUAGE: "Idioma" - LABEL_IDENTITY: "Identity" + LABEL_IDENTITY: "Identidad" LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_LAYOUT_NO_SPLIT: "Sin División" + LABEL_LAYOUT_VERTICAL_SPLIT: "División Vertical" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "División Horizontal" LABEL_EDITOR: "Editor de texto predeterminado" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "Texto plano" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" + LABEL_EDITOR_HTML_FORCED: "Html (forzado)" + LABEL_EDITOR_PLAIN_FORCED: "Texto plano (forzado)" LABEL_ANIMATION: "Interface animation" LABEL_ANIMATION_FULL: "Todo" LABEL_ANIMATION_NORMAL: "Normal" @@ -492,7 +493,7 @@ es_ES: LABEL_SHOW_ANIMATION: "Mostrar animación" LABEL_MESSAGE_PER_PAGE: "Mensajes en página" LABEL_NOTIFICATIONS: "Notificaciones" - LABEL_SOUND_NOTIFICATION: "Sound notification" + LABEL_SOUND_NOTIFICATION: "Sonido de la notificación" LABEL_CHROME_NOTIFICATION_DESC: "Mostrar notificación de nuevos mensajes en Popup" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Bloqueado por el explorador)" SETTINGS_CONTACTS: @@ -540,25 +541,25 @@ es_ES: DELETING_PROCESS: "Eliminado carpeta" RENAMING_PROCESS: "Renombrando carpeta" DELETING_ASK: "¿Está usted seguro?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" + TO_MANY_FOLDERS_DESC_1: "Tiene muchas carpetas!" TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Delete folder" - HELP_SHOW_HIDE_FOLDER: "Show/hide folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + HELP_DELETE_FOLDER: "Eliminar carpeta" + HELP_SHOW_HIDE_FOLDER: "Mostrar/ocultar carpeta" + HELP_CHECK_FOR_NEW_MESSAGES: "Chequear/no chequear nuevos mensajes" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Lista de cuentas" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + LEGEND_IDENTITIES: "Identidades" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Cuentas e identidades" BUTTON_ADD_ACCOUNT: "Añadir cuenta" - BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_ADD_IDENTITY: "Añadir identidad" BUTTON_DELETE: "Eliminar" LOADING_PROCESS: "Actualizando lista de cuentas" DELETING_ASK: "¿Está usted seguro?" - DEFAULT_IDENTITY_LABEL: "default" + DEFAULT_IDENTITY_LABEL: "predeterminado" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Identidad" LEGEND_IDENTITIES: "Identidades adicionales" - LABEL_DEFAULT: "Default" + LABEL_DEFAULT: "Predeterminado" LABEL_DISPLAY_NAME: "Nombre" LABEL_REPLY_TO: "Responder a" LABEL_SIGNATURE: "Firma" @@ -581,7 +582,7 @@ es_ES: TITLE_PRIVATE: "Privado" TITLE_PUBLIC: "Público" DELETING_ASK: "¿Está usted seguro?" - GENERATE_ONLY_HTTPS: "HTTPS only" + GENERATE_ONLY_HTTPS: "Solo HTTPS" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Ayuda de atajos de teclado" TAB_MAILBOX: "Buzón" @@ -597,7 +598,7 @@ es_ES: LABEL_CHECK_ALL: "Comprobar todos los mensajes" LABEL_ARCHIVE: "Archivo" LABEL_DELETE: "Eliminar" - LABEL_OPEN_THREAD: "Open selected thread" + LABEL_OPEN_THREAD: "Abrir hilo seleccionado" LABEL_MOVE: "Mover" LABEL_READ: "Marcar los mensajes seleccionados como leídos" LABEL_UNREAD: "Marcar los mensajes seleccionados como no leídos" @@ -610,14 +611,14 @@ es_ES: LABEL_SWITCH_TO_FOLDER_LIST: "Cambiar foco a la lista de carpetas" LABEL_FULLSCREEN_TOGGLE: "Cambiar a modo de pantalla completa" LABEL_BLOCKQUOTES_TOGGLE: "Cambiar blockquotes de mensaje" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" + LABEL_THREAD_NEXT: "Próximo mensaje del hilo" + LABEL_THREAD_PREV: "Mensaje anterior del hilo" LABEL_PRINT: "Imprimir" LABEL_EXIT_FULLSCREEN: "Salir del modo de pantalla completa" LABEL_CLOSE_MESSAGE: "Cerrar el mensaje (No hay diseño panel de vista previa)" LABEL_SWITCH_TO_LIST: "Cambiar foco de nuevo a la lista de mensajes" LABEL_OPEN_COMPOSE_POPUP: "Abrir ventana de redacción" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimizar componer" LABEL_OPEN_IDENTITIES_DROPDOWN: "Abrir ventana de identidades" LABEL_SAVE_MESSAGE: "Guardar aviso" LABEL_SEND_MESSAGE: "Enviar mensaje" @@ -627,7 +628,7 @@ es_ES: NO_PUBLIC_KEYS_FOUND_FOR: "No hay claves públicas encontrados para el email %MAIL%" NO_PRIVATE_KEY_FOUND: "No se encontró la clave privada" NO_PRIVATE_KEY_FOUND_FOR: "No hay una clave privada para el email %EMAIL%" - ADD_A_PUBLICK_KEY: "Add a public key" + ADD_A_PUBLICK_KEY: "Añadir llave pública" SELECT_A_PRIVATE_KEY: "Seleccionar una clave privada" UNVERIFIRED_SIGNATURE: "Firma no verificada" DECRYPTION_ERROR: "Error de descifrado OpenPGP" @@ -670,9 +671,9 @@ es_ES: CANT_SAVE_MESSAGE: "No se puede guardar el mensaje" CANT_SEND_MESSAGE: "No se puede enviar el mensaje" INVALID_RECIPIENTS: "Los destinatarios no son válidos" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_SAVE_FILTERS: "No se pueden guardar los filtros" + CANT_GET_FILTERS: "No se pueden obtener los filtros" + FILTERS_ARE_NOT_CORRECT: "Filtros incorrectos" CANT_CREATE_FOLDER: "No se puede crear la carpeta" CANT_RENAME_FOLDER: "No se puede renombrar la carpeta" CANT_DELETE_FOLDER: "No se puede eliminar la carpeta" @@ -694,22 +695,22 @@ es_ES: ACCOUNT_ALREADY_EXISTS: "La cuenta ya existe" ACCOUNT_DOES_NOT_EXIST: "La cuenta no existe" MAIL_SERVER_ERROR: "Ocurrió un error mientras se accedía al servidor" - INVALID_INPUT_ARGUMENT: "Invalid input argument" + INVALID_INPUT_ARGUMENT: "Argumento no válido" UNKNOWN_ERROR: "Error desconocido" STATIC: BACK_LINK: "Recargar" DOMAIN_LIST_DESC: "Lista de dominios de correo web que se le permite acceder." PHP_EXSTENSIONS_ERROR_DESC: "La extensión de PHP requerida no está disponible en su configuración de PHP!" PHP_VERSION_ERROR_DESC: "Su versión de PHP (%VERSION%) es menor a la mínima requerida 5.3.0!" - NO_SCRIPT_TITLE: "JavaScript es requerido para esta aplicación." + NO_SCRIPT_TITLE: "Esta aplicación requiere de JavaScript." NO_SCRIPT_DESC: | - JavaScript no está disponible en su navegador. - Por favor habilite el soporte JavaScript en la configuración de su navegador e inténtelo de nuevo. - NO_COOKIE_TITLE: "Los Cookies son requeridos para esta aplicación." + JavaScript no está disponible en su navegador. + Por favor habilite el soporte JavaScript en la configuración de su navegador e inténtelo de nuevo. + NO_COOKIE_TITLE: "Esta aplicación requiere de Cookies." NO_COOKIE_DESC: | - El soporte de Cookies no esta disponible en su navegador. - Por favor habilite los Cookie en la configuración de su navegador e inténtelo de nuevo. + Su navegador no soporta Cookies. + Por favor habilite los Cookie en la configuración de su navegador e inténtelo de nuevo. BAD_BROWSER_TITLE: "Su navegador no está actualizado." BAD_BROWSER_DESC: | - Para usar todas las características de esta aplicación, - descargue e instale uno de estos navegadores: + Para usar todas las características de esta aplicación, + descargue e instale uno de estos navegadores: diff --git a/rainloop/v/0.0.0/app/localization/webmail/et_EE.yml b/rainloop/v/0.0.0/app/localization/webmail/et_EE.yml index 45ff93936..21ec9babd 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/et_EE.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/et_EE.yml @@ -153,10 +153,10 @@ et_EE: READ_RECEIPT: SUBJECT: "Kohaletoimetamise kinnitus - %SUBJECT%" BODY: | - See on kohaletoimetamise kinnitus kirjale, mille saatsid aadressile %READ-RECEIPT%. + See on kohaletoimetamise kinnitus kirjale, mille saatsid aadressile %READ-RECEIPT%. - Tähelepanu: Kinnitus tähendab vaid seda, et kirja kuvati saaja arvutis. - Kirja sisu lugemise või mõistmise kohta see teavitus granatiisid ei anna. + Tähelepanu: Kinnitus tähendab vaid seda, et kirja kuvati saaja arvutis. + Kirja sisu lugemise või mõistmise kohta see teavitus granatiisid ei anna. SUGGESTIONS: SEARCHING_DESC: "Otsin..." CONTACTS: @@ -363,15 +363,15 @@ et_EE: BUTTON_CANCEL: "Tühista" BUTTON_CLOSE: "Sulge" NOTIFICATION_SENT: | - Sa pole valinud süsteemset kausta saadetud kirjadele. - Kui sa ei soovi saadetud kirju salvestada, vali "Ära kasuta". + Sa pole valinud süsteemset kausta saadetud kirjadele. + Kui sa ei soovi saadetud kirju salvestada, vali "Ära kasuta". NOTIFICATION_DRAFTS: "Sa pole valinud kausta, kuhu mustandid kirjutamise ajal salvestatakse." NOTIFICATION_SPAM: | - Sa pole valinud süsteemset kausta rämpspostiks märgitud kirjadele. - Kui sa ei soovi rämpspostiks märgitud kirju salvestada, vali "Ära kasuta". + Sa pole valinud süsteemset kausta rämpspostiks märgitud kirjadele. + Kui sa ei soovi rämpspostiks märgitud kirju salvestada, vali "Ära kasuta". NOTIFICATION_TRASH: | - Sa pole valinud süsteemset kausta kustutatud kirjadele. - Kui sa ei soovi kustutatud kirju salvestada, vali "Ära kasuta". + Sa pole valinud süsteemset kausta kustutatud kirjadele. + Kui sa ei soovi kustutatud kirju salvestada, vali "Ära kasuta". NOTIFICATION_ARCHIVE: "Sa pole valinud kausta, kuhu arhiveeritud kirjad salvestatakse." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2. faktoriga autentimine (TOTP)" @@ -698,13 +698,13 @@ et_EE: PHP_VERSION_ERROR_DESC: "Sinu PHP versioon (%VERSION%) on väiksem, kui minimaalselt nõutud 5.3.0!" NO_SCRIPT_TITLE: "See rakendus vajab tööks JavaScripti" NO_SCRIPT_DESC: | - Sinu veebilehitseja ei toeta JavaScripti. - Luba selle kasutus veebilehitseja sätetes ja proovi uuesti. + Sinu veebilehitseja ei toeta JavaScripti. + Luba selle kasutus veebilehitseja sätetes ja proovi uuesti. NO_COOKIE_TITLE: "See rakendus vajab oma tööks veebiküpsiste tuge" NO_COOKIE_DESC: | - Sinu veebilehitseja ei toeta veebiküpsiseid. - Luba nende kasutus veebilehitseja sätetes ja proovi uuesti. + Sinu veebilehitseja ei toeta veebiküpsiseid. + Luba nende kasutus veebilehitseja sätetes ja proovi uuesti. BAD_BROWSER_TITLE: "Sinu veebilehitseja on aegunud" BAD_BROWSER_DESC: | - Rakenduse kõikide võimaluste kasutamiseks, - lae alla ja paigalda mõni nendest veebilehitsejatest: + Rakenduse kõikide võimaluste kasutamiseks, + lae alla ja paigalda mõni nendest veebilehitsejatest: diff --git a/rainloop/v/0.0.0/app/localization/webmail/fa_IR.yml b/rainloop/v/0.0.0/app/localization/webmail/fa_IR.yml index db371185a..76c95e25d 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/fa_IR.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/fa_IR.yml @@ -154,10 +154,10 @@ fa_IR: READ_RECEIPT: SUBJECT: "برگرداندن گیرنده (نمایش داده شد) - %SUBJECT%" BODY: | - این پیام برگشت برای نامه‌ای است که شما برای %READ-RECEIPT% ارسال کرده‌اید. + این پیام برگشت برای نامه‌ای است که شما برای %READ-RECEIPT% ارسال کرده‌اید. - نکته: این پیام تنها اطلاع‌رسانی در مورد این هست که پیام شما بر روی کامپیوتر گیرنده نمایش داده شده است. - هیچ تضمینی بابت اینکه گیرنده این پیام را خوانده باشد یا درست متوجه شده باشد وجود ندارد. + نکته: این پیام تنها اطلاع‌رسانی در مورد این هست که پیام شما بر روی کامپیوتر گیرنده نمایش داده شده است. + هیچ تضمینی بابت اینکه گیرنده این پیام را خوانده باشد یا درست متوجه شده باشد وجود ندارد. SUGGESTIONS: SEARCHING_DESC: "در حال جستجو..." CONTACTS: @@ -364,15 +364,15 @@ fa_IR: BUTTON_CANCEL: "انصراف" BUTTON_CLOSE: "بستن" NOTIFICATION_SENT: | - شما پوشه سیستمی "ارسالی" را برای قرار گرفتن پیام‌ها در داخل آن، پس از ارسال را انتخاب نکرده‌اید. - اگر شما نمی‌خواهید که پیام‌های ارسالی شما ذخیره شود، لطفا گزینه "استفاده نکن" را انتخاب کنید. + شما پوشه سیستمی "ارسالی" را برای قرار گرفتن پیام‌ها در داخل آن، پس از ارسال را انتخاب نکرده‌اید. + اگر شما نمی‌خواهید که پیام‌های ارسالی شما ذخیره شود، لطفا گزینه "استفاده نکن" را انتخاب کنید. NOTIFICATION_DRAFTS: "شما پوشه سیستمی \"پیش‌نویس‌ها\" را برای ذخیره پیام در زمانی که در حال ایجاد ایمیل جدید هستید را انتخاب نکرده‌اید." NOTIFICATION_SPAM: | - شما پوشه سیستمی "هرزنامه‌" را جهت قرارگرفتن پیام‌های هرزنامه‌ای انتخاب نکرده‌اید. - اگر شما می‌خواهید که پیام‌ها بصورت همیشگی حذف شوند، لطفا گزینه "استفاده نکن" را انتخاب کنید. + شما پوشه سیستمی "هرزنامه‌" را جهت قرارگرفتن پیام‌های هرزنامه‌ای انتخاب نکرده‌اید. + اگر شما می‌خواهید که پیام‌ها بصورت همیشگی حذف شوند، لطفا گزینه "استفاده نکن" را انتخاب کنید. NOTIFICATION_TRASH: | - شما پوشه سیستمی "سطل آشغال" را برای قرارگرفتن پیام‌های حذف شده انتخاب نکرده‌اید. - اگر شما می‌خواهید پیام‌ها بصورت همیشگی حذف شوند، لطفا گزینه "استفاده نکن" را انتخاب کنید. + شما پوشه سیستمی "سطل آشغال" را برای قرارگرفتن پیام‌های حذف شده انتخاب نکرده‌اید. + اگر شما می‌خواهید پیام‌ها بصورت همیشگی حذف شوند، لطفا گزینه "استفاده نکن" را انتخاب کنید. NOTIFICATION_ARCHIVE: "شما پوشه سیستمی \"بایگانی\" را جهت قرارگرفتن پیام‌های بایگانی‌شده انتخاب نکرده‌اید." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "اعتبارسنجی 2 مرحله‌ای (TOTP)" @@ -701,13 +701,13 @@ fa_IR: PHP_VERSION_ERROR_DESC: "نسخه PHP شما (%VERSION%) کمتر از حداقل نسخه مورد انتظار 5.3.0 هست!" NO_SCRIPT_TITLE: "جاوا‌اسکریپت برای این برنامه مورد نیاز است." NO_SCRIPT_DESC: | - پشتیبانی از جاوااسکریپت در مرورگر شما وجود ندارد. - لطفا پشتیبانی از جاوا‌اسکریپت را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. + پشتیبانی از جاوااسکریپت در مرورگر شما وجود ندارد. + لطفا پشتیبانی از جاوا‌اسکریپت را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. NO_COOKIE_TITLE: "Cookie باید بر روی مرورگر شما جهت استفاده از برنامه فعال باشد." NO_COOKIE_DESC: | - پشتیبانی از Cookie در مرورگر شما فعال نیست. - لطفا Cookie را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. + پشتیبانی از Cookie در مرورگر شما فعال نیست. + لطفا Cookie را در تنظیمات مرورگر خود فعال کنید و مجددا تلاش کنید. BAD_BROWSER_TITLE: "نسخه مرورگر شما قدیمی است." BAD_BROWSER_DESC: | - برای استفاده از تمام قابلیتهای برنامه، - یکی از مرورگرهای زیر را دریافت و نصب کنید. + برای استفاده از تمام قابلیتهای برنامه، + یکی از مرورگرهای زیر را دریافت و نصب کنید. diff --git a/rainloop/v/0.0.0/app/localization/webmail/fi_FI.yml b/rainloop/v/0.0.0/app/localization/webmail/fi_FI.yml index c7eb7205c..02abf7106 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/fi_FI.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/fi_FI.yml @@ -154,9 +154,9 @@ fi_FI: READ_RECEIPT: SUBJECT: "Kuitattu luetuksi - %SUBJECT%" BODY: | - Tämä on Kuitattu luetuksi viestille jonka lähetit %READ-RECEIPT%lle. + Tämä on Kuitattu luetuksi viestille jonka lähetit %READ-RECEIPT%lle. - Huom: Tämä viesti kertoo vain että lähetetty viesti on näytetty vastaanottajan koneella. + Huom: Tämä viesti kertoo vain että lähetetty viesti on näytetty vastaanottajan koneella. SUGGESTIONS: SEARCHING_DESC: "Hakee..." CONTACTS: @@ -363,15 +363,15 @@ fi_FI: BUTTON_CANCEL: "Peruuta" BUTTON_CLOSE: "Sulje" NOTIFICATION_SENT: | - Et ole valinnut "Lähetetyt" järjestelmäkansiota jonne viestit laitetaan lähetyksen jälkeen. - Jos et halua tallentaa lähetettyjä viestejä, valitse "Älä käytä". + Et ole valinnut "Lähetetyt" järjestelmäkansiota jonne viestit laitetaan lähetyksen jälkeen. + Jos et halua tallentaa lähetettyjä viestejä, valitse "Älä käytä". NOTIFICATION_DRAFTS: "Et ole valinnut \"Luonnokset\" kansiota minne tallennetaan viestit kirjoitettaessa." NOTIFICATION_SPAM: | - Et ole valinnut "Roskaposti" kansiota mihin roskapostiksi merkityt viestit siirretään. - Jos haluat positaa viestit lopullisesti, valitse "Älä käytä". + Et ole valinnut "Roskaposti" kansiota mihin roskapostiksi merkityt viestit siirretään. + Jos haluat positaa viestit lopullisesti, valitse "Älä käytä". NOTIFICATION_TRASH: | - Et ole valinnut "Roskakori" järjestelmäkansiota mihin poistetut viestit laitetaan. - Jos haluat positaa viestit lopullisesti, valitse "Älä käytä". + Et ole valinnut "Roskakori" järjestelmäkansiota mihin poistetut viestit laitetaan. + Jos haluat positaa viestit lopullisesti, valitse "Älä käytä". NOTIFICATION_ARCHIVE: "Et ole valinnut \"Arkisto\" järjestelmäkansiota." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-osainen todentaminen" @@ -696,13 +696,13 @@ fi_FI: PHP_VERSION_ERROR_DESC: "PHP versiosi (%VERSION%) on alle vaaditun 5.3.0!" NO_SCRIPT_TITLE: "JavaScript vaaditaan." NO_SCRIPT_DESC: | - JavaScript tuki ei ole saatavilla selaimessasi. - Aktivoi JavaScript selaimessasi ja yritä uudelleen. + JavaScript tuki ei ole saatavilla selaimessasi. + Aktivoi JavaScript selaimessasi ja yritä uudelleen. NO_COOKIE_TITLE: "Eväste-tuki vaaditaan." NO_COOKIE_DESC: | - Eväste (cookie) tuki ei ole saatavilla selaimessasi. - Aktivoi evästeet (cookiet) selaimessasi ja yritä uudelleen. + Eväste (cookie) tuki ei ole saatavilla selaimessasi. + Aktivoi evästeet (cookiet) selaimessasi ja yritä uudelleen. BAD_BROWSER_TITLE: "Selaimesi on vanhentunut." BAD_BROWSER_DESC: | - Käyttääksesi kaikkia ominaisuuksia, - lataa ja asenna jokin näistä selaimista: + Käyttääksesi kaikkia ominaisuuksia, + lataa ja asenna jokin näistä selaimista: diff --git a/rainloop/v/0.0.0/app/localization/webmail/fr_FR.yml b/rainloop/v/0.0.0/app/localization/webmail/fr_FR.yml index 2765ed78a..84a9671bb 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/fr_FR.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/fr_FR.yml @@ -151,14 +151,15 @@ fr_FR: PGP_ENCRYPTED_MESSAGE_DESC: "Message chiffré par OpenPGP (cliquer pour déchiffrer)" LINK_DOWNLOAD_AS_ZIP: "Télécharger le zip" LINK_SAVE_TO_OWNCLOUD: "Enregistrer sur ownCloud" + LINK_SAVE_TO_CLOUD: "Enregistrer sur le cloud" LINK_SAVE_TO_DROPBOX: "Enregistrer sur Dropbox" READ_RECEIPT: SUBJECT: "Accusé de réception (affiché) - %SUBJECT%" BODY: | - Il s'agit d'un accusé de réception pour le courrier que vous avez envoyé à %READ-RECEIPT%. + Il s'agit d'un accusé de réception pour le courrier que vous avez envoyé à %READ-RECEIPT%. - Note: Cet accusé de réception reconnaît que le message a été affiché sur l'ordinateur du destinataire. - Il n'y a aucune garantie que le destinataire ait lu ou compris le contenu du message. + Note: Cet accusé de réception reconnaît que le message a été affiché sur l'ordinateur du destinataire. + Il n'y a aucune garantie que le destinataire ait lu ou compris le contenu du message. SUGGESTIONS: SEARCHING_DESC: "Recherche..." CONTACTS: @@ -365,15 +366,15 @@ fr_FR: BUTTON_CANCEL: "Annuler" BUTTON_CLOSE: "Fermer" NOTIFICATION_SENT: | - Vous n'avez pas sélectionné de dossier "Envoyés" où copier les messages après envoi. - Si vous ne souhaitez pas enregistrer une copie des messages envoyés, sélectionnez l'option "Ne pas utiliser". + Vous n'avez pas sélectionné de dossier "Envoyés" où copier les messages après envoi. + Si vous ne souhaitez pas enregistrer une copie des messages envoyés, sélectionnez l'option "Ne pas utiliser". NOTIFICATION_DRAFTS: "Vous n'avez pas sélectionné de dossier \"Brouillons\" où enregistrer les messages en cours de rédaction." NOTIFICATION_SPAM: | - Vous n'avez pas sélectionné de dossier "Spam" où placer les indésirables. - Si vous ne souhaitez pas supprimer définitivement les messages, sélectionnez l'option "Ne pas utiliser". + Vous n'avez pas sélectionné de dossier "Spam" où placer les indésirables. + Si vous ne souhaitez pas supprimer définitivement les messages, sélectionnez l'option "Ne pas utiliser". NOTIFICATION_TRASH: | - Vous n'avez pas sélectionné de dossier "Corbeille" où placer les messages supprimés. - Si vous ne souhaitez pas supprimer définitivement les messages, sélectionnez l'option "Ne pas utiliser". + Vous n'avez pas sélectionné de dossier "Corbeille" où placer les messages supprimés. + Si vous ne souhaitez pas supprimer définitivement les messages, sélectionnez l'option "Ne pas utiliser". NOTIFICATION_ARCHIVE: "Vous n'avez pas sélectionné de dossier \"Archive\" où placer les messages archivés.\n" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Authentification en deux étapes" @@ -582,6 +583,7 @@ fr_FR: TITLE_PUBLIC: "Publique" DELETING_ASK: "Êtes-vous sûr ?" GENERATE_ONLY_HTTPS: "HTTPS seulement" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Brouillon sauvegardé automatiquement" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Aide pour les raccourcis clavier" TAB_MAILBOX: "Boîte aux lettres" @@ -703,13 +705,13 @@ fr_FR: PHP_VERSION_ERROR_DESC: "Votre version de PHP (% VERSION%) est inférieure à la minimale requise 5.3.0 !" NO_SCRIPT_TITLE: "JavaScript est nécessaire pour cette application." NO_SCRIPT_DESC: | - Le support de JavaScript n'est pas disponible dans votre navigateur. - S'il vous plaît activez le support de JavaScript dans les paramètres de votre navigateur et réessayez. + Le support de JavaScript n'est pas disponible dans votre navigateur. + S'il vous plaît activez le support de JavaScript dans les paramètres de votre navigateur et réessayez. NO_COOKIE_TITLE: "Le support des cookies est nécessaire pour cette application." NO_COOKIE_DESC: | - Le support des cookies n'est pas disponible dans votre navigateur. - S'il vous plaît activez le support des cookies dans les paramètres de votre navigateur et réessayez. + Le support des cookies n'est pas disponible dans votre navigateur. + S'il vous plaît activez le support des cookies dans les paramètres de votre navigateur et réessayez. BAD_BROWSER_TITLE: "Votre navigateur est obsolète." BAD_BROWSER_DESC: | - Pour utiliser toutes les fonctionnalités de l'application, - téléchargez et installez l'un de ces navigateurs : + Pour utiliser toutes les fonctionnalités de l'application, + téléchargez et installez l'un de ces navigateurs : diff --git a/rainloop/v/0.0.0/app/localization/webmail/hu_HU.yml b/rainloop/v/0.0.0/app/localization/webmail/hu_HU.yml index df7291a68..86b72272c 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/hu_HU.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/hu_HU.yml @@ -151,14 +151,15 @@ hu_HU: PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP kódolt üzenet (kattints a visszafejtéshez)" LINK_DOWNLOAD_AS_ZIP: "Letöltés zip fájlként" LINK_SAVE_TO_OWNCLOUD: "Mentés ownCloud-ra" + LINK_SAVE_TO_CLOUD: "Mentés a felhőbe" LINK_SAVE_TO_DROPBOX: "Mentés Dropbox-ra" READ_RECEIPT: SUBJECT: "Visszaigazolás (megjelenítve) - %SUBJECT%" BODY: | - Ez egy ide küldött üzenet olvasási visszaigazolása: %READ-RECEIPT%. + Ez egy ide küldött üzenet olvasási visszaigazolása: %READ-RECEIPT%. - Megjegyzés: Ez az olvasási visszaigazolás csak azt igazolja, hogy az üzenet megjelenítésre került a címzett számítógépén. - Nincs rá garancia, hogy a címzett elolvasta volna az üzenetet illetve megértette volna annak tartalmát. + Megjegyzés: Ez az olvasási visszaigazolás csak azt igazolja, hogy az üzenet megjelenítésre került a címzett számítógépén. + Nincs rá garancia, hogy a címzett elolvasta volna az üzenetet illetve megértette volna annak tartalmát. SUGGESTIONS: SEARCHING_DESC: "Keresés..." CONTACTS: @@ -365,16 +366,16 @@ hu_HU: BUTTON_CANCEL: "Mégse" BUTTON_CLOSE: "Bezárás" NOTIFICATION_SENT: | - Nem választottál "Elküldött" rendszermappát a törölt levelek tárolásához. - Ha nem szeretnéd tárolni az elküldött leveleket, akkor válaszd a "Ne használd" lehetőséget. + Nem választottál "Elküldött" rendszermappát a törölt levelek tárolásához. + Ha nem szeretnéd tárolni az elküldött leveleket, akkor válaszd a "Ne használd" lehetőséget. NOTIFICATION_DRAFTS: "Nem választottál \"Piszkozatok\" rendszermappát a szerkesztett üzenetek tárolásához." NOTIFICATION_SPAM: |+ - Nem választottál "Levélszemét" rendszermappát a kéretlen üzenetek tárolásához. - Az üzenetek végleges törléséhez válaszd a "Ne használd" lehetőséget. + Nem választottál "Levélszemét" rendszermappát a kéretlen üzenetek tárolásához. + Az üzenetek végleges törléséhez válaszd a "Ne használd" lehetőséget. NOTIFICATION_TRASH: | - Nem választottál "Lomtár" rendszermappát a törölt levelek tárolásához. - Az üzenetek végleges törléséhez válaszd a "Ne használd" lehetőséget. + Nem választottál "Lomtár" rendszermappát a törölt levelek tárolásához. + Az üzenetek végleges törléséhez válaszd a "Ne használd" lehetőséget. NOTIFICATION_ARCHIVE: "Nem választottál \"Archívum\" rendszermappát az archivált üzenetek tárolásához." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2 lépcsős hitelesítés" @@ -582,6 +583,7 @@ hu_HU: TITLE_PUBLIC: "Publikus" DELETING_ASK: "Biztos vagy benne?" GENERATE_ONLY_HTTPS: "csak HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Piszkozat automatikus mentése" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Billentyű kombináció súgó" TAB_MAILBOX: "Postaláda" @@ -703,13 +705,13 @@ hu_HU: PHP_VERSION_ERROR_DESC: "A PHP verziód (%VERSION%) kisebb mint a minimálisan szükséges 5.3.0!" NO_SCRIPT_TITLE: "Az alkalmazáshoz JavaScript szükséges." NO_SCRIPT_DESC: | - A JavaScript támogatás nem érhető el a böngésződben. - Kérlek engedélyezd böngésződben a JavaScript támogatást, majd próbáld újra. + A JavaScript támogatás nem érhető el a böngésződben. + Kérlek engedélyezd böngésződben a JavaScript támogatást, majd próbáld újra. NO_COOKIE_TITLE: "Az alkalmazáshoz Cookie támogatásra van szükség." NO_COOKIE_DESC: | - A Cookie támogatás nem érhető el a böngésződben. - Kérlek engedélyezd böngésződben a Cookie támogatást, majd próbáld újra. + A Cookie támogatás nem érhető el a böngésződben. + Kérlek engedélyezd böngésződben a Cookie támogatást, majd próbáld újra. BAD_BROWSER_TITLE: "A böngésződ elavult." BAD_BROWSER_DESC: | - Az alkalmazás összes funkciójának használatához - tölts le és telepítsd az alábbi böngészők egyikét: + Az alkalmazás összes funkciójának használatához + tölts le és telepítsd az alábbi böngészők egyikét: diff --git a/rainloop/v/0.0.0/app/localization/webmail/is_IS.yml b/rainloop/v/0.0.0/app/localization/webmail/is_IS.yml index c80725f14..ce8e24f5d 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/is_IS.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/is_IS.yml @@ -154,10 +154,10 @@ is_IS: READ_RECEIPT: SUBJECT: "Móttökukvittun (birt) - %SUBJECT%" BODY: | - Þetta er kvittun fyrir móttöku á pósti sem þú sendir %READ-RECEIPT%. + Þetta er kvittun fyrir móttöku á pósti sem þú sendir %READ-RECEIPT%. - Athugaðu: Þessi móttökukvittun er aðeins staðfesting á því að skeytið var birt á skjá viðtakandans. - Ekkert getur ábyrgst að viðtakandinn hafi lesið eða skilið efni skilaboðanna. + Athugaðu: Þessi móttökukvittun er aðeins staðfesting á því að skeytið var birt á skjá viðtakandans. + Ekkert getur ábyrgst að viðtakandinn hafi lesið eða skilið efni skilaboðanna. SUGGESTIONS: SEARCHING_DESC: "Leita..." CONTACTS: @@ -362,15 +362,15 @@ is_IS: BUTTON_CANCEL: "Hætta við" BUTTON_CLOSE: "Loka" NOTIFICATION_SENT: | - Þú hefur ekki valið kerfismöppuna "Sent" fyrir bréf eftir sendingu. - Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". + Þú hefur ekki valið kerfismöppuna "Sent" fyrir bréf eftir sendingu. + Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". NOTIFICATION_DRAFTS: "Þú hefur ekki valið kerfismöppuna \"Drög\" þar sem bréf sem eru vistuð í á meðan þú skrifar." NOTIFICATION_SPAM: | - Þú hefur ekki valið kerfismöppuna "Ruslpóstur" sem ruslsendingar eru settar í. - Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". + Þú hefur ekki valið kerfismöppuna "Ruslpóstur" sem ruslsendingar eru settar í. + Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". NOTIFICATION_TRASH: | - Þú hefur ekki valið kerfismöppuna "Ruslafata" sem eydd bréf eru sett í. - Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". + Þú hefur ekki valið kerfismöppuna "Ruslafata" sem eydd bréf eru sett í. + Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". NOTIFICATION_ARCHIVE: "Þú hefur ekki valið kerfismöppuna \"Safnskrá\" undir bréf sem á að geyma til langs tíma." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-þrepa sannvottun (TOTP)" @@ -694,13 +694,13 @@ is_IS: PHP_VERSION_ERROR_DESC: "PHP útgáfan þín (%VERSION%) er eldri en lágmarks útgáfa sem krafist er (5.3.0)!" NO_SCRIPT_TITLE: "JavaScript er nauðsynlegt fyrir þetta forrit." NO_SCRIPT_DESC: | - JavaScript stuðningur er ekki til staðar fyrir vafrann þinn. - Vinsamlegast gerðu JavaScript virkt í vafranum þínum og reyndu aftur. + JavaScript stuðningur er ekki til staðar fyrir vafrann þinn. + Vinsamlegast gerðu JavaScript virkt í vafranum þínum og reyndu aftur. NO_COOKIE_TITLE: "Köku stuðningur er nauðsynlegur fyrir þetta forrit." NO_COOKIE_DESC: | - Köku stuðningur er ekki til staðar í vafranum þínum. - Vinsamlegast gerðu JavaScript virkt í vafranum þínum og reyndu aftur. + Köku stuðningur er ekki til staðar í vafranum þínum. + Vinsamlegast gerðu JavaScript virkt í vafranum þínum og reyndu aftur. BAD_BROWSER_TITLE: "Vafrinn þinn er úreltur." BAD_BROWSER_DESC: | - Til að geta notað alla valmöguleika í þessu forriti, - niðurhalaðu og settu upp einn af þessum vöfrum: + Til að geta notað alla valmöguleika í þessu forriti, + niðurhalaðu og settu upp einn af þessum vöfrum: diff --git a/rainloop/v/0.0.0/app/localization/webmail/it_IT.yml b/rainloop/v/0.0.0/app/localization/webmail/it_IT.yml index 8d7d50202..0468eaa65 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/it_IT.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/it_IT.yml @@ -145,19 +145,21 @@ it_IT: PRINT_LABEL_ATTACHMENTS: "Allegati" MESSAGE_LOADING: "Caricamento..." MESSAGE_VIEW_DESC: "Seleziona un messaggio dalla lista per visualizzarlo qui" + MESSAGE_VIEW_MOVE_DESC: "Clicca sul nome della cartella nel pannello sinistro per selezionare la destinazione." PGP_PASSWORD_INPUT_PLACEHOLDER: "Password" PGP_SIGNED_MESSAGE_DESC: "Messaggio firmato con OpenPGP (clicca qui per verificarlo)" PGP_ENCRYPTED_MESSAGE_DESC: "Messaggio cifrato con OpenPGP (clicca qui per decifrarlo)" LINK_DOWNLOAD_AS_ZIP: "Scarica come archivio ZIP" LINK_SAVE_TO_OWNCLOUD: "Salva su OwnCloud" + LINK_SAVE_TO_CLOUD: "Salva nel cloud" LINK_SAVE_TO_DROPBOX: "Salva su DropBox" READ_RECEIPT: SUBJECT: "Avviso di lettura - %SUBJECT%" BODY: | - Questo è un avviso di lettura per la mail che hai inviato a %READ-RECEIPT%. + Questo è un avviso di lettura per la mail che hai inviato a %READ-RECEIPT%. - Attenzione: questa notifica di lettura significa solo che il messaggio è stato visualizzato nel computer del destinatario. - Non c'è alcuna garanzia che il destinatario abbia letto o capito il contenuto del messaggio. + Attenzione: questa notifica di lettura significa solo che il messaggio è stato visualizzato nel computer del destinatario. + Non c'è alcuna garanzia che il destinatario abbia letto o capito il contenuto del messaggio. SUGGESTIONS: SEARCHING_DESC: "Cerca..." CONTACTS: @@ -364,15 +366,15 @@ it_IT: BUTTON_CANCEL: "Annulla" BUTTON_CLOSE: "Chiudi" NOTIFICATION_SENT: | - Non hai selezionato una cartella di sistema per la posta inviata. - Se non vuoi salvare i messaggi inviati seleziona "Non usarla". + Non hai selezionato una cartella di sistema per la posta inviata. + Se non vuoi salvare i messaggi inviati seleziona "Non usarla". NOTIFICATION_DRAFTS: "Non hai selezionato una cartella di sistema per le bozze." NOTIFICATION_SPAM: | - Non hai selezionato una cartella di sistema per i messaggi spam. - Se li vuoi eliminare permanentemente seleziona "Non usarla". + Non hai selezionato una cartella di sistema per i messaggi spam. + Se li vuoi eliminare permanentemente seleziona "Non usarla". NOTIFICATION_TRASH: | - Non hai selezionato una cartella di sistema per il cestino. - Se non lo vuoi usare (e quindi eliminare i messaggi permanentemente) seleziona "Non usarla". + Non hai selezionato una cartella di sistema per il cestino. + Se non lo vuoi usare (e quindi eliminare i messaggi permanentemente) seleziona "Non usarla". NOTIFICATION_ARCHIVE: "Non hai selezionato una cartella di sistema per i messaggi archiviati." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Autenticazione a due fattori" @@ -580,6 +582,7 @@ it_IT: TITLE_PUBLIC: "Pubblica" DELETING_ASK: "Sei sicuro?" GENERATE_ONLY_HTTPS: "solo tramite HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Salva automaticamente la bozza" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Aiuto sulle scorciatoie da tastiera" TAB_MAILBOX: "Casella di posta" @@ -698,13 +701,13 @@ it_IT: PHP_VERSION_ERROR_DESC: "La tua versione di PHP (%VERSION%) è meno recente della 5.3.0!" NO_SCRIPT_TITLE: "È richiesto JavaScript per questa applicazione." NO_SCRIPT_DESC: | - Il supporto a JavaScript è disabilitato. - Abilitare il supporto a JavaScript e riprovare. + Il supporto a JavaScript è disabilitato. + Abilitare il supporto a JavaScript e riprovare. NO_COOKIE_TITLE: "Sono richiesti i Cookie per questa applicazione." NO_COOKIE_DESC: | - Il supporto ai Cookie è disabilitato. - Abilitare il supporto ai Cookie e riprovare. + Il supporto ai Cookie è disabilitato. + Abilitare il supporto ai Cookie e riprovare. BAD_BROWSER_TITLE: "Il tuo browser è troppo vecchio" BAD_BROWSER_DESC: | - Per usare tutte le funzionalità dell'applicazione, - scarica ed installa uno dei seguenti browser: + Per usare tutte le funzionalità dell'applicazione, + scarica ed installa uno dei seguenti browser: diff --git a/rainloop/v/0.0.0/app/localization/webmail/ja_JP.yml b/rainloop/v/0.0.0/app/localization/webmail/ja_JP.yml index 2aab8232b..1f2bf114a 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/ja_JP.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/ja_JP.yml @@ -151,14 +151,15 @@ ja_JP: PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP 暗号化メッセージ (クリックして復号化)" LINK_DOWNLOAD_AS_ZIP: "Zip としてダウンロード" LINK_SAVE_TO_OWNCLOUD: "ownCloud へ保存" + LINK_SAVE_TO_CLOUD: "クラウドに保存する" LINK_SAVE_TO_DROPBOX: "Dropbox へ保存" READ_RECEIPT: SUBJECT: "開封確認メッセージ - %SUBJECT%" BODY: | - これは %READ-RECEIPT% に送信されたメールの開封確認です。 + これは %READ-RECEIPT% に送信されたメールの開封確認です。 - 注: 「この開封確認は、メッセージが受信者のコンピュータ上に表示されたことだけを意味しています。 」 - 受信者が読んだり、メッセージの内容を理解しているという保証はありません。 + 注: 「この開封確認は、メッセージが受信者のコンピュータ上に表示されたことだけを意味しています。 」 + 受信者が読んだり、メッセージの内容を理解しているという保証はありません。 SUGGESTIONS: SEARCHING_DESC: "検索中..." CONTACTS: @@ -186,7 +187,7 @@ ja_JP: LINK_BIRTHDAY: "誕生日を追加" PLACEHOLDER_ENTER_DISPLAY_NAME: "表示名を入力してください" PLACEHOLDER_ENTER_LAST_NAME: "姓を入力してください" - PLACEHOLDER_ENTER_FIRST_NAME: "姓を入力してください" + PLACEHOLDER_ENTER_FIRST_NAME: "名を入力してください" PLACEHOLDER_ENTER_NICK_NAME: "ニックネームを入力してください" LABEL_READ_ONLY: "読み取り専用" LABEL_SHARE: "共有" @@ -365,15 +366,15 @@ ja_JP: BUTTON_CANCEL: "キャンセル" BUTTON_CLOSE: "閉じる" NOTIFICATION_SENT: | - 送信済みメッセージを置くための ”Sent” システムフォルダが選択されていません。 - 送信済みメッセージを保存する必要がないのなら、"使用しない"オプションを選択してください。 + 送信済みメッセージを置くための ”Sent” システムフォルダが選択されていません。 + 送信済みメッセージを保存する必要がないのなら、"使用しない"オプションを選択してください。 NOTIFICATION_DRAFTS: "下書きメッセージを置くための ”Sent” システムフォルダが選択されていません。" NOTIFICATION_SPAM: | - 迷惑メールを置くための ”Spam” システムフォルダが選択されていません。 - 迷惑メールが完全に削除されるのを望むのなら、"使用しない"オプションを選択してください。 + 迷惑メールを置くための ”Spam” システムフォルダが選択されていません。 + 迷惑メールが完全に削除されるのを望むのなら、"使用しない"オプションを選択してください。 NOTIFICATION_TRASH: | - 削除されたメッセージを置くための ”Trash” システムフォルダが選択されていません。 - 削除されたメッセージが完全に削除されるのを望むのなら、"使用しない"オプションを選択してください。 + 削除されたメッセージを置くための ”Trash” システムフォルダが選択されていません。 + 削除されたメッセージが完全に削除されるのを望むのなら、"使用しない"オプションを選択してください。 NOTIFICATION_ARCHIVE: "アーカイブされたメッセージを置くための ”Archive” システムフォルダが選択されていません。" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2段階認証 (TOTP)" @@ -580,6 +581,7 @@ ja_JP: TITLE_PUBLIC: "パブリック" DELETING_ASK: "よろしいですか?" GENERATE_ONLY_HTTPS: "HTTPS only" + LABEL_ALLOW_DRAFT_AUTOSAVE: "下書きを自動的に保存する" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "キーボード ショートカット ヘルプ" TAB_MAILBOX: "メールボックス" @@ -695,13 +697,13 @@ ja_JP: PHP_VERSION_ERROR_DESC: "PHP バージョン (%VERSION%) が、 最低バージョンの 5.3.0 よりも低いです!" NO_SCRIPT_TITLE: "このアプリケーションでは JavaScript が必要です。" NO_SCRIPT_DESC: | - ブラウザで JavaScript が、有効になっていません。 - JavaScript を有効にして、再度試してください。 + ブラウザで JavaScript が、有効になっていません。 + JavaScript を有効にして、再度試してください。 NO_COOKIE_TITLE: "このアプリケーションでは Cookie が必要です。" NO_COOKIE_DESC: | - ブラウザで Cookie が、有効になっていません。 - Cookie を有効にして、再度試してください。 + ブラウザで Cookie が、有効になっていません。 + Cookie を有効にして、再度試してください。 BAD_BROWSER_TITLE: "ブラウザが古いです。" BAD_BROWSER_DESC: | - アプリケーションのすべての機能を使用するには、 - これらのブラウザの1つをダウンロードしてインストールします: + アプリケーションのすべての機能を使用するには、 + これらのブラウザの1つをダウンロードしてインストールします: diff --git a/rainloop/v/0.0.0/app/localization/webmail/ko_KR.yml b/rainloop/v/0.0.0/app/localization/webmail/ko_KR.yml index 627d1bd36..8ea7948db 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/ko_KR.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/ko_KR.yml @@ -4,7 +4,6 @@ ko_KR: LABEL_LOGIN: "아이디" LABEL_PASSWORD: "비밀번호" LABEL_SIGN_ME: "아이디 기억" - LABEL_VERIFICATION_CODE: "Verification Code" LABEL_DONT_ASK_VERIFICATION_CODE: "2주 동안 코드를 물어보지 않기" BUTTON_SIGN_IN: "로그인" TITLE_SIGN_IN_GOOGLE: "구글 계정으로 로그인" @@ -151,13 +150,6 @@ ko_KR: LINK_DOWNLOAD_AS_ZIP: "압축파일로 다운로드" LINK_SAVE_TO_OWNCLOUD: "ownCloud에 저장하기" LINK_SAVE_TO_DROPBOX: "Dropbox에 저장하기" - READ_RECEIPT: - SUBJECT: "Return Receipt (displayed) - %SUBJECT%" - BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - - Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. - There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "검색중..." CONTACTS: @@ -199,7 +191,6 @@ ko_KR: ADD_MENU_BIRTHDAY: "생일" ADD_MENU_TAGS: "태그" BUTTON_SHARE_NONE: "비어 있음" - BUTTON_SHARE_ALL: "Everyone" BUTTON_SYNC: "동기화 (서비스 CardDAV)" COMPOSE: TITLE_FROM: "보낸 이" @@ -364,12 +355,12 @@ ko_KR: BUTTON_CANCEL: "취소" BUTTON_CLOSE: "닫기" NOTIFICATION_SENT: |- - 보낸 편지함 폴더가 지정되지 않았습니다. 보낸 메시지를 보관하지 않고 삭제하려면 "사용하지 않음" 옵션을 선택해주세요. + 보낸 편지함 폴더가 지정되지 않았습니다. 보낸 메시지를 보관하지 않고 삭제하려면 "사용하지 않음" 옵션을 선택해주세요. NOTIFICATION_DRAFTS: "임시 보관함 폴더가 지정되지 않았습니다." NOTIFICATION_SPAM: |- - 스팸함 폴더가 지정되지 않았습니다. 스팸처리한 메시지를 보관하지 않고 바로 삭제하려면 "사용하지 않음" 옵션을 선택해주세요. + 스팸함 폴더가 지정되지 않았습니다. 스팸처리한 메시지를 보관하지 않고 바로 삭제하려면 "사용하지 않음" 옵션을 선택해주세요. NOTIFICATION_TRASH: |- - 휴지통 폴더가 지정되지 않았습니다. 삭제한 메시지를 휴지통에 보관하지 않고 바로 삭제하려면 "사용하지 않음" 옵션을 선택해주세요. + 휴지통 폴더가 지정되지 않았습니다. 삭제한 메시지를 휴지통에 보관하지 않고 바로 삭제하려면 "사용하지 않음" 옵션을 선택해주세요. NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" @@ -685,10 +676,10 @@ ko_KR: PHP_VERSION_ERROR_DESC: "현재 사용 중인 PHP 버전 (%VERSION%)이 너무 낮습니다. 최소 5.3.0 이상을 설치해주세요!" NO_SCRIPT_TITLE: "자바스크립트 필요" NO_SCRIPT_DESC: |- - 사용 중인 브라우저가 자바스크립트를 지원하지 않습니다. 브라우저 설정을 확인하여 자바스크립트 사용을 활성화하고 다시 시도해주세요. + 사용 중인 브라우저가 자바스크립트를 지원하지 않습니다. 브라우저 설정을 확인하여 자바스크립트 사용을 활성화하고 다시 시도해주세요. NO_COOKIE_TITLE: "이 어플리케이션을 사용하려면 쿠키 사용이 지원되야 합니다." NO_COOKIE_DESC: |- - 사용 중인 브라우저가 쿠키를 지원하지 않습니다. 브라우저 설정을 확인하여 쿠키 사용을 활성화하고 다시 시도해주세요. + 사용 중인 브라우저가 쿠키를 지원하지 않습니다. 브라우저 설정을 확인하여 쿠키 사용을 활성화하고 다시 시도해주세요. BAD_BROWSER_TITLE: "사용 중인 브라우저가 구버전입니다." BAD_BROWSER_DESC: |- - 이 어플리케이션을 정상적으로 사용하시려면 아래의 브라우저들 중 하나를 설치해주세요: + 이 어플리케이션을 정상적으로 사용하시려면 아래의 브라우저들 중 하나를 설치해주세요: diff --git a/rainloop/v/0.0.0/app/localization/webmail/lt_LT.yml b/rainloop/v/0.0.0/app/localization/webmail/lt_LT.yml index 6fa0623cb..3ff7d4cd2 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/lt_LT.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/lt_LT.yml @@ -155,10 +155,10 @@ lt_LT: READ_RECEIPT: SUBJECT: "Pristatymo patvirtinimas (laiškas parodytas) - %SUBJECT%" BODY: | - Tai yra laiško pristatymo patvirtinimas, kurį Jūs siuntėte gavėjui %READ-RECEIPT%. + Tai yra laiško pristatymo patvirtinimas, kurį Jūs siuntėte gavėjui %READ-RECEIPT%. - Pastaba: Šis pranešimas įrodo, kad laiškas buvo rodomas gavėjo kompiuteryje. - Nėra jokios garantijos, kad gavėjas perskaitė ar suprato laiško turinį. + Pastaba: Šis pranešimas įrodo, kad laiškas buvo rodomas gavėjo kompiuteryje. + Nėra jokios garantijos, kad gavėjas perskaitė ar suprato laiško turinį. SUGGESTIONS: SEARCHING_DESC: "Ieškome..." CONTACTS: @@ -365,15 +365,15 @@ lt_LT: BUTTON_CANCEL: "Atšaukti" BUTTON_CLOSE: "Uždaryti" NOTIFICATION_SENT: | - Nepasirinkote "Išsiųstieji" katalogo išsiųstiems laiškams saugoti. - Jei nenorite saugoti laiškų po išsiuntimo, pasirinkite "Nenaudoti" variantą. + Nepasirinkote "Išsiųstieji" katalogo išsiųstiems laiškams saugoti. + Jei nenorite saugoti laiškų po išsiuntimo, pasirinkite "Nenaudoti" variantą. NOTIFICATION_DRAFTS: "Nepasirinkote \"Juodraščiai\" sisteminio katalogo žinutėms, kurios saugomos kol jas rašote." NOTIFICATION_SPAM: | - Nepasirinkote "Šlamštas" sisteminio katalogo laikyti nepageidaujamies laiškams. - Jei norite nekaupti šlamšto ir iškart išmesti, pasirinkite "Nenaudoti" variantą. + Nepasirinkote "Šlamštas" sisteminio katalogo laikyti nepageidaujamies laiškams. + Jei norite nekaupti šlamšto ir iškart išmesti, pasirinkite "Nenaudoti" variantą. NOTIFICATION_TRASH: | - Nepasirinkote "Šiukšliadėžė" sisteminio katalogo ištrintoms žinutėms. - Jei nenorite naudotis šiukšliadėže ir išmesti laiškus visam laikui iškart juos trinant, pasirinkite "Nenaudoti" variantą. + Nepasirinkote "Šiukšliadėžė" sisteminio katalogo ištrintoms žinutėms. + Jei nenorite naudotis šiukšliadėže ir išmesti laiškus visam laikui iškart juos trinant, pasirinkite "Nenaudoti" variantą. NOTIFICATION_ARCHIVE: "Nepasirinkote \"Archyvas\" sisteminio katalogo." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-jų žingsnių patikrinimas" @@ -699,13 +699,13 @@ lt_LT: PHP_VERSION_ERROR_DESC: "Jūsų PHP versija (%VERSION%) žemesnė, nei reikalaujama 5.3.0!" NO_SCRIPT_TITLE: "Šiai aplikacijai reikalinga JavaScript." NO_SCRIPT_DESC: | - JavaScript nepalaikoma Jūsų naršyklėje. - Įjunkite JavaScript palaikymą naršyklėje ir bandykite vėl. + JavaScript nepalaikoma Jūsų naršyklėje. + Įjunkite JavaScript palaikymą naršyklėje ir bandykite vėl. NO_COOKIE_TITLE: "Slapukų palaikymas būtinas šiai aplikacijai." NO_COOKIE_DESC: | - Slapukų palaikymas negalimas jūsų naršyklėje. - Įjunkite slapukų palaikymą naršyklėje ir bandykite vėl. + Slapukų palaikymas negalimas jūsų naršyklėje. + Įjunkite slapukų palaikymą naršyklėje ir bandykite vėl. BAD_BROWSER_TITLE: "Jūsų naršyklė pasenusi." BAD_BROWSER_DESC: | - Norint naudotis visais šios aplikacijos privalumais, - parsisiųskite ir įsidiekite vieną iš šių naršyklių: + Norint naudotis visais šios aplikacijos privalumais, + parsisiųskite ir įsidiekite vieną iš šių naršyklių: diff --git a/rainloop/v/0.0.0/app/localization/webmail/lv_LV.yml b/rainloop/v/0.0.0/app/localization/webmail/lv_LV.yml index 86908a365..3a9d03981 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/lv_LV.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/lv_LV.yml @@ -154,10 +154,10 @@ lv_LV: READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. - There is no guarantee that the recipient has read or understood the message contents. + Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. + There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "Meklē..." CONTACTS: @@ -364,15 +364,15 @@ lv_LV: BUTTON_CANCEL: "Atcelt" BUTTON_CLOSE: "Aizvērt" NOTIFICATION_SENT: | - Tu neesi izvēlējies "Izsūtne" sistēmas mapi, kurā ziņojumi tiek ielikti pēc nosūtīšanas. - Ja nevēlie saglabāt nosūtīto ziņu, lūdzu izvēlies "Nelietot" opciju. + Tu neesi izvēlējies "Izsūtne" sistēmas mapi, kurā ziņojumi tiek ielikti pēc nosūtīšanas. + Ja nevēlie saglabāt nosūtīto ziņu, lūdzu izvēlies "Nelietot" opciju. NOTIFICATION_DRAFTS: "Tu neesi izvēlējies \"Melnraksti\" sistemas mapi, kurā tiktu saglabāti ziņojumi, kamēr tie tiek rakstīti." NOTIFICATION_SPAM: | - Tu neesi izvēlējies "Spams" sistēmas mapi, kurā tiks ievietoti spam ziņojumi. - Ja tu vēlies izdzēst ziņojumus pavisam, izvēlies "Neizmantot" opciju. + Tu neesi izvēlējies "Spams" sistēmas mapi, kurā tiks ievietoti spam ziņojumi. + Ja tu vēlies izdzēst ziņojumus pavisam, izvēlies "Neizmantot" opciju. NOTIFICATION_TRASH: | - Tu neesi izvēlējies "Miskaste" sistēmas mapi. - Ja tu vēlies izdzēst ziņojumus pavisam, izvēlies "Neizmantot" opciju. + Tu neesi izvēlējies "Miskaste" sistēmas mapi. + Ja tu vēlies izdzēst ziņojumus pavisam, izvēlies "Neizmantot" opciju. NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" @@ -697,13 +697,13 @@ lv_LV: PHP_VERSION_ERROR_DESC: "Jūsus PHP versija (%VERSION%) ir zemāka nekā atļauts 5.3.0!" NO_SCRIPT_TITLE: "JavaScript ir nepieciešams." NO_SCRIPT_DESC: | - Jūsu pārlūkprogramma neatbalsta JavaScript. - Lūdzu ieslēdziet JavaScript atbalstu. + Jūsu pārlūkprogramma neatbalsta JavaScript. + Lūdzu ieslēdziet JavaScript atbalstu. NO_COOKIE_TITLE: "Cookies atbalsts ir nepieciešams." NO_COOKIE_DESC: | - Cookies atbalsts nav pieejams šai pārlūkprogrammai. - Lūdzu ieslēdziet Cookies atbalstu. + Cookies atbalsts nav pieejams šai pārlūkprogrammai. + Lūdzu ieslēdziet Cookies atbalstu. BAD_BROWSER_TITLE: "Jūsu pārlūkprogramma ir novecojusi." BAD_BROWSER_DESC: | - Lai izmantotu pilnas šis aplikācijas iespējas, - lejupielādējat un uzinstalējas kādu no šīm pārlukprogrammām: + Lai izmantotu pilnas šis aplikācijas iespējas, + lejupielādējat un uzinstalējas kādu no šīm pārlukprogrammām: diff --git a/rainloop/v/0.0.0/app/localization/webmail/nb_NO.yml b/rainloop/v/0.0.0/app/localization/webmail/nb_NO.yml index 35f6f460e..ea528954d 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/nb_NO.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/nb_NO.yml @@ -151,14 +151,15 @@ nb_NO: PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP-kryptert melding (trykk for å dekryptere)" LINK_DOWNLOAD_AS_ZIP: "Last ned som zip-fil" LINK_SAVE_TO_OWNCLOUD: "Lage i Owncloud" + LINK_SAVE_TO_CLOUD: "Lagre på nett" LINK_SAVE_TO_DROPBOX: "Lagre i Dropbox" READ_RECEIPT: SUBJECT: "Lesebekreftelse (meldinga er lest) - %SUBJECT%" BODY: | - Dette er en lesebekreftelse på e-postmeldinga du sendte til %READ-RECEIPT%. + Dette er en lesebekreftelse på e-postmeldinga du sendte til %READ-RECEIPT%. - Merk: Denne bekreftelsen bekrefter bare at meldinga ble åpnet på mottakerens datamaskin, - og er ingen garanti for at mottakeren har lest, forstått eller er enig i innholdet. + Merk: Denne bekreftelsen bekrefter bare at meldinga ble åpnet på mottakerens datamaskin, + og er ingen garanti for at mottakeren har lest, forstått eller er enig i innholdet. SUGGESTIONS: SEARCHING_DESC: "Søker …" CONTACTS: @@ -365,15 +366,15 @@ nb_NO: BUTTON_CANCEL: "Avbryt" BUTTON_CLOSE: "Lukk" NOTIFICATION_SENT: | - Du har ikke valgt «Sendt» som mappe for sendte meldinger. - Velg «Ikke bruk» hvis du ikke vil lagre sendte meldinger. + Du har ikke valgt «Sendt» som mappe for sendte meldinger. + Velg «Ikke bruk» hvis du ikke vil lagre sendte meldinger. NOTIFICATION_DRAFTS: "Du har ikke valgt «Kladd» som mappe hvor meldinger lagres mens du skriver." NOTIFICATION_SPAM: | - Du har ikke valgt «Søppelpost» som mappe for søppelpost. - Velg «Ikke bruk» hvis du vil slette slike meldinger for godt. + Du har ikke valgt «Søppelpost» som mappe for søppelpost. + Velg «Ikke bruk» hvis du vil slette slike meldinger for godt. NOTIFICATION_TRASH: | - Du har ikke valgt «Papirkurv» som mappe for slettede meldinger. - Velg «Ikke bruk» hvis du vil slette slike meldinger for godt. + Du har ikke valgt «Papirkurv» som mappe for slettede meldinger. + Velg «Ikke bruk» hvis du vil slette slike meldinger for godt. NOTIFICATION_ARCHIVE: "Du har ikke valgt «Arkiv» som mappe for arkiverte meldinger." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "To-stegsbekreftelse" @@ -580,6 +581,7 @@ nb_NO: TITLE_PUBLIC: "Offentlig" DELETING_ASK: "Er du sikker?" GENERATE_ONLY_HTTPS: "Kun HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Lagre utkast automatisk" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Tastatursnarveier" TAB_MAILBOX: "Innboks" @@ -698,13 +700,13 @@ nb_NO: PHP_VERSION_ERROR_DESC: "PHP-installasjonen din (%VERSION%) er eldre enn versjon 5.3.0" NO_SCRIPT_TITLE: "Dette programmet krever Javascript." NO_SCRIPT_DESC: | - Nettleseren din støtter ikke Javascript. - Slå på Javascript-støtte i nettleserens innstillinger, og prøv på nytt. + Nettleseren din støtter ikke Javascript. + Slå på Javascript-støtte i nettleserens innstillinger, og prøv på nytt. NO_COOKIE_TITLE: "Dette programmet krever støtte for informasjonskapsler («cookies»)." NO_COOKIE_DESC: | - Nettleseren din støtter ikke bruk av informasjonskapsler («cookies»). - Slå på cookie-støtte i nettleserens innstillinger, og prøv på nytt. + Nettleseren din støtter ikke bruk av informasjonskapsler («cookies»). + Slå på cookie-støtte i nettleserens innstillinger, og prøv på nytt. BAD_BROWSER_TITLE: "Nettleseren din er utdatert." BAD_BROWSER_DESC: | - Hvis du vil bruke alle funksjonene i programmet, - må du laste ned og installere en av disse nettleserne: + Hvis du vil bruke alle funksjonene i programmet, + må du laste ned og installere en av disse nettleserne: diff --git a/rainloop/v/0.0.0/app/localization/webmail/nl_NL.yml b/rainloop/v/0.0.0/app/localization/webmail/nl_NL.yml index 739afa290..61298ec52 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/nl_NL.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/nl_NL.yml @@ -155,10 +155,10 @@ nl_NL: READ_RECEIPT: SUBJECT: "Ontvangstbevestiging (weergegeven) - %SUBJECT%" BODY: | - Dit is een bevestiging dat uw bericht aan %READ-RECEIPT% is ontvangen. + Dit is een bevestiging dat uw bericht aan %READ-RECEIPT% is ontvangen. - Let op: Deze ontvangstbevestiging bevestigd slechts dat uw bericht was weergegeven op het scherm van de ontvanger. - Er is geen enkele garantie dat uw bericht is gelezen of begrepen. + Let op: Deze ontvangstbevestiging bevestigd slechts dat uw bericht was weergegeven op het scherm van de ontvanger. + Er is geen enkele garantie dat uw bericht is gelezen of begrepen. SUGGESTIONS: SEARCHING_DESC: "Zoeken..." CONTACTS: @@ -365,15 +365,15 @@ nl_NL: BUTTON_CANCEL: "Annuleer" BUTTON_CLOSE: "Sluiten" NOTIFICATION_SENT: | - U heeft nog geen "Verzonden items" folder aangeduid waar de berichten geplaatst worden na het versturen. - Indien u geen verzonden berichten wilt bewaren, kies de "Niet gebruiken" optie. + U heeft nog geen "Verzonden items" folder aangeduid waar de berichten geplaatst worden na het versturen. + Indien u geen verzonden berichten wilt bewaren, kies de "Niet gebruiken" optie. NOTIFICATION_DRAFTS: "U heeft nog geen \"Concepten\" folder aangeduid waar de berichten bewaard worden tijdens het opstellen." NOTIFICATION_SPAM: | - U heeft nog geen "Ongewenste e-mail" folder aangeduid waar de spam berichten geplaatst worden. - Indien u berichten permanent wilt verwijderen, kies de "Niet gebruiken" optie. + U heeft nog geen "Ongewenste e-mail" folder aangeduid waar de spam berichten geplaatst worden. + Indien u berichten permanent wilt verwijderen, kies de "Niet gebruiken" optie. NOTIFICATION_TRASH: | - U heeft nog geen "Verwijderde items" folder aangeduid waar de verwijderde berichten geplaatst worden. - Indien u berichten permanent wilt verwijderen, kies de "Niet gebruiken" optie. + U heeft nog geen "Verwijderde items" folder aangeduid waar de verwijderde berichten geplaatst worden. + Indien u berichten permanent wilt verwijderen, kies de "Niet gebruiken" optie. NOTIFICATION_ARCHIVE: "U heeft nog geen \"Archief\" map aangeduid waar de gearchiveerde berichten geplaatst worden." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Stap verificatie" @@ -702,13 +702,13 @@ nl_NL: PHP_VERSION_ERROR_DESC: "Uw PHP versie (%VERSION%) is lager dan de minimaal vereiste 5.3.0!" NO_SCRIPT_TITLE: "JavaScript is benodigd voor deze applicatie" NO_SCRIPT_DESC: | - JavaScript ondersteuning is niet beschikbaar in uw browser. - Gelieve Javascript in te schakelen en opnieuw te proberen. + JavaScript ondersteuning is niet beschikbaar in uw browser. + Gelieve Javascript in te schakelen en opnieuw te proberen. NO_COOKIE_TITLE: "Cookies ondersteuning is nodig voor deze applicatie" NO_COOKIE_DESC: | - Cookies ondersteuning is niet beschikbaar in uw browser. - Gelieve Cookies in te schakelen en opnieuw te proberen. + Cookies ondersteuning is niet beschikbaar in uw browser. + Gelieve Cookies in te schakelen en opnieuw te proberen. BAD_BROWSER_TITLE: "Uw browser is verouderd" BAD_BROWSER_DESC: | - Om alle functies van deze applicatie te gebruiken, - download en installeer een van de volgende browsers: + Om alle functies van deze applicatie te gebruiken, + download en installeer een van de volgende browsers: diff --git a/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml b/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml index a50b82a60..5fa1378ac 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml @@ -154,10 +154,10 @@ pl_PL: READ_RECEIPT: SUBJECT: "Potwierdzenie wyświetlenia wiadomości o tytule: %SUBJECT%" BODY: | - Potwierdzenie wyświetlenia wiadomości wysłanej na adres: %READ-RECEIPT%. + Potwierdzenie wyświetlenia wiadomości wysłanej na adres: %READ-RECEIPT%. - Uwaga: Otrzymanie tego potwierdzenia jest dowodem na to, że wiadomość została wyświetlona na komputerze odbiorcy. - Nie ma jednak żadnej gwarancji, że odbiorca faktycznie zapoznał się z jej treścią. + Uwaga: Otrzymanie tego potwierdzenia jest dowodem na to, że wiadomość została wyświetlona na komputerze odbiorcy. + Nie ma jednak żadnej gwarancji, że odbiorca faktycznie zapoznał się z jej treścią. SUGGESTIONS: SEARCHING_DESC: "Wyszukiwanie..." CONTACTS: @@ -364,15 +364,15 @@ pl_PL: BUTTON_CANCEL: "Anuluj" BUTTON_CLOSE: "Zamknij" NOTIFICATION_SENT: | - Nie wybrano folderu: "Wysłane", do którego przenoszone są wysłane wiadomości. - Jeżeli wysyłane wiadomości nie mają być przechowywane, proszę zaznaczyć opcję: "Nie używaj". + Nie wybrano folderu: "Wysłane", do którego przenoszone są wysłane wiadomości. + Jeżeli wysyłane wiadomości nie mają być przechowywane, proszę zaznaczyć opcję: "Nie używaj". NOTIFICATION_DRAFTS: "Nie wybrano folderu: \"Wersje robocze\", do którego są zapisywane wiadomości w trakcie ich tworzenia." NOTIFICATION_SPAM: | - Nie wybrano folderu: "Niechciane", do którego przenoszone są niepożadane wiadomości. - Jeżeli niechciane wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji: "Nie używaj". + Nie wybrano folderu: "Niechciane", do którego przenoszone są niepożadane wiadomości. + Jeżeli niechciane wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji: "Nie używaj". NOTIFICATION_TRASH: | - Nie wybrano folderu: "Kosz", do którego przenoszone są wszystkie usunięte wiadomości. - Jeżeli wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji: "Nie używaj". + Nie wybrano folderu: "Kosz", do którego przenoszone są wszystkie usunięte wiadomości. + Jeżeli wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji: "Nie używaj". NOTIFICATION_ARCHIVE: "Nie został wybrany folder \"Archiwum\", zostanie użyty systemowy folder archiwizacji wiadomości." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Dwuskładnikowa autoryzacja" @@ -700,13 +700,13 @@ pl_PL: PHP_VERSION_ERROR_DESC: "Aktualnie zainstalowana wersja PHP: (%VERSION%), jest niższa niż minimalnie wymagana 5.3.0!" NO_SCRIPT_TITLE: "Ta aplikacja wymaga JavaScript" NO_SCRIPT_DESC: | - Twoja przeglądarka nie obsługuje JavaScript - Proszę o umożliwienie obsługi JavaScript w przeglądarce, oraz ponowne załadowanie tej strony. + Twoja przeglądarka nie obsługuje JavaScript + Proszę o umożliwienie obsługi JavaScript w przeglądarce, oraz ponowne załadowanie tej strony. NO_COOKIE_TITLE: "Ta aplikacja wymaga plików Cookies" NO_COOKIE_DESC: | - Obsługa Cookies jest wyłączona w twojej przeglądarce - Proszę o umożliwienie obsługi plików Cookie w przeglądarce oraz ponowne uruchomienie tej strony. + Obsługa Cookies jest wyłączona w twojej przeglądarce + Proszę o umożliwienie obsługi plików Cookie w przeglądarce oraz ponowne uruchomienie tej strony. BAD_BROWSER_TITLE: "Twoja przeglądarka jest przestarzała!" BAD_BROWSER_DESC: | - W celu wykorzystania wszystkich funkcji tej aplikacji, - zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek: + W celu wykorzystania wszystkich funkcji tej aplikacji, + zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek: diff --git a/rainloop/v/0.0.0/app/localization/webmail/pt_BR.yml b/rainloop/v/0.0.0/app/localization/webmail/pt_BR.yml index e22839b45..0b1e144cf 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/pt_BR.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/pt_BR.yml @@ -155,10 +155,10 @@ pt_BR: READ_RECEIPT: SUBJECT: "Aviso de recepção (Visualizada) - %SUBJECT%" BODY: | - Comprovante de retorno para o e-mail que você enviou para %READ-RECEIPT%. + Comprovante de retorno para o e-mail que você enviou para %READ-RECEIPT%. - Nota: Este comprovante de retorno apenas reconhece que a mensagem foi exibida no computador do destinatário. - Não há garantia de que o destinatário tenha lido ou compreendido o conteúdo da mensagem. + Nota: Este comprovante de retorno apenas reconhece que a mensagem foi exibida no computador do destinatário. + Não há garantia de que o destinatário tenha lido ou compreendido o conteúdo da mensagem. SUGGESTIONS: SEARCHING_DESC: "Procurando..." CONTACTS: @@ -365,15 +365,15 @@ pt_BR: BUTTON_CANCEL: "Cancelar" BUTTON_CLOSE: "Fechar" NOTIFICATION_SENT: | - Você não selecionou a pasta "Enviadas" do sistema que será colocada as mensagens após o envio. - Se você não quiser salvar a mensagem enviada, por favor selecione a opção"Não usar". + Você não selecionou a pasta "Enviadas" do sistema que será colocada as mensagens após o envio. + Se você não quiser salvar a mensagem enviada, por favor selecione a opção"Não usar". NOTIFICATION_DRAFTS: "Você não selecionou a pasta \"Rascunhos\" do sistema que será colocada as mensagens salvas durante a composição." NOTIFICATION_SPAM: | - Você não selecionou a pasta "Lixo Eletrônico" do sistema que será colocada as mensagens spams. - Se você deseja remover a mensagem permanentemente, por favor selecione a opção"Não usar". + Você não selecionou a pasta "Lixo Eletrônico" do sistema que será colocada as mensagens spams. + Se você deseja remover a mensagem permanentemente, por favor selecione a opção"Não usar". NOTIFICATION_TRASH: | - Você não selecionou a pasta do sistema que serão colocadas as mensagens excluídas. - Se você deseja remover a mensagem permanentemente, por favor selecione a opção"Não usar". + Você não selecionou a pasta do sistema que serão colocadas as mensagens excluídas. + Se você deseja remover a mensagem permanentemente, por favor selecione a opção"Não usar". NOTIFICATION_ARCHIVE: "Você não selecionou a pasta \"Arquivadas\" do sistema que serão colocadas as mensagens arquivadas." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Verificação de duas etapas" @@ -702,13 +702,13 @@ pt_BR: PHP_VERSION_ERROR_DESC: "Sua versão PHP (%VERSION%) é menor do que o mínimo exigido 5.3.0!" NO_SCRIPT_TITLE: "JavaScript é necessário para esta aplicação." NO_SCRIPT_DESC: | - O JavaScript não está disponível em seu navegador. - Por favor ative o suporte a JavaScript nas configurações do seu navegador e tente novamente. + O JavaScript não está disponível em seu navegador. + Por favor ative o suporte a JavaScript nas configurações do seu navegador e tente novamente. NO_COOKIE_TITLE: "É necessário suporte a cookies para esta aplicação." NO_COOKIE_DESC: | - Os Cookies não estão disponíveis em seu navegador. - Por favor ative o suporte a Cookies nas configurações do seu navegador e tente novamente. + Os Cookies não estão disponíveis em seu navegador. + Por favor ative o suporte a Cookies nas configurações do seu navegador e tente novamente. BAD_BROWSER_TITLE: "Seu navegador está desatualizado." BAD_BROWSER_DESC: | - Para usar todos os recursos do aplicativo, - baixe e instale um desses navegadores: + Para usar todos os recursos do aplicativo, + baixe e instale um desses navegadores: diff --git a/rainloop/v/0.0.0/app/localization/webmail/pt_PT.yml b/rainloop/v/0.0.0/app/localization/webmail/pt_PT.yml index db8a814aa..ef6d67d09 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/pt_PT.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/pt_PT.yml @@ -149,10 +149,10 @@ pt_PT: READ_RECEIPT: SUBJECT: "Recibo de leitura (apresentado) - %SUBJECT%" BODY: | - Este é um comprovativo de leitura para o e-mail que você enviou para %READ-RECEIPT%. + Este é um comprovativo de leitura para o e-mail que você enviou para %READ-RECEIPT%. - Nota: Este comprovativo apenas confirma que a mensagem foi apresentada no computador do destinatário. - Não existe nenhuma garantia de que o destinatário tenha lido ou compreendido o conteúdo da mensagem. + Nota: Este comprovativo apenas confirma que a mensagem foi apresentada no computador do destinatário. + Não existe nenhuma garantia de que o destinatário tenha lido ou compreendido o conteúdo da mensagem. SUGGESTIONS: SEARCHING_DESC: "A procurar..." CONTACTS: @@ -359,15 +359,15 @@ pt_PT: BUTTON_CANCEL: "Cancelar" BUTTON_CLOSE: "Fechar" NOTIFICATION_SENT: | - Você não selecionou a pasta "Sent" de sistema, onde as mensagens enviadas são colocadas. - Se você não quiser salvar as mensagens enviadas, por favor selecione a opção "Do not use". + Você não selecionou a pasta "Sent" de sistema, onde as mensagens enviadas são colocadas. + Se você não quiser salvar as mensagens enviadas, por favor selecione a opção "Do not use". NOTIFICATION_DRAFTS: "Você não selecionou a pasta \"Drafts\" de sistema, onde as mensagens são guardadas enquanto são escritas." NOTIFICATION_SPAM: | - Você não selecionou a pasta "Spam" de sistema, onde as mensagens de spam são colocadas. - Se você deseja remover as mensagens definitivamente, por favor selecione a opção "Do not use". + Você não selecionou a pasta "Spam" de sistema, onde as mensagens de spam são colocadas. + Se você deseja remover as mensagens definitivamente, por favor selecione a opção "Do not use". NOTIFICATION_TRASH: | - Você não selecionou a pasta "Trash" de sistema, onde as mensagens eliminadas são colocadas. - Se você deseja remover as mensagens definitivamente, por favor selecione a opção "Do not use". + Você não selecionou a pasta "Trash" de sistema, onde as mensagens eliminadas são colocadas. + Se você deseja remover as mensagens definitivamente, por favor selecione a opção "Do not use". NOTIFICATION_ARCHIVE: "Você não selecionou a pasta \"Archive\" de sistema, onde as mensagens arquivadas são colocadas." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Verificação em 2-Etapas" @@ -692,13 +692,13 @@ pt_PT: PHP_VERSION_ERROR_DESC: "A sua versão do PHP (%VERSION%) é menor do que a mínima exigida: 5.3.0!" NO_SCRIPT_TITLE: "É necessário JavaScript para esta aplicação." NO_SCRIPT_DESC: | - O suporte de JavaScript não está disponível no seu navegador. - Por favor ative o suporte de JavaScript nas definições do seu navegador e tente novamente. + O suporte de JavaScript não está disponível no seu navegador. + Por favor ative o suporte de JavaScript nas definições do seu navegador e tente novamente. NO_COOKIE_TITLE: "É necessário suporte de cookies para esta aplicação." NO_COOKIE_DESC: | - O suport de Cookies não está disponível no seu navegador. - Por favor ative o suporte de Cookies nas definições do seu navegador e tente novamente. + O suport de Cookies não está disponível no seu navegador. + Por favor ative o suporte de Cookies nas definições do seu navegador e tente novamente. BAD_BROWSER_TITLE: "O seu navegador está desatualizado." BAD_BROWSER_DESC: | - Para usar todas as funções da aplicação, - transfira e instale um destes navegadores: + Para usar todas as funções da aplicação, + transfira e instale um destes navegadores: diff --git a/rainloop/v/0.0.0/app/localization/webmail/ru_RU.yml b/rainloop/v/0.0.0/app/localization/webmail/ru_RU.yml index a1b6acb2b..503102768 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/ru_RU.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/ru_RU.yml @@ -145,20 +145,21 @@ ru_RU: PRINT_LABEL_ATTACHMENTS: "Файлы" MESSAGE_LOADING: "Загрузка" MESSAGE_VIEW_DESC: "Выберите сообщение для просмотра." - MESSAGE_VIEW_MOVE_DESC: "Выберите имя папки в левой панели, чтобы переместить сообщения." + MESSAGE_VIEW_MOVE_DESC: "Выберите имя папки в левой панели, чтобы переместить сообщение." PGP_PASSWORD_INPUT_PLACEHOLDER: "Пароль" PGP_SIGNED_MESSAGE_DESC: "OpenPGP подписанное сообщение (нажмите, чтобы подтвердить)" PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP шифрованное сообщение (нажмите, чтобы расшифровать)" LINK_DOWNLOAD_AS_ZIP: "Сохранить как zip" LINK_SAVE_TO_OWNCLOUD: "Сохранить в ownCloud" + LINK_SAVE_TO_CLOUD: "Сохранить в облаке" LINK_SAVE_TO_DROPBOX: "Сохранить в Dropbox" READ_RECEIPT: SUBJECT: "Уведомление о прочтении письма - %SUBJECT%" BODY: | - Это уведомление о прочтении для сообщения, которое вы отправили в адрес %READ-RECEIPT%. + Это уведомление о прочтении для сообщения, которое вы отправили в адрес %READ-RECEIPT%. - Примечание: Это уведомление о прочтении означает лишь то, что сообщение было отображено на машине получателя. - Оно не гарантирует того, что получатель прочёл или понял содержимое сообщения. + Примечание: Это уведомление о прочтении означает лишь то, что сообщение было отображено на машине получателя. + Оно не гарантирует того, что получатель прочёл или понял содержимое сообщения. SUGGESTIONS: SEARCHING_DESC: "Поиск..." CONTACTS: @@ -365,15 +366,15 @@ ru_RU: BUTTON_CANCEL: "Отменить" BUTTON_CLOSE: "Закрыть" NOTIFICATION_SENT: | - Вы еще не выбрали системную папку "Отправленные", в которую складываются все сообщения после отправки. - Если вы не хотите сохранять отправленные письма, пожалуйста, выберите пункт "Не использовать". + Вы еще не выбрали системную папку "Отправленные", в которую складываются все сообщения после отправки. + Если вы не хотите сохранять отправленные письма, пожалуйста, выберите пункт "Не использовать". NOTIFICATION_DRAFTS: "Вы еще не выбрали системную папку \"Черновики\", в которую складываются все сохраненные сообщения." NOTIFICATION_SPAM: | - Вы еще не выбрали системную папку "Спам", в которую складываются все спамовые сообщения. - Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт "Не использовать". + Вы еще не выбрали системную папку "Спам", в которую складываются все спамовые сообщения. + Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт "Не использовать". NOTIFICATION_TRASH: | - Вы еще не выбрали системную папку "Удаленные", в которую складываются все сообщения после удаления. - Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт "Не использовать". + Вы еще не выбрали системную папку "Удаленные", в которую складываются все сообщения после удаления. + Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт "Не использовать". NOTIFICATION_ARCHIVE: "Вы еще не выбрали системную папку \"Архив\", в которую складываются все сообщения после архивации." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Двухфакторная верификация" @@ -581,6 +582,7 @@ ru_RU: TITLE_PUBLIC: "Публичный" DELETING_ASK: "Точно?" GENERATE_ONLY_HTTPS: "HTTPS only" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Автоматически сохранять черновик" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Сочетания клавиш" TAB_MAILBOX: "Почта" @@ -699,13 +701,13 @@ ru_RU: PHP_VERSION_ERROR_DESC: "Ваша версия PHP (%VERSION%) ниже требуемой 5.3.0!" NO_SCRIPT_TITLE: "Для работы приложения необходим JavaScript." NO_SCRIPT_DESC: | - По-видимому, JavaScript либо не поддерживается вашим браузером, либо отключен. - Включите JavaScript, изменив настройки браузера, затем повторите попытку. + По-видимому, JavaScript либо не поддерживается вашим браузером, либо отключен. + Включите JavaScript, изменив настройки браузера, затем повторите попытку. NO_COOKIE_TITLE: "Для работы приложения необходимы Cookie." NO_COOKIE_DESC: | - По-видимому, Cookie либо не поддерживаются вашим браузером, либо отключены. - Включите Cookie, изменив настройки браузера, затем повторите попытку. + По-видимому, Cookie либо не поддерживаются вашим браузером, либо отключены. + Включите Cookie, изменив настройки браузера, затем повторите попытку. BAD_BROWSER_TITLE: "Ваш браузер устарел." BAD_BROWSER_DESC: | - Чтобы использовать все возможности приложения, - загрузите и установите один из этих браузеров + Чтобы использовать все возможности приложения, + загрузите и установите один из этих браузеров diff --git a/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml b/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml index 6c894f9f1..d58f7f2df 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml @@ -155,10 +155,10 @@ sk_SK: READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. - There is no guarantee that the recipient has read or understood the message contents. + Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. + There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "Hľadám..." CONTACTS: @@ -365,15 +365,15 @@ sk_SK: BUTTON_CANCEL: "Zrušiť" BUTTON_CLOSE: "Zatvoriť" NOTIFICATION_SENT: | - Nepriradili ste systémový priečinok "Odoslané" kam budú správy presunuté po ich odoslaní. - Ak nechcete ukladať odoslané správy, vyberte prosím možnosť "Nepoužívať". + Nepriradili ste systémový priečinok "Odoslané" kam budú správy presunuté po ich odoslaní. + Ak nechcete ukladať odoslané správy, vyberte prosím možnosť "Nepoužívať". NOTIFICATION_DRAFTS: "Nepriradili ste systémový priečinok pre \"Koncepty\" kam sú správy ukladané počas ich písania." NOTIFICATION_SPAM: | - Nepriradili ste systémový priečinok pre "Spam" kam sú ukladané nevyžiadané správy. - Ak si želáte takéto správy odstraňovať natrvalo, vyberte prosím možnosť "Nepoužívať". + Nepriradili ste systémový priečinok pre "Spam" kam sú ukladané nevyžiadané správy. + Ak si želáte takéto správy odstraňovať natrvalo, vyberte prosím možnosť "Nepoužívať". NOTIFICATION_TRASH: | - Nepriradili ste systémový priečinok pre "Kôš" kam sú správy presunuté po ich odstránení. - Ak si želáte takéto správy odstraňovať natrvalo, vyberte prosím možnosť "Nepoužívať". + Nepriradili ste systémový priečinok pre "Kôš" kam sú správy presunuté po ich odstránení. + Ak si želáte takéto správy odstraňovať natrvalo, vyberte prosím možnosť "Nepoužívať". NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" @@ -698,13 +698,13 @@ sk_SK: PHP_VERSION_ERROR_DESC: "Your PHP version (%VERSION%) is lower than the minimal required 5.3.0!" NO_SCRIPT_TITLE: "Táto aplikácia vyžaduje JavaScript." NO_SCRIPT_DESC: | - Váš internetový prehliadač nepodporuje JavaScript. - Prosím povoľte podporu JavaScriptu v nastaveniach vášho internetového prehliadača a skúste to znova. + Váš internetový prehliadač nepodporuje JavaScript. + Prosím povoľte podporu JavaScriptu v nastaveniach vášho internetového prehliadača a skúste to znova. NO_COOKIE_TITLE: "Táto aplikácia vyžaduje podporu Cookies." NO_COOKIE_DESC: | - Váš internetový prehliadač nepodporuje Cookies. - Prosím povoľte podporu Cookies v nastaveniach vášho internetového prehliadača a skúste to znova. + Váš internetový prehliadač nepodporuje Cookies. + Prosím povoľte podporu Cookies v nastaveniach vášho internetového prehliadača a skúste to znova. BAD_BROWSER_TITLE: "Používate zastaralý internetový prehliadač." BAD_BROWSER_DESC: | - Aby ste mohli využívať všetky funkcie tejto aplikácie, - použite niektorý z nasledujúcich internetových prehliadačov: + Aby ste mohli využívať všetky funkcie tejto aplikácie, + použite niektorý z nasledujúcich internetových prehliadačov: diff --git a/rainloop/v/0.0.0/app/localization/webmail/sl_SI.yml b/rainloop/v/0.0.0/app/localization/webmail/sl_SI.yml index c7da11412..e92a7ff7d 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/sl_SI.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/sl_SI.yml @@ -155,10 +155,10 @@ sl_SI: READ_RECEIPT: SUBJECT: "Povratno poročilo (prikazano) - %SUBJECT%" BODY: | - To je povratno poročilo za sporočilo, ki je bilo poslano na %READ-RECEIPT%. + To je povratno poročilo za sporočilo, ki je bilo poslano na %READ-RECEIPT%. - Opomba: "To povratno poročilo pomeni le, da je bilo sporočilo prikazano na računalniku prejemnika." - Ni jamstva za prejemnikovo razumevanje vsebine sporočila. + Opomba: "To povratno poročilo pomeni le, da je bilo sporočilo prikazano na računalniku prejemnika." + Ni jamstva za prejemnikovo razumevanje vsebine sporočila. SUGGESTIONS: SEARCHING_DESC: "Iskanje..." CONTACTS: @@ -365,15 +365,15 @@ sl_SI: BUTTON_CANCEL: "Prekliči" BUTTON_CLOSE: "Zapri" NOTIFICATION_SENT: | - Niste izbrali sistemske mape "Poslano" za shranjevanje poslanih sporočil. - Če ne želite shranjevati poslanih sporočil, izberite možnost "Ne uporabi". + Niste izbrali sistemske mape "Poslano" za shranjevanje poslanih sporočil. + Če ne želite shranjevati poslanih sporočil, izberite možnost "Ne uporabi". NOTIFICATION_DRAFTS: "Niste izbrali sistemske mape \"Osnutki\" za začasno shranjevanje sporočil med sestavljanjem." NOTIFICATION_SPAM: | - Niste izbrali sistemske mape "Vsiljena pošta" za shranjevanje vsiljene pošte. - Če želite vsiljeno pošto sproti brisati, izberite možnost "Ne uporabi". + Niste izbrali sistemske mape "Vsiljena pošta" za shranjevanje vsiljene pošte. + Če želite vsiljeno pošto sproti brisati, izberite možnost "Ne uporabi". NOTIFICATION_TRASH: | - Niste izbrali sistemske mape "Smetnjak" za izbrisana sporočila pred trajnim brisanjem. - Če jih želite vedno trajno izbrisati, izberite možnost "Ne uporabi". + Niste izbrali sistemske mape "Smetnjak" za izbrisana sporočila pred trajnim brisanjem. + Če jih želite vedno trajno izbrisati, izberite možnost "Ne uporabi". NOTIFICATION_ARCHIVE: "Niste izbrali sistemske mape \"Arhiv\" za trajno arhiviranje sporočil." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-stopenjsko overjanje (TOTP)" @@ -698,13 +698,13 @@ sl_SI: PHP_VERSION_ERROR_DESC: "Vaša PHP verzija (%VERSION%) je manjša kot potrebna 5.3.0!" NO_SCRIPT_TITLE: "Ta aplikacija potrebuje omogočen JavaScript." NO_SCRIPT_DESC: | - Brskalnik nima podpore za JavaScript. - Omogočite JavaScript v brskalniku in poskusite znova. + Brskalnik nima podpore za JavaScript. + Omogočite JavaScript v brskalniku in poskusite znova. NO_COOKIE_TITLE: "Ta aplikacije potrebuje omogočene piškotke." NO_COOKIE_DESC: | - Brskalnik nima omogočenih piškotkov. - Omogočite piškotke v brskalniku in poskusite znova. + Brskalnik nima omogočenih piškotkov. + Omogočite piškotke v brskalniku in poskusite znova. BAD_BROWSER_TITLE: "Brskalnik je zastarel." BAD_BROWSER_DESC: | - Za uporabo vseh funkcij te aplikacije - prenesite in namestite enega od teh brskalnikov: + Za uporabo vseh funkcij te aplikacije + prenesite in namestite enega od teh brskalnikov: diff --git a/rainloop/v/0.0.0/app/localization/webmail/tr_TR.yml b/rainloop/v/0.0.0/app/localization/webmail/tr_TR.yml index 232e1d1b7..23ac45099 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/tr_TR.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/tr_TR.yml @@ -154,10 +154,10 @@ tr_TR: READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. - There is no guarantee that the recipient has read or understood the message contents. + Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. + There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "Aranıyor..." CONTACTS: @@ -364,13 +364,13 @@ tr_TR: BUTTON_CANCEL: "Vazgeç" BUTTON_CLOSE: "Kapat" NOTIFICATION_SENT: | - Herhangi bir sistem gönderilen klasörü seçmediniz normalde mesaj gönderildikten sonra "Gönderilen"'ler klasörüne kaydedilir - Eğer gönderilenlerin kaydedilmesini istemiyorsanız lütfen ayarlardan "Kullanma" seçeneğini seçin. + Herhangi bir sistem gönderilen klasörü seçmediniz normalde mesaj gönderildikten sonra "Gönderilen"'ler klasörüne kaydedilir + Eğer gönderilenlerin kaydedilmesini istemiyorsanız lütfen ayarlardan "Kullanma" seçeneğini seçin. NOTIFICATION_DRAFTS: "Herhangi bir sistem taslak klasörü seçmediniz.\"Taslak\" klasörü otomatik mesajınızı kaydeder" NOTIFICATION_SPAM: |- - Herhangi bir sistem spam klasörü seçmediniz."Spam" klasörü spam iletileri barındırır. + Herhangi bir sistem spam klasörü seçmediniz."Spam" klasörü spam iletileri barındırır. NOTIFICATION_TRASH: |- - Herhangi bir sistem çöp kutusu klasörü seçmediniz normalde mesaj silindikten sonra "Çöp Kutusu" klasörüne kaydedilir + Herhangi bir sistem çöp kutusu klasörü seçmediniz normalde mesaj silindikten sonra "Çöp Kutusu" klasörüne kaydedilir NOTIFICATION_ARCHIVE: "Herhangi bir sistem arşiv klasörü seçmediniz." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Basamaklı doğrumalama" @@ -698,13 +698,13 @@ tr_TR: PHP_VERSION_ERROR_DESC: "PHP sürümünüz (%VERSION%) en az php 5.3.0 sürümü gerekli!" NO_SCRIPT_TITLE: "JavaScript bu uygulama için gereklidir." NO_SCRIPT_DESC: | - JavaScript desteği tarayıcınızda mevcut değil. - Tarayıcı ayarlarında JavaScript desteğini etkinleştirin ve yeniden deneyin. + JavaScript desteği tarayıcınızda mevcut değil. + Tarayıcı ayarlarında JavaScript desteğini etkinleştirin ve yeniden deneyin. NO_COOKIE_TITLE: "Çerezler desteği bu uygulama için gerekli." NO_COOKIE_DESC: | - Çerezler destek tarayıcınızda mevcut değil. - Tarayıcı ayarlarında Cookie desteği etkinleştirin ve yeniden deneyin. + Çerezler destek tarayıcınızda mevcut değil. + Tarayıcı ayarlarında Cookie desteği etkinleştirin ve yeniden deneyin. BAD_BROWSER_TITLE: "Tarayıcınız çok eski." BAD_BROWSER_DESC: | - Uygulamanın tüm özelliklerini kullanmak için, - Bu tarayıcılardan birini indirmek ve yükleyin: + Uygulamanın tüm özelliklerini kullanmak için, + Bu tarayıcılardan birini indirmek ve yükleyin: diff --git a/rainloop/v/0.0.0/app/localization/webmail/uk_UA.yml b/rainloop/v/0.0.0/app/localization/webmail/uk_UA.yml index ff22edde2..47eef352a 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/uk_UA.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/uk_UA.yml @@ -152,10 +152,10 @@ uk_UA: READ_RECEIPT: SUBJECT: "Сповіщення про прочитання цього повідомлення - %SUBJECT%" BODY: | - Це сповіщення про прочитання для повідомлення, яке ви надіслали в адресу %READ-RECEIPT%. + Це сповіщення про прочитання для повідомлення, яке ви надіслали в адресу %READ-RECEIPT%. - Примітка: Це сповіщення про прочитання означає лише, що повідомлення було відображено на машину отримувача. - Воно не гарантує, що отримувач прочитав чи зрозумів зміст повідомлення. + Примітка: Це сповіщення про прочитання означає лише, що повідомлення було відображено на машину отримувача. + Воно не гарантує, що отримувач прочитав чи зрозумів зміст повідомлення. SUGGESTIONS: SEARCHING_DESC: "Пошук..." CONTACTS: @@ -362,15 +362,15 @@ uk_UA: BUTTON_CANCEL: "Відмінити" BUTTON_CLOSE: "Закрити" NOTIFICATION_SENT: | - Ви ще не обрали системну теку "Вихідні", в яку складаються всі повідомлення післе надсилання. - Якщо ви не хочете зберігати вихідні листи, будь ласка, виберіть пункт "Не використовувати". + Ви ще не обрали системну теку "Вихідні", в яку складаються всі повідомлення післе надсилання. + Якщо ви не хочете зберігати вихідні листи, будь ласка, виберіть пункт "Не використовувати". NOTIFICATION_DRAFTS: "Ви ще не обрали системну теку \"Чорновики\", в яку складаються всі збережені повідомлення." NOTIFICATION_SPAM: | - Ви ще не обрали системну теку "Спам", в яку складаються всі спам повідомлення. - Якщо ви не хочете видаляти листи одразу, будь ласка, виберіть пункт "Не використовувати". + Ви ще не обрали системну теку "Спам", в яку складаються всі спам повідомлення. + Якщо ви не хочете видаляти листи одразу, будь ласка, виберіть пункт "Не використовувати". NOTIFICATION_TRASH: | - Ви ще не обрали системну теку "Удаленные", в яку складаються всі повідомлення після видалення. - Якщо ви не хочете видаляти листи одразу, будь ласка, виберіть пункт "Не використовувати". + Ви ще не обрали системну теку "Удаленные", в яку складаються всі повідомлення після видалення. + Якщо ви не хочете видаляти листи одразу, будь ласка, виберіть пункт "Не використовувати". NOTIFICATION_ARCHIVE: "Ви ще не обрали системну теку \"Архив\", в яку складаються всі повідомлення після архівації." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "Двофакторна верификація" @@ -692,13 +692,13 @@ uk_UA: PHP_VERSION_ERROR_DESC: "Ваша версія PHP (%VERSION%) нижче потрібної 5.3.0!" NO_SCRIPT_TITLE: "Для роботи додатку необхідний JavaScript." NO_SCRIPT_DESC: | - Здається, JavaScript або не підтримується вашим браузером, або вимкнений. - Увімкніть JavaScript, змінив налаштівання браузера, і спробуйте знову. + Здається, JavaScript або не підтримується вашим браузером, або вимкнений. + Увімкніть JavaScript, змінив налаштівання браузера, і спробуйте знову. NO_COOKIE_TITLE: "Для роботи додатку необхідні Cookie." NO_COOKIE_DESC: | - Здається, Cookie або не підтримуються вашим браузером, або вимкнені. - Увімкніть Cookie, змінив налаштівання браузера, і спробуйте знову. + Здається, Cookie або не підтримуються вашим браузером, або вимкнені. + Увімкніть Cookie, змінив налаштівання браузера, і спробуйте знову. BAD_BROWSER_TITLE: "Ваш браузер застарів." BAD_BROWSER_DESC: | - Щоб використовувати всі можливості додатку, - завантажте і встановіть один з цих браузерів + Щоб використовувати всі можливості додатку, + завантажте і встановіть один з цих браузерів diff --git a/rainloop/v/0.0.0/app/localization/webmail/zh_CN.yml b/rainloop/v/0.0.0/app/localization/webmail/zh_CN.yml index 3a05aa2ff..3acbc26db 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/zh_CN.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/zh_CN.yml @@ -154,9 +154,9 @@ zh_CN: READ_RECEIPT: SUBJECT: "妥投回执 - %SUBJECT%" BODY: | - 本回执表示您发送给 %READ-RECEIPT% 的邮件已妥投。 + 本回执表示您发送给 %READ-RECEIPT% 的邮件已妥投。 - 注意:本回执仅意味着邮件已妥投并已在收件人的电脑中出示过,但并不能保证收件人已阅读或已明白邮件内容。 + 注意:本回执仅意味着邮件已妥投并已在收件人的电脑中出示过,但并不能保证收件人已阅读或已明白邮件内容。 SUGGESTIONS: SEARCHING_DESC: "搜索中..." CONTACTS: @@ -363,15 +363,15 @@ zh_CN: BUTTON_CANCEL: "取消" BUTTON_CLOSE: "关闭" NOTIFICATION_SENT: | - 您没有选择 已发邮件 文件夹来存储已发送邮件。 - 如果您不希望保存已发邮件,请选择 不使用 选项。 + 您没有选择 已发邮件 文件夹来存储已发送邮件。 + 如果您不希望保存已发邮件,请选择 不使用 选项。 NOTIFICATION_DRAFTS: "您没有选择 草稿 文件夹来存储邮件草稿。" NOTIFICATION_SPAM: | - 您没有选择 垃圾邮件 文件夹来存储垃圾邮件。 - 如果您希望永久删除邮件,请选择 不使用 选项。 + 您没有选择 垃圾邮件 文件夹来存储垃圾邮件。 + 如果您希望永久删除邮件,请选择 不使用 选项。 NOTIFICATION_TRASH: | - 您没有选择 已删除邮件 文件夹来存储垃圾邮件。 - 如果您希望永久删除邮件,请选择 不使用 选项。 + 您没有选择 已删除邮件 文件夹来存储垃圾邮件。 + 如果您希望永久删除邮件,请选择 不使用 选项。 NOTIFICATION_ARCHIVE: "您没有选择“已归档邮件”文件夹来存储归档邮件。" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "两步验证" @@ -696,13 +696,13 @@ zh_CN: PHP_VERSION_ERROR_DESC: "您的PHP版本 (%VERSION%) 低于所需的 5.3.0!" NO_SCRIPT_TITLE: "JavaScript 需要启用!" NO_SCRIPT_DESC: | - 您的浏览器不支持JavaScript。 - 请启用浏览器的JavaScript支持并重试。 + 您的浏览器不支持JavaScript。 + 请启用浏览器的JavaScript支持并重试。 NO_COOKIE_TITLE: "Cookies 需要启用!" NO_COOKIE_DESC: | - 您的浏览器不支持Cookies。 - 请启用浏览器的Cookies支持并重试。 + 您的浏览器不支持Cookies。 + 请启用浏览器的Cookies支持并重试。 BAD_BROWSER_TITLE: "您的浏览器版本太低" BAD_BROWSER_DESC: | - 如果想使用所有功能, - 下载并安装下列其中一款浏览器: + 如果想使用所有功能, + 下载并安装下列其中一款浏览器: diff --git a/rainloop/v/0.0.0/app/localization/webmail/zh_TW.yml b/rainloop/v/0.0.0/app/localization/webmail/zh_TW.yml index f960454d5..82bae7f8a 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/zh_TW.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/zh_TW.yml @@ -149,10 +149,10 @@ zh_TW: READ_RECEIPT: SUBJECT: "Return Receipt (displayed) - %SUBJECT%" BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. - Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. - There is no guarantee that the recipient has read or understood the message contents. + Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. + There is no guarantee that the recipient has read or understood the message contents. SUGGESTIONS: SEARCHING_DESC: "搜索中..." CONTACTS: @@ -359,15 +359,15 @@ zh_TW: BUTTON_CANCEL: "取消" BUTTON_CLOSE: "關閉" NOTIFICATION_SENT: | - 您沒有選擇 已發郵件 資料夾來存儲已發送郵件。 - 如果您不希望保存已發郵件,請選擇 不使用 選項。 + 您沒有選擇 已發郵件 資料夾來存儲已發送郵件。 + 如果您不希望保存已發郵件,請選擇 不使用 選項。 NOTIFICATION_DRAFTS: "您沒有選擇 草稿 資料夾來存儲郵件草稿。" NOTIFICATION_SPAM: | - 您沒有選擇 垃圾郵件 資料夾來存儲垃圾郵件。 - 如果您希望永久刪除郵件,請選擇 不使用 選項。 + 您沒有選擇 垃圾郵件 資料夾來存儲垃圾郵件。 + 如果您希望永久刪除郵件,請選擇 不使用 選項。 NOTIFICATION_TRASH: | - 您沒有選擇 已刪除郵件 資料夾來存儲垃圾郵件。 - 如果您希望永久刪除郵件,請選擇 不使用 選項。 + 您沒有選擇 已刪除郵件 資料夾來存儲垃圾郵件。 + 如果您希望永久刪除郵件,請選擇 不使用 選項。 NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "兩步驗證" @@ -685,13 +685,13 @@ zh_TW: PHP_VERSION_ERROR_DESC: "您的PHP版本 (%VERSION%) 低於所需的 5.3.0!" NO_SCRIPT_TITLE: "JavaScript 需要啟用!" NO_SCRIPT_DESC: | - 您的瀏覽器不支持JavaScript。 - 請啟用瀏覽器的JavaScript支持並重試。 + 您的瀏覽器不支持JavaScript。 + 請啟用瀏覽器的JavaScript支持並重試。 NO_COOKIE_TITLE: "Cookies 需要啟用!" NO_COOKIE_DESC: | - 您的瀏覽器不支持Cookies。 - 請啟用瀏覽器的Cookies支持並重試。 + 您的瀏覽器不支持Cookies。 + 請啟用瀏覽器的Cookies支持並重試。 BAD_BROWSER_TITLE: "您的瀏覽器過時了" BAD_BROWSER_DESC: | - 為了使用所有特性, - 下載並安裝其中一款瀏覽器: + 為了使用所有特性, + 下載並安裝其中一款瀏覽器: diff --git a/yarn.lock b/yarn.lock index 34b3fc5aa..3578a713e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,70 +2,77 @@ # yarn lockfile v1 -"@babel/code-frame@7.0.0-beta.40", "@babel/code-frame@^7.0.0-beta.40": - version "7.0.0-beta.40" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.40.tgz#37e2b0cf7c56026b4b21d3927cadf81adec32ac6" +"@babel/code-frame@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" dependencies: - "@babel/highlight" "7.0.0-beta.40" + "@babel/highlight" "7.0.0-beta.44" -"@babel/generator@7.0.0-beta.40": - version "7.0.0-beta.40" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.40.tgz#ab61f9556f4f71dbd1138949c795bb9a21e302ea" +"@babel/generator@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" dependencies: - "@babel/types" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.44" jsesc "^2.5.1" lodash "^4.2.0" source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-function-name@7.0.0-beta.40": - version "7.0.0-beta.40" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.40.tgz#9d033341ab16517f40d43a73f2d81fc431ccd7b6" +"@babel/helper-function-name@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.40" - "@babel/template" "7.0.0-beta.40" - "@babel/types" "7.0.0-beta.40" + "@babel/helper-get-function-arity" "7.0.0-beta.44" + "@babel/template" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" -"@babel/helper-get-function-arity@7.0.0-beta.40": - version "7.0.0-beta.40" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.40.tgz#ac0419cf067b0ec16453e1274f03878195791c6e" +"@babel/helper-get-function-arity@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" dependencies: - "@babel/types" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.44" -"@babel/highlight@7.0.0-beta.40": - version "7.0.0-beta.40" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.40.tgz#b43d67d76bf46e1d10d227f68cddcd263786b255" +"@babel/helper-split-export-declaration@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/highlight@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^3.0.0" -"@babel/template@7.0.0-beta.40": - version "7.0.0-beta.40" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.40.tgz#034988c6424eb5c3268fe6a608626de1f4410fc8" +"@babel/template@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" dependencies: - "@babel/code-frame" "7.0.0-beta.40" - "@babel/types" "7.0.0-beta.40" - babylon "7.0.0-beta.40" + "@babel/code-frame" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" lodash "^4.2.0" -"@babel/traverse@^7.0.0-beta.40": - version "7.0.0-beta.40" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.40.tgz#d140e449b2e093ef9fe1a2eecc28421ffb4e521e" +"@babel/traverse@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" dependencies: - "@babel/code-frame" "7.0.0-beta.40" - "@babel/generator" "7.0.0-beta.40" - "@babel/helper-function-name" "7.0.0-beta.40" - "@babel/types" "7.0.0-beta.40" - babylon "7.0.0-beta.40" - debug "^3.0.1" + "@babel/code-frame" "7.0.0-beta.44" + "@babel/generator" "7.0.0-beta.44" + "@babel/helper-function-name" "7.0.0-beta.44" + "@babel/helper-split-export-declaration" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + debug "^3.1.0" globals "^11.1.0" invariant "^2.2.0" lodash "^4.2.0" -"@babel/types@7.0.0-beta.40", "@babel/types@^7.0.0-beta.40": - version "7.0.0-beta.40" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.40.tgz#25c3d7aae14126abe05fcb098c65a66b6d6b8c14" +"@babel/types@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" dependencies: esutils "^2.0.2" lodash "^4.2.0" @@ -94,11 +101,11 @@ accord@^0.29.0: uglify-js "^2.8.22" when "^3.7.8" -acorn-dynamic-import@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" dependencies: - acorn "^4.0.3" + acorn "^5.0.0" acorn-jsx@^3.0.0: version "3.0.1" @@ -110,10 +117,6 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^4.0.3: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - acorn@^5.0.0, acorn@^5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" @@ -239,12 +242,12 @@ ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" + micromatch "^3.1.4" + normalize-path "^2.1.1" aproba@^1.0.3: version "1.1.2" @@ -288,7 +291,7 @@ arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" -arr-flatten@^1.0.1: +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" @@ -334,6 +337,10 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -380,16 +387,14 @@ async@^0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" -async@^2.1.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" - dependencies: - lodash "^4.14.0" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +atob@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + autolinker@1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.6.2.tgz#67ae9da272e808e0d8eb8e02cbc8cde303947457" @@ -421,7 +426,31 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@6.26.0, babel-core@^6.26.0: +babel-core@6.26.3: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" dependencies: @@ -445,14 +474,14 @@ babel-core@6.26.0, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.6" -babel-eslint@8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.2.tgz#1102273354c6f0b29b4ea28a65f97d122296b68b" +babel-eslint@8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.3.tgz#1a2e6681cc9bc4473c32899e59915e19cd6733cf" dependencies: - "@babel/code-frame" "^7.0.0-beta.40" - "@babel/traverse" "^7.0.0-beta.40" - "@babel/types" "^7.0.0-beta.40" - babylon "^7.0.0-beta.40" + "@babel/code-frame" "7.0.0-beta.44" + "@babel/traverse" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" eslint-scope "~3.7.1" eslint-visitor-keys "^1.0.0" @@ -1051,9 +1080,9 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: lodash "^4.17.4" to-fast-properties "^1.0.3" -babylon@7.0.0-beta.40, babylon@^7.0.0-beta.40: - version "7.0.0-beta.40" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.40.tgz#91fc8cd56d5eb98b28e6fde41045f2957779940a" +babylon@7.0.0-beta.44: + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" babylon@^6.18.0: version "6.18.0" @@ -1067,6 +1096,18 @@ base64-js@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" @@ -1093,12 +1134,6 @@ binaryextensions@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755" -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - bluebird@^3.0.6: version "3.5.0" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" @@ -1151,6 +1186,21 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -1278,6 +1328,20 @@ cacache@^10.0.4: unique-filename "^1.1.0" y18n "^4.0.0" +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -1303,10 +1367,6 @@ camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - caniuse-db@^1.0.30000794: version "1.0.30000810" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000810.tgz#bd25830c41efab64339a2e381f49677343c84509" @@ -1378,25 +1438,32 @@ chalk@^2.3.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chokidar@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" +chokidar@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" dependencies: - anymatch "^1.3.0" + anymatch "^2.0.0" async-each "^1.0.0" - glob-parent "^2.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" inherits "^2.0.1" is-binary-path "^1.0.0" - is-glob "^2.0.0" + is-glob "^4.0.0" + normalize-path "^2.1.1" path-is-absolute "^1.0.0" readdirp "^2.0.0" + upath "^1.0.0" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.1.2" chownr@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" +chrome-trace-event@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz#d395af2d31c87b90a716c831fe326f69768ec084" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -1408,6 +1475,15 @@ circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + classnames@2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" @@ -1436,14 +1512,6 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -1484,6 +1552,13 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" @@ -1508,10 +1583,18 @@ commander@~2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1552,6 +1635,10 @@ convert-source-map@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" +convert-source-map@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -1563,6 +1650,10 @@ copy-concurrently@^1.0.0: rimraf "^2.5.4" run-queue "^1.0.0" +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + copy-webpack-plugin@4.5.1: version "4.5.1" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.1.tgz#fc4f68f4add837cc5e13d111b20715793225d29c" @@ -1611,7 +1702,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@^5.0.1, cross-spawn@^5.1.0: +cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" dependencies: @@ -1650,12 +1741,6 @@ cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -1683,9 +1768,9 @@ debug@^2.1.0, debug@^2.2.0, debug@^2.6.8: dependencies: ms "2.0.0" -debug@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.0.1.tgz#0564c612b521dc92d9f2988f0549e34f9c98db64" +debug@^2.1.2, debug@^2.3.3, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" @@ -1701,20 +1786,20 @@ debug@~2.2.0: dependencies: ms "0.7.1" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.0.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + deep-assign@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b" dependencies: is-obj "^1.0.0" -deep-equal@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" @@ -1729,16 +1814,24 @@ defaults@^1.0.0: dependencies: clone "^1.0.2" -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" + is-descriptor "^0.1.0" -defined@~1.0.0: +define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" del@^2.0.2: version "2.2.2" @@ -1787,6 +1880,10 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + diffie-hellman@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" @@ -1929,14 +2026,13 @@ end-of-stream@~0.1.5: dependencies: once "~1.3.0" -enhanced-resolve@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" +enhanced-resolve@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a" dependencies: graceful-fs "^4.1.2" memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.7" + tapable "^1.0.0" errno@^0.1.1, errno@^0.1.3: version "0.1.4" @@ -1944,99 +2040,26 @@ errno@^0.1.1, errno@^0.1.3: dependencies: prr "~0.0.0" +errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + dependencies: + prr "~1.0.1" + error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" dependencies: is-arrayish "^0.2.1" -es-abstract@^1.5.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.8.2.tgz#25103263dc4decbda60e0c737ca32313518027ee" - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.1" - -es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.30" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.30.tgz#7141a16836697dbabfaaaeee41495ce29f52c939" - dependencies: - es6-iterator "2" - es6-symbol "~3.1" - -es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-symbol "^3.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - es6-promise-polyfill@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz#f38925f23cb3e3e8ce6cda8ff774fcebbb090cde" -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-plugin-compat@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-2.2.0.tgz#d612a9988d9fba66bcd8e86fcc1b551753aac995" @@ -2182,13 +2205,6 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" - event-stream@^3.1.7: version "3.3.4" resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" @@ -2212,24 +2228,24 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" @@ -2254,7 +2270,13 @@ extend-shallow@^1.1.2: dependencies: kind-of "^1.1.0" -extend-shallow@^3.0.2: +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" dependencies: @@ -2279,6 +2301,19 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -2343,6 +2378,15 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" @@ -2362,7 +2406,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -2411,13 +2455,7 @@ flush-write-stream@^1.0.0: inherits "^2.0.1" readable-stream "^2.0.4" -for-each@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" - dependencies: - is-function "~1.0.0" - -for-in@^1.0.1: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2433,10 +2471,6 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -2453,6 +2487,12 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" @@ -2468,6 +2508,12 @@ fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -2481,33 +2527,12 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fsevents@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" +fsevents@^1.1.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.3.tgz#08292982e7059f6674c93d8b829c1e8604979ac0" dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.36" - -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + nan "^2.9.2" + node-pre-gyp "^0.9.0" functional-red-black-tree@^1.0.1: version "1.0.1" @@ -2532,10 +2557,6 @@ gaze@^0.5.1: dependencies: globule "~0.1.0" -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -2544,6 +2565,10 @@ get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -2563,6 +2588,13 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + glob-stream@^3.1.5: version "3.1.18" resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" @@ -2595,7 +2627,7 @@ glob@^4.3.1: minimatch "^2.0.1" once "^1.3.0" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.2: +glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -3017,11 +3049,32 @@ has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" -has@^1.0.1, has@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" dependencies: - function-bind "^1.0.2" + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" hash-base@^2.0.0: version "2.0.2" @@ -3112,6 +3165,12 @@ iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@^0.4.4: + version "0.4.21" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798" + dependencies: + safer-buffer "^2.1.0" + ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" @@ -3124,6 +3183,12 @@ ifvisible.js@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/ifvisible.js/-/ifvisible.js-1.0.6.tgz#52eb151ce89c56f15316226462e892d1f8451261" +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + ignore@^3.3.3: version "3.3.5" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" @@ -3165,7 +3230,7 @@ inherits@1: version "1.0.2" resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -3210,10 +3275,6 @@ invariant@^2.2.0, invariant@^2.2.2: dependencies: loose-envify "^1.0.0" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - is-absolute@^0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" @@ -3221,6 +3282,18 @@ is-absolute@^0.2.3: is-relative "^0.2.1" is-windows "^0.2.0" +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -3241,13 +3314,33 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" is-dotfile@^1.0.0: version "1.0.3" @@ -3259,7 +3352,7 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-extendable@^0.1.1: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -3273,7 +3366,7 @@ is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" -is-extglob@^2.1.1: +is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -3293,16 +3386,18 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" -is-function@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" dependencies: is-extglob "^1.0.0" +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + is-glob@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" @@ -3321,10 +3416,20 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + dependencies: + is-number "^4.0.0" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -3341,7 +3446,7 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" dependencies: @@ -3359,12 +3464,6 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - is-relative@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" @@ -3377,14 +3476,10 @@ is-resolvable@^1.0.0: dependencies: tryit "^1.0.1" -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -3403,6 +3498,10 @@ is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + is@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" @@ -3499,7 +3598,7 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" -json-loader@0.5.7, json-loader@^0.5.4: +json-loader@0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" @@ -3550,7 +3649,7 @@ kind-of@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" -kind-of@^3.0.2: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: @@ -3562,6 +3661,14 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + knockout-sortable@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/knockout-sortable/-/knockout-sortable-1.1.0.tgz#fc4f8adb68613950d39fe6bb8b0ccadead9485d2" @@ -3578,12 +3685,6 @@ lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - "less@2.6.x || ^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/less/-/less-3.0.1.tgz#ba2fea24a5632ccb8c84230d6043c0bf91855e37" @@ -3632,15 +3733,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -3916,7 +4008,7 @@ lodash.values@~2.4.1: dependencies: lodash.keys "~2.4.1" -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -3947,9 +4039,9 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" -lozad@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.3.0.tgz#41c14e986c78bd2545b8039627b5946de02f61a8" +lozad@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.4.0.tgz#78d29514608074a34645ba1c5c7747f82c14cbfc" lru-cache@2: version "2.7.3" @@ -3978,7 +4070,7 @@ make-error@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" -map-cache@^0.2.0: +map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -3990,6 +4082,12 @@ map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + matchmedia-polyfill@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/matchmedia-polyfill/-/matchmedia-polyfill-0.3.0.tgz#6f91e34012b3dfc9d5b76cec89deafc1b41b45fa" @@ -4011,12 +4109,6 @@ media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - dependencies: - mimic-fn "^1.0.0" - memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -4045,7 +4137,7 @@ merge-stream@^1.0.0: dependencies: readable-stream "^2.0.1" -micromatch@^2.1.5, micromatch@^2.3.7: +micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -4063,6 +4155,24 @@ micromatch@^2.1.5, micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" +micromatch@^3.1.4, micromatch@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + miller-rabin@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" @@ -4141,10 +4251,23 @@ minimist@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +minipass@^2.2.1, minipass@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.2.4.tgz#03c824d84551ec38a8d1bb5bc350a5a30a354a40" + dependencies: + safe-buffer "^5.1.1" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + mississippi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" @@ -4160,15 +4283,22 @@ mississippi@^2.0.0: stream-each "^1.1.0" through2 "^2.0.0" -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" -moment@2.21.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a" +moment@2.22.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.1.tgz#529a2e9bf973f259c9643d237fda84de3a26e8ad" moment@2.x: version "2.18.1" @@ -4212,9 +4342,26 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -nan@^2.3.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" +nan@^2.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nanomatch@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-odd "^2.0.0" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" natives@^1.1.0: version "1.1.0" @@ -4224,6 +4371,18 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" +needle@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +neo-async@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + node-fetch@^1.3.3: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -4278,20 +4437,20 @@ node-notifier@5.2.1, node-notifier@^5.1.2, node-notifier@^5.2.1: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.6.36: - version "0.6.37" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.37.tgz#3c872b236b2e266e4140578fe1ee88f693323a05" +node-pre-gyp@^0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0" dependencies: + detect-libc "^1.0.2" mkdirp "^0.5.1" + needle "^2.2.0" nopt "^4.0.1" + npm-packlist "^1.1.6" npmlog "^4.0.2" rc "^1.1.7" - request "^2.81.0" rimraf "^2.6.1" semver "^5.3.0" - tape "^4.6.3" - tar "^2.2.1" - tar-pack "^3.4.0" + tar "^4" node.extend@^2.0.0: version "2.0.0" @@ -4315,7 +4474,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: @@ -4329,11 +4488,16 @@ normalize.css@8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.0.tgz#14ac5e461612538a4ce9be90a7da23f86e718493" -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" +npm-bundled@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + +npm-packlist@^1.1.6: + version "1.1.10" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" dependencies: - path-key "^2.0.0" + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" npmlog@^4.0.2: version "4.1.2" @@ -4364,18 +4528,24 @@ object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" -object-inspect@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.3.0.tgz#5b1eb8e6742e2ee83342a637034d844928ba2f6d" - -object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + object.defaults@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" @@ -4392,7 +4562,7 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -object.pick@^1.2.0: +object.pick@^1.2.0, object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" dependencies: @@ -4404,7 +4574,7 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -4470,14 +4640,6 @@ os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -4489,10 +4651,6 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - p-limit@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" @@ -4566,10 +4724,18 @@ parseurl@~1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -4588,10 +4754,6 @@ path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" -path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" @@ -4614,12 +4776,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - dependencies: - pify "^2.0.0" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -4703,6 +4859,10 @@ pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + postcss-value-parser@^3.2.3: version "3.3.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" @@ -4743,6 +4903,10 @@ private@^0.1.6, private@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + process-nextick-args@^1.0.6, process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -4773,6 +4937,10 @@ prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -4875,13 +5043,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -4890,14 +5051,6 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - "readable-stream@1 || 2", readable-stream@^2.0.4: version "2.3.4" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" @@ -4928,7 +5081,7 @@ read-pkg@^2.0.0: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -4984,6 +5137,13 @@ regex-cache@^0.4.2: dependencies: is-equal-shallow "^0.1.3" +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + regexpp@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.0.1.tgz#d857c3a741dce075c2848dcb019a0a975b190d43" @@ -5014,7 +5174,7 @@ repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" -repeat-string@^1.5.2: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -5040,7 +5200,7 @@ replacestream@^4.0.0: object-assign "^4.0.1" readable-stream "^2.0.2" -request@2.81.0, request@^2.81.0: +request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -5067,14 +5227,6 @@ request@2.81.0, request@^2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -5101,7 +5253,11 @@ resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" -resolve@^1.1.6, resolve@^1.1.7, resolve@~1.4.0: +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@^1.1.6, resolve@^1.1.7: version "1.4.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" dependencies: @@ -5120,11 +5276,9 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -resumer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - dependencies: - through "~2.3.4" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" right-align@^0.1.1: version "0.1.3" @@ -5132,7 +5286,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -5179,7 +5333,21 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -schema-utils@^0.4.5: +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +schema-utils@^0.4.4, schema-utils@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" dependencies: @@ -5206,7 +5374,7 @@ serialize-javascript@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -5214,6 +5382,24 @@ set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -5268,6 +5454,33 @@ slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -5278,17 +5491,31 @@ source-list-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" +source-map-resolve@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + dependencies: + atob "^2.0.0" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" dependencies: source-map "^0.5.6" +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.3: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -source-map@^0.6.1: +source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -5310,6 +5537,12 @@ spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + split@0.3: version "0.3.3" resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" @@ -5344,6 +5577,13 @@ stat-mode@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + statuses@1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" @@ -5418,14 +5658,6 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string.prototype.trim@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.0" - function-bind "^1.0.2" - string_decoder@^0.10.25, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -5471,14 +5703,6 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -5489,9 +5713,9 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -style-loader@0.20.3: - version "0.20.3" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.20.3.tgz#ebef06b89dec491bcb1fdb3452e913a6fd1c10c4" +style-loader@0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" dependencies: loader-utils "^1.1.0" schema-utils "^0.4.5" @@ -5504,7 +5728,7 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0: +supports-color@^4.0.0, supports-color@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" dependencies: @@ -5544,48 +5768,21 @@ table@^4.0.1: slice-ansi "0.0.4" string-width "^2.0.0" -tapable@^0.2.7: - version "0.2.8" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" +tapable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" -tape@^4.6.3: - version "4.8.0" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.8.0.tgz#f6a9fec41cc50a1de50fa33603ab580991f6068e" +tar@^4: + version "4.4.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.1.tgz#b25d5a8470c976fd7a9a8a350f42c59e9fa81749" dependencies: - deep-equal "~1.0.1" - defined "~1.0.0" - for-each "~0.3.2" - function-bind "~1.1.0" - glob "~7.1.2" - has "~1.0.1" - inherits "~2.0.3" - minimist "~1.2.0" - object-inspect "~1.3.0" - resolve "~1.4.0" - resumer "~0.0.0" - string.prototype.trim "~1.1.2" - through "~2.3.8" - -tar-pack@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.2.4" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.1" + yallist "^3.0.2" ternary-stream@^2.0.1: version "2.0.1" @@ -5639,7 +5836,7 @@ through2@~0.4: readable-stream "~1.0.17" xtend "~2.1.1" -through@2, through@^2.3.6, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8: +through@2, through@^2.3.6, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -5677,6 +5874,28 @@ to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + tough-cookie@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" @@ -5726,7 +5945,14 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -uglify-js@^2.8.22, uglify-js@^2.8.29: +uglify-es@^3.3.4: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uglify-js@^2.8.22: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" dependencies: @@ -5746,25 +5972,35 @@ uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" -uglifyjs-webpack-plugin@^0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" +uglifyjs-webpack-plugin@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz#2ef8387c8f1a903ec5e44fa36f9f3cbdcea67641" dependencies: - source-map "^0.5.6" - uglify-js "^2.8.29" - webpack-sources "^1.0.1" - -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + cacache "^10.0.4" + find-cache-dir "^1.0.0" + schema-utils "^0.4.5" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" unc-path-regex@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" -underscore@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" +underscore@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.0.tgz#31dbb314cfcc88f169cd3692d9149d81a00a73e4" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" unique-filename@^1.1.0: version "1.1.0" @@ -5786,6 +6022,21 @@ unpipe@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.5.tgz#02cab9ecebe95bbec6d5fc2566325725ab6d1a73" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -5793,6 +6044,12 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" + dependencies: + kind-of "^6.0.2" + user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" @@ -5889,13 +6146,13 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" -watchpack@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" dependencies: - async "^2.1.2" - chokidar "^1.7.0" + chokidar "^2.0.2" graceful-fs "^4.1.2" + neo-async "^2.5.0" webpack-notifier@1.6.0: version "1.6.0" @@ -5912,32 +6169,36 @@ webpack-sources@^1.0.1: source-list-map "^2.0.0" source-map "~0.5.3" -webpack@3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894" +webpack-sources@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.6.0.tgz#363eafa733710eb0ed28c512b2b9b9f5fb01e69b" dependencies: acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" + acorn-dynamic-import "^3.0.0" ajv "^6.1.0" ajv-keywords "^3.1.0" - async "^2.1.2" - enhanced-resolve "^3.4.0" - escope "^3.6.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" + chrome-trace-event "^0.1.1" + enhanced-resolve "^4.0.0" + eslint-scope "^3.7.1" loader-runner "^2.3.0" loader-utils "^1.1.0" memory-fs "~0.4.1" + micromatch "^3.1.8" mkdirp "~0.5.0" + neo-async "^2.5.0" node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^4.2.1" - tapable "^0.2.7" - uglifyjs-webpack-plugin "^0.4.6" - watchpack "^1.4.0" + schema-utils "^0.4.4" + tapable "^1.0.0" + uglifyjs-webpack-plugin "^1.2.4" + watchpack "^1.5.0" webpack-sources "^1.0.1" - yargs "^8.0.2" websocket-driver@>=0.3.6: version "0.7.0" @@ -5954,10 +6215,6 @@ when@^3.7.8: version "3.7.8" resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - which@^1.2.12, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" @@ -5982,12 +6239,11 @@ wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" + errno "~0.1.7" wrappy@1: version "1.0.2" @@ -6021,10 +6277,6 @@ xtend@~2.1.1: dependencies: object-keys "~0.4.0" -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" @@ -6033,29 +6285,9 @@ yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - dependencies: - camelcase "^4.1.0" - -yargs@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" yargs@~3.10.0: version "3.10.0" From 04bfe2686ff9c7e782b63a42608670c9ced5db56 Mon Sep 17 00:00:00 2001 From: Konstantin Krastev Date: Tue, 8 May 2018 23:40:02 +0300 Subject: [PATCH 55/83] * added start_tls support * added gecos token for use in user DN in case your user accounts are using cn as rdn. --- .../ChangePasswordLdapDriver.php | 14 ++++++++++++-- plugins/ldap-change-password/index.php | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/plugins/ldap-change-password/ChangePasswordLdapDriver.php b/plugins/ldap-change-password/ChangePasswordLdapDriver.php index d686036df..562c325ff 100644 --- a/plugins/ldap-change-password/ChangePasswordLdapDriver.php +++ b/plugins/ldap-change-password/ChangePasswordLdapDriver.php @@ -118,13 +118,23 @@ class ChangePasswordLdapDriver implements \RainLoop\Providers\ChangePassword\Cha '{login}' => $oAccount->Login(), '{imap:login}' => $oAccount->Login(), '{imap:host}' => $oAccount->DomainIncHost(), - '{imap:port}' => $oAccount->DomainIncPort() + '{imap:port}' => $oAccount->DomainIncPort(), + '{gecos}' => posix_getpwnam($oAccount->Login()) )); $oCon = @\ldap_connect($this->sHostName, $this->iHostPort); if ($oCon) { - @\ldap_set_option($oCon, LDAP_OPT_PROTOCOL_VERSION, 3); + if (!@\ldap_set_option($oCon, LDAP_OPT_PROTOCOL_VERSION, 3)) { + $this->oLogger->Write("Failed to set LDAP Protocol version to 3, TLS not supported.", + \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); + } + else { + if (!ldap_start_tls($oCon)) { + $this->oLogger->Write("Ldap_start_tls failed: ".$oCon, + \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); + } + } if (!@\ldap_bind($oCon, $sUserDn, $sPrevPassword)) { diff --git a/plugins/ldap-change-password/index.php b/plugins/ldap-change-password/index.php index 546249e2d..128557937 100644 --- a/plugins/ldap-change-password/index.php +++ b/plugins/ldap-change-password/index.php @@ -64,7 +64,7 @@ class LdapChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) ->SetDefaultValue(389), \RainLoop\Plugins\Property::NewInstance('user_dn_format')->SetLabel('User DN format') - ->SetDescription('LDAP user dn format. Supported tokens: {email}, {email:user}, {email:domain}, {login}, {domain}, {domain:dc}, {imap:login}, {imap:host}, {imap:port}') + ->SetDescription('LDAP user dn format. Supported tokens: {email}, {email:user}, {email:domain}, {login}, {domain}, {domain:dc}, {imap:login}, {imap:host}, {imap:port}, {gecos}') ->SetDefaultValue('uid={imap:login},ou=Users,{domain:dc}'), \RainLoop\Plugins\Property::NewInstance('password_field')->SetLabel('Password field') ->SetDefaultValue('userPassword'), From 142272b522754db5d59d7036df3c210e9d827717 Mon Sep 17 00:00:00 2001 From: Techwolf Date: Wed, 16 May 2018 01:00:02 -0700 Subject: [PATCH 56/83] Remove unused GuzzleHttp library. --- .../GuzzleHttp/Adapter/AdapterInterface.php | 23 - .../GuzzleHttp/Adapter/Curl/BatchContext.php | 158 - .../GuzzleHttp/Adapter/Curl/CurlAdapter.php | 142 - .../GuzzleHttp/Adapter/Curl/CurlFactory.php | 331 -- .../GuzzleHttp/Adapter/Curl/MultiAdapter.php | 284 -- .../Adapter/Curl/RequestMediator.php | 130 - .../Adapter/FakeParallelAdapter.php | 34 - .../GuzzleHttp/Adapter/MockAdapter.php | 60 - .../Adapter/ParallelAdapterInterface.php | 23 - .../GuzzleHttp/Adapter/StreamAdapter.php | 347 -- .../Adapter/StreamingProxyAdapter.php | 36 - .../GuzzleHttp/Adapter/Transaction.php | 49 - .../Adapter/TransactionInterface.php | 35 - .../Adapter/TransactionIterator.php | 73 - .../0.0.0/app/libraries/GuzzleHttp/Client.php | 364 -- .../libraries/GuzzleHttp/ClientInterface.php | 179 - .../app/libraries/GuzzleHttp/Collection.php | 265 -- .../libraries/GuzzleHttp/Cookie/CookieJar.php | 249 -- .../GuzzleHttp/Cookie/CookieJarInterface.php | 76 - .../GuzzleHttp/Cookie/FileCookieJar.php | 85 - .../GuzzleHttp/Cookie/SessionCookieJar.php | 65 - .../libraries/GuzzleHttp/Cookie/SetCookie.php | 410 -- .../GuzzleHttp/Event/AbstractEvent.php | 21 - .../GuzzleHttp/Event/AbstractRequestEvent.php | 49 - .../Event/AbstractTransferEvent.php | 83 - .../GuzzleHttp/Event/BeforeEvent.php | 26 - .../GuzzleHttp/Event/CompleteEvent.php | 35 - .../libraries/GuzzleHttp/Event/Emitter.php | 147 - .../GuzzleHttp/Event/EmitterInterface.php | 88 - .../libraries/GuzzleHttp/Event/ErrorEvent.php | 65 - .../GuzzleHttp/Event/EventInterface.php | 24 - .../GuzzleHttp/Event/HasEmitterInterface.php | 16 - .../GuzzleHttp/Event/HasEmitterTrait.php | 21 - .../GuzzleHttp/Event/HeadersEvent.php | 39 - .../Event/ListenerAttacherTrait.php | 89 - .../GuzzleHttp/Event/RequestEvents.php | 162 - .../GuzzleHttp/Event/SubscriberInterface.php | 31 - .../GuzzleHttp/Exception/AdapterException.php | 5 - .../Exception/BadResponseException.php | 8 - .../GuzzleHttp/Exception/ClientException.php | 8 - .../CouldNotRewindStreamException.php | 5 - .../GuzzleHttp/Exception/ParseException.php | 32 - .../GuzzleHttp/Exception/RequestException.php | 124 - .../GuzzleHttp/Exception/ServerException.php | 8 - .../Exception/TooManyRedirectsException.php | 5 - .../Exception/TransferException.php | 5 - .../app/libraries/GuzzleHttp/HasDataTrait.php | 76 - .../GuzzleHttp/Message/AbstractMessage.php | 237 - .../GuzzleHttp/Message/MessageFactory.php | 345 -- .../Message/MessageFactoryInterface.php | 71 - .../GuzzleHttp/Message/MessageInterface.php | 148 - .../GuzzleHttp/Message/MessageParser.php | 172 - .../libraries/GuzzleHttp/Message/Request.php | 216 - .../GuzzleHttp/Message/RequestInterface.php | 150 - .../libraries/GuzzleHttp/Message/Response.php | 202 - .../GuzzleHttp/Message/ResponseInterface.php | 86 - .../app/libraries/GuzzleHttp/Mimetypes.php | 964 ---- .../GuzzleHttp/Post/MultipartBody.php | 292 -- .../libraries/GuzzleHttp/Post/PostBody.php | 282 -- .../GuzzleHttp/Post/PostBodyInterface.php | 129 - .../libraries/GuzzleHttp/Post/PostFile.php | 138 - .../GuzzleHttp/Post/PostFileInterface.php | 42 - .../0.0.0/app/libraries/GuzzleHttp/Query.php | 226 - .../GuzzleHttp/Subscriber/Cookie.php | 59 - .../GuzzleHttp/Subscriber/History.php | 138 - .../GuzzleHttp/Subscriber/HttpError.php | 34 - .../libraries/GuzzleHttp/Subscriber/Mock.php | 143 - .../GuzzleHttp/Subscriber/Prepare.php | 136 - .../GuzzleHttp/Subscriber/Redirect.php | 172 - .../libraries/GuzzleHttp/ToArrayInterface.php | 16 - .../app/libraries/GuzzleHttp/UriTemplate.php | 242 -- .../v/0.0.0/app/libraries/GuzzleHttp/Url.php | 585 --- .../0.0.0/app/libraries/GuzzleHttp/cacert.pem | 3866 ----------------- .../app/libraries/GuzzleHttp/functions.php | 325 -- 74 files changed, 14006 deletions(-) delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/AdapterInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/BatchContext.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlAdapter.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlFactory.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/MultiAdapter.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/RequestMediator.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/FakeParallelAdapter.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/MockAdapter.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/ParallelAdapterInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/StreamAdapter.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/StreamingProxyAdapter.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Transaction.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/TransactionInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/TransactionIterator.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Client.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/ClientInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Collection.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/CookieJar.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/CookieJarInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/FileCookieJar.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/SessionCookieJar.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/SetCookie.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/AbstractEvent.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/AbstractRequestEvent.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/AbstractTransferEvent.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/BeforeEvent.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/CompleteEvent.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/Emitter.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/EmitterInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/ErrorEvent.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/EventInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/HasEmitterInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/HasEmitterTrait.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/HeadersEvent.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/ListenerAttacherTrait.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/RequestEvents.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/SubscriberInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/AdapterException.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/BadResponseException.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/ClientException.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/CouldNotRewindStreamException.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/ParseException.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/RequestException.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/ServerException.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/TooManyRedirectsException.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/TransferException.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/HasDataTrait.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/AbstractMessage.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageFactory.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageFactoryInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageParser.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/Request.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/RequestInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/Response.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/ResponseInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Mimetypes.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/MultipartBody.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostBody.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostBodyInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostFile.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostFileInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Query.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Cookie.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/History.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/HttpError.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Mock.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Prepare.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Redirect.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/ToArrayInterface.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/UriTemplate.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/Url.php delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/cacert.pem delete mode 100644 rainloop/v/0.0.0/app/libraries/GuzzleHttp/functions.php diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/AdapterInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/AdapterInterface.php deleted file mode 100644 index f3c035e2b..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/AdapterInterface.php +++ /dev/null @@ -1,23 +0,0 @@ -multi = $multiHandle; - $this->handles = new \SplObjectStorage(); - $this->throwsExceptions = $throwsExceptions; - $this->pending = $pending; - } - - /** - * Find a transaction for a given curl handle - * - * @param resource $handle Curl handle - * - * @return TransactionInterface - * @throws AdapterException if a transaction is not found - */ - public function findTransaction($handle) - { - foreach ($this->handles as $transaction) { - if ($this->handles[$transaction] === $handle) { - return $transaction; - } - } - - throw new AdapterException('No curl handle was found'); - } - - /** - * Returns true if there are any remaining pending transactions - * - * @return bool - */ - public function hasPending() - { - return $this->pending && $this->pending->valid(); - } - - /** - * Pop the next transaction from the transaction queue - * - * @return TransactionInterface|null - */ - public function nextPending() - { - if (!$this->hasPending()) { - return null; - } - - $current = $this->pending->current(); - $this->pending->next(); - - return $current; - } - - /** - * Checks if the batch is to throw exceptions on error - * - * @return bool - */ - public function throwsExceptions() - { - return $this->throwsExceptions; - } - - /** - * Get the curl_multi handle - * - * @return resource - */ - public function getMultiHandle() - { - return $this->multi; - } - - /** - * Add a transaction to the multi handle - * - * @param TransactionInterface $transaction Transaction to add - * @param resource $handle Resource to use with the handle - * - * @throws AdapterException If the handle is already registered - */ - public function addTransaction(TransactionInterface $transaction, $handle) - { - if (isset($this->handles[$transaction])) { - throw new AdapterException('Transaction already registered'); - } - - $code = curl_multi_add_handle($this->multi, $handle); - if ($code != CURLM_OK) { - MultiAdapter::throwMultiError($code); - } - - $this->handles[$transaction] = $handle; - } - - /** - * Remove a transaction and associated handle from the context - * - * @param TransactionInterface $transaction Transaction to remove - * - * @return array Returns the curl_getinfo array - * @throws AdapterException if the transaction is not found - */ - public function removeTransaction(TransactionInterface $transaction) - { - if (!isset($this->handles[$transaction])) { - throw new AdapterException('Transaction not registered'); - } - - $handle = $this->handles[$transaction]; - - $code = curl_multi_remove_handle($this->multi, $handle); - if ($code != CURLM_OK) { - MultiAdapter::throwMultiError($code); - } - - $info = curl_getinfo($handle); - curl_close($handle); - unset($this->handles[$transaction]); - - return $info; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlAdapter.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlAdapter.php deleted file mode 100644 index 0f1203531..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlAdapter.php +++ /dev/null @@ -1,142 +0,0 @@ -handles = $this->ownedHandles = []; - $this->messageFactory = $messageFactory; - $this->curlFactory = isset($options['handle_factory']) - ? $options['handle_factory'] - : new CurlFactory(); - $this->maxHandles = isset($options['max_handles']) - ? $options['max_handles'] - : 5; - } - - public function __destruct() - { - foreach ($this->handles as $handle) { - if (is_resource($handle)) { - curl_close($handle); - } - } - } - - public function send(TransactionInterface $transaction) - { - RequestEvents::emitBefore($transaction); - if ($response = $transaction->getResponse()) { - return $response; - } - - $factory = $this->curlFactory; - $handle = $factory( - $transaction, - $this->messageFactory, - $this->checkoutEasyHandle() - ); - - curl_exec($handle); - $info = curl_getinfo($handle); - $info['curl_result'] = curl_errno($handle); - - if ($info['curl_result']) { - $this->handleError($transaction, $info, $handle); - } else { - $this->releaseEasyHandle($handle); - RequestEvents::emitComplete($transaction, $info); - } - - return $transaction->getResponse(); - } - - private function handleError( - TransactionInterface $transaction, - $info, - $handle - ) { - $error = curl_error($handle); - $this->releaseEasyHandle($handle); - RequestEvents::emitError( - $transaction, - new AdapterException("cURL error {$info['curl_result']}: {$error}"), - $info - ); - } - - private function checkoutEasyHandle() - { - // Find an unused handle in the cache - if (false !== ($key = array_search(false, $this->ownedHandles, true))) { - $this->ownedHandles[$key] = true; - return $this->handles[$key]; - } - - // Add a new handle - $handle = curl_init(); - $id = (int) $handle; - $this->handles[$id] = $handle; - $this->ownedHandles[$id] = true; - - return $handle; - } - - private function releaseEasyHandle($handle) - { - $id = (int) $handle; - if (count($this->ownedHandles) > $this->maxHandles) { - curl_close($this->handles[$id]); - unset($this->handles[$id], $this->ownedHandles[$id]); - } else { - curl_reset($handle); - $this->ownedHandles[$id] = false; - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlFactory.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlFactory.php deleted file mode 100644 index f1cb393a7..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/CurlFactory.php +++ /dev/null @@ -1,331 +0,0 @@ -getRequest(); - $mediator = new RequestMediator($transaction, $messageFactory); - $options = $this->getDefaultOptions($request, $mediator); - $this->applyMethod($request, $options); - $this->applyTransferOptions($request, $mediator, $options); - $this->applyHeaders($request, $options); - unset($options['_headers']); - - // Add adapter options from the request's configuration options - if ($config = $request->getConfig()['curl']) { - $options = $this->applyCustomCurlOptions($config, $options); - } - - if (!$handle) { - $handle = curl_init(); - } - - curl_setopt_array($handle, $options); - - return $handle; - } - - protected function getDefaultOptions( - RequestInterface $request, - RequestMediator $mediator - ) { - $url = $request->getUrl(); - - // Strip fragment from URL. See: - // https://github.com/guzzle/guzzle/issues/453 - if (($pos = strpos($url, '#')) !== false) { - $url = substr($url, 0, $pos); - } - - $config = $request->getConfig(); - $options = array( - CURLOPT_URL => $url, - CURLOPT_CONNECTTIMEOUT => $config['connect_timeout'] ?: 150, - CURLOPT_RETURNTRANSFER => false, - CURLOPT_HEADER => false, - CURLOPT_WRITEFUNCTION => array($mediator, 'writeResponseBody'), - CURLOPT_HEADERFUNCTION => array($mediator, 'receiveResponseHeader'), - CURLOPT_READFUNCTION => array($mediator, 'readRequestBody'), - CURLOPT_HTTP_VERSION => $request->getProtocolVersion() === '1.0' - ? CURL_HTTP_VERSION_1_0 : CURL_HTTP_VERSION_1_1, - CURLOPT_SSL_VERIFYPEER => 1, - CURLOPT_SSL_VERIFYHOST => 2, - '_headers' => $request->getHeaders() - ); - - if (defined('CURLOPT_PROTOCOLS')) { - // Allow only HTTP and HTTPS protocols - $options[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS; - } - - // Add CURLOPT_ENCODING if Accept-Encoding header is provided - if ($request->hasHeader('Accept-Encoding')) { - $options[CURLOPT_ENCODING] = $request->getHeader('Accept-Encoding'); - // Let cURL set the Accept-Encoding header. Without this change - // curl could add a duplicate value. - $this->removeHeader('Accept-Encoding', $options); - } - - return $options; - } - - private function applyMethod(RequestInterface $request, array &$options) - { - $method = $request->getMethod(); - if ($method == 'HEAD') { - $options[CURLOPT_NOBODY] = true; - unset($options[CURLOPT_WRITEFUNCTION], $options[CURLOPT_READFUNCTION]); - } else { - $options[CURLOPT_CUSTOMREQUEST] = $method; - if (!$request->getBody()) { - unset($options[CURLOPT_READFUNCTION]); - } else { - $this->applyBody($request, $options); - } - } - } - - private function applyBody(RequestInterface $request, array &$options) - { - if ($request->hasHeader('Content-Length')) { - $size = (int) $request->getHeader('Content-Length'); - } else { - $size = null; - } - - $request->getBody()->seek(0); - - // You can send the body as a string using curl's CURLOPT_POSTFIELDS - if (($size !== null && $size < 32768) || - isset($request->getConfig()['curl']['body_as_string']) - ) { - $options[CURLOPT_POSTFIELDS] = $request->getBody()->getContents(); - // Don't duplicate the Content-Length header - $this->removeHeader('Content-Length', $options); - $this->removeHeader('Transfer-Encoding', $options); - } else { - $options[CURLOPT_UPLOAD] = true; - // Let cURL handle setting the Content-Length header - if ($size !== null) { - $options[CURLOPT_INFILESIZE] = $size; - $this->removeHeader('Content-Length', $options); - } - } - - // If the Expect header is not present, prevent curl from adding it - if (!$request->hasHeader('Expect')) { - $options[CURLOPT_HTTPHEADER][] = 'Expect:'; - } - } - - private function applyHeaders(RequestInterface $request, array &$options) - { - foreach ($options['_headers'] as $name => $values) { - $options[CURLOPT_HTTPHEADER][] = $name . ': ' . implode(', ', $values); - } - - // Remove the Expect header if one was not set - if (!$request->hasHeader('Accept')) { - $options[CURLOPT_HTTPHEADER][] = 'Accept:'; - } - } - - private function applyTransferOptions( - RequestInterface $request, - RequestMediator $mediator, - array &$options - ) { - static $methods; - if (!$methods) { - $methods = array_flip(get_class_methods(__CLASS__)); - } - - foreach ($request->getConfig()->toArray() as $key => $value) { - $method = "add_{$key}"; - if (isset($methods[$method])) { - $this->{$method}($request, $mediator, $options, $value); - } - } - } - - private function add_debug( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - if ($value) { - $options[CURLOPT_STDERR] = is_resource($value) ? $value : STDOUT; - $options[CURLOPT_VERBOSE] = true; - } - } - - private function add_proxy( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - if (!is_array($value)) { - $options[CURLOPT_PROXY] = $value; - } else { - $scheme = $request->getScheme(); - if (isset($value[$scheme])) { - $options[CURLOPT_PROXY] = $value[$scheme]; - } - } - } - - private function add_timeout( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - $options[CURLOPT_TIMEOUT_MS] = $value * 1000; - } - - private function add_connect_timeout( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - $options[CURLOPT_CONNECTTIMEOUT_MS] = $value * 1000; - } - - private function add_verify( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - if ($value === false) { - unset($options[CURLOPT_CAINFO]); - $options[CURLOPT_SSL_VERIFYHOST] = 0; - $options[CURLOPT_SSL_VERIFYPEER] = false; - } elseif ($value === true || is_string($value)) { - $options[CURLOPT_SSL_VERIFYHOST] = 2; - $options[CURLOPT_SSL_VERIFYPEER] = true; - if ($value !== true) { - if (!file_exists($value)) { - throw new AdapterException('SSL certificate authority file' - . " not found: {$value}"); - } - $options[CURLOPT_CAINFO] = $value; - } - } - } - - private function add_cert( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - if (!file_exists($value)) { - throw new AdapterException("SSL certificate not found: {$value}"); - } - - $options[CURLOPT_SSLCERT] = $value; - } - - private function add_ssl_key( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - if (is_array($value)) { - $options[CURLOPT_SSLKEYPASSWD] = $value[1]; - $value = $value[0]; - } - - if (!file_exists($value)) { - throw new AdapterException("SSL private key not found: {$value}"); - } - - $options[CURLOPT_SSLKEY] = $value; - } - - private function add_save_to( - RequestInterface $request, - RequestMediator $mediator, - &$options, - $value - ) { - $mediator->setResponseBody(is_string($value) - ? Stream\create(fopen($value, 'w')) - : Stream\create($value)); - } - - /** - * Takes an array of curl options specified in the 'curl' option of a - * request's configuration array and maps them to CURLOPT_* options. - * - * This method is only called when a request has a 'curl' config setting. - * Array key strings that start with CURL that have a matching constant - * value will be automatically converted to the matching constant. - * - * @param array $config Configuration array of custom curl option - * @param array $options Array of existing curl options - * - * @return array Returns a new array of curl options - */ - private function applyCustomCurlOptions(array $config, array $options) - { - unset($config['body_as_string']); - $curlOptions = []; - - // Map curl constant strings to defined values - foreach ($config as $key => $value) { - if (defined($key) && substr($key, 0, 4) === 'CURL') { - $key = constant($key); - } - $curlOptions[$key] = $value; - } - - return $curlOptions + $options; - } - - /** - * Remove a header from the options array - * - * @param string $name Case-insensitive header to remove - * @param array $options Array of options to modify - */ - private function removeHeader($name, array &$options) - { - foreach (array_keys($options['_headers']) as $key) { - if (!strcasecmp($key, $name)) { - unset($options['_headers'][$key]); - return; - } - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/MultiAdapter.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/MultiAdapter.php deleted file mode 100644 index 306459569..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/MultiAdapter.php +++ /dev/null @@ -1,284 +0,0 @@ -messageFactory = $messageFactory; - $this->curlFactory = isset($options['handle_factory']) - ? $options['handle_factory'] - : new CurlFactory(); - - if (isset($options['select_timeout'])) { - $this->selectTimeout = $options['select_timeout']; - } elseif (isset($_SERVER[self::ENV_SELECT_TIMEOUT])) { - $this->selectTimeout = $_SERVER[self::ENV_SELECT_TIMEOUT]; - } else { - $this->selectTimeout = 1; - } - } - - public function __destruct() - { - foreach ($this->multiHandles as $handle) { - if (is_resource($handle)) { - curl_multi_close($handle); - } - } - } - - /** - * Throw an exception for a cURL multi response - * - * @param int $code Curl response code - * @throws AdapterException - */ - public static function throwMultiError($code) - { - $buffer = function_exists('curl_multi_strerror') - ? curl_multi_strerror($code) - : self::ERROR_STR; - - throw new AdapterException(sprintf('cURL error %s: %s', $code, $buffer)); - } - - public function send(TransactionInterface $transaction) - { - $context = new BatchContext($this->checkoutMultiHandle(), true); - $this->addHandle($transaction, $context); - $this->perform($context); - - return $transaction->getResponse(); - } - - public function sendAll(\Iterator $transactions, $parallel) - { - $context = new BatchContext( - $this->checkoutMultiHandle(), - false, - $transactions - ); - - foreach (new \LimitIterator($transactions, 0, $parallel) as $trans) { - $this->addHandle($trans, $context); - } - - $this->perform($context); - } - - private function perform(BatchContext $context) - { - // The first curl_multi_select often times out no matter what, but is - // usually required for fast transfers. - $active = false; - $multi = $context->getMultiHandle(); - - do { - while (($mrc = curl_multi_exec($multi, $active)) == CURLM_CALL_MULTI_PERFORM); - if ($mrc != CURLM_OK && $mrc != CURLM_CALL_MULTI_PERFORM) { - self::throwMultiError($mrc); - } - // Need to check if there are pending transactions before processing - // them so that we don't bail from the loop too early. - $pending = $context->hasPending(); - $this->processMessages($context); - if ($active && curl_multi_select($multi, $this->selectTimeout) === -1) { - // Perform a usleep if a select returns -1. - // See: https://bugs.php.net/bug.php?id=61141 - usleep(250); - } - } while ($active || $pending); - - $this->releaseMultiHandle($multi); - } - - private function processMessages(BatchContext $context) - { - $multi = $context->getMultiHandle(); - - while ($done = curl_multi_info_read($multi)) { - $transaction = $context->findTransaction($done['handle']); - $this->processResponse($transaction, $done, $context); - // Add the next transaction if there are more in the queue - if ($next = $context->nextPending()) { - $this->addHandle($next, $context); - } - } - } - - private function processResponse( - TransactionInterface $transaction, - array $curl, - BatchContext $context - ) { - $info = $context->removeTransaction($transaction); - - try { - if (!$this->isCurlException($transaction, $curl, $context, $info)) { - RequestEvents::emitComplete($transaction, $info); - } - } catch (RequestException $e) { - $this->throwException($e, $context); - } - } - - private function addHandle( - TransactionInterface $transaction, - BatchContext $context - ) { - try { - RequestEvents::emitBefore($transaction); - // Only transfer if the request was not intercepted - if (!$transaction->getResponse()) { - $factory = $this->curlFactory; - $context->addTransaction( - $transaction, - $factory($transaction, $this->messageFactory) - ); - } - } catch (RequestException $e) { - $this->throwException($e, $context); - } - } - - private function isCurlException( - TransactionInterface $transaction, - array $curl, - BatchContext $context, - array $info - ) { - if (CURLM_OK == $curl['result'] || - CURLM_CALL_MULTI_PERFORM == $curl['result'] - ) { - return false; - } - - $request = $transaction->getRequest(); - try { - // Send curl stats along if they are available - $stats = ['curl_result' => $curl['result']] + $info; - RequestEvents::emitError( - $transaction, - new RequestException( - sprintf( - '[curl] (#%s) %s [url] %s', - $curl['result'], - function_exists('curl_strerror') - ? curl_strerror($curl['result']) - : self::ERROR_STR, - $request->getUrl() - ), - $request - ), - $stats - ); - } catch (RequestException $e) { - $this->throwException($e, $context); - } - - return true; - } - - private function throwException(RequestException $e, BatchContext $context) - { - if ($context->throwsExceptions()) { - $this->releaseMultiHandle($context->getMultiHandle()); - throw $e; - } - } - - /** - * Returns a curl_multi handle from the cache or creates a new one - * - * @return resource - */ - private function checkoutMultiHandle() - { - // Find an unused handle in the cache - $key = array_search(false, $this->multiOwned, true); - if (false !== $key) { - $this->multiOwned[$key] = true; - return $this->multiHandles[$key]; - } - - // Add a new handle - $handle = curl_multi_init(); - $id = (int) $handle; - $this->multiHandles[$id] = $handle; - $this->multiOwned[$id] = true; - - return $handle; - } - - /** - * Releases a curl_multi handle back into the cache and removes excess cache - * - * @param resource $handle Curl multi handle to remove - */ - private function releaseMultiHandle($handle) - { - $id = (int) $handle; - - if (count($this->multiHandles) <= 3) { - $this->multiOwned[$id] = false; - } else { - // Prune excessive handles - curl_multi_close($this->multiHandles[$id]); - unset($this->multiHandles[$id], $this->multiOwned[$id]); - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/RequestMediator.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/RequestMediator.php deleted file mode 100644 index 19cbcfd09..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Curl/RequestMediator.php +++ /dev/null @@ -1,130 +0,0 @@ -transaction = $transaction; - $this->messageFactory = $messageFactory; - } - - /** - * Set the body that will hold the response body - * - * @param StreamInterface $body Response body - */ - public function setResponseBody(StreamInterface $body = null) - { - $this->body = $body; - } - - /** - * Receive a response header from curl - * - * @param resource $curl Curl handle - * @param string $header Received header - * - * @return int - */ - public function receiveResponseHeader($curl, $header) - { - static $normalize = ["\r", "\n"]; - $length = strlen($header); - $header = str_replace($normalize, '', $header); - - if (strpos($header, 'HTTP/') === 0) { - $startLine = explode(' ', $header, 3); - // Only download the body to a target body when a successful - // response is received. - if ($startLine[1][0] != '2') { - $this->body = null; - } - $this->statusCode = $startLine[1]; - $this->reasonPhrase = isset($startLine[2]) ? $startLine[2] : null; - $this->protocolVersion = substr($startLine[0], -3); - $this->headers = []; - } elseif ($pos = strpos($header, ':')) { - $this->headers[substr($header, 0, $pos)][] = substr($header, $pos + 1); - } elseif ($header == '' && $this->statusCode >= 200) { - $response = $this->messageFactory->createResponse( - $this->statusCode, - $this->headers, - $this->body, - [ - 'protocol_version' => $this->protocolVersion, - 'reason_phrase' => $this->reasonPhrase - ] - ); - $this->headers = $this->body = null; - $this->transaction->setResponse($response); - // Allows events to react before downloading any of the body - RequestEvents::emitHeaders($this->transaction); - } - - return $length; - } - - /** - * Write data to the response body of a request - * - * @param resource $curl - * @param string $write - * - * @return int - */ - public function writeResponseBody($curl, $write) - { - if (!($response = $this->transaction->getResponse())) { - return 0; - } - - // Add a default body on the response if one was not found - if (!($body = $response->getBody())) { - $body = new Stream(fopen('php://temp', 'r+')); - $response->setBody($body); - } - - return $body->write($write); - } - - /** - * Read data from the request body and send it to curl - * - * @param resource $ch Curl handle - * @param resource $fd File descriptor - * @param int $length Amount of data to read - * - * @return string - */ - public function readRequestBody($ch, $fd, $length) - { - return (string) $this->transaction->getRequest()->getBody()->read($length); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/FakeParallelAdapter.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/FakeParallelAdapter.php deleted file mode 100644 index 302656837..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/FakeParallelAdapter.php +++ /dev/null @@ -1,34 +0,0 @@ -adapter = $adapter; - } - - public function sendAll(\Iterator $transactions, $parallel) - { - foreach ($transactions as $transaction) { - try { - $this->adapter->send($transaction); - } catch (RequestException $e) { - // no op for batch transaction - } - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/MockAdapter.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/MockAdapter.php deleted file mode 100644 index 3e8020e69..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/MockAdapter.php +++ /dev/null @@ -1,60 +0,0 @@ -setResponse($response); - } - - /** - * Set the response that will be served by the adapter - * - * @param ResponseInterface|callable $response Response to serve or - * function to invoke that handles a transaction - */ - public function setResponse($response) - { - $this->response = $response; - } - - public function send(TransactionInterface $transaction) - { - RequestEvents::emitBefore($transaction); - if (!$transaction->getResponse()) { - - // Read the request body if it is present - if ($transaction->getRequest()->getBody()) { - $transaction->getRequest()->getBody()->__toString(); - } - - $response = is_callable($this->response) - ? call_user_func($this->response, $transaction) - : $this->response; - if (!$response instanceof ResponseInterface) { - throw new \RuntimeException('Invalid mocked response'); - } - - $transaction->setResponse($response); - RequestEvents::emitHeaders($transaction); - RequestEvents::emitComplete($transaction); - } - - return $transaction->getResponse(); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/ParallelAdapterInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/ParallelAdapterInterface.php deleted file mode 100644 index 79a25b7e0..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/ParallelAdapterInterface.php +++ /dev/null @@ -1,23 +0,0 @@ -messageFactory = $messageFactory; - } - - public function send(TransactionInterface $transaction) - { - // HTTP/1.1 streams using the PHP stream wrapper require a - // Connection: close header. Setting here so that it is added before - // emitting the request.before_send event. - $request = $transaction->getRequest(); - if ($request->getProtocolVersion() == '1.1' && - !$request->hasHeader('Connection') - ) { - $transaction->getRequest()->setHeader('Connection', 'close'); - } - - RequestEvents::emitBefore($transaction); - if (!$transaction->getResponse()) { - $this->createResponse($transaction); - RequestEvents::emitComplete($transaction); - } - - return $transaction->getResponse(); - } - - private function createResponse(TransactionInterface $transaction) - { - $request = $transaction->getRequest(); - $stream = $this->createStream($request, $http_response_header); - - if (!$request->getConfig()['stream']) { - $stream = $this->getSaveToBody($request, $stream); - } - - // Track the response headers of the request - $this->createResponseObject($http_response_header, $transaction, $stream); - } - - /** - * Drain the steam into the destination stream - */ - private function getSaveToBody(RequestInterface $request, $stream) - { - if ($saveTo = $request->getConfig()['save_to']) { - // Stream the response into the destination stream - $saveTo = is_string($saveTo) - ? Stream\create(fopen($saveTo, 'r+')) - : Stream\create($saveTo); - } else { - // Stream into the default temp stream - $saveTo = Stream\create(); - } - - while (!feof($stream)) { - $saveTo->write(fread($stream, 8096)); - } - - fclose($stream); - $saveTo->seek(0); - - return $saveTo; - } - - private function createResponseObject( - array $headers, - TransactionInterface $transaction, - $stream - ) { - $parts = explode(' ', array_shift($headers), 3); - $options = ['protocol_version' => substr($parts[0], -3)]; - if (isset($parts[2])) { - $options['reason_phrase'] = $parts[2]; - } - - // Set the size on the stream if it was returned in the response - $responseHeaders = []; - foreach ($headers as $header) { - $headerParts = explode(':', $header, 2); - $responseHeaders[$headerParts[0]] = isset($headerParts[1]) - ? $headerParts[1] - : ''; - } - - $response = $this->messageFactory->createResponse( - $parts[1], - $responseHeaders, - $stream, - $options - ); - - $transaction->setResponse($response); - RequestEvents::emitHeaders($transaction); - - return $response; - } - - /** - * Create a resource and check to ensure it was created successfully - * - * @param callable $callback Callable that returns stream resource - * @param RequestInterface $request Request used when throwing exceptions - * @param array $options Options used when throwing exceptions - * - * @return resource - * @throws RequestException on error - */ - private function createResource(callable $callback, RequestInterface $request, $options) - { - // Turn off error reporting while we try to initiate the request - $level = error_reporting(0); - $resource = call_user_func($callback); - error_reporting($level); - - // If the resource could not be created, then grab the last error and - // throw an exception. - if (!is_resource($resource)) { - $message = 'Error creating resource. [url] ' . $request->getUrl() . ' '; - if (isset($options['http']['proxy'])) { - $message .= "[proxy] {$options['http']['proxy']} "; - } - foreach (error_get_last() as $key => $value) { - $message .= "[{$key}] {$value} "; - } - throw new RequestException(trim($message), $request); - } - - return $resource; - } - - /** - * Create the stream for the request with the context options. - * - * @param RequestInterface $request Request being sent - * @param mixed $http_response_header Populated by stream wrapper - * - * @return resource - */ - private function createStream( - RequestInterface $request, - &$http_response_header - ) { - static $methods; - if (!$methods) { - $methods = array_flip(get_class_methods(__CLASS__)); - } - - $params = []; - $options = $this->getDefaultOptions($request); - foreach ($request->getConfig()->toArray() as $key => $value) { - $method = "add_{$key}"; - if (isset($methods[$method])) { - $this->{$method}($request, $options, $value, $params); - } - } - - $this->applyCustomOptions($request, $options); - $context = $this->createStreamContext($request, $options, $params); - - return $this->createStreamResource( - $request, - $options, - $context, - $http_response_header - ); - } - - private function getDefaultOptions(RequestInterface $request) - { - $headers = ''; - foreach ($request->getHeaders() as $name => $values) { - $headers .= $name . ': ' . implode(', ', $values) . "\r\n"; - } - - return [ - 'http' => [ - 'method' => $request->getMethod(), - 'header' => trim($headers), - 'protocol_version' => $request->getProtocolVersion(), - 'ignore_errors' => true, - 'follow_location' => 0, - 'content' => (string) $request->getBody() - ] - ]; - } - - private function add_proxy(RequestInterface $request, &$options, $value, &$params) - { - if (!is_array($value)) { - $options['http']['proxy'] = $value; - $options['http']['request_fulluri'] = true; - } else { - $scheme = $request->getScheme(); - if (isset($value[$scheme])) { - $options['http']['proxy'] = $value[$scheme]; - $options['http']['request_fulluri'] = true; - } - } - } - - private function add_timeout(RequestInterface $request, &$options, $value, &$params) - { - $options['http']['timeout'] = $value; - } - - private function add_verify(RequestInterface $request, &$options, $value, &$params) - { - if ($value === true || is_string($value)) { - $options['http']['verify_peer'] = true; - if ($value !== true) { - if (!file_exists($value)) { - throw new \RuntimeException("SSL certificate authority file not found: {$value}"); - } - $options['http']['allow_self_signed'] = true; - $options['http']['cafile'] = $value; - } - } elseif ($value === false) { - $options['http']['verify_peer'] = false; - } - } - - private function add_cert(RequestInterface $request, &$options, $value, &$params) - { - if (is_array($value)) { - $options['http']['passphrase'] = $value[1]; - $value = $value[0]; - } - - if (!file_exists($value)) { - throw new \RuntimeException("SSL certificate not found: {$value}"); - } - - $options['http']['local_cert'] = $value; - } - - private function add_debug(RequestInterface $request, &$options, $value, &$params) - { - static $map = [ - STREAM_NOTIFY_CONNECT => 'CONNECT', - STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', - STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', - STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', - STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', - STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', - STREAM_NOTIFY_PROGRESS => 'PROGRESS', - STREAM_NOTIFY_FAILURE => 'FAILURE', - STREAM_NOTIFY_COMPLETED => 'COMPLETED', - STREAM_NOTIFY_RESOLVE => 'RESOLVE' - ]; - - static $args = ['severity', 'message', 'message_code', - 'bytes_transferred', 'bytes_max']; - - if (!is_resource($value)) { - $value = fopen('php://output', 'w'); - } - - $params['notification'] = function () use ($request, $value, $map, $args) { - $passed = func_get_args(); - $code = array_shift($passed); - fprintf($value, '<%s> [%s] ', $request->getUrl(), $map[$code]); - foreach (array_filter($passed) as $i => $v) { - fwrite($value, $args[$i] . ': "' . $v . '" '); - } - fwrite($value, "\n"); - }; - } - - private function applyCustomOptions( - RequestInterface $request, - array &$options - ) { - // Overwrite any generated options with custom options - if ($custom = $request->getConfig()['stream_context']) { - if (!is_array($custom)) { - throw new AdapterException('stream_context must be an array'); - } - $options = array_replace_recursive($options, $custom); - } - } - - private function createStreamContext( - RequestInterface $request, - array $options, - array $params - ) { - return $this->createResource(function () use ( - $request, - $options, - $params - ) { - return stream_context_create($options, $params); - }, $request, $options); - } - - private function createStreamResource( - RequestInterface $request, - array $options, - $context, - &$http_response_header - ) { - $url = $request->getUrl(); - // Add automatic gzip decompression - if (strpos($request->getHeader('Accept-Encoding'), 'gzip') !== false) { - $url = 'compress.zlib://' . $url; - } - - return $this->createResource(function () use ( - $url, - &$http_response_header, - $context - ) { - if (false === strpos($url, 'http')) { - trigger_error("URL is invalid: {$url}", E_USER_WARNING); - return null; - } - return fopen($url, 'r', null, $context); - }, $request, $options); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/StreamingProxyAdapter.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/StreamingProxyAdapter.php deleted file mode 100644 index 128eb1d1e..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/StreamingProxyAdapter.php +++ /dev/null @@ -1,36 +0,0 @@ -defaultAdapter = $defaultAdapter; - $this->streamingAdapter = $streamingAdapter; - } - - public function send(TransactionInterface $transaction) - { - return $transaction->getRequest()->getConfig()['stream'] - ? $this->streamingAdapter->send($transaction) - : $this->defaultAdapter->send($transaction); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Transaction.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Transaction.php deleted file mode 100644 index 74bb6b442..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/Transaction.php +++ /dev/null @@ -1,49 +0,0 @@ -client = $client; - $this->request = $request; - } - - public function getRequest() - { - return $this->request; - } - - public function getResponse() - { - return $this->response; - } - - public function setResponse(ResponseInterface $response) - { - $this->response = $response; - } - - public function getClient() - { - return $this->client; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/TransactionInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/TransactionInterface.php deleted file mode 100644 index b9bf50cba..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Adapter/TransactionInterface.php +++ /dev/null @@ -1,35 +0,0 @@ -client = $client; - $this->eventListeners = $this->prepareListeners( - $options, - ['before', 'complete', 'error'] - ); - if ($source instanceof \Iterator) { - $this->source = $source; - } elseif (is_array($source)) { - $this->source = new \ArrayIterator($source); - } else { - throw new \InvalidArgumentException('Expected an Iterator or array'); - } - } - - public function current() - { - $request = $this->source->current(); - if (!$request instanceof RequestInterface) { - throw new \RuntimeException('All must implement RequestInterface'); - } - - $this->attachListeners($request, $this->eventListeners); - - return new Transaction($this->client, $request); - } - - public function next() - { - $this->source->next(); - } - - public function key() - { - return $this->source->key(); - } - - public function valid() - { - return $this->source->valid(); - } - - public function rewind() {} -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Client.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Client.php deleted file mode 100644 index 898157e18..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Client.php +++ /dev/null @@ -1,364 +0,0 @@ - [ - * 'http://www.foo.com/{version}/', - * ['version' => '123'] - * ], - * 'defaults' => [ - * 'timeout' => 10, - * 'allow_redirects' => false, - * 'proxy' => '192.168.16.1:10' - * ] - * ]); - * - * @param array $config Client configuration settings - * - base_url: Base URL of the client that is merged into relative URLs. - * Can be a string or an array that contains a URI template followed - * by an associative array of expansion variables to inject into the - * URI template. - * - adapter: Adapter used to transfer requests - * - parallel_adapter: Adapter used to transfer requests in parallel - * - message_factory: Factory used to create request and response object - * - defaults: Default request options to apply to each request - * - emitter: Event emitter used for request events - */ - public function __construct(array $config = []) - { - $this->configureBaseUrl($config); - $this->configureDefaults($config); - $this->configureAdapter($config); - if (isset($config['emitter'])) { - $this->emitter = $config['emitter']; - } - } - - /** - * Get the default User-Agent string to use with Guzzle - * - * @return string - */ - public static function getDefaultUserAgent() - { - static $defaultAgent = ''; - if (!$defaultAgent) { - $defaultAgent = 'Guzzle/' . self::VERSION; - if (extension_loaded('curl')) { - $defaultAgent .= ' curl/' . curl_version()['version']; - } - $defaultAgent .= ' PHP/' . PHP_VERSION; - } - - return $defaultAgent; - } - - public function __call($name, $arguments) - { - return \GuzzleHttp\deprecation_proxy( - $this, - $name, - $arguments, - ['getEventDispatcher' => 'getEmitter'] - ); - } - - public function getDefaultOption($keyOrPath = null) - { - return $keyOrPath === null - ? $this->defaults - : \GuzzleHttp\get_path($this->defaults, $keyOrPath); - } - - public function setDefaultOption($keyOrPath, $value) - { - \GuzzleHttp\set_path($this->defaults, $keyOrPath, $value); - } - - public function getBaseUrl() - { - return (string) $this->baseUrl; - } - - public function createRequest($method, $url = null, array $options = []) - { - // Merge in default options - $options = array_replace_recursive($this->defaults, $options); - - // Use a clone of the client's emitter - $options['config']['emitter'] = clone $this->getEmitter(); - - $request = $this->messageFactory->createRequest( - $method, - $url ? (string) $this->buildUrl($url) : (string) $this->baseUrl, - $options - ); - - return $request; - } - - public function get($url = null, $options = []) - { - return $this->send($this->createRequest('GET', $url, $options)); - } - - public function head($url = null, array $options = []) - { - return $this->send($this->createRequest('HEAD', $url, $options)); - } - - public function delete($url = null, array $options = []) - { - return $this->send($this->createRequest('DELETE', $url, $options)); - } - - public function put($url = null, array $options = []) - { - return $this->send($this->createRequest('PUT', $url, $options)); - } - - public function patch($url = null, array $options = []) - { - return $this->send($this->createRequest('PATCH', $url, $options)); - } - - public function post($url = null, array $options = []) - { - return $this->send($this->createRequest('POST', $url, $options)); - } - - public function options($url = null, array $options = []) - { - return $this->send($this->createRequest('OPTIONS', $url, $options)); - } - - public function send(RequestInterface $request) - { - $transaction = new Transaction($this, $request); - try { - if ($response = $this->adapter->send($transaction)) { - return $response; - } - throw new \LogicException('No response was associated with the transaction'); - } catch (RequestException $e) { - throw $e; - } catch (\Exception $e) { - // Wrap exceptions in a RequestException to adhere to the interface - throw new RequestException($e->getMessage(), $request, null, $e); - } - } - - public function sendAll($requests, array $options = []) - { - if (!($requests instanceof TransactionIterator)) { - $requests = new TransactionIterator($requests, $this, $options); - } - - $this->parallelAdapter->sendAll( - $requests, - isset($options['parallel']) - ? $options['parallel'] - : self::DEFAULT_CONCURRENCY - ); - } - - /** - * Get an array of default options to apply to the client - * - * @return array - */ - protected function getDefaultOptions() - { - $settings = [ - 'allow_redirects' => true, - 'exceptions' => true, - 'verify' => __DIR__ . '/cacert.pem' - ]; - - // Use the bundled cacert if it is a regular file, or set to true if - // using a phar file (because curL and the stream wrapper can't read - // cacerts from the phar stream wrapper). Favor the ini setting over - // the system's cacert. - if (substr(__FILE__, 0, 7) == 'phar://') { - $settings['verify'] = ini_get('openssl.cafile') ?: true; - } - - // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set - if (isset($_SERVER['HTTP_PROXY'])) { - $settings['proxy']['http'] = $_SERVER['HTTP_PROXY']; - } - - if (isset($_SERVER['HTTPS_PROXY'])) { - $settings['proxy']['https'] = $_SERVER['HTTPS_PROXY']; - } - - return $settings; - } - - /** - * Expand a URI template and inherit from the base URL if it's relative - * - * @param string|array $url URL or URI template to expand - * - * @return string - */ - private function buildUrl($url) - { - if (!is_array($url)) { - if (strpos($url, '://')) { - return (string) $url; - } - return (string) $this->baseUrl->combine($url); - } elseif (strpos($url[0], '://')) { - return \GuzzleHttp\uri_template($url[0], $url[1]); - } - - return (string) $this->baseUrl->combine( - \GuzzleHttp\uri_template($url[0], $url[1]) - ); - } - - /** - * Get a default parallel adapter to use based on the environment - * - * @return ParallelAdapterInterface - */ - private function getDefaultParallelAdapter() - { - return extension_loaded('curl') - ? new MultiAdapter($this->messageFactory) - : new FakeParallelAdapter($this->adapter); - } - - /** - * Create a default adapter to use based on the environment - * @throws \RuntimeException - */ - private function getDefaultAdapter() - { - if (extension_loaded('curl')) { - $this->parallelAdapter = new MultiAdapter($this->messageFactory); - $this->adapter = function_exists('curl_reset') - ? new CurlAdapter($this->messageFactory) - : $this->parallelAdapter; - if (ini_get('allow_url_fopen')) { - $this->adapter = new StreamingProxyAdapter( - $this->adapter, - new StreamAdapter($this->messageFactory) - ); - } - } elseif (ini_get('allow_url_fopen')) { - $this->adapter = new StreamAdapter($this->messageFactory); - } else { - throw new \RuntimeException('Guzzle requires cURL, the ' - . 'allow_url_fopen ini setting, or a custom HTTP adapter.'); - } - } - - private function configureBaseUrl(&$config) - { - if (!isset($config['base_url'])) { - $this->baseUrl = new Url('', ''); - } elseif (is_array($config['base_url'])) { - $this->baseUrl = Url::fromString( - \GuzzleHttp\uri_template( - $config['base_url'][0], - $config['base_url'][1] - ) - ); - $config['base_url'] = (string) $this->baseUrl; - } else { - $this->baseUrl = Url::fromString($config['base_url']); - } - } - - private function configureDefaults($config) - { - if (!isset($config['defaults'])) { - $this->defaults = $this->getDefaultOptions(); - } else { - $this->defaults = array_replace( - $this->getDefaultOptions(), - $config['defaults'] - ); - } - - // Add the default user-agent header - if (!isset($this->defaults['headers'])) { - $this->defaults['headers'] = [ - 'User-Agent' => static::getDefaultUserAgent() - ]; - } elseif (!isset(array_change_key_case($this->defaults['headers'])['user-agent'])) { - // Add the User-Agent header if one was not already set - $this->defaults['headers']['User-Agent'] = static::getDefaultUserAgent(); - } - } - - private function configureAdapter(&$config) - { - if (isset($config['message_factory'])) { - $this->messageFactory = $config['message_factory']; - } else { - $this->messageFactory = new MessageFactory(); - } - if (isset($config['adapter'])) { - $this->adapter = $config['adapter']; - } else { - $this->getDefaultAdapter(); - } - // If no parallel adapter was explicitly provided and one was not - // defaulted when creating the default adapter, then create one now. - if (isset($config['parallel_adapter'])) { - $this->parallelAdapter = $config['parallel_adapter']; - } elseif (!$this->parallelAdapter) { - $this->parallelAdapter = $this->getDefaultParallelAdapter(); - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/ClientInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/ClientInterface.php deleted file mode 100644 index b0e4cba7f..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/ClientInterface.php +++ /dev/null @@ -1,179 +0,0 @@ -data = $data; - } - - /** - * Create a new collection from an array, validate the keys, and add default - * values where missing - * - * @param array $config Configuration values to apply. - * @param array $defaults Default parameters - * @param array $required Required parameter names - * - * @return self - * @throws \InvalidArgumentException if a parameter is missing - */ - public static function fromConfig( - array $config = [], - array $defaults = [], - array $required = [] - ) { - $data = $config + $defaults; - - if ($missing = array_diff($required, array_keys($data))) { - throw new \InvalidArgumentException( - 'Config is missing the following keys: ' . - implode(', ', $missing)); - } - - return new self($data); - } - - /** - * Removes all key value pairs - * - * @return Collection - */ - public function clear() - { - $this->data = []; - - return $this; - } - - /** - * Get a specific key value. - * - * @param string $key Key to retrieve. - * - * @return mixed|null Value of the key or NULL - */ - public function get($key) - { - return isset($this->data[$key]) ? $this->data[$key] : null; - } - - /** - * Set a key value pair - * - * @param string $key Key to set - * @param mixed $value Value to set - * - * @return Collection Returns a reference to the object - */ - public function set($key, $value) - { - $this->data[$key] = $value; - - return $this; - } - - /** - * Add a value to a key. If a key of the same name has already been added, - * the key value will be converted into an array and the new value will be - * pushed to the end of the array. - * - * @param string $key Key to add - * @param mixed $value Value to add to the key - * - * @return Collection Returns a reference to the object. - */ - public function add($key, $value) - { - if (!array_key_exists($key, $this->data)) { - $this->data[$key] = $value; - } elseif (is_array($this->data[$key])) { - $this->data[$key][] = $value; - } else { - $this->data[$key] = array($this->data[$key], $value); - } - - return $this; - } - - /** - * Remove a specific key value pair - * - * @param string $key A key to remove - * - * @return Collection - */ - public function remove($key) - { - unset($this->data[$key]); - - return $this; - } - - /** - * Get all keys in the collection - * - * @return array - */ - public function getKeys() - { - return array_keys($this->data); - } - - /** - * Returns whether or not the specified key is present. - * - * @param string $key The key for which to check the existence. - * - * @return bool - */ - public function hasKey($key) - { - return array_key_exists($key, $this->data); - } - - /** - * Checks if any keys contains a certain value - * - * @param string $value Value to search for - * - * @return mixed Returns the key if the value was found FALSE if the value - * was not found. - */ - public function hasValue($value) - { - return array_search($value, $this->data, true); - } - - /** - * Replace the data of the object with the value of an array - * - * @param array $data Associative array of data - * - * @return Collection Returns a reference to the object - */ - public function replace(array $data) - { - $this->data = $data; - - return $this; - } - - /** - * Add and merge in a Collection or array of key value pair data. - * - * @param Collection|array $data Associative array of key value pair data - * - * @return Collection Returns a reference to the object. - */ - public function merge($data) - { - foreach ($data as $key => $value) { - $this->add($key, $value); - } - - return $this; - } - - /** - * Over write key value pairs in this collection with all of the data from - * an array or collection. - * - * @param array|\Traversable $data Values to override over this config - * - * @return self - */ - public function overwriteWith($data) - { - if (is_array($data)) { - $this->data = $data + $this->data; - } elseif ($data instanceof Collection) { - $this->data = $data->toArray() + $this->data; - } else { - foreach ($data as $key => $value) { - $this->data[$key] = $value; - } - } - - return $this; - } - - /** - * Returns a Collection containing all the elements of the collection after - * applying the callback function to each one. - * - * The callable should accept three arguments: - * - (string) $key - * - (string) $value - * - (array) $context - * - * The callable must return a the altered or unaltered value. - * - * @param callable $closure Map function to apply - * @param array $context Context to pass to the callable - * - * @return Collection - */ - public function map(callable $closure, array $context = []) - { - $collection = new static(); - foreach ($this as $key => $value) { - $collection[$key] = $closure($key, $value, $context); - } - - return $collection; - } - - /** - * Iterates over each key value pair in the collection passing them to the - * callable. If the callable returns true, the current value from input is - * returned into the result Collection. - * - * The callable must accept two arguments: - * - (string) $key - * - (string) $value - * - * @param callable $closure Evaluation function - * - * @return Collection - */ - public function filter(callable $closure) - { - $collection = new static(); - foreach ($this->data as $key => $value) { - if ($closure($key, $value)) { - $collection[$key] = $value; - } - } - - return $collection; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/CookieJar.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/CookieJar.php deleted file mode 100644 index 413485782..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/CookieJar.php +++ /dev/null @@ -1,249 +0,0 @@ -strictMode = $strictMode; - - foreach ($cookieArray as $cookie) { - if (!($cookieArray instanceof SetCookie)) { - $cookie = new SetCookie($cookie); - } - $this->setCookie($cookie); - } - } - - /** - * Create a new Cookie jar from an associative array and domain. - * - * @param array $cookies Cookies to create the jar from - * @param string $domain Domain to set the cookies to - * - * @return self - */ - public static function fromArray(array $cookies, $domain) - { - $cookieJar = new self(); - foreach ($cookies as $name => $value) { - $cookieJar->setCookie(new SetCookie([ - 'Domain' => $domain, - 'Name' => $name, - 'Value' => $value, - 'Discard' => true - ])); - } - - return $cookieJar; - } - - /** - * Quote the cookie value if it is not already quoted and it contains - * problematic characters. - * - * @param string $value Value that may or may not need to be quoted - * - * @return string - */ - public static function getCookieValue($value) - { - if (substr($value, 0, 1) !== '"' && - substr($value, -1, 1) !== '"' && - strpbrk($value, ';,') - ) { - $value = '"' . $value . '"'; - } - - return $value; - } - - public function toArray() - { - return array_map(function (SetCookie $cookie) { - return $cookie->toArray(); - }, $this->getIterator()->getArrayCopy()); - } - - public function clear($domain = null, $path = null, $name = null) - { - if (!$domain) { - $this->cookies = []; - return; - } elseif (!$path) { - $this->cookies = array_filter( - $this->cookies, - function (SetCookie $cookie) use ($path, $domain) { - return !$cookie->matchesDomain($domain); - } - ); - } elseif (!$name) { - $this->cookies = array_filter( - $this->cookies, - function (SetCookie $cookie) use ($path, $domain) { - return !($cookie->matchesPath($path) && - $cookie->matchesDomain($domain)); - } - ); - } else { - $this->cookies = array_filter( - $this->cookies, - function (SetCookie $cookie) use ($path, $domain, $name) { - return !($cookie->getName() == $name && - $cookie->matchesPath($path) && - $cookie->matchesDomain($domain)); - } - ); - } - } - - public function clearSessionCookies() - { - $this->cookies = array_filter( - $this->cookies, - function (SetCookie $cookie) { - return !$cookie->getDiscard() && $cookie->getExpires(); - } - ); - } - - public function setCookie(SetCookie $cookie) - { - // Only allow cookies with set and valid domain, name, value - $result = $cookie->validate(); - if ($result !== true) { - if ($this->strictMode) { - throw new \RuntimeException('Invalid cookie: ' . $result); - } else { - $this->removeCookieIfEmpty($cookie); - return false; - } - } - - // Resolve conflicts with previously set cookies - foreach ($this->cookies as $i => $c) { - - // Two cookies are identical, when their path, and domain are - // identical. - if ($c->getPath() != $cookie->getPath() || - $c->getDomain() != $cookie->getDomain() || - $c->getName() != $cookie->getName() - ) { - continue; - } - - // The previously set cookie is a discard cookie and this one is - // not so allow the new cookie to be set - if (!$cookie->getDiscard() && $c->getDiscard()) { - unset($this->cookies[$i]); - continue; - } - - // If the new cookie's expiration is further into the future, then - // replace the old cookie - if ($cookie->getExpires() > $c->getExpires()) { - unset($this->cookies[$i]); - continue; - } - - // If the value has changed, we better change it - if ($cookie->getValue() !== $c->getValue()) { - unset($this->cookies[$i]); - continue; - } - - // The cookie exists, so no need to continue - return false; - } - - $this->cookies[] = $cookie; - - return true; - } - - public function count() - { - return count($this->cookies); - } - - public function getIterator() - { - return new \ArrayIterator(array_values($this->cookies)); - } - - public function extractCookies( - RequestInterface $request, - ResponseInterface $response - ) { - if ($cookieHeader = $response->getHeader('Set-Cookie', true)) { - foreach ($cookieHeader as $cookie) { - $sc = SetCookie::fromString($cookie); - if (!$sc->getDomain()) { - $sc->setDomain($request->getHost()); - } - $this->setCookie($sc); - } - } - } - - public function addCookieHeader(RequestInterface $request) - { - $values = []; - $scheme = $request->getScheme(); - $host = $request->getHost(); - $path = $request->getPath(); - - foreach ($this->cookies as $cookie) { - if ($cookie->matchesPath($path) && - $cookie->matchesDomain($host) && - !$cookie->isExpired() && - (!$cookie->getSecure() || $scheme == 'https') - ) { - $values[] = $cookie->getName() . '=' - . self::getCookieValue($cookie->getValue()); - } - } - - if ($values) { - $request->setHeader('Cookie', implode(';', $values)); - } - } - - /** - * If a cookie already exists and the server asks to set it again with a - * null value, the cookie must be deleted. - * - * @param SetCookie $cookie - */ - private function removeCookieIfEmpty(SetCookie $cookie) - { - $cookieValue = $cookie->getValue(); - if ($cookieValue === null || $cookieValue === '') { - $this->clear( - $cookie->getDomain(), - $cookie->getPath(), - $cookie->getName() - ); - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/CookieJarInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/CookieJarInterface.php deleted file mode 100644 index 6cafce8cc..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/CookieJarInterface.php +++ /dev/null @@ -1,76 +0,0 @@ -filename = $cookieFile; - - if (file_exists($cookieFile)) { - $this->load($cookieFile); - } - } - - /** - * Saves the file when shutting down - */ - public function __destruct() - { - $this->save($this->filename); - } - - /** - * Saves the cookies to a file. - * - * @param string $filename File to save - * @throws \RuntimeException if the file cannot be found or created - */ - public function save($filename) - { - $json = []; - foreach ($this as $cookie) { - if ($cookie->getExpires() && !$cookie->getDiscard()) { - $json[] = $cookie->toArray(); - } - } - - if (false === file_put_contents($filename, json_encode($json))) { - // @codeCoverageIgnoreStart - throw new \RuntimeException("Unable to save file {$filename}"); - // @codeCoverageIgnoreEnd - } - } - - /** - * Load cookies from a JSON formatted file. - * - * Old cookies are kept unless overwritten by newly loaded ones. - * - * @param string $filename Cookie file to load. - * @throws \RuntimeException if the file cannot be loaded. - */ - public function load($filename) - { - $json = file_get_contents($filename); - if (false === $json) { - // @codeCoverageIgnoreStart - throw new \RuntimeException("Unable to load file {$filename}"); - // @codeCoverageIgnoreEnd - } - - $data = \GuzzleHttp\json_decode($json, true); - if (is_array($data)) { - foreach (\GuzzleHttp\json_decode($json, true) as $cookie) { - $this->setCookie(new SetCookie($cookie)); - } - } elseif (strlen($data)) { - throw new \RuntimeException("Invalid cookie file: {$filename}"); - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/SessionCookieJar.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/SessionCookieJar.php deleted file mode 100644 index 2f708d74e..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/SessionCookieJar.php +++ /dev/null @@ -1,65 +0,0 @@ -sessionKey = $sessionKey; - $this->load(); - } - - /** - * Saves cookies to session when shutting down - */ - public function __destruct() - { - $this->save(); - } - - /** - * Save cookies to the client session - */ - public function save() - { - $json = []; - foreach ($this as $cookie) { - if ($cookie->getExpires() && !$cookie->getDiscard()) { - $json[] = $cookie->toArray(); - } - } - - $_SESSION[$this->sessionKey] = json_encode($json); - } - - /** - * Load the contents of the client session into the data array - */ - protected function load() - { - $cookieJar = isset($_SESSION[$this->sessionKey]) - ? $_SESSION[$this->sessionKey] - : null; - - $data = \GuzzleHttp\json_decode($cookieJar, true); - if (is_array($data)) { - foreach ($data as $cookie) { - $this->setCookie(new SetCookie($cookie)); - } - } elseif (strlen($data)) { - throw new \RuntimeException("Invalid cookie data"); - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/SetCookie.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/SetCookie.php deleted file mode 100644 index 76f6f8d15..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Cookie/SetCookie.php +++ /dev/null @@ -1,410 +0,0 @@ - null, - 'Value' => null, - 'Domain' => null, - 'Path' => '/', - 'Max-Age' => null, - 'Expires' => null, - 'Secure' => false, - 'Discard' => false, - 'HttpOnly' => false - ]; - - /** @var array Cookie data */ - private $data; - - /** - * Create a new SetCookie object from a string - * - * @param string $cookie Set-Cookie header string - * - * @return self - */ - public static function fromString($cookie) - { - // Create the default return array - $data = self::$defaults; - // Explode the cookie string using a series of semicolons - $pieces = array_filter(array_map('trim', explode(';', $cookie))); - // The name of the cookie (first kvp) must include an equal sign. - if (empty($pieces) || !strpos($pieces[0], '=')) { - return new self($data); - } - - // Add the cookie pieces into the parsed data array - foreach ($pieces as $part) { - - $cookieParts = explode('=', $part, 2); - $key = trim($cookieParts[0]); - $value = isset($cookieParts[1]) - ? trim($cookieParts[1], " \n\r\t\0\x0B\"") - : true; - - // Only check for non-cookies when cookies have been found - if (empty($data['Name'])) { - $data['Name'] = $key; - $data['Value'] = $value; - } else { - foreach (array_keys(self::$defaults) as $search) { - if (!strcasecmp($search, $key)) { - $data[$search] = $value; - continue 2; - } - } - $data[$key] = $value; - } - } - - return new self($data); - } - - /** - * @param array $data Array of cookie data provided by a Cookie parser - */ - public function __construct(array $data = []) - { - $this->data = array_replace(self::$defaults, $data); - // Extract the Expires value and turn it into a UNIX timestamp if needed - if (!$this->getExpires() && $this->getMaxAge()) { - // Calculate the Expires date - $this->setExpires(time() + $this->getMaxAge()); - } elseif ($this->getExpires() && !is_numeric($this->getExpires())) { - $this->setExpires($this->getExpires()); - } - } - - public function __toString() - { - $str = $this->data['Name'] . '=' . $this->data['Value'] . '; '; - foreach ($this->data as $k => $v) { - if ($k != 'Name' && $k != 'Value'&& $v !== null && $v !== false) { - if ($k == 'Expires') { - $str .= 'Expires=' . gmdate('D, d M Y H:i:s \G\M\T', $v) . '; '; - } else { - $str .= ($v === true ? $k : "{$k}={$v}") . '; '; - } - } - } - - return rtrim($str, '; '); - } - - public function toArray() - { - return $this->data; - } - - /** - * Get the cookie name - * - * @return string - */ - public function getName() - { - return $this->data['Name']; - } - - /** - * Set the cookie name - * - * @param string $name Cookie name - * - * @return self - */ - public function setName($name) - { - $this->data['Name'] = $name; - - return $this; - } - - /** - * Get the cookie value - * - * @return string - */ - public function getValue() - { - return $this->data['Value']; - } - - /** - * Set the cookie value - * - * @param string $value Cookie value - * - * @return self - */ - public function setValue($value) - { - $this->data['Value'] = $value; - - return $this; - } - - /** - * Get the domain - * - * @return string|null - */ - public function getDomain() - { - return $this->data['Domain']; - } - - /** - * Set the domain of the cookie - * - * @param string $domain - * - * @return self - */ - public function setDomain($domain) - { - $this->data['Domain'] = $domain; - - return $this; - } - - /** - * Get the path - * - * @return string - */ - public function getPath() - { - return $this->data['Path']; - } - - /** - * Set the path of the cookie - * - * @param string $path Path of the cookie - * - * @return self - */ - public function setPath($path) - { - $this->data['Path'] = $path; - - return $this; - } - - /** - * Maximum lifetime of the cookie in seconds - * - * @return int|null - */ - public function getMaxAge() - { - return $this->data['Max-Age']; - } - - /** - * Set the max-age of the cookie - * - * @param int $maxAge Max age of the cookie in seconds - * - * @return self - */ - public function setMaxAge($maxAge) - { - $this->data['Max-Age'] = $maxAge; - - return $this; - } - - /** - * The UNIX timestamp when the cookie Expires - * - * @return mixed - */ - public function getExpires() - { - return $this->data['Expires']; - } - - /** - * Set the unix timestamp for which the cookie will expire - * - * @param int $timestamp Unix timestamp - * - * @return self - */ - public function setExpires($timestamp) - { - $this->data['Expires'] = is_numeric($timestamp) - ? (int) $timestamp - : strtotime($timestamp); - - return $this; - } - - /** - * Get whether or not this is a secure cookie - * - * @return null|bool - */ - public function getSecure() - { - return $this->data['Secure']; - } - - /** - * Set whether or not the cookie is secure - * - * @param bool $secure Set to true or false if secure - * - * @return self - */ - public function setSecure($secure) - { - $this->data['Secure'] = $secure; - - return $this; - } - - /** - * Get whether or not this is a session cookie - * - * @return null|bool - */ - public function getDiscard() - { - return $this->data['Discard']; - } - - /** - * Set whether or not this is a session cookie - * - * @param bool $discard Set to true or false if this is a session cookie - * - * @return self - */ - public function setDiscard($discard) - { - $this->data['Discard'] = $discard; - - return $this; - } - - /** - * Get whether or not this is an HTTP only cookie - * - * @return bool - */ - public function getHttpOnly() - { - return $this->data['HttpOnly']; - } - - /** - * Set whether or not this is an HTTP only cookie - * - * @param bool $httpOnly Set to true or false if this is HTTP only - * - * @return self - */ - public function setHttpOnly($httpOnly) - { - $this->data['HttpOnly'] = $httpOnly; - - return $this; - } - - /** - * Check if the cookie matches a path value - * - * @param string $path Path to check against - * - * @return bool - */ - public function matchesPath($path) - { - return !$this->getPath() || 0 === stripos($path, $this->getPath()); - } - - /** - * Check if the cookie matches a domain value - * - * @param string $domain Domain to check against - * - * @return bool - */ - public function matchesDomain($domain) - { - // Remove the leading '.' as per spec in RFC 6265. - // http://tools.ietf.org/html/rfc6265#section-5.2.3 - $cookieDomain = ltrim($this->getDomain(), '.'); - - // Domain not set or exact match. - if (!$cookieDomain || !strcasecmp($domain, $cookieDomain)) { - return true; - } - - // Matching the subdomain according to RFC 6265. - // http://tools.ietf.org/html/rfc6265#section-5.1.3 - if (filter_var($domain, FILTER_VALIDATE_IP)) { - return false; - } - - return (bool) preg_match('/\.' . preg_quote($cookieDomain) . '$/i', $domain); - } - - /** - * Check if the cookie is expired - * - * @return bool - */ - public function isExpired() - { - return $this->getExpires() && time() > $this->getExpires(); - } - - /** - * Check if the cookie is valid according to RFC 6265 - * - * @return bool|string Returns true if valid or an error message if invalid - */ - public function validate() - { - // Names must not be empty, but can be 0 - $name = $this->getName(); - if (empty($name) && !is_numeric($name)) { - return 'The cookie name must not be empty'; - } - - // Check if any of the invalid characters are present in the cookie name - if (preg_match("/[=,; \t\r\n\013\014]/", $name)) { - return "Cookie name must not cannot invalid characters: =,; \\t\\r\\n\\013\\014"; - } - - // Value must not be empty, but can be 0 - $value = $this->getValue(); - if (empty($value) && !is_numeric($value)) { - return 'The cookie value must not be empty'; - } - - // Domains must not be empty, but can be 0 - // A "0" is not a valid internet domain, but may be used as server name - // in a private network. - $domain = $this->getDomain(); - if (empty($domain) && !is_numeric($domain)) { - return 'The cookie domain must not be empty'; - } - - return true; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/AbstractEvent.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/AbstractEvent.php deleted file mode 100644 index fa1453c84..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/AbstractEvent.php +++ /dev/null @@ -1,21 +0,0 @@ -propagationStopped; - } - - public function stopPropagation() - { - $this->propagationStopped = true; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/AbstractRequestEvent.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/AbstractRequestEvent.php deleted file mode 100644 index d188248ac..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/AbstractRequestEvent.php +++ /dev/null @@ -1,49 +0,0 @@ -transaction = $transaction; - } - - /** - * Get the client associated with the event - * - * @return ClientInterface - */ - public function getClient() - { - return $this->transaction->getClient(); - } - - /** - * Get the request object - * - * @return RequestInterface - */ - public function getRequest() - { - return $this->transaction->getRequest(); - } - - /** - * @return TransactionInterface - */ - protected function getTransaction() - { - return $this->transaction; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/AbstractTransferEvent.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/AbstractTransferEvent.php deleted file mode 100644 index dba1f98eb..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/AbstractTransferEvent.php +++ /dev/null @@ -1,83 +0,0 @@ -transferInfo = $transferInfo; - } - - /** - * Get all transfer information as an associative array if no $name - * argument is supplied, or gets a specific transfer statistic if - * a $name attribute is supplied (e.g., 'total_time'). - * - * @param string $name Name of the transfer stat to retrieve - * - * @return mixed|null|array - */ - public function getTransferInfo($name = null) - { - if (!$name) { - return $this->transferInfo; - } - - return isset($this->transferInfo[$name]) - ? $this->transferInfo[$name] - : null; - } - - /** - * Get the response - * - * @return ResponseInterface|null - */ - abstract public function getResponse(); - - /** - * Intercept the request and associate a response - * - * @param ResponseInterface $response Response to set - */ - abstract public function intercept(ResponseInterface $response); -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/BeforeEvent.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/BeforeEvent.php deleted file mode 100644 index 34a7811d6..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/BeforeEvent.php +++ /dev/null @@ -1,26 +0,0 @@ -getTransaction()->setResponse($response); - $this->stopPropagation(); - RequestEvents::emitComplete($this->getTransaction()); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/CompleteEvent.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/CompleteEvent.php deleted file mode 100644 index 344576001..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/CompleteEvent.php +++ /dev/null @@ -1,35 +0,0 @@ -stopPropagation(); - $this->getTransaction()->setResponse($response); - } - - /** - * Get the response of the request - * - * @return ResponseInterface - */ - public function getResponse() - { - return $this->getTransaction()->getResponse(); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/Emitter.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/Emitter.php deleted file mode 100644 index 49172bcb5..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/Emitter.php +++ /dev/null @@ -1,147 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - * - * @link https://github.com/symfony/symfony/tree/master/src/Symfony/Component/EventDispatcher - */ -class Emitter implements EmitterInterface -{ - /** @var array */ - private $listeners = []; - - /** @var array */ - private $sorted = []; - - public function on($eventName, callable $listener, $priority = 0) - { - if ($priority === 'first') { - $priority = isset($this->listeners[$eventName]) - ? max(array_keys($this->listeners[$eventName])) + 1 - : 1; - } elseif ($priority === 'last') { - $priority = isset($this->listeners[$eventName]) - ? min(array_keys($this->listeners[$eventName])) - 1 - : -1; - } - - $this->listeners[$eventName][$priority][] = $listener; - unset($this->sorted[$eventName]); - } - - public function once($eventName, callable $listener, $priority = 0) - { - $onceListener = function ( - EventInterface $event, - $eventName - ) use (&$onceListener, $eventName, $listener, $priority) { - $this->removeListener($eventName, $onceListener); - $listener($event, $eventName, $this); - }; - - $this->on($eventName, $onceListener, $priority); - } - - public function removeListener($eventName, callable $listener) - { - if (!isset($this->listeners[$eventName])) { - return; - } - - foreach ($this->listeners[$eventName] as $priority => $listeners) { - if (false !== ($key = array_search($listener, $listeners, true))) { - unset( - $this->listeners[$eventName][$priority][$key], - $this->sorted[$eventName] - ); - } - } - } - - public function listeners($eventName = null) - { - // Return all events in a sorted priority order - if ($eventName === null) { - foreach (array_keys($this->listeners) as $eventName) { - if (!isset($this->sorted[$eventName])) { - $this->listeners($eventName); - } - } - return $this->sorted; - } - - // Return the listeners for a specific event, sorted in priority order - if (!isset($this->sorted[$eventName])) { - if (!isset($this->listeners[$eventName])) { - return []; - } else { - krsort($this->listeners[$eventName]); - $this->sorted[$eventName] = call_user_func_array( - 'array_merge', - $this->listeners[$eventName] - ); - } - } - - return $this->sorted[$eventName]; - } - - public function emit($eventName, EventInterface $event) - { - if (isset($this->listeners[$eventName])) { - foreach ($this->listeners($eventName) as $listener) { - $listener($event, $eventName); - if ($event->isPropagationStopped()) { - break; - } - } - } - - return $event; - } - - public function attach(SubscriberInterface $subscriber) - { - foreach ($subscriber->getEvents() as $eventName => $listener) { - $this->on( - $eventName, - array($subscriber, $listener[0]), - isset($listener[1]) ? $listener[1] : 0 - ); - } - } - - public function detach(SubscriberInterface $subscriber) - { - foreach ($subscriber->getEvents() as $eventName => $listener) { - $this->removeListener($eventName, array($subscriber, $listener[0])); - } - } - - public function __call($name, $arguments) - { - return \GuzzleHttp\deprecation_proxy( - $this, - $name, - $arguments, - [ - 'addSubscriber' => 'attach', - 'removeSubscriber' => 'detach', - 'addListener' => 'on', - 'dispatch' => 'emit' - ] - ); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/EmitterInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/EmitterInterface.php deleted file mode 100644 index 0181e7fe7..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/EmitterInterface.php +++ /dev/null @@ -1,88 +0,0 @@ -exception = $e; - } - - /** - * Intercept the exception and inject a response - * - * @param ResponseInterface $response Response to set - */ - public function intercept(ResponseInterface $response) - { - $this->stopPropagation(); - $this->getTransaction()->setResponse($response); - RequestEvents::emitComplete($this->getTransaction()); - } - - /** - * Get the exception that was encountered - * - * @return RequestException - */ - public function getException() - { - return $this->exception; - } - - /** - * Get the response the was received (if any) - * - * @return ResponseInterface|null - */ - public function getResponse() - { - return $this->getException()->getResponse(); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/EventInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/EventInterface.php deleted file mode 100644 index bf58f8b51..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/EventInterface.php +++ /dev/null @@ -1,24 +0,0 @@ -emitter) { - $this->emitter = new Emitter(); - } - - return $this->emitter; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/HeadersEvent.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/HeadersEvent.php deleted file mode 100644 index 81274ff84..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/HeadersEvent.php +++ /dev/null @@ -1,39 +0,0 @@ -getResponse()) { - throw new \RuntimeException('A response must be present'); - } - } - - /** - * Get the response the was received - * - * @return ResponseInterface - */ - public function getResponse() - { - return $this->getTransaction()->getResponse(); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/ListenerAttacherTrait.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/ListenerAttacherTrait.php deleted file mode 100644 index 637cdaea6..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/ListenerAttacherTrait.php +++ /dev/null @@ -1,89 +0,0 @@ -getEmitter(); - foreach ($listeners as $el) { - if ($el['once']) { - $emitter->once($el['name'], $el['fn'], $el['priority']); - } else { - $emitter->on($el['name'], $el['fn'], $el['priority']); - } - } - } - - /** - * Extracts the allowed events from the provided array, and ignores anything - * else in the array. The event listener must be specified as a callable or - * as an array of event listener data ("name", "fn", "priority", "once"). - * - * @param array $source Array containing callables or hashes of data to be - * prepared as event listeners. - * @param array $events Names of events to look for in the provided $source - * array. Other keys are ignored. - * @return array - */ - private function prepareListeners(array $source, array $events) - { - $listeners = []; - foreach ($events as $name) { - if (isset($source[$name])) { - $this->buildListener($name, $source[$name], $listeners); - } - } - - return $listeners; - } - - /** - * Creates a complete event listener definition from the provided array of - * listener data. Also works recursively if more than one listeners are - * contained in the provided array. - * - * @param string $name Name of the event the listener is for. - * @param array|callable $data Event listener data to prepare. - * @param array $listeners Array of listeners, passed by reference. - * - * @throws \InvalidArgumentException if the event data is malformed. - */ - private function buildListener($name, $data, &$listeners) - { - static $defaults = ['priority' => 0, 'once' => false]; - - // If a callable is provided, normalize it to the array format. - if (is_callable($data)) { - $data = ['fn' => $data]; - } - - // Prepare the listener and add it to the array, recursively. - if (isset($data['fn'])) { - $data['name'] = $name; - $listeners[] = $data + $defaults; - } elseif (is_array($data)) { - foreach ($data as $listenerData) { - $this->buildListener($name, $listenerData, $listeners); - } - } else { - throw new \InvalidArgumentException('Each event listener must be a ' - . 'callable or an associative array containing a "fn" key.'); - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/RequestEvents.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/RequestEvents.php deleted file mode 100644 index 654e8ad02..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/RequestEvents.php +++ /dev/null @@ -1,162 +0,0 @@ -getRequest(); - try { - $request->getEmitter()->emit( - 'before', - new BeforeEvent($transaction) - ); - } catch (RequestException $e) { - // When a RequestException has been emitted through emitError, the - // exception is marked as "emitted". This means that the exception - // had a chance to be rescued but was not. In this case, this method - // must not emit the error again, but rather throw the exception. - // This prevents RequestExceptions encountered during the before - // event from being emitted to listeners twice. - if ($e->emittedError()) { - throw $e; - } - self::emitError($transaction, $e); - } catch (\Exception $e) { - self::emitError($transaction, $e); - } - } - - /** - * Emits the complete event for a request and emits an error - * event if an error is encountered during the after send. - * - * @param TransactionInterface $transaction Transaction to emit for - * @param array $stats Transfer stats - * - * @throws RequestException - */ - public static function emitComplete( - TransactionInterface $transaction, - array $stats = [] - ) { - $request = $transaction->getRequest(); - $transaction->getResponse()->setEffectiveUrl($request->getUrl()); - try { - $request->getEmitter()->emit( - 'complete', - new CompleteEvent($transaction, $stats) - ); - } catch (RequestException $e) { - self::emitError($transaction, $e, $stats); - } - } - - /** - * Emits the headers event for a request. - * - * @param TransactionInterface $transaction Transaction to emit for - */ - public static function emitHeaders(TransactionInterface $transaction) - { - $transaction->getRequest()->getEmitter()->emit( - 'headers', - new HeadersEvent($transaction) - ); - } - - /** - * Emits an error event for a request and accounts for the propagation - * of an error event being stopped to prevent the exception from being - * thrown. - * - * @param TransactionInterface $transaction - * @param \Exception $e - * @param array $stats - * - * @throws \GuzzleHttp\Exception\RequestException - */ - public static function emitError( - TransactionInterface $transaction, - \Exception $e, - array $stats = [] - ) { - $request = $transaction->getRequest(); - - // Convert non-request exception to a wrapped exception - if (!($e instanceof RequestException)) { - $e = new RequestException($e->getMessage(), $request, null, $e); - } - - // Mark the exception as having been emitted for an error event. This - // works in tandem with the emitBefore method to prevent the error - // event from being triggered twice for the same exception. - $e->emittedError(true); - - // Dispatch an event and allow interception - if (!$request->getEmitter()->emit( - 'error', - new ErrorEvent($transaction, $e, $stats) - )->isPropagationStopped()) { - throw $e; - } - } - - /** - * Converts an array of event options into a formatted array of valid event - * configuration. - * - * @param array $options Event array to convert - * @param array $events Event names to convert in the options array. - * @param mixed $handler Event handler to utilize - * - * @return array - * @throws \InvalidArgumentException if the event config is invalid - * @internal - */ - public static function convertEventArray( - array $options, - array $events, - $handler - ) { - foreach ($events as $name) { - if (!isset($options[$name])) { - $options[$name] = $handler; - } elseif (is_callable($options[$name])) { - $options[$name] = [['fn' => $options[$name]], $handler]; - } elseif (is_array($options[$name])) { - $options[$name][] = $handler; - } else { - throw new \InvalidArgumentException('Invalid event format'); - } - } - - return $options; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/SubscriberInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/SubscriberInterface.php deleted file mode 100644 index 22c731190..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Event/SubscriberInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - ['methodName']] - * - ['eventName' => ['methodName', $priority]] - * - * @return array - */ - public function getEvents(); -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/AdapterException.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/AdapterException.php deleted file mode 100644 index 55334c464..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/AdapterException.php +++ /dev/null @@ -1,5 +0,0 @@ -response = $response; - } - /** - * Get the associated response - * - * @return ResponseInterface|null - */ - public function getResponse() - { - return $this->response; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/RequestException.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/RequestException.php deleted file mode 100644 index ee953a9c7..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/RequestException.php +++ /dev/null @@ -1,124 +0,0 @@ -getStatusCode() : 0; - parent::__construct($message, $code, $previous); - $this->request = $request; - $this->response = $response; - } - - /** - * Factory method to create a new exception with a normalized error message - * - * @param RequestInterface $request Request - * @param ResponseInterface $response Response received - * @param \Exception $previous Previous exception - * - * @return self - */ - public static function create( - RequestInterface $request, - ResponseInterface $response = null, - \Exception $previous = null - ) { - if (!$response) { - return new self('Error completing request', $request, null, $previous); - } - - $level = $response->getStatusCode()[0]; - if ($level == '4') { - $label = 'Client error response'; - $className = __NAMESPACE__ . '\\ClientException'; - } elseif ($level == '5') { - $label = 'Server error response'; - $className = __NAMESPACE__ . '\\ServerException'; - } else { - $label = 'Unsuccessful response'; - $className = __CLASS__; - } - - $message = $label . ' [url] ' . $request->getUrl() - . ' [status code] ' . $response->getStatusCode() - . ' [reason phrase] ' . $response->getReasonPhrase(); - - return new $className($message, $request, $response, $previous); - } - - /** - * Get the request that caused the exception - * - * @return RequestInterface - */ - public function getRequest() - { - return $this->request; - } - - /** - * Get the associated response - * - * @return ResponseInterface|null - */ - public function getResponse() - { - return $this->response; - } - - /** - * Check if a response was received - * - * @return bool - */ - public function hasResponse() - { - return $this->response !== null; - } - - /** - * Check or set if the exception was emitted in an error event. - * - * This value is used in the RequestEvents::emitBefore() method to check - * to see if an exception has already been emitted in an error event. - * - * @param bool|null Set to true to set the exception as having emitted an - * error. Leave null to retrieve the current setting. - * - * @return null|bool - * @throws \InvalidArgumentException if you attempt to set the value to false - */ - public function emittedError($value = null) - { - if ($value === null) { - return $this->emittedErrorEvent; - } elseif ($value === true) { - return $this->emittedErrorEvent = true; - } else { - throw new \InvalidArgumentException('You cannot set the emitted ' - . 'error value to false.'); - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/ServerException.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/ServerException.php deleted file mode 100644 index d67ed27e3..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Exception/ServerException.php +++ /dev/null @@ -1,8 +0,0 @@ -data); - } - - public function offsetGet($offset) - { - return isset($this->data[$offset]) ? $this->data[$offset] : null; - } - - public function offsetSet($offset, $value) - { - $this->data[$offset] = $value; - } - - public function offsetExists($offset) - { - return isset($this->data[$offset]); - } - - public function offsetUnset($offset) - { - unset($this->data[$offset]); - } - - public function toArray() - { - return $this->data; - } - - public function count() - { - return count($this->data); - } - - /** - * Get a value from the collection using a path syntax to retrieve nested - * data. - * - * @param string $path Path to traverse and retrieve a value from - * - * @return mixed|null - */ - public function getPath($path) - { - return \GuzzleHttp\get_path($this->data, $path); - } - - /** - * Set a value into a nested array key. Keys will be created as needed to - * set the value. - * - * @param string $path Path to set - * @param mixed $value Value to set at the key - * - * @throws \RuntimeException when trying to setPath using a nested path - * that travels through a scalar value - */ - public function setPath($path, $value) - { - \GuzzleHttp\set_path($this->data, $path, $value); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/AbstractMessage.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/AbstractMessage.php deleted file mode 100644 index 6037a70e6..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/AbstractMessage.php +++ /dev/null @@ -1,237 +0,0 @@ -getStartLine(); - foreach ($this->getHeaders() as $name => $values) { - $result .= "\r\n{$name}: " . implode(', ', $values); - } - - return $result . "\r\n\r\n" . $this->body; - } - - public function getProtocolVersion() - { - return $this->protocolVersion; - } - - public function getBody() - { - return $this->body; - } - - public function setBody(StreamInterface $body = null) - { - if ($body === null) { - // Setting a null body will remove the body of the request - $this->removeHeader('Content-Length') - ->removeHeader('Transfer-Encoding'); - } - - $this->body = $body; - - return $this; - } - - public function addHeader($header, $value) - { - static $valid = ['string' => true, 'integer' => true, - 'double' => true, 'array' => true]; - - $type = gettype($value); - if (!isset($valid[$type])) { - throw new \InvalidArgumentException('Invalid header value'); - } - - if ($type == 'array') { - $current = array_merge($this->getHeader($header, true), $value); - } else { - $current = $this->getHeader($header, true); - $current[] = $value; - } - - return $this->setHeader($header, $current); - } - - public function addHeaders(array $headers) - { - foreach ($headers as $name => $header) { - $this->addHeader($name, $header); - } - } - - public function getHeader($header, $asArray = false) - { - $name = strtolower($header); - - if (!isset($this->headers[$name])) { - return $asArray ? [] : ''; - } - - return $asArray - ? $this->headers[$name] - : implode(', ', $this->headers[$name]); - } - - public function getHeaders() - { - $headers = []; - foreach ($this->headers as $name => $values) { - $headers[$this->headerNames[$name]] = $values; - } - - return $headers; - } - - public function setHeader($header, $value) - { - $header = trim($header); - $name = strtolower($header); - $this->headerNames[$name] = $header; - - switch (gettype($value)) { - case 'string': - $this->headers[$name] = [trim($value)]; - break; - case 'integer': - case 'double': - $this->headers[$name] = [(string) $value]; - break; - case 'array': - foreach ($value as &$v) { - $v = trim($v); - } - $this->headers[$name] = $value; - break; - default: - throw new \InvalidArgumentException('Invalid header value ' - . 'provided: ' . var_export($value, true)); - } - - return $this; - } - - public function setHeaders(array $headers) - { - $this->headers = $this->headerNames = []; - foreach ($headers as $key => $value) { - $this->setHeader($key, $value); - } - - return $this; - } - - public function hasHeader($header) - { - return isset($this->headers[strtolower($header)]); - } - - public function removeHeader($header) - { - $name = strtolower($header); - unset($this->headers[$name], $this->headerNames[$name]); - - return $this; - } - - /** - * Parse an array of header values containing ";" separated data into an - * array of associative arrays representing the header key value pair - * data of the header. When a parameter does not contain a value, but just - * contains a key, this function will inject a key with a '' string value. - * - * @param MessageInterface $message That contains the header - * @param string $header Header to retrieve from the message - * - * @return array Returns the parsed header values. - */ - public static function parseHeader(MessageInterface $message, $header) - { - static $trimmed = "\"' \n\t\r"; - $params = $matches = []; - - foreach (self::normalizeHeader($message, $header) as $val) { - $part = []; - foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { - if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { - $m = $matches[0]; - if (isset($m[1])) { - $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); - } else { - $part[] = trim($m[0], $trimmed); - } - } - } - if ($part) { - $params[] = $part; - } - } - - return $params; - } - - /** - * Converts an array of header values that may contain comma separated - * headers into an array of headers with no comma separated values. - * - * @param MessageInterface $message That contains the header - * @param string $header Header to retrieve from the message - * - * @return array Returns the normalized header field values. - */ - public static function normalizeHeader(MessageInterface $message, $header) - { - $h = $message->getHeader($header, true); - for ($i = 0, $total = count($h); $i < $total; $i++) { - if (strpos($h[$i], ',') === false) { - continue; - } - foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $h[$i]) as $v) { - $h[] = trim($v); - } - unset($h[$i]); - } - - return $h; - } - - /** - * Returns the start line of a message. - * - * @return string - */ - abstract protected function getStartLine(); - - /** - * Accepts and modifies the options provided to the message in the - * constructor. - * - * Can be overridden in subclasses as necessary. - * - * @param array $options Options array passed by reference. - */ - protected function handleOptions(array &$options) - { - if (isset($options['protocol_version'])) { - $this->protocolVersion = $options['protocol_version']; - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageFactory.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageFactory.php deleted file mode 100644 index da67c3857..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageFactory.php +++ /dev/null @@ -1,345 +0,0 @@ -errorPlugin = new HttpError(); - $this->redirectPlugin = new Redirect(); - } - - public function createResponse( - $statusCode, - array $headers = [], - $body = null, - array $options = [] - ) { - if (null !== $body) { - $body = Stream\create($body); - } - - return new Response($statusCode, $headers, $body, $options); - } - - public function createRequest($method, $url, array $options = []) - { - // Handle the request protocol version option that needs to be - // specified in the request constructor. - if (isset($options['version'])) { - $options['config']['protocol_version'] = $options['version']; - unset($options['version']); - } - - $request = new Request($method, $url, [], null, - isset($options['config']) ? $options['config'] : []); - - unset($options['config']); - - // Use a POST body by default - if ($method == 'POST' && - !isset($options['body']) && - !isset($options['json']) - ) { - $options['body'] = []; - } - - if ($options) { - $this->applyOptions($request, $options); - } - - return $request; - } - - /** - * Create a request or response object from an HTTP message string - * - * @param string $message Message to parse - * - * @return RequestInterface|ResponseInterface - * @throws \InvalidArgumentException if unable to parse a message - */ - public function fromMessage($message) - { - static $parser; - if (!$parser) { - $parser = new MessageParser(); - } - - // Parse a response - if (strtoupper(substr($message, 0, 4)) == 'HTTP') { - $data = $parser->parseResponse($message); - return $this->createResponse( - $data['code'], - $data['headers'], - $data['body'] === '' ? null : $data['body'], - $data - ); - } - - // Parse a request - if (!($data = ($parser->parseRequest($message)))) { - throw new \InvalidArgumentException('Unable to parse request'); - } - - return $this->createRequest( - $data['method'], - Url::buildUrl($data['request_url']), - [ - 'headers' => $data['headers'], - 'body' => $data['body'] === '' ? null : $data['body'], - 'config' => [ - 'protocol_version' => $data['protocol_version'] - ] - ] - ); - } - - /** - * Apply POST fields and files to a request to attempt to give an accurate - * representation. - * - * @param RequestInterface $request Request to update - * @param array $body Body to apply - */ - protected function addPostData(RequestInterface $request, array $body) - { - static $fields = ['string' => true, 'array' => true, 'NULL' => true, - 'boolean' => true, 'double' => true, 'integer' => true]; - - $post = new PostBody(); - foreach ($body as $key => $value) { - if (isset($fields[gettype($value)])) { - $post->setField($key, $value); - } elseif ($value instanceof PostFileInterface) { - $post->addFile($value); - } else { - $post->addFile(new PostFile($key, $value)); - } - } - - $request->setBody($post); - $post->applyRequestHeaders($request); - } - - protected function applyOptions( - RequestInterface $request, - array $options = [] - ) { - // Values specified in the config map are passed to request options - static $configMap = ['connect_timeout' => 1, 'timeout' => 1, - 'verify' => 1, 'ssl_key' => 1, 'cert' => 1, 'proxy' => 1, - 'debug' => 1, 'save_to' => 1, 'stream' => 1, 'expect' => 1]; - - // Take the class of the instance, not the parent - $selfClass = get_class($this); - - // Check if we already took it's class methods and had them saved - if (!isset(self::$classMethods[$selfClass])) { - self::$classMethods[$selfClass] = array_flip(get_class_methods($this)); - } - - // Take class methods of this particular instance - $methods = self::$classMethods[$selfClass]; - - // Iterate over each key value pair and attempt to apply a config using - // double dispatch. - $config = $request->getConfig(); - foreach ($options as $key => $value) { - $method = "add_{$key}"; - if (isset($methods[$method])) { - $this->{$method}($request, $value); - } elseif (isset($configMap[$key])) { - $config[$key] = $value; - } else { - throw new \InvalidArgumentException("No method is configured " - . "to handle the {$key} config key"); - } - } - } - - private function add_body(RequestInterface $request, $value) - { - if ($value !== null) { - if (is_array($value)) { - $this->addPostData($request, $value); - } else { - $request->setBody(Stream\create($value)); - } - } - } - - private function add_allow_redirects(RequestInterface $request, $value) - { - static $defaultRedirect = [ - 'max' => 5, - 'strict' => false, - 'referer' => false - ]; - - if ($value === false) { - return; - } - - if ($value === true) { - $value = $defaultRedirect; - } elseif (!isset($value['max'])) { - throw new \InvalidArgumentException('allow_redirects must be ' - . 'true, false, or an array that contains the \'max\' key'); - } else { - // Merge the default settings with the provided settings - $value += $defaultRedirect; - } - - $request->getConfig()['redirect'] = $value; - $request->getEmitter()->attach($this->redirectPlugin); - } - - private function add_exceptions(RequestInterface $request, $value) - { - if ($value === true) { - $request->getEmitter()->attach($this->errorPlugin); - } - } - - private function add_auth(RequestInterface $request, $value) - { - if (!$value) { - return; - } elseif (is_array($value)) { - $authType = isset($value[2]) ? strtolower($value[2]) : 'basic'; - } else { - $authType = strtolower($value); - } - - $request->getConfig()->set('auth', $value); - - if ($authType == 'basic') { - $request->setHeader( - 'Authorization', - 'Basic ' . base64_encode("$value[0]:$value[1]") - ); - } elseif ($authType == 'digest') { - // Currently only implemented by the cURL adapter. - // @todo: Need an event listener solution that does not rely on cURL - $config = $request->getConfig(); - $config->setPath('curl/' . CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); - $config->setPath('curl/' . CURLOPT_USERPWD, "$value[0]:$value[1]"); - } - } - - private function add_query(RequestInterface $request, $value) - { - if ($value instanceof Query) { - $original = $request->getQuery(); - // Do not overwrite existing query string variables by overwriting - // the object with the query string data passed in the URL - $request->setQuery($value->overwriteWith($original->toArray())); - } elseif (is_array($value)) { - // Do not overwrite existing query string variables - $query = $request->getQuery(); - foreach ($value as $k => $v) { - if (!isset($query[$k])) { - $query[$k] = $v; - } - } - } else { - throw new \InvalidArgumentException('query value must be an array ' - . 'or Query object'); - } - } - - private function add_headers(RequestInterface $request, $value) - { - if (!is_array($value)) { - throw new \InvalidArgumentException('header value must be an array'); - } - - // Do not overwrite existing headers - foreach ($value as $k => $v) { - if (!$request->hasHeader($k)) { - $request->setHeader($k, $v); - } - } - } - - private function add_cookies(RequestInterface $request, $value) - { - if ($value === true) { - static $cookie = null; - if (!$cookie) { - $cookie = new Cookie(); - } - $request->getEmitter()->attach($cookie); - } elseif (is_array($value)) { - $request->getEmitter()->attach( - new Cookie(CookieJar::fromArray($value, $request->getHost())) - ); - } elseif ($value instanceof CookieJarInterface) { - $request->getEmitter()->attach(new Cookie($value)); - } elseif ($value !== false) { - throw new \InvalidArgumentException('cookies must be an array, ' - . 'true, or a CookieJarInterface object'); - } - } - - private function add_events(RequestInterface $request, $value) - { - if (!is_array($value)) { - throw new \InvalidArgumentException('events value must be an array'); - } - - $this->attachListeners($request, $this->prepareListeners($value, - ['before', 'complete', 'error', 'headers'] - )); - } - - private function add_subscribers(RequestInterface $request, $value) - { - if (!is_array($value)) { - throw new \InvalidArgumentException('subscribers must be an array'); - } - - $emitter = $request->getEmitter(); - foreach ($value as $subscribers) { - $emitter->attach($subscribers); - } - } - - private function add_json(RequestInterface $request, $value) - { - if (!$request->hasHeader('Content-Type')) { - $request->setHeader('Content-Type', 'application/json'); - } - - $request->setBody(Stream\create(json_encode($value))); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageFactoryInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageFactoryInterface.php deleted file mode 100644 index daab04273..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageFactoryInterface.php +++ /dev/null @@ -1,71 +0,0 @@ -getHeaders() as $name => $values) { - * echo $name . ": " . implode(", ", $values); - * } - * - * @return array Returns an associative array of the message's headers. - */ - public function getHeaders(); - - /** - * Retrieve a header by the given case-insensitive name. - * - * By default, this method returns all of the header values of the given - * case-insensitive header name as a string concatenated together using - * a comma. Because some header should not be concatenated together using a - * comma, this method provides a Boolean argument that can be used to - * retrieve the associated header values as an array of strings. - * - * @param string $header Case-insensitive header name. - * @param bool $asArray Set to true to retrieve the header value as an - * array of strings. - * - * @return array|string - */ - public function getHeader($header, $asArray = false); - - /** - * Checks if a header exists by the given case-insensitive name. - * - * @param string $header Case-insensitive header name. - * - * @return bool Returns true if any header names match the given header - * name using a case-insensitive string comparison. Returns false if - * no matching header name is found in the message. - */ - public function hasHeader($header); - - /** - * Remove a specific header by case-insensitive name. - * - * @param string $header Case-insensitive header name. - * - * @return self - */ - public function removeHeader($header); - - /** - * Appends a header value to any existing values associated with the - * given header name. - * - * @param string $header Header name to add - * @param string $value Value of the header - * - * @return self - */ - public function addHeader($header, $value); - - /** - * Merges in an associative array of headers. - * - * Each array key MUST be a string representing the case-insensitive name - * of a header. Each value MUST be either a string or an array of strings. - * For each value, the value is appended to any existing header of the same - * name, or, if a header does not already exist by the given name, then the - * header is added. - * - * @param array $headers Associative array of headers to add to the message - * - * @return self - */ - public function addHeaders(array $headers); - - /** - * Sets a header, replacing any existing values of any headers with the - * same case-insensitive name. - * - * The header values MUST be a string or an array of strings. - * - * @param string $header Header name - * @param string|array $value Header value(s) - * - * @return self Returns the message. - */ - public function setHeader($header, $value); - - /** - * Sets headers, replacing any headers that have already been set on the - * message. - * - * The array keys MUST be a string. The array values must be either a - * string or an array of strings. - * - * @param array $headers Headers to set. - * - * @return self Returns the message. - */ - public function setHeaders(array $headers); -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageParser.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageParser.php deleted file mode 100644 index 777ce26e9..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/MessageParser.php +++ /dev/null @@ -1,172 +0,0 @@ -parseMessage($message))) { - return false; - } - - // Parse the protocol and protocol version - if (isset($parts['start_line'][2])) { - $startParts = explode('/', $parts['start_line'][2]); - $protocol = strtoupper($startParts[0]); - $version = isset($startParts[1]) ? $startParts[1] : '1.1'; - } else { - $protocol = 'HTTP'; - $version = '1.1'; - } - - $parsed = [ - 'method' => strtoupper($parts['start_line'][0]), - 'protocol' => $protocol, - 'protocol_version' => $version, - 'headers' => $parts['headers'], - 'body' => $parts['body'] - ]; - - $parsed['request_url'] = $this->getUrlPartsFromMessage( - (isset($parts['start_line'][1]) ? $parts['start_line'][1] : ''), $parsed); - - return $parsed; - } - - /** - * Parse an HTTP response message into an associative array of parts. - * - * @param string $message HTTP response to parse - * - * @return array|bool Returns false if the message is invalid - */ - public function parseResponse($message) - { - if (!($parts = $this->parseMessage($message))) { - return false; - } - - list($protocol, $version) = explode('/', trim($parts['start_line'][0])); - - return [ - 'protocol' => $protocol, - 'protocol_version' => $version, - 'code' => $parts['start_line'][1], - 'reason_phrase' => isset($parts['start_line'][2]) ? $parts['start_line'][2] : '', - 'headers' => $parts['headers'], - 'body' => $parts['body'] - ]; - } - - /** - * Parse a message into parts - * - * @param string $message Message to parse - * - * @return array|bool - */ - private function parseMessage($message) - { - if (!$message) { - return false; - } - - $startLine = null; - $headers = []; - $body = ''; - - // Iterate over each line in the message, accounting for line endings - $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE); - for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) { - - $line = $lines[$i]; - - // If two line breaks were encountered, then this is the end of body - if (empty($line)) { - if ($i < $totalLines - 1) { - $body = implode('', array_slice($lines, $i + 2)); - } - break; - } - - // Parse message headers - if (!$startLine) { - $startLine = explode(' ', $line, 3); - } elseif (strpos($line, ':')) { - $parts = explode(':', $line, 2); - $key = trim($parts[0]); - $value = isset($parts[1]) ? trim($parts[1]) : ''; - if (!isset($headers[$key])) { - $headers[$key] = $value; - } elseif (!is_array($headers[$key])) { - $headers[$key] = [$headers[$key], $value]; - } else { - $headers[$key][] = $value; - } - } - } - - return [ - 'start_line' => $startLine, - 'headers' => $headers, - 'body' => $body - ]; - } - - /** - * Create URL parts from HTTP message parts - * - * @param string $requestUrl Associated URL - * @param array $parts HTTP message parts - * - * @return array - */ - private function getUrlPartsFromMessage($requestUrl, array $parts) - { - // Parse the URL information from the message - $urlParts = ['path' => $requestUrl, 'scheme' => 'http']; - - // Check for the Host header - if (isset($parts['headers']['Host'])) { - $urlParts['host'] = $parts['headers']['Host']; - } elseif (isset($parts['headers']['host'])) { - $urlParts['host'] = $parts['headers']['host']; - } else { - $urlParts['host'] = null; - } - - if (false === strpos($urlParts['host'], ':')) { - $urlParts['port'] = ''; - } else { - $hostParts = explode(':', $urlParts['host']); - $urlParts['host'] = trim($hostParts[0]); - $urlParts['port'] = (int) trim($hostParts[1]); - if ($urlParts['port'] == 443) { - $urlParts['scheme'] = 'https'; - } - } - - // Check if a query is present - $path = $urlParts['path']; - $qpos = strpos($path, '?'); - if ($qpos) { - $urlParts['query'] = substr($path, $qpos + 1); - $urlParts['path'] = substr($path, 0, $qpos); - } else { - $urlParts['query'] = ''; - } - - return $urlParts; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/Request.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/Request.php deleted file mode 100644 index 5c0e0aefb..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/Request.php +++ /dev/null @@ -1,216 +0,0 @@ -setUrl($url); - $this->method = strtoupper($method); - $this->handleOptions($options); - $this->transferOptions = new Collection($options); - $this->addPrepareEvent(); - - if ($body !== null) { - $this->setBody($body); - } - - if ($headers) { - foreach ($headers as $key => $value) { - $this->setHeader($key, $value); - } - } - } - - public function __clone() - { - if ($this->emitter) { - $this->emitter = clone $this->emitter; - } - $this->transferOptions = clone $this->transferOptions; - $this->url = clone $this->url; - } - - public function setUrl($url) - { - $this->url = $url instanceof Url ? $url : Url::fromString($url); - $this->updateHostHeaderFromUrl(); - - return $this; - } - - public function getUrl() - { - return (string) $this->url; - } - - public function setQuery($query) - { - $this->url->setQuery($query); - - return $this; - } - - public function getQuery() - { - return $this->url->getQuery(); - } - - public function setMethod($method) - { - $this->method = strtoupper($method); - - return $this; - } - - public function getMethod() - { - return $this->method; - } - - public function getScheme() - { - return $this->url->getScheme(); - } - - public function setScheme($scheme) - { - $this->url->setScheme($scheme); - - return $this; - } - - public function getPort() - { - return $this->url->getPort(); - } - - public function setPort($port) - { - $this->url->setPort($port); - $this->updateHostHeaderFromUrl(); - - return $this; - } - - public function getHost() - { - return $this->url->getHost(); - } - - public function setHost($host) - { - $this->url->setHost($host); - $this->updateHostHeaderFromUrl(); - - return $this; - } - - public function getPath() - { - return '/' . ltrim($this->url->getPath(), '/'); - } - - public function setPath($path) - { - $this->url->setPath($path); - - return $this; - } - - public function getResource() - { - $resource = $this->getPath(); - if ($query = (string) $this->url->getQuery()) { - $resource .= '?' . $query; - } - - return $resource; - } - - public function getConfig() - { - return $this->transferOptions; - } - - protected function handleOptions(array &$options) - { - parent::handleOptions($options); - // Use a custom emitter if one is specified, and remove it from - // options that are exposed through getConfig() - if (isset($options['emitter'])) { - $this->emitter = $options['emitter']; - unset($options['emitter']); - } - } - - protected function getStartLine() - { - return trim($this->method . ' ' . $this->getResource()) - . ' HTTP/' . $this->getProtocolVersion(); - } - - /** - * Adds a subscriber that ensures a request's body is prepared before - * sending. - */ - private function addPrepareEvent() - { - static $subscriber; - if (!$subscriber) { - $subscriber = new Prepare(); - } - - $this->getEmitter()->attach($subscriber); - } - - private function updateHostHeaderFromUrl() - { - $port = $this->url->getPort(); - $scheme = $this->url->getScheme(); - if ($host = $this->url->getHost()) { - if (($port == 80 && $scheme == 'http') || - ($port == 443 && $scheme == 'https') - ) { - $this->setHeader('Host', $host); - } else { - $this->setHeader('Host', "{$host}:{$port}"); - } - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/RequestInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/RequestInterface.php deleted file mode 100644 index 8cd5de7be..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/RequestInterface.php +++ /dev/null @@ -1,150 +0,0 @@ - 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', - 208 => 'Already Reported', - 226 => 'IM Used', - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - 308 => 'Permanent Redirect', - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Long', - 415 => 'Unsupported Media Type', - 416 => 'Requested Range Not Satisfiable', - 417 => 'Expectation Failed', - 422 => 'Unprocessable Entity', - 423 => 'Locked', - 424 => 'Failed Dependency', - 425 => 'Reserved for WebDAV advanced collections expired proposal', - 426 => 'Upgrade required', - 428 => 'Precondition Required', - 429 => 'Too Many Requests', - 431 => 'Request Header Fields Too Large', - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 506 => 'Variant Also Negotiates (Experimental)', - 507 => 'Insufficient Storage', - 508 => 'Loop Detected', - 510 => 'Not Extended', - 511 => 'Network Authentication Required', - ); - - /** @var string The reason phrase of the response (human readable code) */ - private $reasonPhrase; - - /** @var string The status code of the response */ - private $statusCode; - - /** @var string The effective URL that returned this response */ - private $effectiveUrl; - - /** - * @param string $statusCode The response status code (e.g. 200) - * @param array $headers The response headers - * @param StreamInterface $body The body of the response - * @param array $options Response message options - * - reason_phrase: Set a custom reason phrase - * - protocol_version: Set a custom protocol version - */ - public function __construct( - $statusCode, - array $headers = [], - StreamInterface $body = null, - array $options = [] - ) { - $this->statusCode = (string) $statusCode; - $this->handleOptions($options); - - // Assume a reason phrase if one was not applied as an option - if (!$this->reasonPhrase && - isset(self::$statusTexts[$this->statusCode]) - ) { - $this->reasonPhrase = self::$statusTexts[$this->statusCode]; - } - - if ($headers) { - $this->setHeaders($headers); - } - - if ($body) { - $this->setBody($body); - } - } - - public function getStatusCode() - { - return $this->statusCode; - } - - public function getReasonPhrase() - { - return $this->reasonPhrase; - } - - public function json(array $config = []) - { - try { - return \GuzzleHttp\json_decode( - (string) $this->getBody(), - isset($config['object']) ? !$config['object'] : true, - 512, - isset($config['big_int_strings']) ? JSON_BIGINT_AS_STRING : 0 - ); - } catch (\InvalidArgumentException $e) { - throw new ParseException( - $e->getMessage(), - $this - ); - } - } - - public function xml(array $config = []) - { - $disableEntities = libxml_disable_entity_loader(true); - $internalErrors = libxml_use_internal_errors(true); - - try { - // Allow XML to be retrieved even if there is no response body - $xml = new \SimpleXMLElement( - (string) $this->getBody() ?: '', - LIBXML_NONET, - isset($config['ns']) ? $config['ns'] : '', - isset($config['ns_is_prefix']) ? $config['ns_is_prefix'] : false - ); - libxml_disable_entity_loader($disableEntities); - libxml_use_internal_errors($internalErrors); - } catch (\Exception $e) { - libxml_disable_entity_loader($disableEntities); - libxml_use_internal_errors($internalErrors); - throw new ParseException( - 'Unable to parse response body into XML: ' . $e->getMessage(), - $this - ); - } - - return $xml; - } - - public function getEffectiveUrl() - { - return $this->effectiveUrl; - } - - public function setEffectiveUrl($url) - { - $this->effectiveUrl = $url; - - return $this; - } - - /** - * Accepts and modifies the options provided to the response in the - * constructor. - * - * @param array $options Options array passed by reference. - */ - protected function handleOptions(array &$options = []) - { - parent::handleOptions($options); - if (isset($options['reason_phrase'])) { - $this->reasonPhrase = $options['reason_phrase']; - } - } - - protected function getStartLine() - { - return 'HTTP/' . $this->getProtocolVersion() - . " {$this->statusCode} {$this->reasonPhrase}"; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/ResponseInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/ResponseInterface.php deleted file mode 100644 index db8252c6b..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Message/ResponseInterface.php +++ /dev/null @@ -1,86 +0,0 @@ - 'text/vnd.in3d.3dml', - '3g2' => 'video/3gpp2', - '3gp' => 'video/3gpp', - '7z' => 'application/x-7z-compressed', - 'aab' => 'application/x-authorware-bin', - 'aac' => 'audio/x-aac', - 'aam' => 'application/x-authorware-map', - 'aas' => 'application/x-authorware-seg', - 'abw' => 'application/x-abiword', - 'ac' => 'application/pkix-attr-cert', - 'acc' => 'application/vnd.americandynamics.acc', - 'ace' => 'application/x-ace-compressed', - 'acu' => 'application/vnd.acucobol', - 'acutc' => 'application/vnd.acucorp', - 'adp' => 'audio/adpcm', - 'aep' => 'application/vnd.audiograph', - 'afm' => 'application/x-font-type1', - 'afp' => 'application/vnd.ibm.modcap', - 'ahead' => 'application/vnd.ahead.space', - 'ai' => 'application/postscript', - 'aif' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'air' => 'application/vnd.adobe.air-application-installer-package+zip', - 'ait' => 'application/vnd.dvb.ait', - 'ami' => 'application/vnd.amiga.ami', - 'apk' => 'application/vnd.android.package-archive', - 'application' => 'application/x-ms-application', - 'apr' => 'application/vnd.lotus-approach', - 'asa' => 'text/plain', - 'asax' => 'application/octet-stream', - 'asc' => 'application/pgp-signature', - 'ascx' => 'text/plain', - 'asf' => 'video/x-ms-asf', - 'ashx' => 'text/plain', - 'asm' => 'text/x-asm', - 'asmx' => 'text/plain', - 'aso' => 'application/vnd.accpac.simply.aso', - 'asp' => 'text/plain', - 'aspx' => 'text/plain', - 'asx' => 'video/x-ms-asf', - 'atc' => 'application/vnd.acucorp', - 'atom' => 'application/atom+xml', - 'atomcat' => 'application/atomcat+xml', - 'atomsvc' => 'application/atomsvc+xml', - 'atx' => 'application/vnd.antix.game-component', - 'au' => 'audio/basic', - 'avi' => 'video/x-msvideo', - 'aw' => 'application/applixware', - 'axd' => 'text/plain', - 'azf' => 'application/vnd.airzip.filesecure.azf', - 'azs' => 'application/vnd.airzip.filesecure.azs', - 'azw' => 'application/vnd.amazon.ebook', - 'bat' => 'application/x-msdownload', - 'bcpio' => 'application/x-bcpio', - 'bdf' => 'application/x-font-bdf', - 'bdm' => 'application/vnd.syncml.dm+wbxml', - 'bed' => 'application/vnd.realvnc.bed', - 'bh2' => 'application/vnd.fujitsu.oasysprs', - 'bin' => 'application/octet-stream', - 'bmi' => 'application/vnd.bmi', - 'bmp' => 'image/bmp', - 'book' => 'application/vnd.framemaker', - 'box' => 'application/vnd.previewsystems.box', - 'boz' => 'application/x-bzip2', - 'bpk' => 'application/octet-stream', - 'btif' => 'image/prs.btif', - 'bz' => 'application/x-bzip', - 'bz2' => 'application/x-bzip2', - 'c' => 'text/x-c', - 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', - 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', - 'c4d' => 'application/vnd.clonk.c4group', - 'c4f' => 'application/vnd.clonk.c4group', - 'c4g' => 'application/vnd.clonk.c4group', - 'c4p' => 'application/vnd.clonk.c4group', - 'c4u' => 'application/vnd.clonk.c4group', - 'cab' => 'application/vnd.ms-cab-compressed', - 'car' => 'application/vnd.curl.car', - 'cat' => 'application/vnd.ms-pki.seccat', - 'cc' => 'text/x-c', - 'cct' => 'application/x-director', - 'ccxml' => 'application/ccxml+xml', - 'cdbcmsg' => 'application/vnd.contact.cmsg', - 'cdf' => 'application/x-netcdf', - 'cdkey' => 'application/vnd.mediastation.cdkey', - 'cdmia' => 'application/cdmi-capability', - 'cdmic' => 'application/cdmi-container', - 'cdmid' => 'application/cdmi-domain', - 'cdmio' => 'application/cdmi-object', - 'cdmiq' => 'application/cdmi-queue', - 'cdx' => 'chemical/x-cdx', - 'cdxml' => 'application/vnd.chemdraw+xml', - 'cdy' => 'application/vnd.cinderella', - 'cer' => 'application/pkix-cert', - 'cfc' => 'application/x-coldfusion', - 'cfm' => 'application/x-coldfusion', - 'cgm' => 'image/cgm', - 'chat' => 'application/x-chat', - 'chm' => 'application/vnd.ms-htmlhelp', - 'chrt' => 'application/vnd.kde.kchart', - 'cif' => 'chemical/x-cif', - 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', - 'cil' => 'application/vnd.ms-artgalry', - 'cla' => 'application/vnd.claymore', - 'class' => 'application/java-vm', - 'clkk' => 'application/vnd.crick.clicker.keyboard', - 'clkp' => 'application/vnd.crick.clicker.palette', - 'clkt' => 'application/vnd.crick.clicker.template', - 'clkw' => 'application/vnd.crick.clicker.wordbank', - 'clkx' => 'application/vnd.crick.clicker', - 'clp' => 'application/x-msclip', - 'cmc' => 'application/vnd.cosmocaller', - 'cmdf' => 'chemical/x-cmdf', - 'cml' => 'chemical/x-cml', - 'cmp' => 'application/vnd.yellowriver-custom-menu', - 'cmx' => 'image/x-cmx', - 'cod' => 'application/vnd.rim.cod', - 'com' => 'application/x-msdownload', - 'conf' => 'text/plain', - 'cpio' => 'application/x-cpio', - 'cpp' => 'text/x-c', - 'cpt' => 'application/mac-compactpro', - 'crd' => 'application/x-mscardfile', - 'crl' => 'application/pkix-crl', - 'crt' => 'application/x-x509-ca-cert', - 'cryptonote' => 'application/vnd.rig.cryptonote', - 'cs' => 'text/plain', - 'csh' => 'application/x-csh', - 'csml' => 'chemical/x-csml', - 'csp' => 'application/vnd.commonspace', - 'css' => 'text/css', - 'cst' => 'application/x-director', - 'csv' => 'text/csv', - 'cu' => 'application/cu-seeme', - 'curl' => 'text/vnd.curl', - 'cww' => 'application/prs.cww', - 'cxt' => 'application/x-director', - 'cxx' => 'text/x-c', - 'dae' => 'model/vnd.collada+xml', - 'daf' => 'application/vnd.mobius.daf', - 'dataless' => 'application/vnd.fdsn.seed', - 'davmount' => 'application/davmount+xml', - 'dcr' => 'application/x-director', - 'dcurl' => 'text/vnd.curl.dcurl', - 'dd2' => 'application/vnd.oma.dd2+xml', - 'ddd' => 'application/vnd.fujixerox.ddd', - 'deb' => 'application/x-debian-package', - 'def' => 'text/plain', - 'deploy' => 'application/octet-stream', - 'der' => 'application/x-x509-ca-cert', - 'dfac' => 'application/vnd.dreamfactory', - 'dic' => 'text/x-c', - 'dir' => 'application/x-director', - 'dis' => 'application/vnd.mobius.dis', - 'dist' => 'application/octet-stream', - 'distz' => 'application/octet-stream', - 'djv' => 'image/vnd.djvu', - 'djvu' => 'image/vnd.djvu', - 'dll' => 'application/x-msdownload', - 'dmg' => 'application/octet-stream', - 'dms' => 'application/octet-stream', - 'dna' => 'application/vnd.dna', - 'doc' => 'application/msword', - 'docm' => 'application/vnd.ms-word.document.macroenabled.12', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'dot' => 'application/msword', - 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', - 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', - 'dp' => 'application/vnd.osgi.dp', - 'dpg' => 'application/vnd.dpgraph', - 'dra' => 'audio/vnd.dra', - 'dsc' => 'text/prs.lines.tag', - 'dssc' => 'application/dssc+der', - 'dtb' => 'application/x-dtbook+xml', - 'dtd' => 'application/xml-dtd', - 'dts' => 'audio/vnd.dts', - 'dtshd' => 'audio/vnd.dts.hd', - 'dump' => 'application/octet-stream', - 'dvi' => 'application/x-dvi', - 'dwf' => 'model/vnd.dwf', - 'dwg' => 'image/vnd.dwg', - 'dxf' => 'image/vnd.dxf', - 'dxp' => 'application/vnd.spotfire.dxp', - 'dxr' => 'application/x-director', - 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', - 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', - 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', - 'ecma' => 'application/ecmascript', - 'edm' => 'application/vnd.novadigm.edm', - 'edx' => 'application/vnd.novadigm.edx', - 'efif' => 'application/vnd.picsel', - 'ei6' => 'application/vnd.pg.osasli', - 'elc' => 'application/octet-stream', - 'eml' => 'message/rfc822', - 'emma' => 'application/emma+xml', - 'eol' => 'audio/vnd.digital-winds', - 'eot' => 'application/vnd.ms-fontobject', - 'eps' => 'application/postscript', - 'epub' => 'application/epub+zip', - 'es3' => 'application/vnd.eszigno3+xml', - 'esf' => 'application/vnd.epson.esf', - 'et3' => 'application/vnd.eszigno3+xml', - 'etx' => 'text/x-setext', - 'exe' => 'application/x-msdownload', - 'exi' => 'application/exi', - 'ext' => 'application/vnd.novadigm.ext', - 'ez' => 'application/andrew-inset', - 'ez2' => 'application/vnd.ezpix-album', - 'ez3' => 'application/vnd.ezpix-package', - 'f' => 'text/x-fortran', - 'f4v' => 'video/x-f4v', - 'f77' => 'text/x-fortran', - 'f90' => 'text/x-fortran', - 'fbs' => 'image/vnd.fastbidsheet', - 'fcs' => 'application/vnd.isac.fcs', - 'fdf' => 'application/vnd.fdf', - 'fe_launch' => 'application/vnd.denovo.fcselayout-link', - 'fg5' => 'application/vnd.fujitsu.oasysgp', - 'fgd' => 'application/x-director', - 'fh' => 'image/x-freehand', - 'fh4' => 'image/x-freehand', - 'fh5' => 'image/x-freehand', - 'fh7' => 'image/x-freehand', - 'fhc' => 'image/x-freehand', - 'fig' => 'application/x-xfig', - 'fli' => 'video/x-fli', - 'flo' => 'application/vnd.micrografx.flo', - 'flv' => 'video/x-flv', - 'flw' => 'application/vnd.kde.kivio', - 'flx' => 'text/vnd.fmi.flexstor', - 'fly' => 'text/vnd.fly', - 'fm' => 'application/vnd.framemaker', - 'fnc' => 'application/vnd.frogans.fnc', - 'for' => 'text/x-fortran', - 'fpx' => 'image/vnd.fpx', - 'frame' => 'application/vnd.framemaker', - 'fsc' => 'application/vnd.fsc.weblaunch', - 'fst' => 'image/vnd.fst', - 'ftc' => 'application/vnd.fluxtime.clip', - 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', - 'fvt' => 'video/vnd.fvt', - 'fxp' => 'application/vnd.adobe.fxp', - 'fxpl' => 'application/vnd.adobe.fxp', - 'fzs' => 'application/vnd.fuzzysheet', - 'g2w' => 'application/vnd.geoplan', - 'g3' => 'image/g3fax', - 'g3w' => 'application/vnd.geospace', - 'gac' => 'application/vnd.groove-account', - 'gdl' => 'model/vnd.gdl', - 'geo' => 'application/vnd.dynageo', - 'gex' => 'application/vnd.geometry-explorer', - 'ggb' => 'application/vnd.geogebra.file', - 'ggt' => 'application/vnd.geogebra.tool', - 'ghf' => 'application/vnd.groove-help', - 'gif' => 'image/gif', - 'gim' => 'application/vnd.groove-identity-message', - 'gmx' => 'application/vnd.gmx', - 'gnumeric' => 'application/x-gnumeric', - 'gph' => 'application/vnd.flographit', - 'gqf' => 'application/vnd.grafeq', - 'gqs' => 'application/vnd.grafeq', - 'gram' => 'application/srgs', - 'gre' => 'application/vnd.geometry-explorer', - 'grv' => 'application/vnd.groove-injector', - 'grxml' => 'application/srgs+xml', - 'gsf' => 'application/x-font-ghostscript', - 'gtar' => 'application/x-gtar', - 'gtm' => 'application/vnd.groove-tool-message', - 'gtw' => 'model/vnd.gtw', - 'gv' => 'text/vnd.graphviz', - 'gxt' => 'application/vnd.geonext', - 'h' => 'text/x-c', - 'h261' => 'video/h261', - 'h263' => 'video/h263', - 'h264' => 'video/h264', - 'hal' => 'application/vnd.hal+xml', - 'hbci' => 'application/vnd.hbci', - 'hdf' => 'application/x-hdf', - 'hh' => 'text/x-c', - 'hlp' => 'application/winhlp', - 'hpgl' => 'application/vnd.hp-hpgl', - 'hpid' => 'application/vnd.hp-hpid', - 'hps' => 'application/vnd.hp-hps', - 'hqx' => 'application/mac-binhex40', - 'hta' => 'application/octet-stream', - 'htc' => 'text/html', - 'htke' => 'application/vnd.kenameaapp', - 'htm' => 'text/html', - 'html' => 'text/html', - 'hvd' => 'application/vnd.yamaha.hv-dic', - 'hvp' => 'application/vnd.yamaha.hv-voice', - 'hvs' => 'application/vnd.yamaha.hv-script', - 'i2g' => 'application/vnd.intergeo', - 'icc' => 'application/vnd.iccprofile', - 'ice' => 'x-conference/x-cooltalk', - 'icm' => 'application/vnd.iccprofile', - 'ico' => 'image/x-icon', - 'ics' => 'text/calendar', - 'ief' => 'image/ief', - 'ifb' => 'text/calendar', - 'ifm' => 'application/vnd.shana.informed.formdata', - 'iges' => 'model/iges', - 'igl' => 'application/vnd.igloader', - 'igm' => 'application/vnd.insors.igm', - 'igs' => 'model/iges', - 'igx' => 'application/vnd.micrografx.igx', - 'iif' => 'application/vnd.shana.informed.interchange', - 'imp' => 'application/vnd.accpac.simply.imp', - 'ims' => 'application/vnd.ms-ims', - 'in' => 'text/plain', - 'ini' => 'text/plain', - 'ipfix' => 'application/ipfix', - 'ipk' => 'application/vnd.shana.informed.package', - 'irm' => 'application/vnd.ibm.rights-management', - 'irp' => 'application/vnd.irepository.package+xml', - 'iso' => 'application/octet-stream', - 'itp' => 'application/vnd.shana.informed.formtemplate', - 'ivp' => 'application/vnd.immervision-ivp', - 'ivu' => 'application/vnd.immervision-ivu', - 'jad' => 'text/vnd.sun.j2me.app-descriptor', - 'jam' => 'application/vnd.jam', - 'jar' => 'application/java-archive', - 'java' => 'text/x-java-source', - 'jisp' => 'application/vnd.jisp', - 'jlt' => 'application/vnd.hp-jlyt', - 'jnlp' => 'application/x-java-jnlp-file', - 'joda' => 'application/vnd.joost.joda-archive', - 'jpe' => 'image/jpeg', - 'jpeg' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'jpgm' => 'video/jpm', - 'jpgv' => 'video/jpeg', - 'jpm' => 'video/jpm', - 'js' => 'text/javascript', - 'json' => 'application/json', - 'kar' => 'audio/midi', - 'karbon' => 'application/vnd.kde.karbon', - 'kfo' => 'application/vnd.kde.kformula', - 'kia' => 'application/vnd.kidspiration', - 'kml' => 'application/vnd.google-earth.kml+xml', - 'kmz' => 'application/vnd.google-earth.kmz', - 'kne' => 'application/vnd.kinar', - 'knp' => 'application/vnd.kinar', - 'kon' => 'application/vnd.kde.kontour', - 'kpr' => 'application/vnd.kde.kpresenter', - 'kpt' => 'application/vnd.kde.kpresenter', - 'ksp' => 'application/vnd.kde.kspread', - 'ktr' => 'application/vnd.kahootz', - 'ktx' => 'image/ktx', - 'ktz' => 'application/vnd.kahootz', - 'kwd' => 'application/vnd.kde.kword', - 'kwt' => 'application/vnd.kde.kword', - 'lasxml' => 'application/vnd.las.las+xml', - 'latex' => 'application/x-latex', - 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', - 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', - 'les' => 'application/vnd.hhe.lesson-player', - 'lha' => 'application/octet-stream', - 'link66' => 'application/vnd.route66.link66+xml', - 'list' => 'text/plain', - 'list3820' => 'application/vnd.ibm.modcap', - 'listafp' => 'application/vnd.ibm.modcap', - 'log' => 'text/plain', - 'lostxml' => 'application/lost+xml', - 'lrf' => 'application/octet-stream', - 'lrm' => 'application/vnd.ms-lrm', - 'ltf' => 'application/vnd.frogans.ltf', - 'lvp' => 'audio/vnd.lucent.voice', - 'lwp' => 'application/vnd.lotus-wordpro', - 'lzh' => 'application/octet-stream', - 'm13' => 'application/x-msmediaview', - 'm14' => 'application/x-msmediaview', - 'm1v' => 'video/mpeg', - 'm21' => 'application/mp21', - 'm2a' => 'audio/mpeg', - 'm2v' => 'video/mpeg', - 'm3a' => 'audio/mpeg', - 'm3u' => 'audio/x-mpegurl', - 'm3u8' => 'application/vnd.apple.mpegurl', - 'm4a' => 'audio/mp4', - 'm4u' => 'video/vnd.mpegurl', - 'm4v' => 'video/mp4', - 'ma' => 'application/mathematica', - 'mads' => 'application/mads+xml', - 'mag' => 'application/vnd.ecowin.chart', - 'maker' => 'application/vnd.framemaker', - 'man' => 'text/troff', - 'mathml' => 'application/mathml+xml', - 'mb' => 'application/mathematica', - 'mbk' => 'application/vnd.mobius.mbk', - 'mbox' => 'application/mbox', - 'mc1' => 'application/vnd.medcalcdata', - 'mcd' => 'application/vnd.mcd', - 'mcurl' => 'text/vnd.curl.mcurl', - 'mdb' => 'application/x-msaccess', - 'mdi' => 'image/vnd.ms-modi', - 'me' => 'text/troff', - 'mesh' => 'model/mesh', - 'meta4' => 'application/metalink4+xml', - 'mets' => 'application/mets+xml', - 'mfm' => 'application/vnd.mfmp', - 'mgp' => 'application/vnd.osgeo.mapguide.package', - 'mgz' => 'application/vnd.proteus.magazine', - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mif' => 'application/vnd.mif', - 'mime' => 'message/rfc822', - 'mj2' => 'video/mj2', - 'mjp2' => 'video/mj2', - 'mlp' => 'application/vnd.dolby.mlp', - 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', - 'mmf' => 'application/vnd.smaf', - 'mmr' => 'image/vnd.fujixerox.edmics-mmr', - 'mny' => 'application/x-msmoney', - 'mobi' => 'application/x-mobipocket-ebook', - 'mods' => 'application/mods+xml', - 'mov' => 'video/quicktime', - 'movie' => 'video/x-sgi-movie', - 'mp2' => 'audio/mpeg', - 'mp21' => 'application/mp21', - 'mp2a' => 'audio/mpeg', - 'mp3' => 'audio/mpeg', - 'mp4' => 'video/mp4', - 'mp4a' => 'audio/mp4', - 'mp4s' => 'application/mp4', - 'mp4v' => 'video/mp4', - 'mpc' => 'application/vnd.mophun.certificate', - 'mpe' => 'video/mpeg', - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpg4' => 'video/mp4', - 'mpga' => 'audio/mpeg', - 'mpkg' => 'application/vnd.apple.installer+xml', - 'mpm' => 'application/vnd.blueice.multipass', - 'mpn' => 'application/vnd.mophun.application', - 'mpp' => 'application/vnd.ms-project', - 'mpt' => 'application/vnd.ms-project', - 'mpy' => 'application/vnd.ibm.minipay', - 'mqy' => 'application/vnd.mobius.mqy', - 'mrc' => 'application/marc', - 'mrcx' => 'application/marcxml+xml', - 'ms' => 'text/troff', - 'mscml' => 'application/mediaservercontrol+xml', - 'mseed' => 'application/vnd.fdsn.mseed', - 'mseq' => 'application/vnd.mseq', - 'msf' => 'application/vnd.epson.msf', - 'msh' => 'model/mesh', - 'msi' => 'application/x-msdownload', - 'msl' => 'application/vnd.mobius.msl', - 'msty' => 'application/vnd.muvee.style', - 'mts' => 'model/vnd.mts', - 'mus' => 'application/vnd.musician', - 'musicxml' => 'application/vnd.recordare.musicxml+xml', - 'mvb' => 'application/x-msmediaview', - 'mwf' => 'application/vnd.mfer', - 'mxf' => 'application/mxf', - 'mxl' => 'application/vnd.recordare.musicxml', - 'mxml' => 'application/xv+xml', - 'mxs' => 'application/vnd.triscape.mxs', - 'mxu' => 'video/vnd.mpegurl', - 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', - 'n3' => 'text/n3', - 'nb' => 'application/mathematica', - 'nbp' => 'application/vnd.wolfram.player', - 'nc' => 'application/x-netcdf', - 'ncx' => 'application/x-dtbncx+xml', - 'ngdat' => 'application/vnd.nokia.n-gage.data', - 'nlu' => 'application/vnd.neurolanguage.nlu', - 'nml' => 'application/vnd.enliven', - 'nnd' => 'application/vnd.noblenet-directory', - 'nns' => 'application/vnd.noblenet-sealer', - 'nnw' => 'application/vnd.noblenet-web', - 'npx' => 'image/vnd.net-fpx', - 'nsf' => 'application/vnd.lotus-notes', - 'oa2' => 'application/vnd.fujitsu.oasys2', - 'oa3' => 'application/vnd.fujitsu.oasys3', - 'oas' => 'application/vnd.fujitsu.oasys', - 'obd' => 'application/x-msbinder', - 'oda' => 'application/oda', - 'odb' => 'application/vnd.oasis.opendocument.database', - 'odc' => 'application/vnd.oasis.opendocument.chart', - 'odf' => 'application/vnd.oasis.opendocument.formula', - 'odft' => 'application/vnd.oasis.opendocument.formula-template', - 'odg' => 'application/vnd.oasis.opendocument.graphics', - 'odi' => 'application/vnd.oasis.opendocument.image', - 'odm' => 'application/vnd.oasis.opendocument.text-master', - 'odp' => 'application/vnd.oasis.opendocument.presentation', - 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', - 'odt' => 'application/vnd.oasis.opendocument.text', - 'oga' => 'audio/ogg', - 'ogg' => 'audio/ogg', - 'ogv' => 'video/ogg', - 'ogx' => 'application/ogg', - 'onepkg' => 'application/onenote', - 'onetmp' => 'application/onenote', - 'onetoc' => 'application/onenote', - 'onetoc2' => 'application/onenote', - 'opf' => 'application/oebps-package+xml', - 'oprc' => 'application/vnd.palm', - 'org' => 'application/vnd.lotus-organizer', - 'osf' => 'application/vnd.yamaha.openscoreformat', - 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', - 'otc' => 'application/vnd.oasis.opendocument.chart-template', - 'otf' => 'application/x-font-otf', - 'otg' => 'application/vnd.oasis.opendocument.graphics-template', - 'oth' => 'application/vnd.oasis.opendocument.text-web', - 'oti' => 'application/vnd.oasis.opendocument.image-template', - 'otp' => 'application/vnd.oasis.opendocument.presentation-template', - 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', - 'ott' => 'application/vnd.oasis.opendocument.text-template', - 'oxt' => 'application/vnd.openofficeorg.extension', - 'p' => 'text/x-pascal', - 'p10' => 'application/pkcs10', - 'p12' => 'application/x-pkcs12', - 'p7b' => 'application/x-pkcs7-certificates', - 'p7c' => 'application/pkcs7-mime', - 'p7m' => 'application/pkcs7-mime', - 'p7r' => 'application/x-pkcs7-certreqresp', - 'p7s' => 'application/pkcs7-signature', - 'p8' => 'application/pkcs8', - 'pas' => 'text/x-pascal', - 'paw' => 'application/vnd.pawaafile', - 'pbd' => 'application/vnd.powerbuilder6', - 'pbm' => 'image/x-portable-bitmap', - 'pcf' => 'application/x-font-pcf', - 'pcl' => 'application/vnd.hp-pcl', - 'pclxl' => 'application/vnd.hp-pclxl', - 'pct' => 'image/x-pict', - 'pcurl' => 'application/vnd.curl.pcurl', - 'pcx' => 'image/x-pcx', - 'pdb' => 'application/vnd.palm', - 'pdf' => 'application/pdf', - 'pfa' => 'application/x-font-type1', - 'pfb' => 'application/x-font-type1', - 'pfm' => 'application/x-font-type1', - 'pfr' => 'application/font-tdpfr', - 'pfx' => 'application/x-pkcs12', - 'pgm' => 'image/x-portable-graymap', - 'pgn' => 'application/x-chess-pgn', - 'pgp' => 'application/pgp-encrypted', - 'php' => 'text/x-php', - 'phps' => 'application/x-httpd-phps', - 'pic' => 'image/x-pict', - 'pkg' => 'application/octet-stream', - 'pki' => 'application/pkixcmp', - 'pkipath' => 'application/pkix-pkipath', - 'plb' => 'application/vnd.3gpp.pic-bw-large', - 'plc' => 'application/vnd.mobius.plc', - 'plf' => 'application/vnd.pocketlearn', - 'pls' => 'application/pls+xml', - 'pml' => 'application/vnd.ctc-posml', - 'png' => 'image/png', - 'pnm' => 'image/x-portable-anymap', - 'portpkg' => 'application/vnd.macports.portpkg', - 'pot' => 'application/vnd.ms-powerpoint', - 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', - 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', - 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', - 'ppd' => 'application/vnd.cups-ppd', - 'ppm' => 'image/x-portable-pixmap', - 'pps' => 'application/vnd.ms-powerpoint', - 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', - 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', - 'ppt' => 'application/vnd.ms-powerpoint', - 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', - 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'pqa' => 'application/vnd.palm', - 'prc' => 'application/x-mobipocket-ebook', - 'pre' => 'application/vnd.lotus-freelance', - 'prf' => 'application/pics-rules', - 'ps' => 'application/postscript', - 'psb' => 'application/vnd.3gpp.pic-bw-small', - 'psd' => 'image/vnd.adobe.photoshop', - 'psf' => 'application/x-font-linux-psf', - 'pskcxml' => 'application/pskc+xml', - 'ptid' => 'application/vnd.pvi.ptid1', - 'pub' => 'application/x-mspublisher', - 'pvb' => 'application/vnd.3gpp.pic-bw-var', - 'pwn' => 'application/vnd.3m.post-it-notes', - 'pya' => 'audio/vnd.ms-playready.media.pya', - 'pyv' => 'video/vnd.ms-playready.media.pyv', - 'qam' => 'application/vnd.epson.quickanime', - 'qbo' => 'application/vnd.intu.qbo', - 'qfx' => 'application/vnd.intu.qfx', - 'qps' => 'application/vnd.publishare-delta-tree', - 'qt' => 'video/quicktime', - 'qwd' => 'application/vnd.quark.quarkxpress', - 'qwt' => 'application/vnd.quark.quarkxpress', - 'qxb' => 'application/vnd.quark.quarkxpress', - 'qxd' => 'application/vnd.quark.quarkxpress', - 'qxl' => 'application/vnd.quark.quarkxpress', - 'qxt' => 'application/vnd.quark.quarkxpress', - 'ra' => 'audio/x-pn-realaudio', - 'ram' => 'audio/x-pn-realaudio', - 'rar' => 'application/x-rar-compressed', - 'ras' => 'image/x-cmu-raster', - 'rb' => 'text/plain', - 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', - 'rdf' => 'application/rdf+xml', - 'rdz' => 'application/vnd.data-vision.rdz', - 'rep' => 'application/vnd.businessobjects', - 'res' => 'application/x-dtbresource+xml', - 'resx' => 'text/xml', - 'rgb' => 'image/x-rgb', - 'rif' => 'application/reginfo+xml', - 'rip' => 'audio/vnd.rip', - 'rl' => 'application/resource-lists+xml', - 'rlc' => 'image/vnd.fujixerox.edmics-rlc', - 'rld' => 'application/resource-lists-diff+xml', - 'rm' => 'application/vnd.rn-realmedia', - 'rmi' => 'audio/midi', - 'rmp' => 'audio/x-pn-realaudio-plugin', - 'rms' => 'application/vnd.jcp.javame.midlet-rms', - 'rnc' => 'application/relax-ng-compact-syntax', - 'roff' => 'text/troff', - 'rp9' => 'application/vnd.cloanto.rp9', - 'rpss' => 'application/vnd.nokia.radio-presets', - 'rpst' => 'application/vnd.nokia.radio-preset', - 'rq' => 'application/sparql-query', - 'rs' => 'application/rls-services+xml', - 'rsd' => 'application/rsd+xml', - 'rss' => 'application/rss+xml', - 'rtf' => 'application/rtf', - 'rtx' => 'text/richtext', - 's' => 'text/x-asm', - 'saf' => 'application/vnd.yamaha.smaf-audio', - 'sbml' => 'application/sbml+xml', - 'sc' => 'application/vnd.ibm.secure-container', - 'scd' => 'application/x-msschedule', - 'scm' => 'application/vnd.lotus-screencam', - 'scq' => 'application/scvp-cv-request', - 'scs' => 'application/scvp-cv-response', - 'scurl' => 'text/vnd.curl.scurl', - 'sda' => 'application/vnd.stardivision.draw', - 'sdc' => 'application/vnd.stardivision.calc', - 'sdd' => 'application/vnd.stardivision.impress', - 'sdkd' => 'application/vnd.solent.sdkm+xml', - 'sdkm' => 'application/vnd.solent.sdkm+xml', - 'sdp' => 'application/sdp', - 'sdw' => 'application/vnd.stardivision.writer', - 'see' => 'application/vnd.seemail', - 'seed' => 'application/vnd.fdsn.seed', - 'sema' => 'application/vnd.sema', - 'semd' => 'application/vnd.semd', - 'semf' => 'application/vnd.semf', - 'ser' => 'application/java-serialized-object', - 'setpay' => 'application/set-payment-initiation', - 'setreg' => 'application/set-registration-initiation', - 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', - 'sfs' => 'application/vnd.spotfire.sfs', - 'sgl' => 'application/vnd.stardivision.writer-global', - 'sgm' => 'text/sgml', - 'sgml' => 'text/sgml', - 'sh' => 'application/x-sh', - 'shar' => 'application/x-shar', - 'shf' => 'application/shf+xml', - 'sig' => 'application/pgp-signature', - 'silo' => 'model/mesh', - 'sis' => 'application/vnd.symbian.install', - 'sisx' => 'application/vnd.symbian.install', - 'sit' => 'application/x-stuffit', - 'sitx' => 'application/x-stuffitx', - 'skd' => 'application/vnd.koan', - 'skm' => 'application/vnd.koan', - 'skp' => 'application/vnd.koan', - 'skt' => 'application/vnd.koan', - 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', - 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', - 'slt' => 'application/vnd.epson.salt', - 'sm' => 'application/vnd.stepmania.stepchart', - 'smf' => 'application/vnd.stardivision.math', - 'smi' => 'application/smil+xml', - 'smil' => 'application/smil+xml', - 'snd' => 'audio/basic', - 'snf' => 'application/x-font-snf', - 'so' => 'application/octet-stream', - 'spc' => 'application/x-pkcs7-certificates', - 'spf' => 'application/vnd.yamaha.smaf-phrase', - 'spl' => 'application/x-futuresplash', - 'spot' => 'text/vnd.in3d.spot', - 'spp' => 'application/scvp-vp-response', - 'spq' => 'application/scvp-vp-request', - 'spx' => 'audio/ogg', - 'src' => 'application/x-wais-source', - 'sru' => 'application/sru+xml', - 'srx' => 'application/sparql-results+xml', - 'sse' => 'application/vnd.kodak-descriptor', - 'ssf' => 'application/vnd.epson.ssf', - 'ssml' => 'application/ssml+xml', - 'st' => 'application/vnd.sailingtracker.track', - 'stc' => 'application/vnd.sun.xml.calc.template', - 'std' => 'application/vnd.sun.xml.draw.template', - 'stf' => 'application/vnd.wt.stf', - 'sti' => 'application/vnd.sun.xml.impress.template', - 'stk' => 'application/hyperstudio', - 'stl' => 'application/vnd.ms-pki.stl', - 'str' => 'application/vnd.pg.format', - 'stw' => 'application/vnd.sun.xml.writer.template', - 'sub' => 'image/vnd.dvb.subtitle', - 'sus' => 'application/vnd.sus-calendar', - 'susp' => 'application/vnd.sus-calendar', - 'sv4cpio' => 'application/x-sv4cpio', - 'sv4crc' => 'application/x-sv4crc', - 'svc' => 'application/vnd.dvb.service', - 'svd' => 'application/vnd.svd', - 'svg' => 'image/svg+xml', - 'svgz' => 'image/svg+xml', - 'swa' => 'application/x-director', - 'swf' => 'application/x-shockwave-flash', - 'swi' => 'application/vnd.aristanetworks.swi', - 'sxc' => 'application/vnd.sun.xml.calc', - 'sxd' => 'application/vnd.sun.xml.draw', - 'sxg' => 'application/vnd.sun.xml.writer.global', - 'sxi' => 'application/vnd.sun.xml.impress', - 'sxm' => 'application/vnd.sun.xml.math', - 'sxw' => 'application/vnd.sun.xml.writer', - 't' => 'text/troff', - 'tao' => 'application/vnd.tao.intent-module-archive', - 'tar' => 'application/x-tar', - 'tcap' => 'application/vnd.3gpp2.tcap', - 'tcl' => 'application/x-tcl', - 'teacher' => 'application/vnd.smart.teacher', - 'tei' => 'application/tei+xml', - 'teicorpus' => 'application/tei+xml', - 'tex' => 'application/x-tex', - 'texi' => 'application/x-texinfo', - 'texinfo' => 'application/x-texinfo', - 'text' => 'text/plain', - 'tfi' => 'application/thraud+xml', - 'tfm' => 'application/x-tex-tfm', - 'thmx' => 'application/vnd.ms-officetheme', - 'tif' => 'image/tiff', - 'tiff' => 'image/tiff', - 'tmo' => 'application/vnd.tmobile-livetv', - 'torrent' => 'application/x-bittorrent', - 'tpl' => 'application/vnd.groove-tool-template', - 'tpt' => 'application/vnd.trid.tpt', - 'tr' => 'text/troff', - 'tra' => 'application/vnd.trueapp', - 'trm' => 'application/x-msterminal', - 'tsd' => 'application/timestamped-data', - 'tsv' => 'text/tab-separated-values', - 'ttc' => 'application/x-font-ttf', - 'ttf' => 'application/x-font-ttf', - 'ttl' => 'text/turtle', - 'twd' => 'application/vnd.simtech-mindmapper', - 'twds' => 'application/vnd.simtech-mindmapper', - 'txd' => 'application/vnd.genomatix.tuxedo', - 'txf' => 'application/vnd.mobius.txf', - 'txt' => 'text/plain', - 'u32' => 'application/x-authorware-bin', - 'udeb' => 'application/x-debian-package', - 'ufd' => 'application/vnd.ufdl', - 'ufdl' => 'application/vnd.ufdl', - 'umj' => 'application/vnd.umajin', - 'unityweb' => 'application/vnd.unity', - 'uoml' => 'application/vnd.uoml+xml', - 'uri' => 'text/uri-list', - 'uris' => 'text/uri-list', - 'urls' => 'text/uri-list', - 'ustar' => 'application/x-ustar', - 'utz' => 'application/vnd.uiq.theme', - 'uu' => 'text/x-uuencode', - 'uva' => 'audio/vnd.dece.audio', - 'uvd' => 'application/vnd.dece.data', - 'uvf' => 'application/vnd.dece.data', - 'uvg' => 'image/vnd.dece.graphic', - 'uvh' => 'video/vnd.dece.hd', - 'uvi' => 'image/vnd.dece.graphic', - 'uvm' => 'video/vnd.dece.mobile', - 'uvp' => 'video/vnd.dece.pd', - 'uvs' => 'video/vnd.dece.sd', - 'uvt' => 'application/vnd.dece.ttml+xml', - 'uvu' => 'video/vnd.uvvu.mp4', - 'uvv' => 'video/vnd.dece.video', - 'uvva' => 'audio/vnd.dece.audio', - 'uvvd' => 'application/vnd.dece.data', - 'uvvf' => 'application/vnd.dece.data', - 'uvvg' => 'image/vnd.dece.graphic', - 'uvvh' => 'video/vnd.dece.hd', - 'uvvi' => 'image/vnd.dece.graphic', - 'uvvm' => 'video/vnd.dece.mobile', - 'uvvp' => 'video/vnd.dece.pd', - 'uvvs' => 'video/vnd.dece.sd', - 'uvvt' => 'application/vnd.dece.ttml+xml', - 'uvvu' => 'video/vnd.uvvu.mp4', - 'uvvv' => 'video/vnd.dece.video', - 'uvvx' => 'application/vnd.dece.unspecified', - 'uvx' => 'application/vnd.dece.unspecified', - 'vcd' => 'application/x-cdlink', - 'vcf' => 'text/x-vcard', - 'vcg' => 'application/vnd.groove-vcard', - 'vcs' => 'text/x-vcalendar', - 'vcx' => 'application/vnd.vcx', - 'vis' => 'application/vnd.visionary', - 'viv' => 'video/vnd.vivo', - 'vor' => 'application/vnd.stardivision.writer', - 'vox' => 'application/x-authorware-bin', - 'vrml' => 'model/vrml', - 'vsd' => 'application/vnd.visio', - 'vsf' => 'application/vnd.vsf', - 'vss' => 'application/vnd.visio', - 'vst' => 'application/vnd.visio', - 'vsw' => 'application/vnd.visio', - 'vtu' => 'model/vnd.vtu', - 'vxml' => 'application/voicexml+xml', - 'w3d' => 'application/x-director', - 'wad' => 'application/x-doom', - 'wav' => 'audio/x-wav', - 'wax' => 'audio/x-ms-wax', - 'wbmp' => 'image/vnd.wap.wbmp', - 'wbs' => 'application/vnd.criticaltools.wbs+xml', - 'wbxml' => 'application/vnd.wap.wbxml', - 'wcm' => 'application/vnd.ms-works', - 'wdb' => 'application/vnd.ms-works', - 'weba' => 'audio/webm', - 'webm' => 'video/webm', - 'webp' => 'image/webp', - 'wg' => 'application/vnd.pmi.widget', - 'wgt' => 'application/widget', - 'wks' => 'application/vnd.ms-works', - 'wm' => 'video/x-ms-wm', - 'wma' => 'audio/x-ms-wma', - 'wmd' => 'application/x-ms-wmd', - 'wmf' => 'application/x-msmetafile', - 'wml' => 'text/vnd.wap.wml', - 'wmlc' => 'application/vnd.wap.wmlc', - 'wmls' => 'text/vnd.wap.wmlscript', - 'wmlsc' => 'application/vnd.wap.wmlscriptc', - 'wmv' => 'video/x-ms-wmv', - 'wmx' => 'video/x-ms-wmx', - 'wmz' => 'application/x-ms-wmz', - 'woff' => 'application/x-font-woff', - 'wpd' => 'application/vnd.wordperfect', - 'wpl' => 'application/vnd.ms-wpl', - 'wps' => 'application/vnd.ms-works', - 'wqd' => 'application/vnd.wqd', - 'wri' => 'application/x-mswrite', - 'wrl' => 'model/vrml', - 'wsdl' => 'application/wsdl+xml', - 'wspolicy' => 'application/wspolicy+xml', - 'wtb' => 'application/vnd.webturbo', - 'wvx' => 'video/x-ms-wvx', - 'x32' => 'application/x-authorware-bin', - 'x3d' => 'application/vnd.hzn-3d-crossword', - 'xap' => 'application/x-silverlight-app', - 'xar' => 'application/vnd.xara', - 'xbap' => 'application/x-ms-xbap', - 'xbd' => 'application/vnd.fujixerox.docuworks.binder', - 'xbm' => 'image/x-xbitmap', - 'xdf' => 'application/xcap-diff+xml', - 'xdm' => 'application/vnd.syncml.dm+xml', - 'xdp' => 'application/vnd.adobe.xdp+xml', - 'xdssc' => 'application/dssc+xml', - 'xdw' => 'application/vnd.fujixerox.docuworks', - 'xenc' => 'application/xenc+xml', - 'xer' => 'application/patch-ops-error+xml', - 'xfdf' => 'application/vnd.adobe.xfdf', - 'xfdl' => 'application/vnd.xfdl', - 'xht' => 'application/xhtml+xml', - 'xhtml' => 'application/xhtml+xml', - 'xhvml' => 'application/xv+xml', - 'xif' => 'image/vnd.xiff', - 'xla' => 'application/vnd.ms-excel', - 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', - 'xlc' => 'application/vnd.ms-excel', - 'xlm' => 'application/vnd.ms-excel', - 'xls' => 'application/vnd.ms-excel', - 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', - 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'xlt' => 'application/vnd.ms-excel', - 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', - 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', - 'xlw' => 'application/vnd.ms-excel', - 'xml' => 'application/xml', - 'xo' => 'application/vnd.olpc-sugar', - 'xop' => 'application/xop+xml', - 'xpi' => 'application/x-xpinstall', - 'xpm' => 'image/x-xpixmap', - 'xpr' => 'application/vnd.is-xpr', - 'xps' => 'application/vnd.ms-xpsdocument', - 'xpw' => 'application/vnd.intercon.formnet', - 'xpx' => 'application/vnd.intercon.formnet', - 'xsl' => 'application/xml', - 'xslt' => 'application/xslt+xml', - 'xsm' => 'application/vnd.syncml+xml', - 'xspf' => 'application/xspf+xml', - 'xul' => 'application/vnd.mozilla.xul+xml', - 'xvm' => 'application/xv+xml', - 'xvml' => 'application/xv+xml', - 'xwd' => 'image/x-xwindowdump', - 'xyz' => 'chemical/x-xyz', - 'yaml' => 'text/yaml', - 'yang' => 'application/yang', - 'yin' => 'application/yin+xml', - 'yml' => 'text/yaml', - 'zaz' => 'application/vnd.zzazz.deck+xml', - 'zip' => 'application/zip', - 'zir' => 'application/vnd.zul', - 'zirz' => 'application/vnd.zul', - 'zmm' => 'application/vnd.handheld-entertainment+xml' - ); - - /** - * Get a singleton instance of the class - * - * @return self - * @codeCoverageIgnore - */ - public static function getInstance() - { - if (!self::$instance) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Get a mimetype value from a file extension - * - * @param string $extension File extension - * - * @return string|null - * - */ - public function fromExtension($extension) - { - $extension = strtolower($extension); - - return isset($this->mimetypes[$extension]) - ? $this->mimetypes[$extension] - : null; - } - - /** - * Get a mimetype from a filename - * - * @param string $filename Filename to generate a mimetype from - * - * @return string|null - */ - public function fromFilename($filename) - { - return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/MultipartBody.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/MultipartBody.php deleted file mode 100644 index 72ce6e12c..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/MultipartBody.php +++ /dev/null @@ -1,292 +0,0 @@ -boundary = $boundary ?: uniqid(); - $this->fields = $fields; - $this->files = $files; - - // Ensure each file is a PostFileInterface - foreach ($this->files as $file) { - if (!$file instanceof PostFileInterface) { - throw new \InvalidArgumentException('All POST fields must ' - . 'implement PostFieldInterface'); - } - } - } - - public function __toString() - { - $this->seek(0); - - return $this->getContents(); - } - - public function getContents($maxLength = -1) - { - $buffer = ''; - - while (!$this->eof()) { - if ($maxLength === -1) { - $read = 1048576; - } else { - $len = strlen($buffer); - if ($len == $maxLength) { - break; - } - $read = min(1048576, $maxLength - $len); - } - $buffer .= $this->read($read); - } - - return $buffer; - } - - /** - * Get the boundary - * - * @return string - */ - public function getBoundary() - { - return $this->boundary; - } - - public function close() - { - $this->detach(); - } - - public function detach() - { - $this->fields = $this->files = []; - } - - /** - * The stream has reached an EOF when all of the fields and files have been - * read. - * {@inheritdoc} - */ - public function eof() - { - return $this->currentField == count($this->fields) && - $this->currentFile == count($this->files); - } - - public function tell() - { - return $this->pos; - } - - public function isReadable() - { - return true; - } - - public function isWritable() - { - return false; - } - - /** - * The steam is seekable by default, but all attached files must be - * seekable too. - * {@inheritdoc} - */ - public function isSeekable() - { - foreach ($this->files as $file) { - if (!$file->getContent()->isSeekable()) { - return false; - } - } - - return true; - } - - public function getSize() - { - if ($this->size === null) { - foreach ($this->files as $file) { - // We must be able to ascertain the size of each attached file - if (null === ($size = $file->getContent()->getSize())) { - return null; - } - $this->size += strlen($this->getFileHeaders($file)) + $size; - } - foreach (array_keys($this->fields) as $key) { - $this->size += strlen($this->getFieldString($key)); - } - $this->size += strlen("\r\n--{$this->boundary}--"); - } - - return $this->size; - } - - public function read($length) - { - $content = ''; - if ($this->buffer && !$this->buffer->eof()) { - $content .= $this->buffer->read($length); - } - if ($delta = $length - strlen($content)) { - $content .= $this->readData($delta); - } - - if ($content === '' && !$this->sentLast) { - $this->sentLast = true; - $content = "\r\n--{$this->boundary}--"; - } - - return $content; - } - - public function seek($offset, $whence = SEEK_SET) - { - if ($offset != 0 || $whence != SEEK_SET || !$this->isSeekable()) { - return false; - } - - foreach ($this->files as $file) { - if (!$file->getContent()->seek(0)) { - throw new \RuntimeException('Rewind on multipart file failed ' - . 'even though it shouldn\'t have'); - } - } - - $this->buffer = $this->sentLast = null; - $this->pos = $this->currentField = $this->currentFile = 0; - $this->bufferedHeaders = []; - - return true; - } - - public function write($string) - { - return false; - } - - /** - * No data is in the read buffer, so more needs to be pulled in from fields - * and files. - * - * @param int $length Amount of data to read - * - * @return string - */ - private function readData($length) - { - $result = ''; - - if ($this->currentField < count($this->fields)) { - $result = $this->readField($length); - } - - if ($result === '' && $this->currentFile < count($this->files)) { - $result = $this->readFile($length); - } - - return $result; - } - - /** - * Create a new stream buffer and inject form-data - * - * @param int $length Amount of data to read from the stream buffer - * - * @return string - */ - private function readField($length) - { - $name = array_keys($this->fields)[++$this->currentField - 1]; - $this->buffer = Stream\create($this->getFieldString($name)); - - return $this->buffer->read($length); - } - - /** - * Read data from a POST file, fill the read buffer with any overflow - * - * @param int $length Amount of data to read from the file - * - * @return string - */ - private function readFile($length) - { - $current = $this->files[$this->currentFile]; - - // Got to the next file and recursively return the read value, or bail - // if no more data can be read. - if ($current->getContent()->eof()) { - return ++$this->currentFile == count($this->files) - ? '' - : $this->readFile($length); - } - - // If this is the start of a file, then send the headers to the read - // buffer. - if (!isset($this->bufferedHeaders[$this->currentFile])) { - $this->buffer = Stream\create($this->getFileHeaders($current)); - $this->bufferedHeaders[$this->currentFile] = true; - } - - // More data needs to be read to meet the limit, so pull from the file - $content = $this->buffer ? $this->buffer->read($length) : ''; - if (($remaining = $length - strlen($content)) > 0) { - $content .= $current->getContent()->read($remaining); - } - - return $content; - } - - private function getFieldString($key) - { - return sprintf( - "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n", - $this->boundary, - $key, - $this->fields[$key] - ); - } - - private function getFileHeaders(PostFileInterface $file) - { - $headers = ''; - foreach ($file->getHeaders() as $key => $value) { - $headers .= "{$key}: {$value}\r\n"; - } - - return "--{$this->boundary}\r\n" . trim($headers) . "\r\n\r\n"; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostBody.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostBody.php deleted file mode 100644 index 6ba253be1..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostBody.php +++ /dev/null @@ -1,282 +0,0 @@ -files || $this->forceMultipart) { - $request->setHeader( - 'Content-Type', - 'multipart/form-data; boundary=' . $this->getBody()->getBoundary() - ); - } elseif ($this->fields) { - $request->setHeader('Content-Type', 'application/x-www-form-urlencoded'); - } - - if ($size = $this->getSize()) { - $request->setHeader('Content-Length', $size); - } - } - - public function forceMultipartUpload($force) - { - $this->forceMultipart = $force; - - return $this; - } - - public function setAggregator(callable $aggregator) - { - $this->aggregator = $aggregator; - } - - public function setField($name, $value) - { - $this->fields[$name] = $value; - $this->mutate(); - - return $this; - } - - public function replaceFields(array $fields) - { - $this->fields = $fields; - $this->mutate(); - - return $this; - } - - public function getField($name) - { - return isset($this->fields[$name]) ? $this->fields[$name] : null; - } - - public function removeField($name) - { - unset($this->fields[$name]); - $this->mutate(); - - return $this; - } - - public function getFields($asString = false) - { - if (!$asString) { - return $this->fields; - } - - return (string) (new Query($this->fields)) - ->setEncodingType(Query::RFC1738) - ->setAggregator($this->getAggregator()); - } - - public function hasField($name) - { - return isset($this->fields[$name]); - } - - public function getFile($name) - { - foreach ($this->files as $file) { - if ($file->getName() == $name) { - return $file; - } - } - - return null; - } - - public function getFiles() - { - return $this->files; - } - - public function addFile(PostFileInterface $file) - { - $this->files[] = $file; - $this->mutate(); - - return $this; - } - - public function clearFiles() - { - $this->files = []; - $this->mutate(); - - return $this; - } - - /** - * Returns the numbers of fields + files - * - * @return int - */ - public function count() - { - return count($this->files) + count($this->fields); - } - - public function __toString() - { - return (string) $this->getBody(); - } - - public function getContents($maxLength = -1) - { - return $this->getBody()->getContents(); - } - - public function close() - { - return $this->body ? $this->body->close() : true; - } - - public function detach() - { - $this->body = null; - $this->fields = $this->files = []; - - return $this; - } - - public function eof() - { - return $this->getBody()->eof(); - } - - public function tell() - { - return $this->body ? $this->body->tell() : 0; - } - - public function isSeekable() - { - return true; - } - - public function isReadable() - { - return true; - } - - public function isWritable() - { - return false; - } - - public function getSize() - { - return $this->getBody()->getSize(); - } - - public function seek($offset, $whence = SEEK_SET) - { - return $this->getBody()->seek($offset, $whence); - } - - public function read($length) - { - return $this->getBody()->read($length); - } - - public function write($string) - { - return false; - } - - /** - * Return a stream object that is built from the POST fields and files. - * - * If one has already been created, the previously created stream will be - * returned. - */ - private function getBody() - { - if ($this->body) { - return $this->body; - } elseif ($this->files || $this->forceMultipart) { - return $this->body = $this->createMultipart(); - } elseif ($this->fields) { - return $this->body = $this->createUrlEncoded(); - } else { - return $this->body = Stream\create(); - } - } - - /** - * Get the aggregator used to join multi-valued field parameters - * - * @return callable - */ - final protected function getAggregator() - { - if (!$this->aggregator) { - $this->aggregator = Query::phpAggregator(); - } - - return $this->aggregator; - } - - /** - * Creates a multipart/form-data body stream - * - * @return MultipartBody - */ - private function createMultipart() - { - // Flatten the nested query string values using the correct aggregator - $query = (string) (new Query($this->fields)) - ->setEncodingType(false) - ->setAggregator($this->getAggregator()); - // Convert the flattened query string back into an array - $fields = Query::fromString($query)->toArray(); - - return new MultipartBody($fields, $this->files); - } - - /** - * Creates an application/x-www-form-urlencoded stream body - * - * @return Stream\StreamInterface - */ - private function createUrlEncoded() - { - return Stream\create($this->getFields(true)); - } - - /** - * Get rid of any cached data - */ - private function mutate() - { - $this->body = null; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostBodyInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostBodyInterface.php deleted file mode 100644 index 4405ce21a..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostBodyInterface.php +++ /dev/null @@ -1,129 +0,0 @@ -headers = $headers; - $this->name = $name; - $this->prepareContent($content); - $this->prepareFilename($filename); - $this->prepareDefaultHeaders(); - } - - public function getName() - { - return $this->name; - } - - public function getFilename() - { - return $this->filename; - } - - public function getContent() - { - return $this->content; - } - - public function getHeaders() - { - return $this->headers; - } - - /** - * Prepares the contents of a POST file. - * - * @param mixed $content Content of the POST file - */ - private function prepareContent($content) - { - $this->content = $content; - - if (!($this->content instanceof StreamInterface)) { - $this->content = \GuzzleHttp\Stream\create($this->content); - } elseif ($this->content instanceof MultipartBody) { - if (!$this->hasHeader('Content-Disposition')) { - $disposition = 'form-data; name="' . $this->name .'"'; - $this->headers['Content-Disposition'] = $disposition; - } - - if (!$this->hasHeader('Content-Type')) { - $this->headers['Content-Type'] = sprintf( - "multipart/form-data; boundary=%s", - $this->content->getBoundary() - ); - } - } - } - - /** - * Applies a file name to the POST file based on various checks. - * - * @param string|null $filename Filename to apply (or null to guess) - */ - private function prepareFilename($filename) - { - $this->filename = $filename; - - if (!$this->filename && - $this->content instanceof MetadataStreamInterface - ) { - $this->filename = $this->content->getMetadata('uri'); - } - - if (!$this->filename || substr($this->filename, 0, 6) === 'php://') { - $this->filename = $this->name; - } - } - - /** - * Applies default Content-Disposition and Content-Type headers if needed. - */ - private function prepareDefaultHeaders() - { - // Set a default content-disposition header if one was no provided - if (!$this->hasHeader('Content-Disposition')) { - $this->headers['Content-Disposition'] = sprintf( - 'form-data; filename="%s"; name="%s"', - basename($this->filename), - $this->name - ); - } - - // Set a default Content-Type if one was not supplied - if (!$this->hasHeader('Content-Type')) { - $this->headers['Content-Type'] = Mimetypes::getInstance() - ->fromFilename($this->filename) ?: 'text/plain'; - } - } - - /** - * Check if a specific header exists on the POST file by name. - * - * @param string $name Case-insensitive header to check - * - * @return bool - */ - private function hasHeader($name) - { - return isset(array_change_key_case($this->headers)[strtolower($name)]); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostFileInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostFileInterface.php deleted file mode 100644 index 205dd9676..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Post/PostFileInterface.php +++ /dev/null @@ -1,42 +0,0 @@ -add($key, $value); - $foundDuplicates = true; - } elseif ($paramIsPhpStyleArray) { - $q[$key] = array($value); - } else { - $q[$key] = $value; - } - } else { - $q->add($key, null); - } - } - - // Use the duplicate aggregator if duplicates were found and not using - // PHP style arrays. - if ($foundDuplicates && !$foundPhpStyle) { - $q->setAggregator(self::duplicateAggregator()); - } - - return $q; - } - - /** - * Convert the query string parameters to a query string string - * - * @return string - */ - public function __toString() - { - if (!$this->data) { - return ''; - } - - // The default aggregator is statically cached - static $defaultAggregator; - - if (!$this->aggregator) { - if (!$defaultAggregator) { - $defaultAggregator = self::phpAggregator(); - } - $this->aggregator = $defaultAggregator; - } - - $result = ''; - $aggregator = $this->aggregator; - - foreach ($aggregator($this->data) as $key => $values) { - foreach ($values as $value) { - if ($result) { - $result .= '&'; - } - if ($this->encoding == self::RFC1738) { - $result .= urlencode($key); - if ($value !== null) { - $result .= '=' . urlencode($value); - } - } elseif ($this->encoding == self::RFC3986) { - $result .= rawurlencode($key); - if ($value !== null) { - $result .= '=' . rawurlencode($value); - } - } else { - $result .= $key; - if ($value !== null) { - $result .= '=' . $value; - } - } - } - } - - return $result; - } - - /** - * Controls how multi-valued query string parameters are aggregated into a - * string. - * - * $query->setAggregator($query::duplicateAggregator()); - * - * @param callable $aggregator Callable used to convert a deeply nested - * array of query string variables into a flattened array of key value - * pairs. The callable accepts an array of query data and returns a - * flattened array of key value pairs where each value is an array of - * strings. - * - * @return self - */ - public function setAggregator(callable $aggregator) - { - $this->aggregator = $aggregator; - - return $this; - } - - /** - * Specify how values are URL encoded - * - * @param string|bool $type One of 'RFC1738', 'RFC3986', or false to disable encoding - * - * @return self - * @throws \InvalidArgumentException - */ - public function setEncodingType($type) - { - if ($type === false || $type === self::RFC1738 || $type === self::RFC3986) { - $this->encoding = $type; - } else { - throw new \InvalidArgumentException('Invalid URL encoding type'); - } - - return $this; - } - - /** - * Query string aggregator that does not aggregate nested query string - * values and allows duplicates in the resulting array. - * - * Example: http://test.com?q=1&q=2 - * - * @return callable - */ - public static function duplicateAggregator() - { - return function (array $data) { - return self::walkQuery($data, '', function ($key, $prefix) { - return is_int($key) ? $prefix : "{$prefix}[{$key}]"; - }); - }; - } - - /** - * Aggregates nested query string variables using the same technique as - * ``http_build_query()``. - * - * @param bool $numericIndices Pass false to not include numeric indices - * when multi-values query string parameters are present. - * - * @return callable - */ - public static function phpAggregator($numericIndices = true) - { - return function (array $data) use ($numericIndices) { - return self::walkQuery( - $data, - '', - function ($key, $prefix) use ($numericIndices) { - return !$numericIndices && is_int($key) - ? "{$prefix}[]" - : "{$prefix}[{$key}]"; - } - ); - }; - } - - /** - * Easily create query aggregation functions by providing a key prefix - * function to this query string array walker. - * - * @param array $query Query string to walk - * @param string $keyPrefix Key prefix (start with '') - * @param callable $prefixer Function used to create a key prefix - * - * @return array - */ - public static function walkQuery(array $query, $keyPrefix, callable $prefixer) - { - $result = []; - foreach ($query as $key => $value) { - if ($keyPrefix) { - $key = $prefixer($key, $keyPrefix); - } - if (is_array($value)) { - $result += self::walkQuery($value, $key, $prefixer); - } elseif (isset($result[$key])) { - $result[$key][] = $value; - } else { - $result[$key] = array($value); - } - } - - return $result; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Cookie.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Cookie.php deleted file mode 100644 index 4b8a2c081..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Cookie.php +++ /dev/null @@ -1,59 +0,0 @@ -cookieJar = $cookieJar ?: new CookieJar(); - } - - public function getEvents() - { - // Fire the cookie plugin complete event before redirecting - return [ - 'before' => ['onBefore'], - 'complete' => ['onComplete', RequestEvents::REDIRECT_RESPONSE + 10] - ]; - } - - /** - * Get the cookie cookieJar - * - * @return CookieJarInterface - */ - public function getCookieJar() - { - return $this->cookieJar; - } - - public function onBefore(BeforeEvent $event) - { - $this->cookieJar->addCookieHeader($event->getRequest()); - } - - public function onComplete(CompleteEvent $event) - { - $this->cookieJar->extractCookies( - $event->getRequest(), - $event->getResponse() - ); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/History.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/History.php deleted file mode 100644 index b2a49e044..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/History.php +++ /dev/null @@ -1,138 +0,0 @@ -limit = $limit; - } - - public function getEvents() - { - return [ - 'complete' => ['onComplete', RequestEvents::EARLY], - 'error' => ['onError', RequestEvents::EARLY], - ]; - } - - /** - * Convert to a string that contains all request and response headers - * - * @return string - */ - public function __toString() - { - $lines = array(); - foreach ($this->transactions as $entry) { - $response = isset($entry['response']) ? $entry['response'] : ''; - $lines[] = '> ' . trim($entry['request']) . "\n\n< " . trim($response) . "\n"; - } - - return implode("\n", $lines); - } - - public function onComplete(CompleteEvent $event) - { - $this->add($event->getRequest(), $event->getResponse()); - } - - public function onError(ErrorEvent $event) - { - $this->add($event->getRequest(), $event->getResponse()); - } - - /** - * Returns an Iterator that yields associative array values where each - * associative array contains a 'request' and 'response' key. - * - * @return \Iterator - */ - public function getIterator() - { - return new \ArrayIterator($this->transactions); - } - - /** - * Get all of the requests sent through the plugin - * - * @return RequestInterface[] - */ - public function getRequests() - { - return array_map(function ($t) { - return $t['request']; - }, $this->transactions); - } - - /** - * Get the number of requests in the history - * - * @return int - */ - public function count() - { - return count($this->transactions); - } - - /** - * Get the last request sent - * - * @return RequestInterface - */ - public function getLastRequest() - { - return end($this->transactions)['request']; - } - - /** - * Get the last response in the history - * - * @return ResponseInterface|null - */ - public function getLastResponse() - { - return end($this->transactions)['response']; - } - - /** - * Clears the history - */ - public function clear() - { - $this->transactions = array(); - } - - /** - * Add a request to the history - * - * @param RequestInterface $request Request to add - * @param ResponseInterface $response Response of the request - */ - private function add( - RequestInterface $request, - ResponseInterface $response = null - ) { - $this->transactions[] = ['request' => $request, 'response' => $response]; - if (count($this->transactions) > $this->limit) { - array_shift($this->transactions); - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/HttpError.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/HttpError.php deleted file mode 100644 index f2f72f15e..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/HttpError.php +++ /dev/null @@ -1,34 +0,0 @@ - ['onComplete', RequestEvents::VERIFY_RESPONSE]]; - } - - /** - * Throw a RequestException on an HTTP protocol error - * - * @param CompleteEvent $event Emitted event - * @throws RequestException - */ - public function onComplete(CompleteEvent $event) - { - $code = (string) $event->getResponse()->getStatusCode(); - // Throw an exception for an unsuccessful response - if ($code[0] === '4' || $code[0] === '5') { - throw RequestException::create($event->getRequest(), $event->getResponse()); - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Mock.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Mock.php deleted file mode 100644 index 99a3d18d7..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Mock.php +++ /dev/null @@ -1,143 +0,0 @@ -factory = new MessageFactory(); - $this->readBodies = $readBodies; - $this->addMultiple($items); - } - - public function getEvents() - { - // Fire the event last, after signing - return ['before' => ['onBefore', RequestEvents::SIGN_REQUEST - 10]]; - } - - /** - * @throws \OutOfBoundsException|\Exception - */ - public function onBefore(BeforeEvent $event) - { - if (!$item = array_shift($this->queue)) { - throw new \OutOfBoundsException('Mock queue is empty'); - } elseif ($item instanceof RequestException) { - throw $item; - } - - // Emulate the receiving of the response headers - $request = $event->getRequest(); - $transaction = new Transaction($event->getClient(), $request); - $transaction->setResponse($item); - $request->getEmitter()->emit( - 'headers', - new HeadersEvent($transaction) - ); - - // Emulate reading a response body - if ($this->readBodies && $request->getBody()) { - while (!$request->getBody()->eof()) { - $request->getBody()->read(8096); - } - } - - $event->intercept($item); - } - - public function count() - { - return count($this->queue); - } - - /** - * Add a response to the end of the queue - * - * @param string|ResponseInterface $response Response or path to response file - * - * @return self - * @throws \InvalidArgumentException if a string or Response is not passed - */ - public function addResponse($response) - { - if (is_string($response)) { - $response = file_exists($response) - ? $this->factory->fromMessage(file_get_contents($response)) - : $this->factory->fromMessage($response); - } elseif (!($response instanceof ResponseInterface)) { - throw new \InvalidArgumentException('Response must a message ' - . 'string, response object, or path to a file'); - } - - $this->queue[] = $response; - - return $this; - } - - /** - * Add an exception to the end of the queue - * - * @param RequestException $e Exception to throw when the request is executed - * - * @return self - */ - public function addException(RequestException $e) - { - $this->queue[] = $e; - - return $this; - } - - /** - * Add multiple items to the queue - * - * @param array $items Items to add - */ - public function addMultiple(array $items) - { - foreach ($items as $item) { - if ($item instanceof RequestException) { - $this->addException($item); - } else { - $this->addResponse($item); - } - } - } - - /** - * Clear the queue - */ - public function clearQueue() - { - $this->queue = []; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Prepare.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Prepare.php deleted file mode 100644 index 2d82acd6d..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Prepare.php +++ /dev/null @@ -1,136 +0,0 @@ - ['onBefore', RequestEvents::PREPARE_REQUEST]]; - } - - public function onBefore(BeforeEvent $event) - { - $request = $event->getRequest(); - - // Set the appropriate Content-Type for a request if one is not set and - // there are form fields - if (!($body = $request->getBody())) { - return; - } - - $this->addContentLength($request, $body); - - if ($body instanceof PostBodyInterface) { - // Synchronize the POST body with the request's headers - $body->applyRequestHeaders($request); - } elseif (!$request->hasHeader('Content-Type')) { - $this->addContentType($request, $body); - } - - $this->addExpectHeader($request, $body); - } - - private function addContentType( - RequestInterface $request, - StreamInterface $body - ) { - if (!($body instanceof MetadataStreamInterface)) { - return; - } - - if (!($uri = $body->getMetadata('uri'))) { - return; - } - - // Guess the content-type based on the stream's "uri" metadata value. - // The file extension is used to determine the appropriate mime-type. - if ($contentType = Mimetypes::getInstance()->fromFilename($uri)) { - $request->setHeader('Content-Type', $contentType); - } - } - - private function addContentLength( - RequestInterface $request, - StreamInterface $body - ) { - // Set the Content-Length header if it can be determined, and never - // send a Transfer-Encoding: chunked and Content-Length header in - // the same request. - if ($request->hasHeader('Content-Length')) { - // Remove transfer-encoding if content-length is set. - $request->removeHeader('Transfer-Encoding'); - return; - } - - if ($request->hasHeader('Transfer-Encoding')) { - return; - } - - if (null !== ($size = $body->getSize())) { - $request->setHeader('Content-Length', $size) - ->removeHeader('Transfer-Encoding'); - } elseif ('1.1' == $request->getProtocolVersion()) { - // Use chunked Transfer-Encoding if there is no determinable - // content-length header and we're using HTTP/1.1. - $request->setHeader('Transfer-Encoding', 'chunked') - ->removeHeader('Content-Length'); - } - } - - private function addExpectHeader( - RequestInterface $request, - StreamInterface $body - ) { - // Determine if the Expect header should be used - if ($request->hasHeader('Expect')) { - return; - } - - $expect = $request->getConfig()['expect']; - - // Return if disabled or if you're not using HTTP/1.1 - if ($expect === false || $request->getProtocolVersion() !== '1.1') { - return; - } - - // The expect header is unconditionally enabled - if ($expect === true) { - $request->setHeader('Expect', '100-Continue'); - return; - } - - // By default, send the expect header when the payload is > 1mb - if ($expect === null) { - $expect = 1048576; - } - - // Always add if the body cannot be rewound, the size cannot be - // determined, or the size is greater than the cutoff threshold - $size = $body->getSize(); - if ($size === null || $size >= (int) $expect || !$body->isSeekable()) { - $request->setHeader('Expect', '100-Continue'); - } - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Redirect.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Redirect.php deleted file mode 100644 index bd8988d8d..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Subscriber/Redirect.php +++ /dev/null @@ -1,172 +0,0 @@ - ['onComplete', RequestEvents::REDIRECT_RESPONSE]]; - } - - /** - * Rewind the entity body of the request if needed - * - * @param RequestInterface $redirectRequest - * @throws CouldNotRewindStreamException - */ - public static function rewindEntityBody(RequestInterface $redirectRequest) - { - // Rewind the entity body of the request if needed - if ($redirectRequest->getBody()) { - $body = $redirectRequest->getBody(); - // Only rewind the body if some of it has been read already, and - // throw an exception if the rewind fails - if ($body->tell() && !$body->seek(0)) { - throw new CouldNotRewindStreamException( - 'Unable to rewind the non-seekable request body after redirecting', - $redirectRequest - ); - } - } - } - - /** - * Called when a request receives a redirect response - * - * @param CompleteEvent $event Event emitted - * @throws TooManyRedirectsException - */ - public function onComplete(CompleteEvent $event) - { - $response = $event->getResponse(); - - if (substr($response->getStatusCode(), 0, 1) != '3' || - !$response->hasHeader('Location') - ) { - return; - } - - $redirectCount = 0; - $request = $event->getRequest(); - $redirectResponse = $response; - $max = $request->getConfig()->getPath('redirect/max') ?: 5; - - do { - if (++$redirectCount > $max) { - throw new TooManyRedirectsException( - "Will not follow more than {$redirectCount} redirects", - $request - ); - } - $redirectRequest = $this->createRedirectRequest($request, $redirectResponse); - $redirectResponse = $event->getClient()->send($redirectRequest); - } while (substr($redirectResponse->getStatusCode(), 0, 1) == '3' && - $redirectResponse->hasHeader('Location') - ); - - if ($redirectResponse !== $response) { - $event->intercept($redirectResponse); - } - } - - /** - * Create a redirect request for a specific request object - * - * Takes into account strict RFC compliant redirection (e.g. redirect POST - * with POST) vs doing what most clients do (e.g. redirect POST with GET). - * - * @param RequestInterface $request - * @param ResponseInterface $response - * - * @return RequestInterface Returns a new redirect request - * @throws CouldNotRewindStreamException If the body cannot be rewound. - */ - private function createRedirectRequest( - RequestInterface $request, - ResponseInterface $response - ) { - $config = $request->getConfig(); - - // Use a GET request if this is an entity enclosing request and we are - // not forcing RFC compliance, but rather emulating what all browsers - // would do. Be sure to disable redirects on the clone. - $redirectRequest = clone $request; - $redirectRequest->getEmitter()->detach($this); - $statusCode = $response->getStatusCode(); - - if ($statusCode == 303 || - ($statusCode <= 302 && $request->getBody() && - !$config->getPath('redirect/strict')) - ) { - $redirectRequest->setMethod('GET'); - $redirectRequest->setBody(null); - } - - $this->setRedirectUrl($redirectRequest, $response); - $this->rewindEntityBody($redirectRequest); - - // Add the Referer header if it is told to do so and only - // add the header if we are not redirecting from https to http. - if ($config->getPath('redirect/referer') && ( - $redirectRequest->getScheme() == 'https' || - $redirectRequest->getScheme() == $request->getScheme() - )) { - $url = Url::fromString($request->getUrl()); - $url->setUsername(null)->setPassword(null); - $redirectRequest->setHeader('Referer', (string) $url); - } - - return $redirectRequest; - } - - /** - * Set the appropriate URL on the request based on the location header - * - * @param RequestInterface $redirectRequest - * @param ResponseInterface $response - */ - private function setRedirectUrl( - RequestInterface $redirectRequest, - ResponseInterface $response - ) { - $location = $response->getHeader('Location'); - $location = Url::fromString($location); - - // Combine location with the original URL if it is not absolute. - if (!$location->isAbsolute()) { - $originalUrl = Url::fromString($redirectRequest->getUrl()); - // Remove query string parameters and just take what is present on - // the redirect Location header - $originalUrl->getQuery()->clear(); - $location = $originalUrl->combine($location); - } - - $redirectRequest->setUrl($location); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/ToArrayInterface.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/ToArrayInterface.php deleted file mode 100644 index 7c4120fbc..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/ToArrayInterface.php +++ /dev/null @@ -1,16 +0,0 @@ - array('prefix' => '', 'joiner' => ',', 'query' => false), - '+' => array('prefix' => '', 'joiner' => ',', 'query' => false), - '#' => array('prefix' => '#', 'joiner' => ',', 'query' => false), - '.' => array('prefix' => '.', 'joiner' => '.', 'query' => false), - '/' => array('prefix' => '/', 'joiner' => '/', 'query' => false), - ';' => array('prefix' => ';', 'joiner' => ';', 'query' => true), - '?' => array('prefix' => '?', 'joiner' => '&', 'query' => true), - '&' => array('prefix' => '&', 'joiner' => '&', 'query' => true) - ); - - /** @var array Delimiters */ - private static $delims = array(':', '/', '?', '#', '[', ']', '@', '!', '$', - '&', '\'', '(', ')', '*', '+', ',', ';', '='); - - /** @var array Percent encoded delimiters */ - private static $delimsPct = array('%3A', '%2F', '%3F', '%23', '%5B', '%5D', - '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', - '%3B', '%3D'); - - public function expand($template, array $variables) - { - if (false === strpos($template, '{')) { - return $template; - } - - $this->template = $template; - $this->variables = $variables; - - return preg_replace_callback( - '/\{([^\}]+)\}/', - [$this, 'expandMatch'], - $this->template - ); - } - - /** - * Parse an expression into parts - * - * @param string $expression Expression to parse - * - * @return array Returns an associative array of parts - */ - private function parseExpression($expression) - { - $result = array(); - - if (isset(self::$operatorHash[$expression[0]])) { - $result['operator'] = $expression[0]; - $expression = substr($expression, 1); - } else { - $result['operator'] = ''; - } - - foreach (explode(',', $expression) as $value) { - $value = trim($value); - $varspec = array(); - if ($colonPos = strpos($value, ':')) { - $varspec['value'] = substr($value, 0, $colonPos); - $varspec['modifier'] = ':'; - $varspec['position'] = (int) substr($value, $colonPos + 1); - } elseif (substr($value, -1) == '*') { - $varspec['modifier'] = '*'; - $varspec['value'] = substr($value, 0, -1); - } else { - $varspec['value'] = (string) $value; - $varspec['modifier'] = ''; - } - $result['values'][] = $varspec; - } - - return $result; - } - - /** - * Process an expansion - * - * @param array $matches Matches met in the preg_replace_callback - * - * @return string Returns the replacement string - */ - private function expandMatch(array $matches) - { - static $rfc1738to3986 = array('+' => '%20', '%7e' => '~'); - - $replacements = array(); - $parsed = self::parseExpression($matches[1]); - $prefix = self::$operatorHash[$parsed['operator']]['prefix']; - $joiner = self::$operatorHash[$parsed['operator']]['joiner']; - $useQuery = self::$operatorHash[$parsed['operator']]['query']; - - foreach ($parsed['values'] as $value) { - - if (!isset($this->variables[$value['value']])) { - continue; - } - - $variable = $this->variables[$value['value']]; - $actuallyUseQuery = $useQuery; - $expanded = ''; - - if (is_array($variable)) { - - $isAssoc = $this->isAssoc($variable); - $kvp = array(); - foreach ($variable as $key => $var) { - - if ($isAssoc) { - $key = rawurlencode($key); - $isNestedArray = is_array($var); - } else { - $isNestedArray = false; - } - - if (!$isNestedArray) { - $var = rawurlencode($var); - if ($parsed['operator'] == '+' || - $parsed['operator'] == '#' - ) { - $var = $this->decodeReserved($var); - } - } - - if ($value['modifier'] == '*') { - if ($isAssoc) { - if ($isNestedArray) { - // Nested arrays must allow for deeply nested - // structures. - $var = strtr( - http_build_query([$key => $var]), - $rfc1738to3986 - ); - } else { - $var = $key . '=' . $var; - } - } elseif ($key > 0 && $actuallyUseQuery) { - $var = $value['value'] . '=' . $var; - } - } - - $kvp[$key] = $var; - } - - if (empty($variable)) { - $actuallyUseQuery = false; - } elseif ($value['modifier'] == '*') { - $expanded = implode($joiner, $kvp); - if ($isAssoc) { - // Don't prepend the value name when using the explode - // modifier with an associative array. - $actuallyUseQuery = false; - } - } else { - if ($isAssoc) { - // When an associative array is encountered and the - // explode modifier is not set, then the result must be - // a comma separated list of keys followed by their - // respective values. - foreach ($kvp as $k => &$v) { - $v = $k . ',' . $v; - } - } - $expanded = implode(',', $kvp); - } - - } else { - if ($value['modifier'] == ':') { - $variable = substr($variable, 0, $value['position']); - } - $expanded = rawurlencode($variable); - if ($parsed['operator'] == '+' || $parsed['operator'] == '#') { - $expanded = $this->decodeReserved($expanded); - } - } - - if ($actuallyUseQuery) { - if (!$expanded && $joiner != '&') { - $expanded = $value['value']; - } else { - $expanded = $value['value'] . '=' . $expanded; - } - } - - $replacements[] = $expanded; - } - - $ret = implode($joiner, $replacements); - if ($ret && $prefix) { - return $prefix . $ret; - } - - return $ret; - } - - /** - * Determines if an array is associative. - * - * This makes the assumption that input arrays are sequences or hashes. - * This assumption is a tradeoff for accuracy in favor of speed, but it - * should work in almost every case where input is supplied for a URI - * template. - * - * @param array $array Array to check - * - * @return bool - */ - private function isAssoc(array $array) - { - return $array && array_keys($array)[0] !== 0; - } - - /** - * Removes percent encoding on reserved characters (used with + and # - * modifiers). - * - * @param string $string String to fix - * - * @return string - */ - private function decodeReserved($string) - { - return str_replace(self::$delimsPct, self::$delims, $string); - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Url.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Url.php deleted file mode 100644 index a305a768c..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/Url.php +++ /dev/null @@ -1,585 +0,0 @@ - 80, 'https' => 443, 'ftp' => 21]; - - /** @var Query Query part of the URL */ - private $query; - - /** - * Factory method to create a new URL from a URL string - * - * @param string $url Full URL used to create a Url object - * - * @return Url - * @throws \InvalidArgumentException - */ - public static function fromString($url) - { - static $defaults = array('scheme' => null, 'host' => null, - 'path' => null, 'port' => null, 'query' => null, - 'user' => null, 'pass' => null, 'fragment' => null); - - if (false === ($parts = parse_url($url))) { - throw new \InvalidArgumentException('Unable to parse malformed ' - . 'url: ' . $url); - } - - $parts += $defaults; - - // Convert the query string into a Query object - if ($parts['query'] || 0 !== strlen($parts['query'])) { - $parts['query'] = Query::fromString($parts['query']); - } - - return new static($parts['scheme'], $parts['host'], $parts['user'], - $parts['pass'], $parts['port'], $parts['path'], $parts['query'], - $parts['fragment']); - } - - /** - * Build a URL from parse_url parts. The generated URL will be a relative - * URL if a scheme or host are not provided. - * - * @param array $parts Array of parse_url parts - * - * @return string - */ - public static function buildUrl(array $parts) - { - $url = $scheme = ''; - - if (!empty($parts['scheme'])) { - $scheme = $parts['scheme']; - $url .= $scheme . ':'; - } - - if (!empty($parts['host'])) { - $url .= '//'; - if (isset($parts['user'])) { - $url .= $parts['user']; - if (isset($parts['pass'])) { - $url .= ':' . $parts['pass']; - } - $url .= '@'; - } - - $url .= $parts['host']; - - // Only include the port if it is not the default port of the scheme - if (isset($parts['port']) && - (!isset(self::$defaultPorts[$scheme]) || - $parts['port'] != self::$defaultPorts[$scheme]) - ) { - $url .= ':' . $parts['port']; - } - } - - // Add the path component if present - if (isset($parts['path']) && strlen($parts['path'])) { - // Always ensure that the path begins with '/' if set and something - // is before the path - if (isset($parts['host']) && $parts['path'][0] != '/') { - $url .= '/'; - } - $url .= $parts['path']; - } - - // Add the query string if present - if (isset($parts['query'])) { - $queryStr = (string) $parts['query']; - if ($queryStr || $queryStr === '0') { - $url .= '?' . $queryStr; - } - } - - // Ensure that # is only added to the url if fragment contains anything. - if (isset($parts['fragment'])) { - $url .= '#' . $parts['fragment']; - } - - return $url; - } - - /** - * Create a new URL from URL parts - * - * @param string $scheme Scheme of the URL - * @param string $host Host of the URL - * @param string $username Username of the URL - * @param string $password Password of the URL - * @param int $port Port of the URL - * @param string $path Path of the URL - * @param Query|array|string $query Query string of the URL - * @param string $fragment Fragment of the URL - */ - public function __construct( - $scheme, - $host, - $username = null, - $password = null, - $port = null, - $path = null, - Query $query = null, - $fragment = null - ) { - $this->scheme = $scheme; - $this->host = $host; - $this->port = $port; - $this->username = $username; - $this->password = $password; - $this->fragment = $fragment; - if (!$query) { - $this->query = new Query(); - } else { - $this->setQuery($query); - } - $this->setPath($path); - } - - /** - * Clone the URL - */ - public function __clone() - { - $this->query = clone $this->query; - } - - /** - * Returns the URL as a URL string - * - * @return string - */ - public function __toString() - { - return static::buildUrl($this->getParts()); - } - - /** - * Get the parts of the URL as an array - * - * @return array - */ - public function getParts() - { - return array( - 'scheme' => $this->scheme, - 'user' => $this->username, - 'pass' => $this->password, - 'host' => $this->host, - 'port' => $this->port, - 'path' => $this->path, - 'query' => $this->query, - 'fragment' => $this->fragment, - ); - } - - /** - * Set the host of the request. - * - * @param string $host Host to set (e.g. www.yahoo.com, yahoo.com) - * - * @return Url - */ - public function setHost($host) - { - if (strpos($host, ':') === false) { - $this->host = $host; - } else { - list($host, $port) = explode(':', $host); - $this->host = $host; - $this->setPort($port); - } - - return $this; - } - - /** - * Get the host part of the URL - * - * @return string - */ - public function getHost() - { - return $this->host; - } - - /** - * Set the scheme part of the URL (http, https, ftp, etc.) - * - * @param string $scheme Scheme to set - * - * @return Url - */ - public function setScheme($scheme) - { - // Remove the default port if one is specified - if ($this->port && isset(self::$defaultPorts[$this->scheme]) && - self::$defaultPorts[$this->scheme] == $this->port - ) { - $this->port = null; - } - - $this->scheme = $scheme; - - return $this; - } - - /** - * Get the scheme part of the URL - * - * @return string - */ - public function getScheme() - { - return $this->scheme; - } - - /** - * Set the port part of the URL - * - * @param int $port Port to set - * - * @return Url - */ - public function setPort($port) - { - $this->port = $port; - - return $this; - } - - /** - * Get the port part of the URl. - * - * If no port was set, this method will return the default port for the - * scheme of the URI. - * - * @return int|null - */ - public function getPort() - { - if ($this->port) { - return $this->port; - } elseif (isset(self::$defaultPorts[$this->scheme])) { - return self::$defaultPorts[$this->scheme]; - } - - return null; - } - - /** - * Set the path part of the URL - * - * @param string $path Path string to set - * - * @return Url - */ - public function setPath($path) - { - static $search = [' ', '?']; - static $replace = ['%20', '%3F']; - $this->path = str_replace($search, $replace, $path); - - return $this; - } - - /** - * Removes dot segments from a URL - * - * @return Url - * @link http://tools.ietf.org/html/rfc3986#section-5.2.4 - */ - public function removeDotSegments() - { - static $noopPaths = ['' => true, '/' => true, '*' => true]; - static $ignoreSegments = ['' => true, '.' => true, '..' => true]; - - if (isset($noopPaths[$this->path])) { - return $this; - } - - $results = []; - $segments = $this->getPathSegments(); - foreach ($segments as $segment) { - if ($segment == '..') { - array_pop($results); - } elseif (!isset($ignoreSegments[$segment])) { - $results[] = $segment; - } - } - - // Combine the normalized parts and add the leading slash if needed - if ($this->path[0] == '/') { - $this->path = '/' . implode('/', $results); - } else { - $this->path = implode('/', $results); - } - - // Add the trailing slash if necessary - if ($this->path != '/' && isset($ignoreSegments[end($segments)])) { - $this->path .= '/'; - } - - return $this; - } - - /** - * Add a relative path to the currently set path. - * - * @param string $relativePath Relative path to add - * - * @return Url - */ - public function addPath($relativePath) - { - if ($relativePath != '/' && - is_string($relativePath) && - strlen($relativePath) > 0 - ) { - // Add a leading slash if needed - if ($relativePath[0] != '/') { - $relativePath = '/' . $relativePath; - } - $this->setPath(str_replace('//', '/', $this->path . $relativePath)); - } - - return $this; - } - - /** - * Get the path part of the URL - * - * @return string - */ - public function getPath() - { - return $this->path; - } - - /** - * Get the path segments of the URL as an array - * - * @return array - */ - public function getPathSegments() - { - return explode('/', $this->path); - } - - /** - * Set the password part of the URL - * - * @param string $password Password to set - * - * @return Url - */ - public function setPassword($password) - { - $this->password = $password; - - return $this; - } - - /** - * Get the password part of the URL - * - * @return null|string - */ - public function getPassword() - { - return $this->password; - } - - /** - * Set the username part of the URL - * - * @param string $username Username to set - * - * @return Url - */ - public function setUsername($username) - { - $this->username = $username; - - return $this; - } - - /** - * Get the username part of the URl - * - * @return null|string - */ - public function getUsername() - { - return $this->username; - } - - /** - * Get the query part of the URL as a Query object - * - * @return Query - */ - public function getQuery() - { - return $this->query; - } - - /** - * Set the query part of the URL - * - * @param Query|string|array $query Query string value to set. Can - * be a string that will be parsed into a Query object, an array - * of key value pairs, or a Query object. - * - * @return Url - * @throws \InvalidArgumentException - */ - public function setQuery($query) - { - if ($query instanceof Query) { - $this->query = $query; - } elseif (is_string($query)) { - $this->query = Query::fromString($query); - } elseif (is_array($query)) { - $this->query = new Query($query); - } else { - throw new \InvalidArgumentException('Query must be a ' - . 'QueryInterface, array, or string'); - } - - return $this; - } - - /** - * Get the fragment part of the URL - * - * @return null|string - */ - public function getFragment() - { - return $this->fragment; - } - - /** - * Set the fragment part of the URL - * - * @param string $fragment Fragment to set - * - * @return Url - */ - public function setFragment($fragment) - { - $this->fragment = $fragment; - - return $this; - } - - /** - * Check if this is an absolute URL - * - * @return bool - */ - public function isAbsolute() - { - return $this->scheme && $this->host; - } - - /** - * Combine the URL with another URL and return a new URL instance. - * - * Follows the rules specific in RFC 3986 section 5.4. - * - * @param string $url Relative URL to combine with - * - * @return Url - * @throws \InvalidArgumentException - * @link http://tools.ietf.org/html/rfc3986#section-5.4 - */ - public function combine($url) - { - $url = static::fromString($url); - - // Use the more absolute URL as the base URL - if (!$this->isAbsolute() && $url->isAbsolute()) { - $url = $url->combine($this); - } - - $parts = $url->getParts(); - - // Passing a URL with a scheme overrides everything - if ($parts['scheme']) { - return new static( - $parts['scheme'], - $parts['host'], - $parts['user'], - $parts['pass'], - $parts['port'], - $parts['path'], - clone $parts['query'], - $parts['fragment'] - ); - } - - // Setting a host overrides the entire rest of the URL - if ($parts['host']) { - return new static( - $this->scheme, - $parts['host'], - $parts['user'], - $parts['pass'], - $parts['port'], - $parts['path'], - clone $parts['query'], - $parts['fragment'] - ); - } - - if (!$parts['path']) { - // The relative URL has no path, so check if it is just a query - $path = $this->path ?: ''; - $query = count($parts['query']) ? $parts['query'] : $this->query; - } else { - $query = $parts['query']; - if ($parts['path'][0] == '/' || !$this->path) { - // Overwrite the existing path if the rel path starts with "/" - $path = $parts['path']; - } else { - // If the relative URL does not have a path or the base URL - // path does not end in a "/" then overwrite the existing path - // up to the last "/" - $path = substr($this->path, 0, strrpos($this->path, '/') + 1) . $parts['path']; - } - } - - $result = new self( - $this->scheme, - $this->host, - $this->username, - $this->password, - $this->port, - $path, - clone $query, - $parts['fragment'] - ); - - if ($path) { - $result->removeDotSegments(); - } - - return $result; - } -} diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/cacert.pem b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/cacert.pem deleted file mode 100644 index 9794dfb70..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/cacert.pem +++ /dev/null @@ -1,3866 +0,0 @@ -## -## ca-bundle.crt -- Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Tue Apr 22 08:29:31 2014 -## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## http://mxr.mozilla.org/mozilla-release/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## - - -GTE CyberTrust Global Root -========================== ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg -Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG -A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz -MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL -Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 -IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u -sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql -HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID -AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW -M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF -NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -Equifax Secure CA -================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE -ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT -B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR -fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW -8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE -CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS -spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 -zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB -BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 -70+sB3c4 ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA -TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah -WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf -Tqj/ZA1k ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - -GlobalSign Root CA -================== ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx -GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds -b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD -VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa -DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc -THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb -Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP -c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF -AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj -Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG -j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH -hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC -X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -ValiCert Class 1 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy -MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi -GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm -DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG -lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX -icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP -Orf1LXLI ------END CERTIFICATE----- - -ValiCert Class 2 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC -CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf -ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ -SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV -UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 -W9ViH0Pd ------END CERTIFICATE----- - -RSA Root Certificate 1 -====================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td -3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H -BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs -3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF -V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r -on+jjBXu ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS -tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM -8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW -Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX -Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd -RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG -UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -Entrust.net Secure Server CA -============================ ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl -ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG -A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi -eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p -dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ -aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 -gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw -ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l -dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw -NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow -HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN -Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 -n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -Entrust.net Premium 2048 Secure Server CA -========================================= ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u -ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 -d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u -ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr -hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW -nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ -KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy -T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT -J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e -nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -Baltimore CyberTrust Root -========================= ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE -ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li -ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC -SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs -dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME -uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB -UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C -G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 -XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr -l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI -VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh -cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 -hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa -Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -Equifax Secure Global eBusiness CA -================================== ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp -bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds -b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV -PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN -qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn -hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs -MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN -I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY -NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 1 -============================= ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB -LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE -ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz -IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ -1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a -IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk -MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW -Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF -AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 -lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ -KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -AddTrust Low-Value Services Root -================================ ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU -cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO -ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 -54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr -oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 -Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui -GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w -HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw -HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt -ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr -mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj -ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -AddTrust External Root -====================== ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD -VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw -NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU -cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg -Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 -+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw -Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo -aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy -2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 -7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL -VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk -VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 -e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u -G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -AddTrust Public Services Root -============================= ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU -cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ -BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l -dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu -nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i -d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG -Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw -HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G -A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G -A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 -JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 -Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H -EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -AddTrust Qualified Certificates Root -==================================== ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU -cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx -CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx -64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 -KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o -L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR -wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU -MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE -BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y -azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze -RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB -iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- - -Entrust Root Certification Authority -==================================== ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw -b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG -A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 -MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu -MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu -Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz -A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww -Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 -j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN -rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 -MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM -Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa -v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS -W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 -tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Global CA 2 -==================== ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw -MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ -NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k -LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA -Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b -HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH -K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 -srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh -ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL -OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC -x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - -Visa eCommerce Root -=================== ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG -EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug -QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 -WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm -VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL -F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b -RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 -TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI -/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs -GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc -CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW -YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz -zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -Certum Root CA -============== ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK -ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla -Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u -by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x -wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL -kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ -89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K -Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P -NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ -GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg -GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ -0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS -qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -Comodo AAA Services root -======================== ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw -MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl -c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV -BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG -C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs -i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW -Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH -Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK -Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f -BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz -LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z -8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C -12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -Comodo Secure Services root -=========================== ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw -MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi -BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP -9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc -rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC -oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V -p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E -FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj -YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm -aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL -DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw -pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H -RR3B7Hzs/Sk= ------END CERTIFICATE----- - -Comodo Trusted Services root -============================ ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw -MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h -bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw -IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 -3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y -/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 -juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS -ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud -DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp -ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl -cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA -BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l -R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O -9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - -QuoVadis Root CA 2 -================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx -OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg -DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij -KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K -DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv -BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp -p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 -nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX -MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM -Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz -uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT -BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB -BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD -VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 -ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE -AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV -qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s -hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z -POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 -Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp -8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC -bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu -g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p -vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr -qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - -Staat der Nederlanden Root CA -============================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE -ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w -HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh -bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt -vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P -jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca -C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth -vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 -22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV -HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v -dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN -BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR -EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw -MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -TDC Internet Root CA -==================== ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE -ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx -NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu -ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j -xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL -znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc -5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6 -otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI -AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM -VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM -MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe -UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G -CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m -gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb -O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU -Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - -UTN DATACorp SGC Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ -BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa -MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w -HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy -dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys -raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo -wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA -9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv -33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud -DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 -BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD -LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 -I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx -EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP -DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -UTN USERFirst Hardware Root CA -============================== ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd -BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx -OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 -eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz -ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI -wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd -tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 -i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf -Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw -gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF -lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF -UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW -XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 -lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn -iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 -nfhmqA== ------END CERTIFICATE----- - -Camerfirma Chambers of Commerce Root -==================================== ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx -NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp -cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn -MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC -AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU -xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH -NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW -DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV -d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud -EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v -cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P -AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh -bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi -fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD -L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN -UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n -ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 -erfutGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -Camerfirma Global Chambersign Root -================================== ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx -NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt -YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg -MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw -ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J -1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O -by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl -6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c -8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ -BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j -aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B -Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj -aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA -PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y -gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ -PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 -IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes -t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -NetLock Notary (Class A) Root -============================= ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI -EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j -ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX -DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH -EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD -VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz -cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM -D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ -z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC -/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 -tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 -4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG -A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC -Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn -LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz -IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh -IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu -b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg -Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp -bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 -ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP -ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB -CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr -KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM -8CgHrTwXZoi1/baI ------END CERTIFICATE----- - -NetLock Business (Class B) Root -=============================== ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg -VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD -VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv -bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg -VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S -o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr -1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ -RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh -dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 -ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv -c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz -Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA -bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 -YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj -cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM -43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR -stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -NetLock Express (Class C) Root -============================== ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ -BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j -ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z -W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 -euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw -DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN -RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn -YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB -IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i -aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y -emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k -IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ -UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg -YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 -xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW -gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -XRamp Global CA Root -==================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj -dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx -HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg -U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu -IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx -foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE -zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs -AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry -xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap -oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC -AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n -nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz -8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -Go Daddy Class 2 CA -=================== ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY -VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG -A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD -ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 -qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j -YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY -vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O -BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o -atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu -MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim -PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI -Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b -vZ8= ------END CERTIFICATE----- - -Starfield Class 2 CA -==================== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc -U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo -MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG -SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY -bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ -JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm -epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN -F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF -MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f -hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo -bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs -afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD -KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 -QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj -YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH -AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw -Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg -U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 -LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh -cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT -dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC -AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh -3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm -vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk -fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ -EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl -1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ -lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro -g14= ------END CERTIFICATE----- - -Taiwan GRCA -=========== ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG -EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv -dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN -w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 -BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O -1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO -htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov -J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 -Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t -B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB -O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 -lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV -HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj -Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 -Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU -D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz -DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk -Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk -7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ -CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy -+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS ------END CERTIFICATE----- - -Swisscom Root CA 1 -================== ------BEGIN CERTIFICATE----- -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 -NY6E0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -DigiCert Assured ID Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx -MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO -9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy -UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW -/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy -oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf -GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF -66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq -hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc -EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn -SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -DigiCert Global Root CA -======================= ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw -MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn -TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 -BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H -4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y -7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB -o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm -8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF -BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr -EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt -tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -DigiCert High Assurance EV Root CA -================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw -KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw -MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu -Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t -Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS -OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 -MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ -NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe -h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY -JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ -V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp -myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- - -Certplus Class 2 Primary CA -=========================== ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE -BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN -OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy -dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR -5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ -Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO -YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e -e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME -CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ -YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t -L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD -P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R -TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ -7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -DST ACES CA X6 -============== ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT -MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha -MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE -CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI -DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa -pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow -GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy -MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu -Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy -dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU -CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 -5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs -vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 -oKfN5XozNmr6mis= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 1 -============================================== ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP -MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 -acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx -MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB -TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC -aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX -yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i -Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ -8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 -W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME -BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 -sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY -nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2 -============================================== ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN -MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr -dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe -LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI -x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g -QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr -5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB -AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ -hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P -9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 -UrbnBEI= ------END CERTIFICATE----- - -SwissSign Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -SecureTrust CA -============== ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy -dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe -BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX -OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t -DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH -GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b -01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH -ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj -aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu -SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf -mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -Secure Global CA -================ ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH -bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg -MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx -YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ -bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g -8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV -HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi -0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn -oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA -MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ -OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn -CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -COMODO Certification Authority -============================== ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb -MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD -T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH -+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww -xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV -4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA -1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI -rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k -b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC -AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc -IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN -+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- - -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -COMODO ECC Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix -GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X -4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni -wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG -FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA -U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - -Security Communication EV RootCA1 -================================= ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE -BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl -Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO -/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX -WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z -ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 -bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK -9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm -iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG -Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW -mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW -T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -OISTE WISeKey Global Root GA CA -=============================== ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= ------END CERTIFICATE----- - -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -Certigna -======== ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw -EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 -MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI -Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q -XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH -GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p -ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg -DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf -Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ -tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ -BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J -SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA -hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ -ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu -PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY -1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. -====================================== ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT -AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg -LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w -HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ -U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh -IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN -yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU -2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 -4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP -2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm -8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf -HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa -Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK -5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b -czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g -ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF -BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug -cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf -AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX -EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v -/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 -MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 -3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk -eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f -/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h -RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU -Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== ------END CERTIFICATE----- - -TC TrustCenter Class 2 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw -MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw -IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 -xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ -Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u -SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G -dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ -KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj -TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP -JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk -vQ== ------END CERTIFICATE----- - -TC TrustCenter Class 3 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw -MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W -yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo -6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ -uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk -2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE -O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 -yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 -IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal -092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc -5A== ------END CERTIFICATE----- - -TC TrustCenter Universal CA I -============================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN -MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg -VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw -JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC -qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv -xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw -ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O -gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j -BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG -1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy -vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 -ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a -7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -Deutsche Telekom Root CA 2 -========================== ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT -RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG -A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 -MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G -A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS -b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 -bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI -KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY -AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK -Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV -jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV -HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr -E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy -zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 -rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G -dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -ComSign Secured CA -================== ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE -AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w -NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD -QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs -49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH -7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB -kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 -9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw -AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t -U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA -j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC -AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a -BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp -FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP -51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -ePKI Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG -EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx -MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq -MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs -IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi -lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv -qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX -12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O -WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ -ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao -lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ -vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi -Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi -MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 -1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq -KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV -xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP -NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r -GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE -xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx -gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy -sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD -BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 -============================================================================================================================= ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH -DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q -aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry -b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV -BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg -S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 -MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl -IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF -n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl -IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft -dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl -cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO -Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 -xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR -6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd -BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 -N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT -y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh -LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M -dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= ------END CERTIFICATE----- - -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -Buypass Class 3 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 -MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx -ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 -n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia -AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c -1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 -pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA -EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 -htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj -el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -certSIGN ROOT CA -================ ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD -VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa -Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE -CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I -JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH -rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 -ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD -0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 -AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB -AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 -SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 -x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt -vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz -TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -CNNIC ROOT -========== ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE -ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw -OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD -o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz -VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT -VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or -czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK -y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC -wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S -lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 -Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM -O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 -BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 -G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m -mxE= ------END CERTIFICATE----- - -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -NetLock Arany (Class Gold) Főtanúsítvány -============================================ ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G -A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 -dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB -cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx -MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO -ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 -c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu -0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw -/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk -H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw -fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 -neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW -qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta -YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna -NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu -dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G2 -================================== ------BEGIN CERTIFICATE----- -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 -66+KAQ== ------END CERTIFICATE----- - -CA Disig -======== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK -QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw -MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz -bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm -GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD -Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo -hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt -ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w -gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P -AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz -aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff -ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa -BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t -WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 -mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K -ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA -4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -ACEDICOM Root -============= ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky -CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX -bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ -D/xwzoiQ ------END CERTIFICATE----- - -Microsec e-Szigno Root CA 2009 -============================== ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER -MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv -c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE -BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt -U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA -fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG -0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA -pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm -1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC -AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf -QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE -FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o -lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX -I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 -yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi -LXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi -=================================================== ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz -ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 -MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 -cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u -aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY -8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y -jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI -JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk -9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG -SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d -F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq -D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 -Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - -GlobalSign Root CA - R3 -======================= ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt -iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ -0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 -rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl -OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 -xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 -lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 -EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E -bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 -YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r -kpeDMdmztcpHWD9f ------END CERTIFICATE----- - -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -Izenpe.com -========== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -Go Daddy Root Certificate Authority - G2 -======================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu -MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G -A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq -9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD -+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd -fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl -NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 -BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac -vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r -5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV -N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 ------END CERTIFICATE----- - -Starfield Root Certificate Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw -DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg -VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB -dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv -W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs -bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk -N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf -ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU -JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol -TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx -4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw -F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ -c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -Starfield Services Root Certificate Authority - G2 -================================================== ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl -IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT -dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 -h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa -hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP -LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB -rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG -SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP -E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy -xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza -YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 ------END CERTIFICATE----- - -AffirmTrust Commercial -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw -MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb -DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV -C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 -BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww -MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV -HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG -hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi -qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv -0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh -sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -AffirmTrust Networking -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw -MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE -Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI -dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 -/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb -h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV -HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu -UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 -12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 -WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 -/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -AffirmTrust Premium -=================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy -OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy -dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn -BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV -5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs -+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd -GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R -p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI -S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 -6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 -/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo -+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv -MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC -6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S -L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK -+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV -BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg -IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 -g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb -zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== ------END CERTIFICATE----- - -AffirmTrust Premium ECC -======================= ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV -BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx -MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U -cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ -N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW -BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK -BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X -57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM -eQ== ------END CERTIFICATE----- - -Certum Trusted Network CA -========================= ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK -ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy -MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU -ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC -l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J -J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 -fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 -cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB -Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw -DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj -jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 -mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj -Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -Certinomis - Autorité Racine -============================= ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK -Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg -LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG -A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw -JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa -wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly -Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw -2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N -jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q -c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC -lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb -xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g -530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna -4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x -WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva -R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 -nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B -CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv -JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE -qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b -WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE -wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ -vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -A-Trust-nQual-03 -================ ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE -Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy -a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R -dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw -RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 -ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 -c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA -zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n -yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE -SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 -iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V -cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV -eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 -ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr -sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd -JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 -ahq97BvIxYSazQ== ------END CERTIFICATE----- - -TWCA Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ -VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG -EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB -IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx -QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC -oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP -4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r -y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG -9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC -mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW -QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY -T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny -Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -Security Communication RootCA2 -============================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC -SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy -aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ -+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R -3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV -spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K -EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 -QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj -u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk -3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q -tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 -mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -EC-ACC -====== ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE -BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w -ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD -VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE -CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT -BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 -MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt -SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl -Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh -cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK -w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT -ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 -HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a -E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw -0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD -VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 -Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l -dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ -lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa -Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe -l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 -E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D -5EI= ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -Actalis Authentication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM -BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE -AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky -MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz -IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ -wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa -by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 -zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f -YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 -oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l -EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 -hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 -EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 -jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY -iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI -WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 -JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx -K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ -Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC -4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo -2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz -lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem -OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 -vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -Trustis FPS Root CA -=================== ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG -EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 -IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV -BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ -RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk -H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa -cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt -o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA -AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd -BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c -GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC -yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P -8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV -l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl -iB6XzCGcKQENZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ -Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 -dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu -c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv -bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 -aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t -L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 -fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm -N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN -Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T -tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX -e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA -2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs -HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib -D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -StartCom Certification Authority G2 -=================================== ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE -ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O -o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG -4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi -Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul -Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs -O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H -vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L -nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS -FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa -z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ -KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk -J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ -JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG -/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc -nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld -blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc -l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm -7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm -obp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -Buypass Class 2 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X -DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 -g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn -9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b -/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU -CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff -awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI -zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn -Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX -Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs -M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI -osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S -aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd -DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD -LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 -oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC -wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS -CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN -rJgWVqA= ------END CERTIFICATE----- - -Buypass Class 3 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X -DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH -sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR -5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh -7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ -ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH -2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV -/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ -RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA -Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq -j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G -uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG -Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 -ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 -KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz -6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug -UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe -eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi -Cp/HuZc= ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 3 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx -MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK -9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU -NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF -iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W -0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr -AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb -fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT -ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h -P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== ------END CERTIFICATE----- - -EE Certification Centre Root CA -=============================== ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy -dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw -MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB -UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy -ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM -TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 -rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw -93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN -P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ -MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF -BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj -xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM -lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU -3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM -dcGWxZ0= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2007 -================================================= ------BEGIN CERTIFICATE----- -MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X -DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl -a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN -BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp -bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N -YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv -KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya -KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT -rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC -AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s -Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I -aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO -Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb -BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK -poRq0Tl9 ------END CERTIFICATE----- - -D-TRUST Root Class 3 CA 2 2009 -============================== ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe -Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE -LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD -ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA -BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv -KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z -p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC -AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ -4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y -eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw -MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G -PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw -OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm -2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV -dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph -X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -D-TRUST Root Class 3 CA 2 EV 2009 -================================= ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw -OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw -OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS -egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh -zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T -7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 -sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 -11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv -cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v -ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El -MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp -b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh -c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ -PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX -ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA -NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv -w9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -PSCProcert -========== ------BEGIN CERTIFICATE----- -MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk -ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ -MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz -dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl -cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw -IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw -MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w -DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD -ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp -Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC -wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA -3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh -RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO -EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 -0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH -0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU -td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw -Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp -r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ -AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz -Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId -xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp -ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH -EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h -Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k -ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG -9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG -MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG -LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 -ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy -YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v -Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o -dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq -T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN -g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q -uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 -n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn -FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo -5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq -3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 -poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y -eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km ------END CERTIFICATE----- - -China Internet Network Information Center EV Certificates Root -============================================================== ------BEGIN CERTIFICATE----- -MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D -aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg -Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG -A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM -PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl -cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y -jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV -98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H -klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 -KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC -7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD -glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 -0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM -7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws -ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 -5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= ------END CERTIFICATE----- - -Swisscom Root CA 2 -================== ------BEGIN CERTIFICATE----- -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 -5OfNeOI5wSsSnqaeG8XmDtkx2Q== ------END CERTIFICATE----- - -Swisscom Root EV CA 2 -===================== ------BEGIN CERTIFICATE----- -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 -l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= ------END CERTIFICATE----- - -CA Disig Root R1 -================ ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw -EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp -ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx -EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp -c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy -3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 -u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 -m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk -CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa -YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 -vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL -LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX -ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is -XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ -04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR -xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B -LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM -CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb -VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 -YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS -ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix -lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N -UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ -a7+h89n07eLw4+1knj0vllJPgFOL ------END CERTIFICATE----- - -CA Disig Root R2 -================ ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw -EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp -ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx -EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp -c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC -w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia -xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 -A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S -GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV -g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa -5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE -koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A -Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i -Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u -Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV -sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je -dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 -1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx -mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 -utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 -sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg -UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV -7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -ACCVRAIZ1 -========= ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB -SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 -MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH -UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM -jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 -RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD -aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ -0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG -WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 -8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR -5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J -9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK -Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw -Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu -Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM -Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA -QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh -AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA -YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj -AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA -IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk -aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 -dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 -MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI -hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E -R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN -YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 -nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ -TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 -sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg -Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd -3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p -EfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -TWCA Global Root CA -=================== ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT -CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD -QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK -EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg -Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C -nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV -r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR -Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV -tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W -KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 -sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p -yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn -kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI -zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC -AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g -cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M -8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg -/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg -lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP -A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m -i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 -EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 -zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= ------END CERTIFICATE----- - -TeliaSonera Root CA v1 -====================== ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE -CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 -MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW -VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ -6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA -3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k -B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn -Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH -oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 -F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ -oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 -gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc -TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB -AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW -DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm -zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW -pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV -G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc -c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT -JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 -qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 -Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems -WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -E-Tugra Certification Authority -=============================== ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w -DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls -ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw -NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx -QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl -cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD -DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd -hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K -CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g -ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ -BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 -E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz -rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq -jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 -dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB -/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG -MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK -kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO -XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 -VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo -a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc -dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV -KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT -Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 -8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G -C7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 2 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx -MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ -SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F -vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 -2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV -WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy -YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 -r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf -vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR -3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== ------END CERTIFICATE----- - -Atos TrustedRoot 2011 -===================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU -cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 -MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG -A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV -hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr -54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ -DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 -HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR -z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R -l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ -bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h -k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh -TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 -61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G -3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- diff --git a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/functions.php b/rainloop/v/0.0.0/app/libraries/GuzzleHttp/functions.php deleted file mode 100644 index 9dcce36e3..000000000 --- a/rainloop/v/0.0.0/app/libraries/GuzzleHttp/functions.php +++ /dev/null @@ -1,325 +0,0 @@ -send($client->createRequest($method, $url, $options)); -} - -/** - * Send a GET request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function get($url, array $options = []) -{ - return request('GET', $url, $options); -} - -/** - * Send a HEAD request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function head($url, array $options = []) -{ - return request('HEAD', $url, $options); -} - -/** - * Send a DELETE request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function delete($url, array $options = []) -{ - return request('DELETE', $url, $options); -} - -/** - * Send a POST request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function post($url, array $options = []) -{ - return request('POST', $url, $options); -} - -/** - * Send a PUT request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function put($url, array $options = []) -{ - return request('PUT', $url, $options); -} - -/** - * Send a PATCH request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function patch($url, array $options = []) -{ - return request('PATCH', $url, $options); -} - -/** - * Send an OPTIONS request - * - * @param string $url URL of the request - * @param array $options Array of request options - * - * @return ResponseInterface - */ -function options($url, array $options = []) -{ - return request('OPTIONS', $url, $options); -} - -/** - * Convenience method for sending multiple requests in parallel and retrieving - * a hash map of requests to response objects or RequestException objects. - * - * Note: This method keeps every request and response in memory, and as such is - * NOT recommended when sending a large number or an indeterminable number of - * requests in parallel. - * - * @param ClientInterface $client Client used to send the requests - * @param array|\Iterator $requests Requests to send in parallel - * @param array $options Passes through the options available in - * {@see GuzzleHttp\ClientInterface::sendAll()} - * @return \SplObjectStorage Requests are the key and each value is a - * {@see GuzzleHttp\Message\ResponseInterface} if the request succeeded or - * a {@see GuzzleHttp\Exception\RequestException} if it failed. - * @throws \InvalidArgumentException if the event format is incorrect. - */ -function batch(ClientInterface $client, $requests, array $options = []) -{ - $hash = new \SplObjectStorage(); - foreach ($requests as $request) { - $hash->attach($request); - } - - // Merge the necessary complete and error events to the event listeners so - // that as each request succeeds or fails, it is added to the result hash. - $options = RequestEvents::convertEventArray( - $options, - ['complete', 'error'], - [ - 'priority' => RequestEvents::EARLY, - 'once' => true, - 'fn' => function ($e) use ($hash) { $hash[$e->getRequest()] = $e; } - ] - ); - - // Send the requests in parallel and aggregate the results. - $client->sendAll($requests, $options); - - // Update the received value for any of the intercepted requests. - foreach ($hash as $request) { - if ($hash[$request] instanceof CompleteEvent) { - $hash[$request] = $hash[$request]->getResponse(); - } elseif ($hash[$request] instanceof ErrorEvent) { - $hash[$request] = $hash[$request]->getException(); - } - } - - return $hash; -} - -/** - * Gets a value from an array using a path syntax to retrieve nested data. - * - * This method does not allow for keys that contain "/". You must traverse - * the array manually or using something more advanced like JMESPath to - * work with keys that contain "/". - * - * // Get the bar key of a set of nested arrays. - * // This is equivalent to $collection['foo']['baz']['bar'] but won't - * // throw warnings for missing keys. - * GuzzleHttp\get_path($data, 'foo/baz/bar'); - * - * @param array $data Data to retrieve values from - * @param string $path Path to traverse and retrieve a value from - * - * @return mixed|null - */ -function get_path($data, $path) -{ - $path = explode('/', $path); - - while (null !== ($part = array_shift($path))) { - if (!is_array($data) || !isset($data[$part])) { - return null; - } - $data = $data[$part]; - } - - return $data; -} - -/** - * Set a value in a nested array key. Keys will be created as needed to set the - * value. - * - * This function does not support keys that contain "/" or "[]" characters - * because these are special tokens used when traversing the data structure. - * A value may be prepended to an existing array by using "[]" as the final - * key of a path. - * - * GuzzleHttp\get_path($data, 'foo/baz'); // null - * GuzzleHttp\set_path($data, 'foo/baz/[]', 'a'); - * GuzzleHttp\set_path($data, 'foo/baz/[]', 'b'); - * GuzzleHttp\get_path($data, 'foo/baz'); - * // Returns ['a', 'b'] - * - * @param array $data Data to modify by reference - * @param string $path Path to set - * @param mixed $value Value to set at the key - * @throws \RuntimeException when trying to setPath using a nested path that - * travels through a scalar value. - */ -function set_path(&$data, $path, $value) -{ - $current =& $data; - $queue = explode('/', $path); - while (null !== ($key = array_shift($queue))) { - if (!is_array($current)) { - throw new \RuntimeException("Trying to setPath {$path}, but " - . "{$key} is set and is not an array"); - } elseif (!$queue) { - if ($key == '[]') { - $current[] = $value; - } else { - $current[$key] = $value; - } - } elseif (isset($current[$key])) { - $current =& $current[$key]; - } else { - $current[$key] = []; - $current =& $current[$key]; - } - } -} - -/** - * Expands a URI template - * - * @param string $template URI template - * @param array $variables Template variables - * - * @return string - */ -function uri_template($template, array $variables) -{ - if (function_exists('\\uri_template')) { - return \uri_template($template, $variables); - } - - static $uriTemplate; - if (!$uriTemplate) { - $uriTemplate = new UriTemplate(); - } - - return $uriTemplate->expand($template, $variables); -} - -/** - * Wrapper for JSON decode that implements error detection with helpful error - * messages. - * - * @param string $json JSON data to parse - * @param bool $assoc When true, returned objects will be converted into - * associative arrays. - * @param int $depth User specified recursion depth. - * @param int $options Bitmask of JSON decode options. - * - * @return mixed - * @throws \InvalidArgumentException if the JSON cannot be parsed. - * @link http://www.php.net/manual/en/function.json-decode.php - */ -function json_decode($json, $assoc = false, $depth = 512, $options = 0) -{ - static $jsonErrors = [ - JSON_ERROR_DEPTH => 'JSON_ERROR_DEPTH - Maximum stack depth exceeded', - JSON_ERROR_STATE_MISMATCH => 'JSON_ERROR_STATE_MISMATCH - Underflow or the modes mismatch', - JSON_ERROR_CTRL_CHAR => 'JSON_ERROR_CTRL_CHAR - Unexpected control character found', - JSON_ERROR_SYNTAX => 'JSON_ERROR_SYNTAX - Syntax error, malformed JSON', - JSON_ERROR_UTF8 => 'JSON_ERROR_UTF8 - Malformed UTF-8 characters, possibly incorrectly encoded' - ]; - - $data = \json_decode($json, $assoc, $depth, $options); - - if (JSON_ERROR_NONE !== json_last_error()) { - $last = json_last_error(); - throw new \InvalidArgumentException( - 'Unable to parse JSON data: ' - . (isset($jsonErrors[$last]) ? $jsonErrors[$last] : 'Unknown error') - ); - } - - return $data; -} - -/** - * @internal - */ -function deprecation_proxy($object, $name, $arguments, $map) -{ - if (!isset($map[$name])) { - throw new \BadMethodCallException('Unknown method, ' . $name); - } - - $message = sprintf('%s is deprecated and will be removed in a future ' - . 'version. Update your code to use the equivalent %s method ' - . 'instead to avoid breaking changes when this shim is removed.', - get_class($object) . '::' . $name . '()', - get_class($object) . '::' . $map[$name] . '()' - ); - - trigger_error($message, E_USER_DEPRECATED); - - return call_user_func_array([$object, $map[$name]], $arguments); -} From 367748d39ebe4295b33830cca728cbf54d9a0add Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Wed, 16 May 2018 17:31:45 +0300 Subject: [PATCH 57/83] Add Object.assign polyfill (#1692) --- dev/boot.js | 2 ++ package.json | 3 ++- yarn.lock | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/dev/boot.js b/dev/boot.js index 97a82d8f4..df120ab42 100644 --- a/dev/boot.js +++ b/dev/boot.js @@ -2,6 +2,8 @@ import window from 'window'; import elementDatasetPolyfill from 'element-dataset'; +import 'es6-object-assign/auto'; + import {Promise} from 'es6-promise-polyfill/promise.js'; import {progressJs} from '../vendors/Progress.js/src/progress.js'; diff --git a/package.json b/package.json index 13eeeb687..b7481db6f 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "copy-webpack-plugin": "4.5.1", "element-dataset": "2.2.6", "emailjs-addressparser": "2.0.2", + "es6-object-assign": "1.1.0", "es6-promise-polyfill": "1.2.0", "eslint": "4.19.1", "eslint-plugin-compat": "2.2.0", @@ -103,8 +104,8 @@ "json-loader": "0.5.7", "json3": "3.3.2", "knockout": "3.4.2", - "knockout-transformations": "2.1.0", "knockout-sortable": "1.1.0", + "knockout-transformations": "2.1.0", "lozad": "1.4.0", "matchmedia-polyfill": "0.3.0", "moment": "2.22.1", diff --git a/yarn.lock b/yarn.lock index 3578a713e..8856171df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2052,6 +2052,10 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + es6-promise-polyfill@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz#f38925f23cb3e3e8ce6cda8ff774fcebbb090cde" From f5b92b8b65e6b7312ff930ad04abe71e136dc27c Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Wed, 16 May 2018 17:37:12 +0300 Subject: [PATCH 58/83] Remove GuzzleHttp namespace --- rainloop/v/0.0.0/app/handle.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rainloop/v/0.0.0/app/handle.php b/rainloop/v/0.0.0/app/handle.php index c96ce7977..f763f20cb 100644 --- a/rainloop/v/0.0.0/app/handle.php +++ b/rainloop/v/0.0.0/app/handle.php @@ -22,7 +22,7 @@ if (!\defined('RAINLOOP_APP_LIBRARIES_PATH')) function rainLoopSplAutoloadNamespaces() { return RAINLOOP_INCLUDE_AS_API_DEF ? array('RainLoop', 'Predis') : - array('RainLoop', 'Facebook', 'GuzzleHttp', 'PHPThumb', 'Predis', 'SabreForRainLoop', 'Imagine', 'Detection'); + array('RainLoop', 'Facebook', 'PHPThumb', 'Predis', 'SabreForRainLoop', 'Imagine', 'Detection'); } /** From 075b841b844a457c55a6a52ddc08e975d20e462c Mon Sep 17 00:00:00 2001 From: Lindolfo Meira Date: Wed, 6 Jun 2018 19:02:43 -0300 Subject: [PATCH 59/83] Added support to additional search field (defaults to "uid") --- .../LdapContactsSuggestions.php | 32 +++++++++++++++---- plugins/ldap-contacts-suggestions/index.php | 7 ++-- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php b/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php index 9eb538678..485c9f2cd 100644 --- a/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php +++ b/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php @@ -32,6 +32,11 @@ class LdapContactsSuggestions implements \RainLoop\Providers\Suggestions\ISugges */ private $sObjectClass = 'inetOrgPerson'; + /** + * @var string + */ + private $sUidField = 'uid'; + /** * @var string */ @@ -64,7 +69,7 @@ class LdapContactsSuggestions implements \RainLoop\Providers\Suggestions\ISugges * * @return \LdapContactsSuggestions */ - public function SetConfig($sHostName, $iHostPort, $sAccessDn, $sAccessPassword, $sUsersDn, $sObjectClass, $sNameField, $sEmailField) + public function SetConfig($sHostName, $iHostPort, $sAccessDn, $sAccessPassword, $sUsersDn, $sObjectClass, $sUidField, $sNameField, $sEmailField) { $this->sHostName = $sHostName; $this->iHostPort = $iHostPort; @@ -72,6 +77,7 @@ class LdapContactsSuggestions implements \RainLoop\Providers\Suggestions\ISugges $this->sAccessPassword = $sAccessPassword; $this->sUsersDn = $sUsersDn; $this->sObjectClass = $sObjectClass; + $this->sUidField = $sUidField; $this->sNameField = $sNameField; $this->sEmailField = $sEmailField; @@ -128,9 +134,9 @@ class LdapContactsSuggestions implements \RainLoop\Providers\Suggestions\ISugges * * @return array */ - private function findNameAndEmail($aLdapItem, $aEmailFields, $aNameFields) + private function findNameAndEmail($aLdapItem, $aEmailFields, $aNameFields, $aUidFields) { - $sEmail = $sName = ''; + $sEmail = $sName = $sUid = ''; if ($aLdapItem) { foreach ($aEmailFields as $sField) @@ -156,9 +162,21 @@ class LdapContactsSuggestions implements \RainLoop\Providers\Suggestions\ISugges } } } + + foreach ($aUidFields as $sField) + { + if (!empty($aLdapItem[$sField][0])) + { + $sUid = \trim($aLdapItem[$sField][0]); + if (!empty($sUid)) + { + break; + } + } + } } - return array($sEmail, $sName); + return array($sEmail, $sName, $sUid); } /** @@ -200,11 +218,13 @@ class LdapContactsSuggestions implements \RainLoop\Providers\Suggestions\ISugges $aEmails = empty($this->sEmailField) ? array() : \explode(',', $this->sEmailField); $aNames = empty($this->sNameField) ? array() : \explode(',', $this->sNameField); + $aUIDs = empty($this->sUidField) ? array() : \explode(',', $this->sUidField); $aEmails = \array_map('trim', $aEmails); $aNames = \array_map('trim', $aNames); + $aUIDs = \array_map('trim', $aUIDs); - $aFields = \array_merge($aEmails, $aNames); + $aFields = \array_merge($aEmails, $aNames, $aUIDs); $aItems = array(); $sSubFilter = ''; @@ -238,7 +258,7 @@ class LdapContactsSuggestions implements \RainLoop\Providers\Suggestions\ISugges if ($aItem) { $sName = $sEmail = ''; - list ($sEmail, $sName) = $this->findNameAndEmail($aItem, $aEmails, $aNames); + list ($sEmail, $sName) = $this->findNameAndEmail($aItem, $aEmails, $aNames, $aUIDs); if (!empty($sEmail)) { $aResult[] = array($sEmail, $sName); diff --git a/plugins/ldap-contacts-suggestions/index.php b/plugins/ldap-contacts-suggestions/index.php index b02fc1c37..0bcd0b2b7 100644 --- a/plugins/ldap-contacts-suggestions/index.php +++ b/plugins/ldap-contacts-suggestions/index.php @@ -41,6 +41,7 @@ class LdapContactsSuggestionsPlugin extends \RainLoop\Plugins\AbstractPlugin $sAccessPassword = \trim($this->Config()->Get('plugin', 'access_password', '')); $sUsersDn = \trim($this->Config()->Get('plugin', 'users_dn_format', '')); $sObjectClass = \trim($this->Config()->Get('plugin', 'object_class', '')); + $sSearchField = \trim($this->Config()->Get('plugin', 'search_field', '')); $sNameField = \trim($this->Config()->Get('plugin', 'name_field', '')); $sEmailField = \trim($this->Config()->Get('plugin', 'mail_field', '')); @@ -50,7 +51,7 @@ class LdapContactsSuggestionsPlugin extends \RainLoop\Plugins\AbstractPlugin include_once __DIR__.'/LdapContactsSuggestions.php'; $oProvider = new LdapContactsSuggestions(); - $oProvider->SetConfig($sHostName, $iHostPort, $sAccessDn, $sAccessPassword, $sUsersDn, $sObjectClass, $sNameField, $sEmailField); + $oProvider->SetConfig($sHostName, $iHostPort, $sAccessDn, $sAccessPassword, $sUsersDn, $sObjectClass, $sSearchField, $sNameField, $sEmailField); $mResult[] = $oProvider; } @@ -80,6 +81,8 @@ class LdapContactsSuggestionsPlugin extends \RainLoop\Plugins\AbstractPlugin ->SetDefaultValue('ou=People,dc=domain,dc=com'), \RainLoop\Plugins\Property::NewInstance('object_class')->SetLabel('objectClass value') ->SetDefaultValue('inetOrgPerson'), + \RainLoop\Plugins\Property::NewInstance('search_field')->SetLabel('Search field') + ->SetDefaultValue('uid'), \RainLoop\Plugins\Property::NewInstance('name_field')->SetLabel('Name field') ->SetDefaultValue('givenname'), \RainLoop\Plugins\Property::NewInstance('mail_field')->SetLabel('Mail field') @@ -89,4 +92,4 @@ class LdapContactsSuggestionsPlugin extends \RainLoop\Plugins\AbstractPlugin ->SetDefaultValue('*') ); } -} \ No newline at end of file +} From 791f0ff6adc3916ecde708dc8235e8780710411b Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Tue, 10 Jul 2018 00:05:02 +0300 Subject: [PATCH 60/83] Small fixes and improvements --- .docker/node/Dockerfile | 2 +- .eslintrc.js | 4 +- dev/Common/Booter.js | 16 +- dev/External/ko.js | 4 +- dev/View/Popup/AddOpenPgpKey.js | 2 +- dev/View/Popup/Contacts.js | 2 +- dev/View/User/MailBox/MessageList.js | 2 +- package.json | 48 +- yarn.lock | 12370 ++++++++++++------------- 9 files changed, 6100 insertions(+), 6350 deletions(-) diff --git a/.docker/node/Dockerfile b/.docker/node/Dockerfile index d97ceba55..460b9d3e9 100644 --- a/.docker/node/Dockerfile +++ b/.docker/node/Dockerfile @@ -1,4 +1,4 @@ -FROM node:alpine +FROM node:9.11.2-alpine RUN apk add --no-cache git RUN yarn global add gulp@3.9.1 diff --git a/.eslintrc.js b/.eslintrc.js index 4b8cd2065..9c8f661fe 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -11,7 +11,7 @@ module.exports = { 'commonjs': true, 'es6': true }, - 'plugins': ['compat'], + // 'plugins': ['compat'], 'globals': { 'RL_COMMUNITY': true, 'RL_ES6': true @@ -20,7 +20,7 @@ module.exports = { // http://eslint.org/docs/rules/ 'rules': { // plugins - 'compat/compat': 2, + // 'compat/compat': 2, // errors 'no-cond-assign': [2, 'always'], diff --git a/dev/Common/Booter.js b/dev/Common/Booter.js index a71cc739f..70309ae93 100644 --- a/dev/Common/Booter.js +++ b/dev/Common/Booter.js @@ -225,7 +225,7 @@ function runApp() p.setOptions({theme: 'rainloop'}); p.start().set(5); - const libs = jassl(appData.StaticLibJsLink).then(() => { + const libs = () => jassl(appData.StaticLibJsLink).then(() => { if (window.$) { window.$('#rl-check').remove(); @@ -243,12 +243,14 @@ function runApp() } }); - const common = window.Promise.all([ - jassl(appData.TemplatesLink), - jassl(appData.LangLink) - ]); - - window.Promise.all([libs, common]) + libs() + .then(() => { + p.set(20); + return window.Promise.all([ + jassl(appData.TemplatesLink), + jassl(appData.LangLink) + ]); + }) .then(() => { p.set(30); return jassl(useJsNextBundle ? appData.StaticAppJsNextLink : appData.StaticAppJsLink); diff --git a/dev/External/ko.js b/dev/External/ko.js index 3ef28aa30..f9c09e6ce 100644 --- a/dev/External/ko.js +++ b/dev/External/ko.js @@ -1209,7 +1209,7 @@ ko.observable.fn.validateEmail = function() { this.hasError = ko.observable(false); this.subscribe((value) => { - this.hasError('' !== value && !(/^[^@\s]+@[^@\s]+$/.test(value))); + this.hasError('' !== value && !((/^[^@\s]+@[^@\s]+$/).test(value))); }); this.valueHasMutated(); @@ -1221,7 +1221,7 @@ ko.observable.fn.validateSimpleEmail = function() { this.hasError = ko.observable(false); this.subscribe((value) => { - this.hasError('' !== value && !(/^.+@.+$/.test(value))); + this.hasError('' !== value && !((/^.+@.+$/).test(value))); }); this.valueHasMutated(); diff --git a/dev/View/Popup/AddOpenPgpKey.js b/dev/View/Popup/AddOpenPgpKey.js index 91a636adf..3bd094ac1 100644 --- a/dev/View/Popup/AddOpenPgpKey.js +++ b/dev/View/Popup/AddOpenPgpKey.js @@ -38,7 +38,7 @@ class AddOpenPgpKeyPopupView extends AbstractViewNext let keyTrimmed = trim(this.key()); - if (/[\n]/.test(keyTrimmed)) + if ((/[\n]/).test(keyTrimmed)) { keyTrimmed = keyTrimmed.replace(/[\r]+/g, '').replace(/[\n]{2,}/g, '\n\n'); } diff --git a/dev/View/Popup/Contacts.js b/dev/View/Popup/Contacts.js index efc9008fe..0ab41726c 100644 --- a/dev/View/Popup/Contacts.js +++ b/dev/View/Popup/Contacts.js @@ -327,7 +327,7 @@ class ContactsPopupView extends AbstractViewNext properties = []; _.each(this.viewProperties(), (oItem) => { - if (oItem.type() && '' !== trim(oItem.value())) + if (oItem.type() && oItem.type() !== ContactPropertyType.FullName && '' !== trim(oItem.value())) { properties.push([oItem.type(), oItem.value(), oItem.typeStr()]); } diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index c8d7aec4e..c82c6a630 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -465,7 +465,7 @@ class MessageListMailBoxUserView extends AbstractViewNext return false; } - if (/is:unseen/.test(this.mainMessageListSearch())) + if ((/is:unseen/).test(this.mainMessageListSearch())) { return false; } diff --git a/package.json b/package.json index b7481db6f..443c74a74 100644 --- a/package.json +++ b/package.json @@ -3,14 +3,14 @@ "title": "RainLoop Webmail", "description": "Simple, modern & fast web-based email client", "private": true, - "version": "1.12.0", - "ownCloudVersion": "5.1.0", - "homepage": "http://rainloop.net", + "version": "1.12.1", + "ownCloudVersion": "5.1.1", + "homepage": "https://www.rainloop.net", "main": "gulpfile.js", "author": { "name": "RainLoop Team", "email": "support@rainloop.net", - "web": "http://www.rainloop.net" + "web": "https://www.rainloop.net" }, "repository": { "type": "git", @@ -24,7 +24,7 @@ }, { "type": "RainLoop Software License", - "ulr": "http://www.rainloop.net/licensing/" + "ulr": "https://www.rainloop.net/licensing/" } ], "bugs": { @@ -43,40 +43,36 @@ "openpgp" ], "readmeFilename": "README.md", - "engines": { - "node": ">= 4" - }, "browserslist": [ "last 3 versions", - "ie >= 9", + "IE >= 9", "firefox esr" ], "devDependencies": { "autolinker": "1.6.2", "babel-core": "6.26.3", - "babel-eslint": "8.2.3", - "babel-loader": "7.1.4", - "babel-plugin-transform-decorators-legacy": "1.3.4", + "babel-eslint": "8.2.5", + "babel-loader": "7.1.5", + "babel-plugin-transform-decorators-legacy": "1.3.5", "babel-plugin-transform-runtime": "6.23.0", - "babel-preset-env": "1.6.1", + "babel-preset-env": "1.7.0", "babel-preset-stage-0": "6.24.1", "babel-runtime": "6.26.0", - "classnames": "2.2.5", - "copy-webpack-plugin": "4.5.1", + "classnames": "2.2.6", + "copy-webpack-plugin": "4.5.2", "element-dataset": "2.2.6", "emailjs-addressparser": "2.0.2", "es6-object-assign": "1.1.0", "es6-promise-polyfill": "1.2.0", - "eslint": "4.19.1", - "eslint-plugin-compat": "2.2.0", + "eslint": "5.1.0", "gulp": "3.9.1", "gulp-autoprefixer": "5.0.0", "gulp-cached": "1.1.1", "gulp-chmod": "2.0.0", - "gulp-clean-css": "3.9.3", + "gulp-clean-css": "3.9.4", "gulp-concat-util": "0.5.5", "gulp-eol": "0.2.0", - "gulp-eslint": "4.0.2", + "gulp-eslint": "5.0.0", "gulp-expect-file": "0.0.7", "gulp-filter": "5.1.0", "gulp-header": "2.0.5", @@ -85,8 +81,8 @@ "gulp-livereload": "3.8.1", "gulp-notify": "3.2.0", "gulp-plumber": "1.2.0", - "gulp-rename": "1.2.2", - "gulp-replace": "0.6.1", + "gulp-rename": "1.3.0", + "gulp-replace": "1.0.0", "gulp-rimraf": "0.2.2", "gulp-size": "3.0.0", "gulp-stripbom": "1.0.4", @@ -107,8 +103,8 @@ "knockout-sortable": "1.1.0", "knockout-transformations": "2.1.0", "lozad": "1.4.0", - "matchmedia-polyfill": "0.3.0", - "moment": "2.22.1", + "matchmedia-polyfill": "0.3.1", + "moment": "2.22.2", "node-fs": "0.1.7", "node-notifier": "5.2.1", "normalize.css": "8.0.0", @@ -118,10 +114,10 @@ "raw-loader": "0.5.1", "rimraf": "2.6.2", "run-sequence": "2.2.1", - "simplestatemanager": "4.1.0", + "simplestatemanager": "4.1.1", "style-loader": "0.21.0", - "underscore": "1.9.0", - "webpack": "4.6.0", + "underscore": "1.9.1", + "webpack": "4.15.1", "webpack-notifier": "1.6.0" } } diff --git a/yarn.lock b/yarn.lock index 8856171df..6d919f4c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,6309 +1,6061 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" - dependencies: - "@babel/highlight" "7.0.0-beta.44" - -"@babel/generator@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" - dependencies: - "@babel/types" "7.0.0-beta.44" - jsesc "^2.5.1" - lodash "^4.2.0" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/helper-function-name@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" - dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.44" - "@babel/template" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - -"@babel/helper-get-function-arity@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" - dependencies: - "@babel/types" "7.0.0-beta.44" - -"@babel/helper-split-export-declaration@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" - dependencies: - "@babel/types" "7.0.0-beta.44" - -"@babel/highlight@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -"@babel/template@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - lodash "^4.2.0" - -"@babel/traverse@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/generator" "7.0.0-beta.44" - "@babel/helper-function-name" "7.0.0-beta.44" - "@babel/helper-split-export-declaration" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - debug "^3.1.0" - globals "^11.1.0" - invariant "^2.2.0" - lodash "^4.2.0" - -"@babel/types@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" - dependencies: - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^2.0.0" - -abbrev@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" - -accord@^0.29.0: - version "0.29.0" - resolved "https://registry.yarnpkg.com/accord/-/accord-0.29.0.tgz#b741c176d00435c5929d466dfe8cf6bee933b1e4" - dependencies: - convert-source-map "^1.5.0" - glob "^7.0.5" - indx "^0.2.3" - lodash.clone "^4.3.2" - lodash.defaults "^4.0.1" - lodash.flatten "^4.2.0" - lodash.merge "^4.4.0" - lodash.partialright "^4.1.4" - lodash.pick "^4.2.1" - lodash.uniq "^4.3.0" - resolve "^1.5.0" - semver "^5.3.0" - uglify-js "^2.8.22" - when "^3.7.8" - -acorn-dynamic-import@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" - dependencies: - acorn "^5.0.0" - -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^5.0.0, acorn@^5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" - -acorn@^5.5.0: - version "5.5.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" - -ajv-keywords@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" - -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - -ajv-keywords@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be" - -ajv@^4.7.0, ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -ajv@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - json-schema-traverse "^0.3.0" - json-stable-stringify "^1.0.1" - -ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -ajv@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.0.tgz#afac295bbaa0152449e522742e4547c1ae9328d2" - dependencies: - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -ansi-colors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" - dependencies: - ansi-wrap "^0.1.0" - -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - dependencies: - ansi-wrap "0.1.0" - -ansi-escapes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" - -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - dependencies: - ansi-wrap "0.1.0" - -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - dependencies: - ansi-wrap "0.1.0" - -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.1.0, ansi-styles@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" - dependencies: - color-convert "^1.9.0" - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - dependencies: - color-convert "^1.9.0" - -ansi-wrap@0.1.0, ansi-wrap@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -aproba@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" - -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - -are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" - dependencies: - arr-flatten "^1.0.1" - array-slice "^0.2.3" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -arr-union@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - -array-each@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - -array-slice@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1, array-uniq@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -arrify@^1.0.0, arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - -asn1.js@^4.0.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - dependencies: - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async@^0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -atob@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" - -autolinker@1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.6.2.tgz#67ae9da272e808e0d8eb8e02cbc8cde303947457" - -autoprefixer@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-8.1.0.tgz#374cf35be1c0e8fce97408d876f95f66f5cb4641" - dependencies: - browserslist "^3.1.1" - caniuse-lite "^1.0.30000810" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^6.0.19" - postcss-value-parser "^3.2.3" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws4@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@6.26.3: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.7" - slash "^1.0.0" - source-map "^0.5.6" - -babel-eslint@8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.3.tgz#1a2e6681cc9bc4473c32899e59915e19cd6733cf" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/traverse" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - eslint-scope "~3.7.1" - eslint-visitor-keys "^1.0.0" - -babel-generator@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.6" - trim-right "^1.0.1" - -babel-helper-bindify-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-explode-class@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" - dependencies: - babel-helper-bindify-decorators "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-loader@7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.4.tgz#e3463938bd4e6d55d1c174c5485d406a188ed015" - dependencies: - find-cache-dir "^1.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-async-generators@^6.5.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" - -babel-plugin-syntax-class-constructor-call@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - -babel-plugin-syntax-decorators@^6.1.18, babel-plugin-syntax-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" - -babel-plugin-syntax-do-expressions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" - -babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-export-extensions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" - -babel-plugin-syntax-function-bind@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-generator-functions@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-class-constructor-call@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" - dependencies: - babel-plugin-syntax-class-constructor-call "^6.18.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-decorators-legacy@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz#741b58f6c5bce9e6027e0882d9c994f04f366925" - dependencies: - babel-plugin-syntax-decorators "^6.1.18" - babel-runtime "^6.2.0" - babel-template "^6.3.0" - -babel-plugin-transform-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" - dependencies: - babel-helper-explode-class "^6.24.1" - babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-do-expressions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" - dependencies: - babel-plugin-syntax-do-expressions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-export-extensions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" - dependencies: - babel-plugin-syntax-export-extensions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-function-bind@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" - dependencies: - babel-plugin-syntax-function-bind "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-runtime@6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-stage-0@6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" - dependencies: - babel-plugin-transform-do-expressions "^6.22.0" - babel-plugin-transform-function-bind "^6.22.0" - babel-preset-stage-1 "^6.24.1" - -babel-preset-stage-1@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" - dependencies: - babel-plugin-transform-class-constructor-call "^6.24.1" - babel-plugin-transform-export-extensions "^6.22.0" - babel-preset-stage-2 "^6.24.1" - -babel-preset-stage-2@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-plugin-transform-class-properties "^6.24.1" - babel-plugin-transform-decorators "^6.24.1" - babel-preset-stage-3 "^6.24.1" - -babel-preset-stage-3@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" - dependencies: - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-generator-functions "^6.24.1" - babel-plugin-transform-async-to-generator "^6.24.1" - babel-plugin-transform-exponentiation-operator "^6.24.1" - babel-plugin-transform-object-rest-spread "^6.22.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@6.26.0, babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@7.0.0-beta.44: - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base64-js@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -bean@0.x: - version "0.4.11" - resolved "https://registry.yarnpkg.com/bean/-/bean-0.4.11.tgz#544c2bcdb1223e451a0ce4d9b13ab59f75cbb1bb" - -beeper@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - -binary-extensions@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" - -binaryextensions@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755" - -bluebird@^3.0.6: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" - -bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - -body-parser@~1.14.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9" - dependencies: - bytes "2.2.0" - content-type "~1.0.1" - debug "~2.2.0" - depd "~1.1.0" - http-errors "~1.3.1" - iconv-lite "0.4.13" - on-finished "~2.3.0" - qs "5.2.0" - raw-body "~2.1.5" - type-is "~1.6.10" - -bonzo@1.x: - version "1.4.0" - resolved "https://registry.yarnpkg.com/bonzo/-/bonzo-1.4.0.tgz#d7d2e06f6b6f67eb3b8fc18774f79058f4ab34df" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -brace-expansion@^1.0.0, brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.0, braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.0.8" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.8.tgz#c8fa3b1b7585bb7ba77c5560b60996ddec6d5309" - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" - dependencies: - pako "~0.2.0" - -browserslist@^2.1.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.4.0.tgz#693ee93d01e66468a6348da5498e011f578f87f8" - dependencies: - caniuse-lite "^1.0.30000718" - electron-to-chromium "^1.3.18" - -browserslist@^2.11.3: - version "2.11.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" - dependencies: - caniuse-lite "^1.0.30000792" - electron-to-chromium "^1.3.30" - -browserslist@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.1.1.tgz#d380fc048bc3a33e60fb87dc135110ebaaa6320a" - dependencies: - caniuse-lite "^1.0.30000809" - electron-to-chromium "^1.3.33" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - -buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - -bytes@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588" - -bytes@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" - -cacache@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.1" - mississippi "^2.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^5.2.4" - unique-filename "^1.1.0" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -caniuse-db@^1.0.30000794: - version "1.0.30000810" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000810.tgz#bd25830c41efab64339a2e381f49677343c84509" - -caniuse-lite@^1.0.30000718: - version "1.0.30000730" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000730.tgz#26a14ff1b3bfc1f1cb4da75c2c73451b3f1ade1a" - -caniuse-lite@^1.0.30000792: - version "1.0.30000810" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000810.tgz#47585fffce0e9f3593a6feea4673b945424351d9" - -caniuse-lite@^1.0.30000809, caniuse-lite@^1.0.30000810: - version "1.0.30000813" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000813.tgz#7b25e27fdfb8d133f3c932b01f77452140fcc6c9" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^0.5.0, chalk@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - -chalk@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" - dependencies: - ansi-styles "^3.2.0" - escape-string-regexp "^1.0.5" - supports-color "^5.2.0" - -chalk@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chokidar@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.0" - optionalDependencies: - fsevents "^1.1.2" - -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - -chrome-trace-event@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz#d395af2d31c87b90a716c831fe326f69768ec084" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -classnames@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" - -clean-css@4.1.11: - version "4.1.11" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" - dependencies: - source-map "0.5.x" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -clone-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - -clone-stats@^0.0.1, clone-stats@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - -clone-stats@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" - -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - -clone@^1.0.0, clone@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" - -clone@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" - -cloneable-readable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117" - dependencies: - inherits "^2.0.1" - process-nextick-args "^1.0.6" - through2 "^2.0.1" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" - dependencies: - color-name "^1.1.1" - -color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" - -commander@~2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.5.0, concat-stream@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -concat-with-sourcemaps@*, concat-with-sourcemaps@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz#f55b3be2aeb47601b10a2d5259ccfb70fd2f1dd6" - dependencies: - source-map "^0.5.1" - -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - dependencies: - date-now "^0.1.4" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - -content-type@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - -convert-source-map@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" - -convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -copy-webpack-plugin@4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.1.tgz#fc4f68f4add837cc5e13d111b20715793225d29c" - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - globby "^7.1.1" - is-glob "^4.0.0" - loader-utils "^1.1.0" - minimatch "^3.0.4" - p-limit "^1.0.0" - serialize-javascript "^1.4.0" - -core-js@^2.4.0, core-js@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -create-ecdh@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - ripemd160 "^2.0.0" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.6" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -crypto-browserify@^3.11.0: - version "3.11.1" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - -dateformat@^1.0.7-1.2.3: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - -dateformat@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" - -debug@^2.1.0, debug@^2.2.0, debug@^2.6.8: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - dependencies: - ms "2.0.0" - -debug@^2.1.2, debug@^2.3.3, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - -decamelize@^1.0.0, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - -deep-assign@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b" - dependencies: - is-obj "^1.0.0" - -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -defaults@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - dependencies: - clone "^1.0.2" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -depd@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - -deprecated@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" - -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-file@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" - dependencies: - fs-exists-sync "^0.1.0" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - -diffie-hellman@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - -doctrine@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - dependencies: - esutils "^2.0.2" - -domain-browser@^1.1.1: - version "1.1.7" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" - -domready@0.x: - version "0.3.0" - resolved "https://registry.yarnpkg.com/domready/-/domready-0.3.0.tgz#b3740facbd09163018152d12aec239383e102175" - -duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - dependencies: - readable-stream "~1.1.9" - -duplexer2@~0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - dependencies: - readable-stream "^2.0.2" - -duplexer@^0.1.1, duplexer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - -duplexify@^3.4.2, duplexify@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.3.tgz#8b5818800df92fd0125b27ab896491912858243e" - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -duplexify@^3.5.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd" - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -electron-to-chromium@^1.3.18: - version "1.3.21" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.21.tgz#a967ebdcfe8ed0083fc244d1894022a8e8113ea2" - -electron-to-chromium@^1.3.30: - version "1.3.34" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.34.tgz#d93498f40391bb0c16a603d8241b9951404157ed" - -electron-to-chromium@^1.3.33: - version "1.3.36" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.36.tgz#0eabf71a9ebea9013fb1cc35a390e068624f27e8" - -element-dataset@2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/element-dataset/-/element-dataset-2.2.6.tgz#a4e46dbb3ee991e8c7d5366ec654f87670c2ef80" - dependencies: - babel-runtime "^6.23.0" - -elliptic@^6.0.0: - version "6.4.0" - resolved "https://codeload.github.com/openpgpjs/elliptic/tar.gz/e187e706e11fa51bcd20e46e5119054be4e2a4a6" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emailjs-addressparser@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/emailjs-addressparser/-/emailjs-addressparser-2.0.2.tgz#fa8e6ff989667da8ae41d7316a7dfe6abe3c9d51" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - dependencies: - iconv-lite "~0.4.13" - -end-of-stream@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" - dependencies: - once "^1.4.0" - -end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - dependencies: - once "^1.4.0" - -end-of-stream@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" - dependencies: - once "~1.3.0" - -enhanced-resolve@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a" - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - -errno@^0.1.1, errno@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" - dependencies: - prr "~0.0.0" - -errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - -es6-object-assign@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" - -es6-promise-polyfill@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz#f38925f23cb3e3e8ce6cda8ff774fcebbb090cde" - -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -eslint-plugin-compat@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-compat/-/eslint-plugin-compat-2.2.0.tgz#d612a9988d9fba66bcd8e86fcc1b551753aac995" - dependencies: - babel-runtime "^6.26.0" - browserslist "^2.11.3" - caniuse-db "^1.0.30000794" - mdn-browser-compat-data "^0.0.20" - requireindex "^1.1.0" - -eslint-scope@^3.7.1, eslint-scope@~3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - -eslint@4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.4" - esquery "^1.0.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - regexpp "^1.0.1" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" - -eslint@^4.0.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.6.1.tgz#ddc7fc7fd70bf93205b0b3449bb16a1e9e7d4950" - dependencies: - ajv "^5.2.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^2.6.8" - doctrine "^2.0.0" - eslint-scope "^3.7.1" - espree "^3.5.0" - esquery "^1.0.0" - estraverse "^4.2.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^9.17.0" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^4.0.0" - progress "^2.0.0" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "^4.0.1" - text-table "~0.2.0" - -espree@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.0.tgz#98358625bdd055861ea27e2867ea729faf463d8d" - dependencies: - acorn "^5.1.1" - acorn-jsx "^3.0.0" - -espree@^3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" - dependencies: - estraverse "^4.1.0" - object-assign "^4.0.1" - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -event-stream@^3.1.7: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - dependencies: - os-homedir "^1.0.1" - -expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - dependencies: - homedir-polyfill "^1.0.1" - -extend-shallow@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" - dependencies: - kind-of "^1.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@3.0.1, extend@^3.0.0, extend@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -external-editor@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" - dependencies: - iconv-lite "^0.4.17" - jschardet "^1.4.2" - tmp "^0.0.31" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0, extsprintf@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -fancy-log@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" - dependencies: - chalk "^1.1.1" - time-stamp "^1.0.0" - -fancy-log@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - time-stamp "^1.0.0" - -fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -faye-websocket@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11" - dependencies: - websocket-driver ">=0.3.6" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - -find-index@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -findup-sync@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" - dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" - -fined@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" - dependencies: - expand-tilde "^2.0.2" - is-plain-object "^2.0.3" - object.defaults "^1.1.0" - object.pick "^1.2.0" - parse-filepath "^1.0.1" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - -flagged-respawn@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" - -flat-cache@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - -flush-write-stream@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -for-own@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -fork-stream@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70" - -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -from@~0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - dependencies: - minipass "^2.2.1" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.1.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.3.tgz#08292982e7059f6674c93d8b829c1e8604979ac0" - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.9.0" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" - dependencies: - globule "~0.1.0" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-stream@^3.1.5: - version "3.1.18" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" - dependencies: - glob "^4.3.1" - glob2base "^0.0.12" - minimatch "^2.0.1" - ordered-read-streams "^0.1.0" - through2 "^0.6.1" - unique-stream "^1.0.0" - -glob-watcher@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" - dependencies: - gaze "^0.5.1" - -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - dependencies: - find-index "^0.1.1" - -glob@^4.3.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - -glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@~3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" - -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" - -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - dependencies: - homedir-polyfill "^1.0.0" - ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" - -globals@^11.0.1, globals@^11.1.0: - version "11.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" - -globals@^9.17.0, globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globby@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" - dependencies: - array-union "^1.0.1" - dir-glob "^2.0.0" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -globule@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" - dependencies: - glob "~3.1.21" - lodash "~1.0.1" - minimatch "~0.2.11" - -glogg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" - dependencies: - sparkles "^1.0.0" - -graceful-fs@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - dependencies: - natives "^1.1.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - -gulp-autoprefixer@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-5.0.0.tgz#8237c278a69775270a1cafe7d6f101cfcd585544" - dependencies: - autoprefixer "^8.0.0" - fancy-log "^1.3.2" - plugin-error "^1.0.1" - postcss "^6.0.1" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-cached@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/gulp-cached/-/gulp-cached-1.1.1.tgz#fe7cd4f87f37601e6073cfedee5c2bdaf8b6acce" - dependencies: - lodash.defaults "^4.2.0" - through2 "^2.0.1" - -gulp-chmod@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/gulp-chmod/-/gulp-chmod-2.0.0.tgz#00c390b928a0799b251accf631aa09e01cc6299c" - dependencies: - deep-assign "^1.0.0" - stat-mode "^0.2.0" - through2 "^2.0.0" - -gulp-clean-css@3.9.3: - version "3.9.3" - resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.9.3.tgz#47bf7ad62f44970f86e4ac4bdeed68ad904e65c5" - dependencies: - clean-css "4.1.11" - plugin-error "1.0.1" - through2 "2.0.3" - vinyl-sourcemaps-apply "0.2.1" - -gulp-concat-util@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/gulp-concat-util/-/gulp-concat-util-0.5.5.tgz#c8f0633b4e6e950ff93c475b3c8d3b84be03b7dc" - dependencies: - concat-with-sourcemaps "^1.0.4" - gulp-if "^2.0.0" - gulp-util "^3.0.6" - lodash.assign "^3.2.0" - stream-combiner2 "^1.1.1" - through2 "^2.0.0" - -gulp-eol@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/gulp-eol/-/gulp-eol-0.2.0.tgz#f0afe3bbffedbe9d191a76ac2dfbfa2167e9d33e" - dependencies: - plugin-error "~1.0" - through2 "~0.4" - -gulp-eslint@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/gulp-eslint/-/gulp-eslint-4.0.2.tgz#18a2a6768e4404cbf3e203239cb57474168fa606" - dependencies: - eslint "^4.0.0" - fancy-log "^1.3.2" - plugin-error "^1.0.0" - -gulp-expect-file@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/gulp-expect-file/-/gulp-expect-file-0.0.7.tgz#913e731db0dd6f5866149ba400ad835eb34623ad" - dependencies: - async "^0.9.0" - gulp-util "^2.2.16" - minimatch "^0.3.0" - through2 "^1.0.0" - xtend "^3.0.0" - -gulp-filter@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-5.1.0.tgz#a05e11affb07cf7dcf41a7de1cb7b63ac3783e73" - dependencies: - multimatch "^2.0.0" - plugin-error "^0.1.2" - streamfilter "^1.0.5" - -gulp-header@2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-2.0.5.tgz#16e229c73593ade301168024fea68dab75d9d38c" - dependencies: - concat-with-sourcemaps "*" - lodash.template "^4.4.0" - through2 "^2.0.0" - -gulp-if@2.0.2, gulp-if@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-2.0.2.tgz#a497b7e7573005041caa2bc8b7dda3c80444d629" - dependencies: - gulp-match "^1.0.3" - ternary-stream "^2.0.1" - through2 "^2.0.1" - -gulp-less@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gulp-less/-/gulp-less-4.0.0.tgz#3c49deb96bdca913e436921ef792fb4c24296fcd" - dependencies: - accord "^0.29.0" - less "2.6.x || ^3.0.0" - object-assign "^4.0.1" - plugin-error "^0.1.2" - replace-ext "^1.0.0" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-livereload@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/gulp-livereload/-/gulp-livereload-3.8.1.tgz#00f744b2d749d3e9e3746589c8a44acac779b50f" - dependencies: - chalk "^0.5.1" - debug "^2.1.0" - event-stream "^3.1.7" - gulp-util "^3.0.2" - lodash.assign "^3.0.0" - mini-lr "^0.1.8" - -gulp-match@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.0.3.tgz#91c7c0d7f29becd6606d57d80a7f8776a87aba8e" - dependencies: - minimatch "^3.0.3" - -gulp-notify@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/gulp-notify/-/gulp-notify-3.2.0.tgz#2ae8225009df881eef59be5dd5a2f1337387764e" - dependencies: - ansi-colors "^1.0.1" - fancy-log "^1.3.2" - lodash.template "^4.4.0" - node-notifier "^5.2.1" - node.extend "^2.0.0" - plugin-error "^0.1.2" - through2 "^2.0.3" - -gulp-plumber@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.2.0.tgz#18ea03912c9ee483f8a5499973b5954cd90f6ad8" - dependencies: - chalk "^1.1.3" - fancy-log "^1.3.2" - plugin-error "^0.1.2" - through2 "^2.0.3" - -gulp-rename@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817" - -gulp-replace@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-0.6.1.tgz#11bf8c8fce533e33e2f6a8f2f430b955ba0be066" - dependencies: - istextorbinary "1.0.2" - readable-stream "^2.0.1" - replacestream "^4.0.0" - -gulp-rimraf@0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/gulp-rimraf/-/gulp-rimraf-0.2.2.tgz#967f309ab19c207e131e008218a5f01e1f13e1ce" - dependencies: - rimraf "^2.6.2" - through2 "^2.0.3" - -gulp-size@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gulp-size/-/gulp-size-3.0.0.tgz#cb1ac8e6ba83dede52430c47fd039324f003ff82" - dependencies: - chalk "^2.3.0" - fancy-log "^1.3.2" - gzip-size "^4.1.0" - plugin-error "^0.1.2" - pretty-bytes "^4.0.2" - stream-counter "^1.0.0" - through2 "^2.0.0" - -gulp-stripbom@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/gulp-stripbom/-/gulp-stripbom-1.0.4.tgz#58c1d03e85e008a7aab47d81b1297c8c1bc828eb" - dependencies: - gulp-util "^3.0.0" - log-symbols "^1.0.0" - strip-bom "^1.0.0" - through2 "^0.5.1" - -gulp-through@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/gulp-through/-/gulp-through-0.4.0.tgz#6463b29f678c788540b63aa6a1bad5bd8552ae6d" - dependencies: - bluebird "^3.0.6" - chalk "^1.1.1" - gulp-util "^3.0.7" - through2 "^2.0.0" - xtend "^4.0.1" - -gulp-uglify@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca" - dependencies: - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash "^4.13.1" - make-error-cause "^1.1.1" - through2 "^2.0.0" - uglify-js "^3.0.5" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-util@3.0.8, gulp-util@^3.0.0, gulp-util@^3.0.2, gulp-util@^3.0.6, gulp-util@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp-util@^2.2.16: - version "2.2.20" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" - dependencies: - chalk "^0.5.0" - dateformat "^1.0.7-1.2.3" - lodash._reinterpolate "^2.4.1" - lodash.template "^2.4.1" - minimist "^0.2.0" - multipipe "^0.1.0" - through2 "^0.5.0" - vinyl "^0.2.1" - -gulp-zip@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-4.1.0.tgz#dab178bd99afa190923f1eb78abaf0db47817704" - dependencies: - get-stream "^3.0.0" - plugin-error "^0.1.2" - through2 "^2.0.1" - vinyl "^2.1.0" - yazl "^2.1.0" - -gulp@3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" - dependencies: - archy "^1.0.0" - chalk "^1.0.0" - deprecated "^0.0.1" - gulp-util "^3.0.0" - interpret "^1.0.0" - liftoff "^2.1.0" - minimist "^1.1.0" - orchestrator "^0.3.0" - pretty-hrtime "^1.0.0" - semver "^4.1.0" - tildify "^1.0.0" - v8flags "^2.0.2" - vinyl-fs "^0.3.0" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - dependencies: - glogg "^1.0.0" - -gzip-size@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-4.1.0.tgz#8ae096257eabe7d69c45be2b67c448124ffb517c" - dependencies: - duplexer "^0.1.1" - pify "^3.0.0" - -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - dependencies: - ansi-regex "^0.2.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - dependencies: - sparkles "^1.0.0" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -hash-base@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" - dependencies: - inherits "^2.0.1" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" - -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" - -http-errors@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" - dependencies: - inherits "~2.0.1" - statuses "1" - -http-parser-js@>=0.4.0: - version "0.4.6" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.6.tgz#195273f58704c452d671076be201329dd341dc55" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" - -iconv-lite@0.4.13: - version "0.4.13" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" - -iconv-lite@^0.4.17, iconv-lite@~0.4.13: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - -iconv-lite@^0.4.4: - version "0.4.21" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798" - dependencies: - safer-buffer "^2.1.0" - -ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - -ifvisible.js@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/ifvisible.js/-/ifvisible.js-1.0.6.tgz#52eb151ce89c56f15316226462e892d1f8451261" - -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - dependencies: - minimatch "^3.0.4" - -ignore@^3.3.3: - version "3.3.5" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.5.tgz#c4e715455f6073a8d7e5dae72d2fc9d71663dba6" - -ignore@^3.3.5: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" - -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - -indx@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - -ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - -inquirer@^3.0.6: - version "3.2.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.2.3.tgz#1c7b1731cf77b934ec47d22c9ac5aa8fe7fbe095" - dependencies: - ansi-escapes "^2.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -interpret@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" - -intersection-observer@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.5.0.tgz#9fe8bee3953c755b1485c38efd9633d535775ea6" - -invariant@^2.2.0, invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - dependencies: - loose-envify "^1.0.0" - -is-absolute@^0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" - dependencies: - is-relative "^0.2.1" - is-windows "^0.2.0" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - dependencies: - is-extglob "^2.1.1" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - dependencies: - path-is-inside "^1.0.1" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - -is-relative@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" - dependencies: - is-unc-path "^0.1.1" - -is-resolvable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" - dependencies: - tryit "^1.0.1" - -is-stream@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-unc-path@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" - dependencies: - unc-path-regex "^0.1.0" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - -is@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -istextorbinary@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-1.0.2.tgz#ace19354d1a9a0173efeb1084ce0f87b0ad7decf" - dependencies: - binaryextensions "~1.0.0" - textextensions "~1.0.0" - -jquery-backstretch@2.1.16: - version "2.1.16" - resolved "https://registry.yarnpkg.com/jquery-backstretch/-/jquery-backstretch-2.1.16.tgz#4ee7547dcb85cf69eed2639cac0c9131651dc5e7" - dependencies: - jquery "^3.1.1" - -jquery-mousewheel@3.1.13: - version "3.1.13" - resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" - -jquery-scrollstop@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/jquery-scrollstop/-/jquery-scrollstop-1.2.0.tgz#f1827a25cf12887d965c085d8a75035655b37663" - dependencies: - jquery ">=1.2.3" - -jquery@2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.4.tgz#2c89d6889b5eac522a7eea32c14521559c6cbf02" - -jquery@>=1.2.3, jquery@^3.1.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" - -js-cookie@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.0.tgz#1b2c279a6eece380a12168b92485265b35b1effb" - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -js-yaml@^3.9.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jschardet@^1.4.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-loader@0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json3@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - -json5@^0.5.0, json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -kind-of@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - -knockout-sortable@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/knockout-sortable/-/knockout-sortable-1.1.0.tgz#fc4f8adb68613950d39fe6bb8b0ccadead9485d2" - -knockout-transformations@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/knockout-transformations/-/knockout-transformations-2.1.0.tgz#c9a9148dbe1649dc00518eccea704379aadb0097" - -knockout@3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/knockout/-/knockout-3.4.2.tgz#e87958de77ad1e936f7ce645bab8b5d7c456d937" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -"less@2.6.x || ^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/less/-/less-3.0.1.tgz#ba2fea24a5632ccb8c84230d6043c0bf91855e37" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - mime "^1.4.1" - mkdirp "^0.5.0" - promise "^7.1.1" - request "2.81.0" - source-map "^0.5.3" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -liftoff@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" - dependencies: - extend "^3.0.0" - findup-sync "^0.4.2" - fined "^1.0.1" - flagged-respawn "^0.3.2" - lodash.isplainobject "^4.0.4" - lodash.isstring "^4.0.1" - lodash.mapvalues "^4.4.0" - rechoir "^0.6.2" - resolve "^1.1.7" - -livereload-js@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" - -loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -lodash._baseassign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" - dependencies: - lodash._basecopy "^3.0.0" - lodash.keys "^3.0.0" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - -lodash._bindcallback@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - -lodash._createassigner@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" - dependencies: - lodash._bindcallback "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash.restparam "^3.0.0" - -lodash._escapehtmlchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" - dependencies: - lodash._htmlescapes "~2.4.1" - -lodash._escapestringchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash._htmlescapes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - -lodash._isnative@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" - -lodash._objecttypes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - -lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" - -lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - -lodash._reunescapedhtml@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" - dependencies: - lodash._htmlescapes "~2.4.1" - lodash.keys "~2.4.1" - -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - -lodash._shimkeys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.assign@^3.0.0, lodash.assign@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" - dependencies: - lodash._baseassign "^3.0.0" - lodash._createassigner "^3.0.0" - lodash.keys "^3.0.0" - -lodash.clone@^4.3.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" - -lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - -lodash.defaults@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" - dependencies: - lodash._objecttypes "~2.4.1" - lodash.keys "~2.4.1" - -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - dependencies: - lodash._root "^3.0.0" - -lodash.escape@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" - dependencies: - lodash._escapehtmlchar "~2.4.1" - lodash._reunescapedhtml "~2.4.1" - lodash.keys "~2.4.1" - -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - -lodash.isobject@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.isplainobject@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.keys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" - dependencies: - lodash._isnative "~2.4.1" - lodash._shimkeys "~2.4.1" - lodash.isobject "~2.4.1" - -lodash.mapvalues@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" - -lodash.merge@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" - -lodash.partialright@^4.1.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b" - -lodash.pick@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - -lodash.template@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" - dependencies: - lodash._escapestringchar "~2.4.1" - lodash._reinterpolate "~2.4.1" - lodash.defaults "~2.4.1" - lodash.escape "~2.4.1" - lodash.keys "~2.4.1" - lodash.templatesettings "~2.4.1" - lodash.values "~2.4.1" - -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.template@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - dependencies: - lodash._reinterpolate "~3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - -lodash.templatesettings@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" - dependencies: - lodash._reinterpolate "~3.0.0" - -lodash.templatesettings@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" - dependencies: - lodash._reinterpolate "~2.4.1" - lodash.escape "~2.4.1" - -lodash.uniq@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - -lodash.values@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" - dependencies: - lodash.keys "~2.4.1" - -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - -lodash@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" - -log-symbols@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - dependencies: - chalk "^1.0.0" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lozad@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.4.0.tgz#78d29514608074a34645ba1c5c7747f82c14cbfc" - -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - -lru-cache@^4.0.1, lru-cache@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -make-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" - dependencies: - pify "^2.3.0" - -make-error-cause@^1.1.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" - dependencies: - make-error "^1.2.0" - -make-error@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" - -map-cache@^0.2.0, map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -matchmedia-polyfill@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/matchmedia-polyfill/-/matchmedia-polyfill-0.3.0.tgz#6f91e34012b3dfc9d5b76cec89deafc1b41b45fa" - -md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -mdn-browser-compat-data@^0.0.20: - version "0.0.20" - resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-0.0.20.tgz#26e4a226d96cc5318fdc504d6dfd86907752da5c" - dependencies: - extend "3.0.1" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - -memory-fs@^0.4.0, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-stream@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - dependencies: - readable-stream "^2.0.1" - -micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.4, micromatch@^3.1.8: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - -mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.7: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" - dependencies: - mime-db "~1.30.0" - -mime@^1.4.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - -mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" - -mini-lr@^0.1.8: - version "0.1.9" - resolved "https://registry.yarnpkg.com/mini-lr/-/mini-lr-0.1.9.tgz#02199d27347953d1fd1d6dbded4261f187b2d0f6" - dependencies: - body-parser "~1.14.0" - debug "^2.2.0" - faye-websocket "~0.7.2" - livereload-js "^2.2.0" - parseurl "~1.3.0" - qs "~2.2.3" - -minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - -minimatch@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimatch@^2.0.1: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" - -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimatch@~0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" - -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -minipass@^2.2.1, minipass@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.2.4.tgz#03c824d84551ec38a8d1bb5bc350a5a30a354a40" - dependencies: - safe-buffer "^5.1.1" - yallist "^3.0.0" - -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" - dependencies: - minipass "^2.2.1" - -mississippi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^2.0.1" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -moment@2.22.1: - version "2.22.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.1.tgz#529a2e9bf973f259c9643d237fda84de3a26e8ad" - -moment@2.x: - version "2.18.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -multimatch@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - dependencies: - array-differ "^1.0.0" - array-union "^1.0.1" - arrify "^1.0.0" - minimatch "^3.0.0" - -multipipe@^0.1.0, multipipe@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - dependencies: - duplexer2 "0.0.2" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - -nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - -nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-odd "^2.0.0" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natives@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -needle@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - -neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" - -node-fetch@^1.3.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-fs@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/node-fs/-/node-fs-0.1.7.tgz#32323cccb46c9fbf0fc11812d45021cc31d325bb" - -node-libs-browser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" - dependencies: - assert "^1.1.1" - browserify-zlib "^0.1.4" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "0.0.1" - os-browserify "^0.2.0" - path-browserify "0.0.0" - process "^0.11.0" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.0.5" - stream-browserify "^2.0.1" - stream-http "^2.3.1" - string_decoder "^0.10.25" - timers-browserify "^2.0.2" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-localstorage@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-1.3.0.tgz#2e436aae8dcc9ace97b43c65c16c0d577be0a55c" - dependencies: - write-file-atomic "^1.1.4" - -node-notifier@5.2.1, node-notifier@^5.1.2, node-notifier@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" - dependencies: - growly "^1.3.0" - semver "^5.4.1" - shellwords "^0.1.1" - which "^1.3.0" - -node-pre-gyp@^0.9.0: - version "0.9.1" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0" - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.0" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.1.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node.extend@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-2.0.0.tgz#7525a2875677ea534784a5e10ac78956139614df" - dependencies: - is "^3.2.1" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - -normalize.css@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.0.tgz#14ac5e461612538a4ce9be90a7da23f86e718493" - -npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" - -npm-packlist@^1.1.6: - version "1.1.10" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" - -object.defaults@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" - dependencies: - array-each "^1.0.1" - array-slice "^1.0.0" - for-own "^1.0.0" - isobject "^3.0.0" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.2.0, object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - dependencies: - mimic-fn "^1.0.0" - -openpgp@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-2.6.2.tgz#1039d5070dc01c04e51fab58273fdf29a1ee098b" - dependencies: - node-fetch "^1.3.3" - node-localstorage "~1.3.0" - -opentip@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/opentip/-/opentip-2.4.3.tgz#2a3b500c2738f8069c33462ed48b5afe9ce804e6" - dependencies: - bean "0.x" - bonzo "1.x" - domready "0.x" - qwery "3.x" - reqwest "0.x" - -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -orchestrator@^0.3.0: - version "0.3.8" - resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" - dependencies: - end-of-stream "~0.1.5" - sequencify "~0.0.7" - stream-consume "~0.1.0" - -ordered-read-streams@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" - -os-browserify@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" - -os-homedir@^1.0.0, os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-limit@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" - dependencies: - p-try "^1.0.0" - -p-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - -parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - dependencies: - cyclist "~0.2.2" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parse-asn1@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - -parse-filepath@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" - dependencies: - is-absolute "^0.2.3" - map-cache "^0.2.0" - path-root "^0.1.1" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - -parseurl@~1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - dependencies: - path-root-regex "^0.1.0" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - dependencies: - pify "^3.0.0" - -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - dependencies: - through "~2.3" - -pbkdf2@^3.0.3: - version "3.0.14" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - -pikaday@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/pikaday/-/pikaday-1.7.0.tgz#78bf26e709f7c135b674762bbab79d75ac589ab6" - optionalDependencies: - moment "2.x" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - dependencies: - find-up "^2.1.0" - -plugin-error@1.0.1, plugin-error@^1.0.0, plugin-error@^1.0.1, plugin-error@~1.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" - dependencies: - ansi-colors "^1.0.1" - arr-diff "^4.0.0" - arr-union "^3.1.0" - extend-shallow "^3.0.2" - -plugin-error@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" - dependencies: - ansi-cyan "^0.1.1" - ansi-red "^0.1.1" - arr-diff "^1.0.1" - arr-union "^2.0.1" - extend-shallow "^1.1.2" - -pluralize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" - -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -postcss-value-parser@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" - -postcss@^6.0.1: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.11.tgz#f48db210b1d37a7f7ab6499b7a54982997ab6f72" - dependencies: - chalk "^2.1.0" - source-map "^0.5.7" - supports-color "^4.4.0" - -postcss@^6.0.19: - version "6.0.19" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.19.tgz#76a78386f670b9d9494a655bf23ac012effd1555" - dependencies: - chalk "^2.3.1" - source-map "^0.6.1" - supports-color "^5.2.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -pretty-bytes@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" - -pretty-hrtime@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - -private@^0.1.6, private@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" - -private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - -process-nextick-args@^1.0.6, process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -process@^0.11.0: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - -progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - dependencies: - asap "~2.0.3" - -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -public-encrypt@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - -pump@^2.0.0, pump@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.4.0.tgz#80b7c5df7e24153d03f0e7ac8a05a5d068bd07fb" - dependencies: - duplexify "^3.5.3" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - -punycode@^1.2.4, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -qs@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be" - -qs@~2.2.3: - version "2.2.5" - resolved "https://registry.yarnpkg.com/qs/-/qs-2.2.5.tgz#1088abaf9dcc0ae5ae45b709e6c6b5888b23923c" - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - -qwery@3.x: - version "3.4.2" - resolved "https://registry.yarnpkg.com/qwery/-/qwery-3.4.2.tgz#7d0af3ebcf48af599f2ed498d8ce39023978a63e" - -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -randombytes@^2.0.0, randombytes@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" - dependencies: - safe-buffer "^5.1.0" - -raw-body@~2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" - dependencies: - bytes "2.4.0" - iconv-lite "0.4.13" - unpipe "1.0.0" - -raw-loader@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" - -rc@^1.1.7: - version "1.2.1" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -"readable-stream@1 || 2", readable-stream@^2.0.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -"readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - dependencies: - resolve "^1.1.6" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -regenerate@^1.2.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" - -regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.0.1.tgz#d857c3a741dce075c2848dcb019a0a975b190d43" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - -replace-ext@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" - -replacestream@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36" - dependencies: - escape-string-regexp "^1.0.3" - object-assign "^4.0.1" - readable-stream "^2.0.2" - -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -requireindex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" - -reqwest@0.x: - version "0.9.7" - resolved "https://registry.yarnpkg.com/reqwest/-/reqwest-0.9.7.tgz#11a2de9704dc8d52c9675265d7177103febf3a63" - -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" - -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -resolve@^1.1.6, resolve@^1.1.7: - version "1.4.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" - dependencies: - path-parse "^1.0.5" - -resolve@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" - dependencies: - path-parse "^1.0.5" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" - dependencies: - hash-base "^2.0.0" - inherits "^2.0.1" - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - dependencies: - is-promise "^2.1.0" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - dependencies: - aproba "^1.1.1" - -run-sequence@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/run-sequence/-/run-sequence-2.2.1.tgz#1ce643da36fd8c7ea7e1a9329da33fc2b8898495" - dependencies: - chalk "^1.1.3" - fancy-log "^1.3.2" - plugin-error "^0.1.2" - -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - -schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - -"semver@2 || 3 || 4 || 5", semver@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - -semver@^4.1.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -semver@^5.4.1: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - -sequencify@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" - -serialize-javascript@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005" - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.8" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" - dependencies: - inherits "^2.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - -sigmund@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -simplestatemanager@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/simplestatemanager/-/simplestatemanager-4.1.0.tgz#4830106037c188dd66251965bf8e9bc0c9f126ef" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - dependencies: - is-fullwidth-code-point "^2.0.0" - -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" - -source-map-resolve@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" - dependencies: - atob "^2.0.0" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - -source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.3: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -sparkles@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" - -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -ssri@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.2.4.tgz#9985e14041e65fc397af96542be35724ac11da52" - dependencies: - safe-buffer "^5.1.1" - -stat-mode@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -statuses@1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - -stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-combiner2@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" - dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" - -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - dependencies: - duplexer "~0.1.1" - -stream-consume@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" - -stream-counter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-1.0.0.tgz#91cf2569ce4dc5061febcd7acb26394a5a114751" - -stream-each@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.3.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.2.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - -streamfilter@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/streamfilter/-/streamfilter-1.0.5.tgz#87507111beb8e298451717b511cfed8f002abf53" - dependencies: - readable-stream "^2.0.2" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@^0.10.25, string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - dependencies: - ansi-regex "^0.2.1" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-bom@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" - dependencies: - first-chunk-stream "^1.0.0" - is-utf8 "^0.2.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -style-loader@0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" - dependencies: - loader-utils "^1.1.0" - schema-utils "^0.4.5" - -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^4.0.0, supports-color@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" - dependencies: - has-flag "^2.0.0" - -supports-color@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a" - dependencies: - has-flag "^3.0.0" - -supports-color@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" - dependencies: - has-flag "^3.0.0" - -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - -table@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" - dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" - -tapable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" - -tar@^4: - version "4.4.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.1.tgz#b25d5a8470c976fd7a9a8a350f42c59e9fa81749" - dependencies: - chownr "^1.0.1" - fs-minipass "^1.2.5" - minipass "^2.2.4" - minizlib "^1.1.0" - mkdirp "^0.5.0" - safe-buffer "^5.1.1" - yallist "^3.0.2" - -ternary-stream@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.0.1.tgz#064e489b4b5bf60ba6a6b7bc7f2f5c274ecf8269" - dependencies: - duplexify "^3.5.0" - fork-stream "^0.0.4" - merge-stream "^1.0.0" - through2 "^2.0.1" - -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -textextensions@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-1.0.2.tgz#65486393ee1f2bb039a60cbba05b0b68bd9501d2" - -through2@2.0.3, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through2@^0.5.0, through2@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" - dependencies: - readable-stream "~1.0.17" - xtend "~3.0.0" - -through2@^0.6.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545" - dependencies: - readable-stream ">=1.1.13-1 <1.2.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@~0.4: - version "0.4.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" - dependencies: - readable-stream "~1.0.17" - xtend "~2.1.1" - -through@2, through@^2.3.6, through@~2.3, through@~2.3.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -tildify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - dependencies: - os-homedir "^1.0.0" - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - -timers-browserify@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6" - dependencies: - setimmediate "^1.0.4" - -tmp@^0.0.31: - version "0.0.31" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" - dependencies: - os-tmpdir "~1.0.1" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@~2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" - dependencies: - punycode "^1.4.1" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -tryit@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -type-is@~1.6.10: - version "1.6.15" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.15" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - -uglify-js@^2.8.22: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-js@^3.0.5: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.0.tgz#92fae17b88dfbc3c394175a935044cdbcf4085ae" - dependencies: - commander "~2.11.0" - source-map "~0.5.1" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -uglifyjs-webpack-plugin@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz#2ef8387c8f1a903ec5e44fa36f9f3cbdcea67641" - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - schema-utils "^0.4.5" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-es "^3.3.4" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -unc-path-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - -underscore@1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.0.tgz#31dbb314cfcc88f169cd3692d9149d81a00a73e4" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -unique-filename@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" - dependencies: - imurmurhash "^0.1.4" - -unique-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" - -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.5.tgz#02cab9ecebe95bbec6d5fc2566325725ab6d1a73" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" - dependencies: - kind-of "^6.0.2" - -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -util@0.10.3, util@^0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - -uuid@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - -v8flags@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - dependencies: - user-home "^1.1.1" - -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vinyl-fs@^0.3.0: - version "0.3.14" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" - dependencies: - defaults "^1.0.0" - glob-stream "^3.1.5" - glob-watcher "^0.0.6" - graceful-fs "^3.0.0" - mkdirp "^0.5.0" - strip-bom "^1.0.0" - through2 "^0.6.1" - vinyl "^0.4.0" - -vinyl-sourcemaps-apply@0.2.1, vinyl-sourcemaps-apply@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" - dependencies: - source-map "^0.5.1" - -vinyl@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" - dependencies: - clone-stats "~0.0.1" - -vinyl@^0.4.0: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vinyl@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c" - dependencies: - clone "^2.1.1" - clone-buffer "^1.0.0" - clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" - -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - dependencies: - indexof "0.0.1" - -watchpack@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - dependencies: - chokidar "^2.0.2" - graceful-fs "^4.1.2" - neo-async "^2.5.0" - -webpack-notifier@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/webpack-notifier/-/webpack-notifier-1.6.0.tgz#ffac8e55ff8c469752b8c1bbb011a16f10986e02" - dependencies: - node-notifier "^5.1.2" - object-assign "^4.1.0" - strip-ansi "^3.0.1" - -webpack-sources@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.1.tgz#c7356436a4d13123be2e2426a05d1dad9cbe65cf" - dependencies: - source-list-map "^2.0.0" - source-map "~0.5.3" - -webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.6.0.tgz#363eafa733710eb0ed28c512b2b9b9f5fb01e69b" - dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^3.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^0.1.1" - enhanced-resolve "^4.0.0" - eslint-scope "^3.7.1" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^0.4.4" - tapable "^1.0.0" - uglifyjs-webpack-plugin "^1.2.4" - watchpack "^1.5.0" - webpack-sources "^1.0.1" - -websocket-driver@>=0.3.6: - version "0.7.0" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" - dependencies: - http-parser-js ">=0.4.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.2.tgz#0e18781de629a18308ce1481650f67ffa2693a5d" - -when@^3.7.8: - version "3.7.8" - resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" - -which@^1.2.12, which@^1.2.9, which@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - dependencies: - string-width "^1.0.2" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - dependencies: - errno "~0.1.7" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@^1.1.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - dependencies: - mkdirp "^0.5.1" - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -xtend@^3.0.0, xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - -xtend@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - dependencies: - object-keys "~0.4.0" - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - -yazl@^2.1.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.2.tgz#14cb19083e1e25a70092c1588aabe0f4e4dd4d88" - dependencies: - buffer-crc32 "~0.2.3" +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" + dependencies: + "@babel/highlight" "7.0.0-beta.44" + +"@babel/generator@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" + dependencies: + "@babel/types" "7.0.0-beta.44" + jsesc "^2.5.1" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-function-name@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" + dependencies: + "@babel/helper-get-function-arity" "7.0.0-beta.44" + "@babel/template" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-get-function-arity@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/helper-split-export-declaration@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" + dependencies: + "@babel/types" "7.0.0-beta.44" + +"@babel/highlight@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@babel/template@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + lodash "^4.2.0" + +"@babel/traverse@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/generator" "7.0.0-beta.44" + "@babel/helper-function-name" "7.0.0-beta.44" + "@babel/helper-split-export-declaration" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + debug "^3.1.0" + globals "^11.1.0" + invariant "^2.2.0" + lodash "^4.2.0" + +"@babel/types@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" + dependencies: + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" + +"@webassemblyjs/ast@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" + dependencies: + "@webassemblyjs/helper-module-context" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/wast-parser" "1.5.13" + debug "^3.1.0" + mamacro "^0.0.3" + +"@webassemblyjs/floating-point-hex-parser@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298" + +"@webassemblyjs/helper-api-error@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59" + +"@webassemblyjs/helper-buffer@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e" + dependencies: + debug "^3.1.0" + +"@webassemblyjs/helper-code-frame@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58" + dependencies: + "@webassemblyjs/wast-printer" "1.5.13" + +"@webassemblyjs/helper-fsm@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924" + +"@webassemblyjs/helper-module-context@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5" + dependencies: + debug "^3.1.0" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747" + +"@webassemblyjs/helper-wasm-section@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-buffer" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/wasm-gen" "1.5.13" + debug "^3.1.0" + +"@webassemblyjs/ieee754@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364" + dependencies: + ieee754 "^1.1.11" + +"@webassemblyjs/leb128@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee" + dependencies: + long "4.0.0" + +"@webassemblyjs/utf8@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469" + +"@webassemblyjs/wasm-edit@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-buffer" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/helper-wasm-section" "1.5.13" + "@webassemblyjs/wasm-gen" "1.5.13" + "@webassemblyjs/wasm-opt" "1.5.13" + "@webassemblyjs/wasm-parser" "1.5.13" + "@webassemblyjs/wast-printer" "1.5.13" + debug "^3.1.0" + +"@webassemblyjs/wasm-gen@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/ieee754" "1.5.13" + "@webassemblyjs/leb128" "1.5.13" + "@webassemblyjs/utf8" "1.5.13" + +"@webassemblyjs/wasm-opt@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-buffer" "1.5.13" + "@webassemblyjs/wasm-gen" "1.5.13" + "@webassemblyjs/wasm-parser" "1.5.13" + debug "^3.1.0" + +"@webassemblyjs/wasm-parser@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-api-error" "1.5.13" + "@webassemblyjs/helper-wasm-bytecode" "1.5.13" + "@webassemblyjs/ieee754" "1.5.13" + "@webassemblyjs/leb128" "1.5.13" + "@webassemblyjs/utf8" "1.5.13" + +"@webassemblyjs/wast-parser@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/floating-point-hex-parser" "1.5.13" + "@webassemblyjs/helper-api-error" "1.5.13" + "@webassemblyjs/helper-code-frame" "1.5.13" + "@webassemblyjs/helper-fsm" "1.5.13" + long "^3.2.0" + mamacro "^0.0.3" + +"@webassemblyjs/wast-printer@1.5.13": + version "1.5.13" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/wast-parser" "1.5.13" + long "^3.2.0" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +accord@^0.29.0: + version "0.29.0" + resolved "https://registry.yarnpkg.com/accord/-/accord-0.29.0.tgz#b741c176d00435c5929d466dfe8cf6bee933b1e4" + dependencies: + convert-source-map "^1.5.0" + glob "^7.0.5" + indx "^0.2.3" + lodash.clone "^4.3.2" + lodash.defaults "^4.0.1" + lodash.flatten "^4.2.0" + lodash.merge "^4.4.0" + lodash.partialright "^4.1.4" + lodash.pick "^4.2.1" + lodash.uniq "^4.3.0" + resolve "^1.5.0" + semver "^5.3.0" + uglify-js "^2.8.22" + when "^3.7.8" + +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + dependencies: + acorn "^5.0.0" + +acorn-jsx@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e" + dependencies: + acorn "^5.0.3" + +acorn@^5.0.0, acorn@^5.0.3, acorn@^5.6.0, acorn@^5.6.2: + version "5.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + +ajv-keywords@^3.0.0, ajv-keywords@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" + +ajv@^5.1.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.0.1, ajv@^6.1.0, ajv@^6.5.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + dependencies: + ansi-wrap "^0.1.0" + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + dependencies: + ansi-wrap "0.1.0" + +ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + +array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1, array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@^0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + +autolinker@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.6.2.tgz#67ae9da272e808e0d8eb8e02cbc8cde303947457" + +autoprefixer@^8.0.0: + version "8.6.5" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-8.6.5.tgz#343f3d193ed568b3208e00117a1b96eb691d4ee9" + dependencies: + browserslist "^3.2.8" + caniuse-lite "^1.0.30000864" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^6.0.23" + postcss-value-parser "^3.2.3" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@6.26.3, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-eslint@8.2.5: + version "8.2.5" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.5.tgz#dc2331c259d36782aa189da510c43dedd5adc7a3" + dependencies: + "@babel/code-frame" "7.0.0-beta.44" + "@babel/traverse" "7.0.0-beta.44" + "@babel/types" "7.0.0-beta.44" + babylon "7.0.0-beta.44" + eslint-scope "~3.7.1" + eslint-visitor-keys "^1.0.0" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-bindify-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-explode-class@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" + dependencies: + babel-helper-bindify-decorators "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-loader@7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" + dependencies: + find-cache-dir "^1.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-constructor-call@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.1.18, babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-do-expressions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-export-extensions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + +babel-plugin-syntax-function-bind@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-generator-functions@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-constructor-call@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" + dependencies: + babel-plugin-syntax-class-constructor-call "^6.18.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-class-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" + dependencies: + babel-helper-function-name "^6.24.1" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-decorators-legacy@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz#0e492dffa0edd70529072887f8aa86d4dd8b40a1" + dependencies: + babel-plugin-syntax-decorators "^6.1.18" + babel-runtime "^6.2.0" + babel-template "^6.3.0" + +babel-plugin-transform-decorators@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" + dependencies: + babel-helper-explode-class "^6.24.1" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-do-expressions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" + dependencies: + babel-plugin-syntax-do-expressions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-export-extensions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" + dependencies: + babel-plugin-syntax-export-extensions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-function-bind@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" + dependencies: + babel-plugin-syntax-function-bind "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-runtime@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-env@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + +babel-preset-stage-0@6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" + dependencies: + babel-plugin-transform-do-expressions "^6.22.0" + babel-plugin-transform-function-bind "^6.22.0" + babel-preset-stage-1 "^6.24.1" + +babel-preset-stage-1@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" + dependencies: + babel-plugin-transform-class-constructor-call "^6.24.1" + babel-plugin-transform-export-extensions "^6.22.0" + babel-preset-stage-2 "^6.24.1" + +babel-preset-stage-2@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.24.1" + babel-plugin-transform-decorators "^6.24.1" + babel-preset-stage-3 "^6.24.1" + +babel-preset-stage-3@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.24.1" + babel-plugin-transform-async-to-generator "^6.24.1" + babel-plugin-transform-exponentiation-operator "^6.24.1" + babel-plugin-transform-object-rest-spread "^6.22.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@6.26.0, babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@7.0.0-beta.44: + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-js@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + dependencies: + tweetnacl "^0.14.3" + +bean@0.x: + version "0.4.11" + resolved "https://registry.yarnpkg.com/bean/-/bean-0.4.11.tgz#544c2bcdb1223e451a0ce4d9b13ab59f75cbb1bb" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +binaryextensions@2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" + +bluebird@^3.0.6, bluebird@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + +body-parser@~1.14.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9" + dependencies: + bytes "2.2.0" + content-type "~1.0.1" + debug "~2.2.0" + depd "~1.1.0" + http-errors "~1.3.1" + iconv-lite "0.4.13" + on-finished "~2.3.0" + qs "5.2.0" + raw-body "~2.1.5" + type-is "~1.6.10" + +bonzo@1.x: + version "1.4.0" + resolved "https://registry.yarnpkg.com/bonzo/-/bonzo-1.4.0.tgz#d7d2e06f6b6f67eb3b8fc18774f79058f4ab34df" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.0, braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + dependencies: + pako "~1.0.5" + +browserslist@^3.2.6, browserslist@^3.2.8: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +buffer-from@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^4.3.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +bytes@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +cacache@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864: + version "1.0.30000864" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000864.tgz#7a08c78da670f23c06f11aa918831b8f2dd60ddc" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^0.5.0, chalk@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + +chokidar@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + lodash.debounce "^4.0.8" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.5" + optionalDependencies: + fsevents "^1.2.2" + +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + dependencies: + tslib "^1.9.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + +clean-css@4.1.11: + version "4.1.11" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" + dependencies: + source-map "0.5.x" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + +clone-stats@^0.0.1, clone-stats@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + +clone@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + +cloneable-readable@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" + dependencies: + inherits "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" + dependencies: + color-name "1.1.1" + +color-name@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + +combined-stream@1.0.6, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + +commander@~2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concat-with-sourcemaps@*, concat-with-sourcemaps@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" + dependencies: + source-map "^0.6.1" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +content-type@~1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +copy-webpack-plugin@4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz#d53444a8fea2912d806e78937390ddd7e632ee5c" + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + globby "^7.1.1" + is-glob "^4.0.0" + loader-utils "^1.1.0" + minimatch "^3.0.4" + p-limit "^1.0.0" + serialize-javascript "^1.4.0" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +dateformat@^1.0.7-1.2.3: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + +debug@^2.1.0, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +decamelize@^1.0.0, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +deep-assign@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b" + dependencies: + is-obj "^1.0.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + +domready@0.x: + version "0.3.0" + resolved "https://registry.yarnpkg.com/domready/-/domready-0.3.0.tgz#b3740facbd09163018152d12aec239383e102175" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +duplexer2@~0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + dependencies: + readable-stream "^2.0.2" + +duplexer@^0.1.1, duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +editions@^1.3.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +electron-to-chromium@^1.3.47: + version "1.3.51" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.51.tgz#6a42b49daaf7f22a5b37b991daf949f34dbdb9b5" + +element-dataset@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/element-dataset/-/element-dataset-2.2.6.tgz#a4e46dbb3ee991e8c7d5366ec654f87670c2ef80" + dependencies: + babel-runtime "^6.23.0" + +elliptic@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emailjs-addressparser@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/emailjs-addressparser/-/emailjs-addressparser-2.0.2.tgz#fa8e6ff989667da8ae41d7316a7dfe6abe3c9d51" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + dependencies: + once "~1.3.0" + +enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + dependencies: + prr "~1.0.1" + +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.10.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +es6-object-assign@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + +es6-promise-polyfill@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz#f38925f23cb3e3e8ce6cda8ff774fcebbb090cde" + +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +eslint-scope@^3.7.1, eslint-scope@~3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-scope@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@5.1.0, eslint@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.1.0.tgz#2ed611f1ce163c0fb99e1e0cda5af8f662dff645" + dependencies: + ajv "^6.5.0" + babel-code-frame "^6.26.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^4.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^4.0.0" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^5.2.0" + is-resolvable "^1.1.0" + js-yaml "^3.11.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.5" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.1.0" + require-uncached "^1.0.3" + semver "^5.5.0" + string.prototype.matchall "^2.0.0" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^4.0.3" + text-table "^0.2.0" + +espree@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-4.0.0.tgz#253998f20a0f82db5d866385799d912a83a36634" + dependencies: + acorn "^5.6.0" + acorn-jsx "^4.1.1" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-stream@^3.1.7: + version "3.3.4" + resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fancy-log@^1.1.0, fancy-log@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + time-stamp "^1.0.0" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +faye-websocket@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11" + dependencies: + websocket-driver ">=0.3.6" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +flagged-respawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +flush-write-stream@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +fork-stream@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70" + +form-data@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + dependencies: + minipass "^2.2.1" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + dependencies: + globule "~0.1.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.1.0, globals@^11.7.0: + version "11.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" + dependencies: + sparkles "^1.0.0" + +graceful-fs@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + +gulp-autoprefixer@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-5.0.0.tgz#8237c278a69775270a1cafe7d6f101cfcd585544" + dependencies: + autoprefixer "^8.0.0" + fancy-log "^1.3.2" + plugin-error "^1.0.1" + postcss "^6.0.1" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-cached@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/gulp-cached/-/gulp-cached-1.1.1.tgz#fe7cd4f87f37601e6073cfedee5c2bdaf8b6acce" + dependencies: + lodash.defaults "^4.2.0" + through2 "^2.0.1" + +gulp-chmod@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/gulp-chmod/-/gulp-chmod-2.0.0.tgz#00c390b928a0799b251accf631aa09e01cc6299c" + dependencies: + deep-assign "^1.0.0" + stat-mode "^0.2.0" + through2 "^2.0.0" + +gulp-clean-css@3.9.4: + version "3.9.4" + resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.9.4.tgz#c6d3f8bb7a600fbe661962a72348a330954d343b" + dependencies: + clean-css "4.1.11" + plugin-error "1.0.1" + through2 "2.0.3" + vinyl-sourcemaps-apply "0.2.1" + +gulp-concat-util@0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/gulp-concat-util/-/gulp-concat-util-0.5.5.tgz#c8f0633b4e6e950ff93c475b3c8d3b84be03b7dc" + dependencies: + concat-with-sourcemaps "^1.0.4" + gulp-if "^2.0.0" + gulp-util "^3.0.6" + lodash.assign "^3.2.0" + stream-combiner2 "^1.1.1" + through2 "^2.0.0" + +gulp-eol@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/gulp-eol/-/gulp-eol-0.2.0.tgz#f0afe3bbffedbe9d191a76ac2dfbfa2167e9d33e" + dependencies: + plugin-error "~1.0" + through2 "~0.4" + +gulp-eslint@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gulp-eslint/-/gulp-eslint-5.0.0.tgz#2a2684095f774b2cf79310262078c56cc7a12b52" + dependencies: + eslint "^5.0.1" + fancy-log "^1.3.2" + plugin-error "^1.0.1" + +gulp-expect-file@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/gulp-expect-file/-/gulp-expect-file-0.0.7.tgz#913e731db0dd6f5866149ba400ad835eb34623ad" + dependencies: + async "^0.9.0" + gulp-util "^2.2.16" + minimatch "^0.3.0" + through2 "^1.0.0" + xtend "^3.0.0" + +gulp-filter@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-5.1.0.tgz#a05e11affb07cf7dcf41a7de1cb7b63ac3783e73" + dependencies: + multimatch "^2.0.0" + plugin-error "^0.1.2" + streamfilter "^1.0.5" + +gulp-header@2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-2.0.5.tgz#16e229c73593ade301168024fea68dab75d9d38c" + dependencies: + concat-with-sourcemaps "*" + lodash.template "^4.4.0" + through2 "^2.0.0" + +gulp-if@2.0.2, gulp-if@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-2.0.2.tgz#a497b7e7573005041caa2bc8b7dda3c80444d629" + dependencies: + gulp-match "^1.0.3" + ternary-stream "^2.0.1" + through2 "^2.0.1" + +gulp-less@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp-less/-/gulp-less-4.0.0.tgz#3c49deb96bdca913e436921ef792fb4c24296fcd" + dependencies: + accord "^0.29.0" + less "2.6.x || ^3.0.0" + object-assign "^4.0.1" + plugin-error "^0.1.2" + replace-ext "^1.0.0" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-livereload@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/gulp-livereload/-/gulp-livereload-3.8.1.tgz#00f744b2d749d3e9e3746589c8a44acac779b50f" + dependencies: + chalk "^0.5.1" + debug "^2.1.0" + event-stream "^3.1.7" + gulp-util "^3.0.2" + lodash.assign "^3.0.0" + mini-lr "^0.1.8" + +gulp-match@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.0.3.tgz#91c7c0d7f29becd6606d57d80a7f8776a87aba8e" + dependencies: + minimatch "^3.0.3" + +gulp-notify@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/gulp-notify/-/gulp-notify-3.2.0.tgz#2ae8225009df881eef59be5dd5a2f1337387764e" + dependencies: + ansi-colors "^1.0.1" + fancy-log "^1.3.2" + lodash.template "^4.4.0" + node-notifier "^5.2.1" + node.extend "^2.0.0" + plugin-error "^0.1.2" + through2 "^2.0.3" + +gulp-plumber@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.2.0.tgz#18ea03912c9ee483f8a5499973b5954cd90f6ad8" + dependencies: + chalk "^1.1.3" + fancy-log "^1.3.2" + plugin-error "^0.1.2" + through2 "^2.0.3" + +gulp-rename@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.3.0.tgz#2e789d8f563ab0c924eeb62967576f37ff4cb826" + +gulp-replace@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-1.0.0.tgz#b32bd61654d97b8d78430a67b3e8ce067b7c9143" + dependencies: + istextorbinary "2.2.1" + readable-stream "^2.0.1" + replacestream "^4.0.0" + +gulp-rimraf@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/gulp-rimraf/-/gulp-rimraf-0.2.2.tgz#967f309ab19c207e131e008218a5f01e1f13e1ce" + dependencies: + rimraf "^2.6.2" + through2 "^2.0.3" + +gulp-size@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-size/-/gulp-size-3.0.0.tgz#cb1ac8e6ba83dede52430c47fd039324f003ff82" + dependencies: + chalk "^2.3.0" + fancy-log "^1.3.2" + gzip-size "^4.1.0" + plugin-error "^0.1.2" + pretty-bytes "^4.0.2" + stream-counter "^1.0.0" + through2 "^2.0.0" + +gulp-stripbom@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/gulp-stripbom/-/gulp-stripbom-1.0.4.tgz#58c1d03e85e008a7aab47d81b1297c8c1bc828eb" + dependencies: + gulp-util "^3.0.0" + log-symbols "^1.0.0" + strip-bom "^1.0.0" + through2 "^0.5.1" + +gulp-through@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/gulp-through/-/gulp-through-0.4.0.tgz#6463b29f678c788540b63aa6a1bad5bd8552ae6d" + dependencies: + bluebird "^3.0.6" + chalk "^1.1.1" + gulp-util "^3.0.7" + through2 "^2.0.0" + xtend "^4.0.1" + +gulp-uglify@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca" + dependencies: + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash "^4.13.1" + make-error-cause "^1.1.1" + through2 "^2.0.0" + uglify-js "^3.0.5" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-util@3.0.8, gulp-util@^3.0.0, gulp-util@^3.0.2, gulp-util@^3.0.6, gulp-util@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp-util@^2.2.16: + version "2.2.20" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" + dependencies: + chalk "^0.5.0" + dateformat "^1.0.7-1.2.3" + lodash._reinterpolate "^2.4.1" + lodash.template "^2.4.1" + minimist "^0.2.0" + multipipe "^0.1.0" + through2 "^0.5.0" + vinyl "^0.2.1" + +gulp-zip@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-4.1.0.tgz#dab178bd99afa190923f1eb78abaf0db47817704" + dependencies: + get-stream "^3.0.0" + plugin-error "^0.1.2" + through2 "^2.0.1" + vinyl "^2.1.0" + yazl "^2.1.0" + +gulp@3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +gzip-size@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-4.1.0.tgz#8ae096257eabe7d69c45be2b67c448124ffb517c" + dependencies: + duplexer "^0.1.1" + pify "^3.0.0" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + dependencies: + ansi-regex "^0.2.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.4.tgz#8b50e1f35d51bd01e5ed9ece4dbe3549ccfa0a3c" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + +http-errors@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" + dependencies: + inherits "~2.0.1" + statuses "1" + +http-parser-js@>=0.4.0: + version "0.4.13" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.11, ieee754@^1.1.4: + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + +ifvisible.js@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/ifvisible.js/-/ifvisible.js-1.0.6.tgz#52eb151ce89c56f15316226462e892d1f8451261" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + dependencies: + minimatch "^3.0.4" + +ignore@^3.3.3, ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +indx@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/indx/-/indx-0.2.3.tgz#15dcf56ee9cf65c0234c513c27fbd580e70fbc50" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +inquirer@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.1.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^5.5.2" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + +intersection-observer@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.5.0.tgz#9fe8bee3953c755b1485c38efd9633d535775ea6" + +invariant@^2.2.0, invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + dependencies: + is-unc-path "^1.0.0" + +is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + dependencies: + unc-path-regex "^0.1.2" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + +is@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istextorbinary@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53" + dependencies: + binaryextensions "2" + editions "^1.3.3" + textextensions "2" + +jquery-backstretch@2.1.16: + version "2.1.16" + resolved "https://registry.yarnpkg.com/jquery-backstretch/-/jquery-backstretch-2.1.16.tgz#4ee7547dcb85cf69eed2639cac0c9131651dc5e7" + dependencies: + jquery "^3.1.1" + +jquery-mousewheel@3.1.13: + version "3.1.13" + resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" + +jquery-scrollstop@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/jquery-scrollstop/-/jquery-scrollstop-1.2.0.tgz#f1827a25cf12887d965c085d8a75035655b37663" + dependencies: + jquery ">=1.2.3" + +jquery@2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.4.tgz#2c89d6889b5eac522a7eea32c14521559c6cbf02" + +jquery@>=1.2.3, jquery@^3.1.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" + +js-cookie@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.0.tgz#1b2c279a6eece380a12168b92485265b35b1effb" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-loader@0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.5.0, json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +knockout-sortable@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/knockout-sortable/-/knockout-sortable-1.1.0.tgz#fc4f8adb68613950d39fe6bb8b0ccadead9485d2" + +knockout-transformations@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/knockout-transformations/-/knockout-transformations-2.1.0.tgz#c9a9148dbe1649dc00518eccea704379aadb0097" + +knockout@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/knockout/-/knockout-3.4.2.tgz#e87958de77ad1e936f7ce645bab8b5d7c456d937" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +"less@2.6.x || ^3.0.0": + version "3.5.3" + resolved "https://registry.yarnpkg.com/less/-/less-3.5.3.tgz#108f656b5ee09a281b757a603a80aa091acf6384" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + mime "^1.4.1" + mkdirp "^0.5.0" + promise "^7.1.1" + request "^2.83.0" + source-map "~0.6.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +liftoff@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" + dependencies: + extend "^3.0.0" + findup-sync "^2.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +livereload-js@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._escapehtmlchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" + dependencies: + lodash._htmlescapes "~2.4.1" + +lodash._escapestringchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._htmlescapes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._isnative@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" + +lodash._objecttypes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" + +lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._reunescapedhtml@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" + dependencies: + lodash._htmlescapes "~2.4.1" + lodash.keys "~2.4.1" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash._shimkeys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.assign@^3.0.0, lodash.assign@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.clone@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + +lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + +lodash.defaults@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" + dependencies: + lodash._objecttypes "~2.4.1" + lodash.keys "~2.4.1" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.escape@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" + dependencies: + lodash._escapehtmlchar "~2.4.1" + lodash._reunescapedhtml "~2.4.1" + lodash.keys "~2.4.1" + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isobject@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.keys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" + dependencies: + lodash._isnative "~2.4.1" + lodash._shimkeys "~2.4.1" + lodash.isobject "~2.4.1" + +lodash.merge@^4.4.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + +lodash.partialright@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.partialright/-/lodash.partialright-4.2.1.tgz#0130d80e83363264d40074f329b8a3e7a8a1cc4b" + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.template@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" + dependencies: + lodash._escapestringchar "~2.4.1" + lodash._reinterpolate "~2.4.1" + lodash.defaults "~2.4.1" + lodash.escape "~2.4.1" + lodash.keys "~2.4.1" + lodash.templatesettings "~2.4.1" + lodash.values "~2.4.1" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.template@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + dependencies: + lodash._reinterpolate "~3.0.0" + +lodash.templatesettings@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" + dependencies: + lodash._reinterpolate "~2.4.1" + lodash.escape "~2.4.1" + +lodash.uniq@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash.values@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" + dependencies: + lodash.keys "~2.4.1" + +lodash@^4.13.1, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + +log-symbols@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + +long@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + +long@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lozad@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.4.0.tgz#78d29514608074a34645ba1c5c7747f82c14cbfc" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +lru-cache@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + dependencies: + pify "^3.0.0" + +make-error-cause@^1.1.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" + dependencies: + make-error "^1.2.0" + +make-error@^1.2.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" + +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + dependencies: + kind-of "^6.0.2" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +matchmedia-polyfill@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/matchmedia-polyfill/-/matchmedia-polyfill-0.3.1.tgz#83e754b3b4a297179fcdb71c3aefa0980bff7b18" + +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +memory-fs@^0.4.0, memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-stream@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +micromatch@^3.0.4, micromatch@^3.1.4, micromatch@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +mini-lr@^0.1.8: + version "0.1.9" + resolved "https://registry.yarnpkg.com/mini-lr/-/mini-lr-0.1.9.tgz#02199d27347953d1fd1d6dbded4261f187b2d0f6" + dependencies: + body-parser "~1.14.0" + debug "^2.2.0" + faye-websocket "~0.7.2" + livereload-js "^2.2.0" + parseurl "~1.3.0" + qs "~2.2.3" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +minimatch@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" + +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +moment@2.22.2, moment@2.x: + version "2.22.2" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +multimatch@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +multipipe@^0.1.0, multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +nan@^2.9.2: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natives@^1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.4.tgz#2f0f224fc9a7dd53407c7667c84cf8dbe773de58" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +needle@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +neo-async@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + +nice-try@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" + +node-fetch@^1.3.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fs@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/node-fs/-/node-fs-0.1.7.tgz#32323cccb46c9fbf0fc11812d45021cc31d325bb" + +node-libs-browser@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-localstorage@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-1.3.1.tgz#3177ef42837f398aee5dd75e319b281e40704243" + dependencies: + write-file-atomic "^1.1.4" + +node-notifier@5.2.1, node-notifier@^5.1.2, node-notifier@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + dependencies: + growly "^1.3.0" + semver "^5.4.1" + shellwords "^0.1.1" + which "^1.3.0" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +node.extend@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-2.0.0.tgz#7525a2875677ea534784a5e10ac78956139614df" + dependencies: + is "^3.2.1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +normalize.css@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.0.tgz#14ac5e461612538a4ce9be90a7da23f86e718493" + +npm-bundled@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + +npm-packlist@^1.1.6: + version "1.1.10" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.8: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +openpgp@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/openpgp/-/openpgp-2.6.2.tgz#1039d5070dc01c04e51fab58273fdf29a1ee098b" + dependencies: + node-fetch "^1.3.3" + node-localstorage "~1.3.0" + +opentip@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/opentip/-/opentip-2.4.3.tgz#2a3b500c2738f8069c33462ed48b5afe9ce804e6" + dependencies: + bean "0.x" + bonzo "1.x" + domready "0.x" + qwery "3.x" + reqwest "0.x" + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-limit@^1.0.0, p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +pako@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parse-asn1@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +parseurl@~1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + dependencies: + pify "^3.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pbkdf2@^3.0.3: + version "3.0.16" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pikaday@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/pikaday/-/pikaday-1.7.0.tgz#78bf26e709f7c135b674762bbab79d75ac589ab6" + optionalDependencies: + moment "2.x" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + +plugin-error@1.0.1, plugin-error@^1.0.1, plugin-error@~1.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +postcss-value-parser@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss@^6.0.1, postcss@^6.0.23: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +pretty-bytes@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +public-encrypt@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + +qs@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be" + +qs@~2.2.3: + version "2.2.5" + resolved "https://registry.yarnpkg.com/qs/-/qs-2.2.5.tgz#1088abaf9dcc0ae5ae45b709e6c6b5888b23923c" + +qs@~6.5.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +qwery@3.x: + version "3.4.2" + resolved "https://registry.yarnpkg.com/qwery/-/qwery-3.4.2.tgz#7d0af3ebcf48af599f2ed498d8ce39023978a63e" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +raw-body@~2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.13" + unpipe "1.0.0" + +raw-loader@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +"readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" + dependencies: + define-properties "^1.1.2" + +regexpp@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + +replacestream@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36" + dependencies: + escape-string-regexp "^1.0.3" + object-assign "^4.0.1" + readable-stream "^2.0.2" + +request@^2.83.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +reqwest@0.x: + version "0.9.7" + resolved "https://registry.yarnpkg.com/reqwest/-/reqwest-0.9.7.tgz#11a2de9704dc8d52c9675265d7177103febf3a63" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.5.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + dependencies: + aproba "^1.1.1" + +run-sequence@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/run-sequence/-/run-sequence-2.2.1.tgz#1ce643da36fd8c7ea7e1a9329da33fc2b8898495" + dependencies: + chalk "^1.1.3" + fancy-log "^1.3.2" + plugin-error "^0.1.2" + +rxjs@^5.5.2: + version "5.5.11" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87" + dependencies: + symbol-observable "1.0.1" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +schema-utils@^0.4.4, schema-utils@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + +serialize-javascript@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +simplestatemanager@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/simplestatemanager/-/simplestatemanager-4.1.1.tgz#723879947cd8a40dd20645a0ee6a7cadcc669d4f" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-list-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +sparkles@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" + +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + safer-buffer "^2.0.2" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +ssri@^5.2.4: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + dependencies: + safe-buffer "^5.1.1" + +stat-mode@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +statuses@1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-consume@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" + +stream-counter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-1.0.0.tgz#91cf2569ce4dc5061febcd7acb26394a5a114751" + +stream-each@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +streamfilter@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/streamfilter/-/streamfilter-1.0.7.tgz#ae3e64522aa5a35c061fd17f67620c7653c643c9" + dependencies: + readable-stream "^2.0.2" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string.prototype.matchall@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz#2af8fe3d2d6dc53ca2a59bd376b089c3c152b3c8" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.10.0" + function-bind "^1.1.1" + has-symbols "^1.0.0" + regexp.prototype.flags "^1.2.0" + +string_decoder@^1.0.0, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +style-loader@0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" + dependencies: + loader-utils "^1.1.0" + schema-utils "^0.4.5" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^5.3.0, supports-color@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + +table@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" + dependencies: + ajv "^6.0.1" + ajv-keywords "^3.0.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +tapable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" + +tar@^4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +ternary-stream@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.0.1.tgz#064e489b4b5bf60ba6a6b7bc7f2f5c274ecf8269" + dependencies: + duplexify "^3.5.0" + fork-stream "^0.0.4" + merge-stream "^1.0.0" + through2 "^2.0.1" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +textextensions@2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" + +through2@2.0.3, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through2@^0.5.0, through2@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" + dependencies: + readable-stream "~1.0.17" + xtend "~3.0.0" + +through2@^0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545" + dependencies: + readable-stream ">=1.1.13-1 <1.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@~0.4: + version "0.4.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" + dependencies: + readable-stream "~1.0.17" + xtend "~2.1.1" + +through@2, through@^2.3.6, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + dependencies: + setimmediate "^1.0.4" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@~2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tslib@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.10: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uglify-es@^3.3.4: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uglify-js@^2.8.22: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-js@^3.0.5: + version "3.4.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.4.tgz#92e79532a3aeffd4b6c65755bdba8d5bad98d607" + dependencies: + commander "~2.16.0" + source-map "~0.6.1" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uglifyjs-webpack-plugin@^1.2.4: + version "1.2.7" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + schema-utils "^0.4.5" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + uglify-es "^3.3.4" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +underscore@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unique-filename@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + dependencies: + imurmurhash "^0.1.4" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" + +uri-js@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" + dependencies: + kind-of "^6.0.2" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +util@^0.10.3: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + dependencies: + inherits "2.0.3" + +uuid@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + +v8flags@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl-sourcemaps-apply@0.2.1, vinyl-sourcemaps-apply@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + dependencies: + source-map "^0.5.1" + +vinyl@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" + dependencies: + clone-stats "~0.0.1" + +vinyl@^0.4.0: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" + dependencies: + clone "^2.1.1" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +watchpack@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +webpack-notifier@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/webpack-notifier/-/webpack-notifier-1.6.0.tgz#ffac8e55ff8c469752b8c1bbb011a16f10986e02" + dependencies: + node-notifier "^5.1.2" + object-assign "^4.1.0" + strip-ansi "^3.0.1" + +webpack-sources@^1.0.1, webpack-sources@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.15.1: + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.15.1.tgz#dc716779a3b88827c369f18c71a6137fa7e582fd" + dependencies: + "@webassemblyjs/ast" "1.5.13" + "@webassemblyjs/helper-module-context" "1.5.13" + "@webassemblyjs/wasm-edit" "1.5.13" + "@webassemblyjs/wasm-opt" "1.5.13" + "@webassemblyjs/wasm-parser" "1.5.13" + acorn "^5.6.2" + acorn-dynamic-import "^3.0.0" + ajv "^6.1.0" + ajv-keywords "^3.1.0" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^3.7.1" + json-parse-better-errors "^1.0.2" + loader-runner "^2.3.0" + loader-utils "^1.1.0" + memory-fs "~0.4.1" + micromatch "^3.1.8" + mkdirp "~0.5.0" + neo-async "^2.5.0" + node-libs-browser "^2.0.0" + schema-utils "^0.4.4" + tapable "^1.0.0" + uglifyjs-webpack-plugin "^1.2.4" + watchpack "^1.5.0" + webpack-sources "^1.0.1" + +websocket-driver@>=0.3.6: + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + dependencies: + http-parser-js ">=0.4.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + +when@^3.7.8: + version "3.7.8" + resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" + +which@^1.2.14, which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + dependencies: + string-width "^1.0.2 || 2" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +worker-farm@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + dependencies: + errno "~0.1.7" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xtend@^3.0.0, xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + dependencies: + object-keys "~0.4.0" + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yazl@^2.1.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.3.tgz#ec26e5cc87d5601b9df8432dbdd3cd2e5173a071" + dependencies: + buffer-crc32 "~0.2.3" From cc3b742221f7e9135d7befbcd9ebf2cafb3d1c16 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Tue, 10 Jul 2018 00:11:13 +0300 Subject: [PATCH 61/83] Synchronize localizations from Transifex --- .../v/0.0.0/app/localization/admin/fa_IR.yml | 2 + .../v/0.0.0/app/localization/admin/hu_HU.yml | 1 + .../v/0.0.0/app/localization/admin/nb_NO.yml | 1 + .../v/0.0.0/app/localization/admin/pl_PL.yml | 223 ++++----- .../v/0.0.0/app/localization/admin/sl_SI.yml | 1 + .../0.0.0/app/localization/webmail/bg_BG.yml | 2 +- .../0.0.0/app/localization/webmail/fa_IR.yml | 3 + .../0.0.0/app/localization/webmail/nb_NO.yml | 2 +- .../0.0.0/app/localization/webmail/pl_PL.yml | 455 +++++++++--------- .../0.0.0/app/localization/webmail/ro_RO.yml | 4 +- .../0.0.0/app/localization/webmail/sl_SI.yml | 2 + 11 files changed, 355 insertions(+), 341 deletions(-) diff --git a/rainloop/v/0.0.0/app/localization/admin/fa_IR.yml b/rainloop/v/0.0.0/app/localization/admin/fa_IR.yml index 68f6c7a1a..28771b2e1 100644 --- a/rainloop/v/0.0.0/app/localization/admin/fa_IR.yml +++ b/rainloop/v/0.0.0/app/localization/admin/fa_IR.yml @@ -26,6 +26,7 @@ fa_IR: LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "زبان در صفحه تنظیمات قابل انتخاب باشد" LABEL_ALLOW_THEMES_ON_SETTINGS: "پوسته در صفحه تنظیمات قابل انتخاب باشد" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "تصویر پشت زمینه در صفحه تنظیمات قابل انتخاب باشد" + LABEL_NEW_FOLDER_MOVE: "دکمه جدید «انتقال به پوشه»" LABEL_SHOW_THUMBNAILS: "اندازه کوچک را نشان بده (پیوست‌ها)" LABEL_ALLOW_GRAVATAR: "اجازه استفاده از آواتار" LEGEND_MAIN: "اصلی" @@ -33,6 +34,7 @@ fa_IR: LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "مجوز استفاده از نام‌های کاربری دیگر" LABEL_ALLOW_IDENTITIES: "اجازه استفاده از چندین شناسه" LABEL_ALLOW_TEMPLATES: "اجازه استفاده از پوسته‌ها" + ALERT_DATA_ACCESS: "شاخه data قابل دسترس هست. تنظیمات وب‌سرور را طوری انجام دهید این شاخه از بیرون قابل دسترس نباشد. اطلاعات بیشتر اینجا هست:" ALERT_WARNING: "اخطار!" HTML_ALERT_WEAK_PASSWORD: |+ شما در حال استفاده از گذرواژه پیش‌فرض کاربر مدیر هستید. diff --git a/rainloop/v/0.0.0/app/localization/admin/hu_HU.yml b/rainloop/v/0.0.0/app/localization/admin/hu_HU.yml index df08e6c54..822747b6d 100644 --- a/rainloop/v/0.0.0/app/localization/admin/hu_HU.yml +++ b/rainloop/v/0.0.0/app/localization/admin/hu_HU.yml @@ -34,6 +34,7 @@ hu_HU: LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "További fiókok engedélyezése" LABEL_ALLOW_IDENTITIES: "Több identitás engedélyezése" LABEL_ALLOW_TEMPLATES: "Sablonok engedélyezése" + ALERT_DATA_ACCESS: "A RainLoop adatmappája hozzáférhető. Kérlek állítsd be úgy a webszervert, hogy az adatmappát rejtse el a külső hozzáférés elől. További tudnivalók itt:" ALERT_WARNING: "Figyelmeztetés!" HTML_ALERT_WEAK_PASSWORD: | Az alapértelmezett admin jelszót használod diff --git a/rainloop/v/0.0.0/app/localization/admin/nb_NO.yml b/rainloop/v/0.0.0/app/localization/admin/nb_NO.yml index 1d4bf2454..2f5fcbcad 100644 --- a/rainloop/v/0.0.0/app/localization/admin/nb_NO.yml +++ b/rainloop/v/0.0.0/app/localization/admin/nb_NO.yml @@ -34,6 +34,7 @@ nb_NO: LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Tillat bruk av flere kontoer" LABEL_ALLOW_IDENTITIES: "Tillat bruk av flere identiteter" LABEL_ALLOW_TEMPLATES: "Tillat bruk av maler" + ALERT_DATA_ACCESS: "RainLoop-datamappa di er offentlig tiljgengelig. Sett opp webtjeneren slik at den ikke viser datamappa. Les mer her:" ALERT_WARNING: "Advarsel!" HTML_ALERT_WEAK_PASSWORD: | Du bruker forvalgt admin-passord. diff --git a/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml b/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml index 3925ff5d7..fb2635965 100644 --- a/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml +++ b/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml @@ -2,7 +2,7 @@ pl_PL: LOGIN: LABEL_LOGIN: "Login" LABEL_PASSWORD: "Hasło" - BUTTON_LOGIN: "Zaloguj" + BUTTON_LOGIN: "Zaloguj do panelu administracjnego" TOP_PANEL: LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Panel administracyjny" @@ -17,12 +17,12 @@ pl_PL: LABEL_PLUGINS_NAME: "Wtyczki" LABEL_PACKAGES_NAME: "Zarządzanie wtyczkami" LABEL_LICENSING_NAME: "Licencjonowanie" - LABEL_ABOUT_NAME: "O skrypcie" + LABEL_ABOUT_NAME: "O programie" TAB_GENERAL: LEGEND_INTERFACE: "Interfejs" - LABEL_LANGUAGE: "Język:" - LABEL_LANGUAGE_ADMIN: "Język (admin):" - LABEL_THEME: "Motyw:" + LABEL_LANGUAGE: "Język" + LABEL_LANGUAGE_ADMIN: "Język (admin)" + LABEL_THEME: "Motyw" LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Zezwól użytkownikowi na wybór języka" LABEL_ALLOW_THEMES_ON_SETTINGS: "Zezwól użytkownikowi na zmianę motywu" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Zezwól użytkownikowi na użycie własnego tła" @@ -30,63 +30,64 @@ pl_PL: LABEL_SHOW_THUMBNAILS: "Pokaż miniatury (załączniki)" LABEL_ALLOW_GRAVATAR: "Zezwól na używanie gravatarów" LEGEND_MAIN: "Główne" - LABEL_ATTACHMENT_SIZE_LIMIT: "Maks. rozmiar zał.:" + LABEL_ATTACHMENT_SIZE_LIMIT: "Maksymalny rozmiar załącznika" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Zezwól na dodatkowe konta" LABEL_ALLOW_IDENTITIES: "Zezwól na posiadanie wielu tożsamości" LABEL_ALLOW_TEMPLATES: "Zezwól na używanie szablonów" + ALERT_DATA_ACCESS: "Folder data jest osiągalny z poziomu przeglądarki WWW. Zmień konfigurację serwera www, aby ukryć ten folder z zewnątrz. Więcej informacji tutaj: " ALERT_WARNING: "Ostrzeżenie!" HTML_ALERT_WEAK_PASSWORD: | Korzystasz z domyślnego hasła administratora.
      - Ze względów bezpieczeństwa, proszę - zmienić hasło + Ze względów bezpieczeństwa + zmień hasło na inne. TAB_LOGIN: - LEGEND_LOGIN_SCREEN: "Logowanie" - LABEL_DEFAULT_DOMAIN: "Domyślna domena:" + LEGEND_LOGIN_SCREEN: "Ekran logowania" + LABEL_DEFAULT_DOMAIN: "Domyślna domena" LABEL_DETERMINE_USER_DOMAIN: "Spróbuj określić domenę użytkownika" - LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Zezwól na zmianę języka podczas logowania" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Zezwól na zmianę języka na ekranie logowania" LABEL_DETERMINE_USER_LANGUAGE: "Spróbuj określić język użytkownika" TAB_BRANDING: LEGEND_BRANDING: "Personalizacja" - LABEL_PAGE_TITLE: "Tytuł strony:" - LABEL_LOADING_DESCRIPTION: "Komunikat ład. strony:" - LABEL_FAVICON_URL: "Favicon:" + LABEL_PAGE_TITLE: "Tytuł strony" + LABEL_LOADING_DESCRIPTION: "Komunikat ładowania strony" + LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Login" - LABEL_LOGIN_LOGO: "Logo:" - LABEL_LOGIN_DESCRIPTION: "Opis:" - LABEL_LOGIN_BACKGROUND: "Tło:" - LABEL_LOGIN_CUSTOM_CSS: "Własny arkusz stylów:" - LABEL_LOGIN_SHOW_POWERED_LINK: "Pokaż link: \"Powered by RainLoop\"" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Opis" + LABEL_LOGIN_BACKGROUND: "Tło" + LABEL_LOGIN_CUSTOM_CSS: "Własny arkusz styli CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Pokaż link \"Powered by RainLoop\"" LEGEND_USER: "Użytkownik" - LABEL_USER_LOGO: "Logo:" - LABEL_USER_LOGO_TITLE: "Tytuł loga:" - LABEL_USER_LOGO_MESSAGE: "Logo (widok wiad.)" - LABEL_USER_CUSTOM_CSS: "Własny arkusz stylów:" - LEGEND_WELCOME_PAGE: "Str. główna" - LABEL_WELCOME_PAGE_TITLE: "Tytuł:" - LABEL_WELCOME_PAGE_URL: "Adres URL:" - LABEL_WELCOME_PAGE_DISPLAY: "Wyświetl:" - OPTION_WELCOME_PAGE_DISPLAY_NONE: "nigdy" - OPTION_WELCOME_PAGE_DISPLAY_ONCE: "raz" - OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "zawsze" - HTML_ALERT_PREMIUM: "Ta opcja jest dostępna tylko dla licencji Premium." TAB_CONTACTS: LEGEND_CONTACTS: "Kontakty" LEGEND_STORAGE: "Baza danych (PDO)" LABEL_ENABLE_CONTACTS: "Włącz kontakty" LABEL_ALLOW_SYNC: "Zezwól na synchronizację kontaktów (przy użyciu zewnętrznego serwera CardDAV)" - LABEL_STORAGE_TYPE: "Typ:" - LABEL_STORAGE_DSN: "Adres DSN:" - LABEL_STORAGE_USER: "Użytkownik:" - LABEL_STORAGE_PASSWORD: "Hasło:" + LABEL_STORAGE_TYPE: "Typ" + LABEL_STORAGE_DSN: "Adres DSN" + LABEL_STORAGE_USER: "Użytkownik" + LABEL_STORAGE_PASSWORD: "Hasło" BUTTON_TEST: "Testuj" ALERT_NOTICE: "Powiadomienie!" HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nie używaj tej bazy danych z dużą ilością aktywnych użytkowników." HTML_ALERT_DOES_NOT_SUPPORTED: | Twój system nie zawiera wsparcia dla obsługi kontaktów.
      - Musisz zainstalować lub uruchomić na serwerze jedno z rozszerzeń PDO (SQLite / MySQL / PostgreSQL). + Musisz zainstalować lub uruchomić na serwerze jedno z rozszerzeń PDO (SQLite / MySQL / PostgreSQL). TAB_DOMAINS: LEGEND_DOMAINS: "Domeny" BUTTON_ADD_DOMAIN: "Dodaj domenę" @@ -98,42 +99,42 @@ pl_PL: Kliknij na nazwę, aby skonfigurować domenę. TAB_SECURITY: LEGEND_SECURITY: "Bezpieczeństwo" - LABEL_ALLOW_TWO_STEP: "Zezwól na dwuskładnikową autoryzację" - LABEL_FORCE_TWO_STEP: "Wymuś dwuskładnikową autoryzację" + LABEL_ALLOW_TWO_STEP: "Zezwól na autoryzację 2-etapową" + LABEL_FORCE_TWO_STEP: "Wymuś autoryzację 2-etapową" LABEL_USE_IMAGE_PROXY: "Użyj lokalnego serwera proxy dla zewnętrznych obrazów" - LABEL_ALLOW_OPEN_PGP: "Zezwól na użycie OpenPGP" + LABEL_ALLOW_OPEN_PGP: "Zezwalaj na używanie OpenPGP" LABEL_SHOW_PHP_INFO: "Pokaż informacje o wersji PHP" LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Dane dostępowe panelu administracyjnego" - LABEL_CURRENT_PASSWORD: "Bieżące hasło:" - LABEL_NEW_LOGIN: "Nowy login:" - LABEL_NEW_PASSWORD: "Nowe hasło:" - LABEL_REPEAT_PASSWORD: "Powtórz hasło:" + LABEL_CURRENT_PASSWORD: "Bieżące hasło" + LABEL_NEW_LOGIN: "Nowy login" + LABEL_NEW_PASSWORD: "Nowe hasło" + LABEL_REPEAT_PASSWORD: "Powtórz hasło" BUTTON_UPDATE_PASSWORD: "Zaktualizuj hasło" LEGEND_SSL: "SSL" LABEL_REQUIRE_VERIFICATION: "Wymagaj sprawdzania poprawności certyfikatów SSL (IMAP/SMTP)" - LABEL_ALLOW_SELF_SIGNED: "Zezwól na używanie certyfikatów podpisanych przez siebie" + LABEL_ALLOW_SELF_SIGNED: "Zezwól na używanie certyfikatów podpisanych samodzielnie" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" - LABEL_ENABLE_GOOGLE: "Włącz obsługę platformy Google" + LABEL_ENABLE_GOOGLE: "Włącz integrację z Google" LABEL_GOOGLE_AUTH: "Autoryzacja" - LABEL_GOOGLE_DRIVE: "Obsługa dysku Google (widok tworz. wiadomości)" - LABEL_GOOGLE_PREVIEW: "Obsługa przeglądarki Google (podgląd dla plików: Microsoft Word, Excel i PowerPoint)" - LABEL_GOOGLE_CLIENT_ID: "Identyfikator:" - LABEL_GOOGLE_CLIENT_SECRET: "Hasło:" - LABEL_GOOGLE_API_KEY: "Klucz API:" - HINT_GOOGLE_API_KEY: "Wymagane dla obsługi interfejsu usługi: 'Dysk Google'" + LABEL_GOOGLE_DRIVE: "Obsługa dysku Google (widok tworzenia wiadomości)" + LABEL_GOOGLE_PREVIEW: "Obsługa przeglądarki Google (podgląd dla plików Microsoft Word, Excel i PowerPoint)" + LABEL_GOOGLE_CLIENT_ID: "Identyfikator klienta" + LABEL_GOOGLE_CLIENT_SECRET: "Hasło" + LABEL_GOOGLE_API_KEY: "Klucz API" + HINT_GOOGLE_API_KEY: "Wymagane dla obsługi interfejsu usługi 'Dysk Google'" LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Włącz obsługę platformy Facebook (autoryzacja)" - LABEL_FACEBOOK_APP_ID: "Identyfikator aplikacji:" - LABEL_FACEBOOK_APP_SECRET: "Hasło aplikacji:" + LABEL_ENABLE_FACEBOOK: "Włącz integrację z Facebook (autoryzacja)" + LABEL_FACEBOOK_APP_ID: "Identyfikator aplikacji" + LABEL_FACEBOOK_APP_SECRET: "Hasło aplikacji" LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Włącz obsługę platformy Twitter (autoryzacja)" - LABEL_TWITTER_CONSUMER_KEY: "Klucz użytkownika:" - LABEL_TWITTER_CONSUMER_SECRET: "Hasło użytkownika:" + LABEL_ENABLE_TWITTER: "Włącz integrację z Twitter (autoryzacja)" + LABEL_TWITTER_CONSUMER_KEY: "Klucz użytkownika" + LABEL_TWITTER_CONSUMER_SECRET: "Hasło użytkownika" LEGEND_DROPBOX: "Dropbox" - LABEL_ENABLE_DROPBOX: "Włącz obsługę platformy Dropbox" - LABEL_DROPBOX_API_KEY: "Klucz API:" - TOP_ALERT: "Szczegółowe informacje na temat obsługi platform, można znaleźść pod adresem: " + LABEL_ENABLE_DROPBOX: "Włącz integrację z Dropbox" + LABEL_DROPBOX_API_KEY: "Klucz API" + TOP_ALERT: "Szczegółowe informacje na temat obsługi platform, można znaleźć pod adresem " TAB_PLUGINS: LEGEND_PLUGINS: "Wtyczki" LABEL_ENABLE_PLUGINS: "Włącz obsługę wtyczek" @@ -141,53 +142,53 @@ pl_PL: LINK_INSTALL_NEW: "Kliknij tutaj, aby zainstalować nowe wtyczki!" HINT_CLICK_NAME: "Kliknij na nazwę, aby skonfigurować wtyczkę." TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Aktualizacja" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Do zainstalowania" - LEGEND_INSTALLED_PACKAGES: "Zainstalowane" + LEGEND_AVAILABLE_FOR_UPDATE: "Dostępna do aktualizacji" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Dostępna do zainstalowania" + LEGEND_INSTALLED_PACKAGES: "Zainstalowane pakiety" ALERT_CANNOT_ACCESS_REPOSITORY: "Nie można uzyskać dostępu do repozytorium." TAB_LICENSING: - LABEL_YOUR_DOMAIN: "Domena:" - LABEL_VERSION: "Wersja:" - LABEL_CHECKING: "sprawdzanie..." + LABEL_YOUR_DOMAIN: "Twoja domena" + LABEL_VERSION: "Wersja" + LABEL_CHECKING: "Sprawdzanie..." TYPE_BASIC_HINT: "Ta domena nie jest licencjonowana do użytku komercyjnego." TYPE_BASIC_HINT_2: "Nie można dodać licencji dla tej domeny." - HTML_ALERT_TOP_1: "RainLoop Webmail korzysta z licencji:" - HTML_ALERT_TOP_2: "Możesz używać tego klienta za darmo, tylko dla prywatnych (własnych) projektów." + HTML_ALERT_TOP_1: "RainLoop Webmail korzysta z licencji" + HTML_ALERT_TOP_2: "Możesz używać tego klienta za darmo, tylko do celów prywatnych." HTML_ALERT_TOP_3: | - Do komercyjnego użytku (używania dodatkowych opcji) RainLoop Webmail, wymagane jest posiadanie + Do użytku komercyjnego (z dodatkowymi opcjami) RainLoop Webmail, wymagane jest posiadanie ważnej subskrypcji. TYPE_PREMIUM_LIFETIME: "Dożywotnia" - LABEL_SUB_EXPIRES: "Subskrypcja wygasa:" - BUTTON_ACTIVATE: "Aktywuj klucz" + LABEL_SUB_EXPIRES: "Subskrypcja wygasa" + BUTTON_ACTIVATE: "Aktywuj klucz dla tej domeny" BUTTON_PURCHASE: "Kup klucz" BUTTON_TRIAL: "Wersja testowa" TAB_ABOUT: - LEGEND_ABOUT: "O skrypcie" + LEGEND_ABOUT: "O programie" LABEL_TAG_HINT: "Prosty, nowoczesny i szybki klient pocztowy" LABEL_ALL_RIGHTS_RESERVED: "Wszystkie prawa zastrzeżone." - HINT_READ_CHANGE_LOG: "Przed aktualizacją, proszę przeczytać listę zmian." - HINT_IS_UP_TO_DATE: "Klient RainLoop jest aktualny." + HINT_READ_CHANGE_LOG: "Przed aktualizacją przeczytaj proszę listę zmian." + HINT_IS_UP_TO_DATE: "RainLoop jest aktualny." HTML_NEW_VERSION: "Dostępna jest nowa wersja: %VERSION%." - LABEL_UPDATING: "Aktualizowanie..." + LABEL_UPDATING: "Aktualizacja w toku..." LABEL_CHECKING: "Szukanie aktualizacji..." BUTTON_UPDATE: "Zaktualizuj" BUTTON_DOWNLOAD: "Pobierz" BUTTON_CHANGELOG: "Lista zmian" POPUPS_ACTIVATE: - TITLE_ACTIVATE: "Aktywacja klucza subskrypcji" - TITLE_ACTIVATION: "Aktywowanie..." - LABEL_DOMAIN: "Domena:" - LABEL_SUB_KEY: "Klucz subskrypcji:" + TITLE_ACTIVATE: "Czy chcesz aktywować klucz subskrypcji?" + TITLE_ACTIVATION: "Aktywacja w toku..." + LABEL_DOMAIN: "Domena" + LABEL_SUB_KEY: "Klucz subskrypcji" BUTTON_ACTIVATE: "Aktywuj" LABEL_ACTIVATED: "Aktywowano" ERROR_INVALID_SUBS_KEY: "Niepoprawny klucz subskrypcji" - SUBS_KEY_ACTIVATED: "Aktywowano klucz subskrypcji" + SUBS_KEY_ACTIVATED: "Poprawnie aktywowano klucz subskrypcji" HTML_DESC: | - Subskrypcja premium dla domeny: %DOMAIN%, zostanie przedłużona po aktywacji. + Subskrypcja premium dla domeny %DOMAIN%, zostanie przedłużona po aktywacji.
      - Zwróc uwagę, że klucz subskrypcji może być aktywowany tylko dla jednej domeny. + Zwróć uwagę, że klucz subskrypcji może być aktywowany tylko dla jednej domeny.

      - Po uruchomieniu aktywacji, nie można jej przerwac lub anulować. + Po uruchomieniu aktywacji, nie można jej przerwać lub anulować. POPUPS_DOMAIN_ALIAS: TITLE_ADD_DOMAIN_ALIAS: "Dodaj Alias" LABEL_ALIAS: "Alias" @@ -196,16 +197,16 @@ pl_PL: BUTTON_ADD: "Dodaj" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Dodawanie domeny" - TITLE_ADD_DOMAIN_WITH_NAME: "Dodawanie domeny: \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Edycja domeny: \"%NAME%\"" + TITLE_ADD_DOMAIN_WITH_NAME: "Dodawanie domeny \"%NAME%\"" + TITLE_EDIT_DOMAIN: "Edycja domeny \"%NAME%\"" LABEL_NAME: "Nazwa" NAME_HELPER: "obsługiwany znak wieloznaczności - *" LABEL_IMAP: "IMAP" LABEL_SMTP: "SMTP" LABEL_SIEVE: "SIEVE" - LABEL_SERVER: "Serwer:" - LABEL_PORT: "Port:" - LABEL_SECURE: "Rodzaj połączenia:" + LABEL_SERVER: "Serwer" + LABEL_PORT: "Port" + LABEL_SECURE: "Rodzaj połączenia" LABEL_WHITE_LIST: "Biała lista" SECURE_OPTION_NONE: "Bez zabezpieczeń" SECURE_OPTION_SSL: "SSL/TLS" @@ -214,7 +215,7 @@ pl_PL: LABEL_ALLOW_USER_SCRIPT: "Zezwól na spersonalizowany skrypt użytkownika" LABEL_USE_SHORT_LOGIN: "Użyj krótkiego loginu" LABEL_USE_AUTH: "Użyj autoryzacji" - LABEL_USE_PHP_MAIL: "Użyj funkcji php: 'mail()'" + LABEL_USE_PHP_MAIL: "Użyj funkcji php 'mail()'" BUTTON_TEST: "Test" BUTTON_WHITE_LIST: "Biała lista" BUTTON_SIEVE_CONFIGURATION: "Konfiguracja sieve" @@ -223,12 +224,12 @@ pl_PL: BUTTON_CLOSE: "Zamknij" BUTTON_ADD: "Dodaj" BUTTON_UPDATE: "Zaktualizuj" - NEW_DOMAIN_DESC: "Konfiguracja tej domeny pozwala na pracę
      z adresami email: %NAME%" + NEW_DOMAIN_DESC: "Konfiguracja tej domeny pozwala na pracę
      z adresami e-mail: %NAME%" WHITE_LIST_ALERT: | - Lista użytkowników domeny, którzy mogą uzyskać dostęp poprzez tego klienta. + Lista użytkowników domeny, którzy mogą uzyskać dostęp z tego webmaila. Użyj spacji do rozdzielenia. POPUPS_PLUGIN: - TITLE_PLUGIN: "Wtyczka: " + TITLE_PLUGIN: "Wtyczka" DESC_NOTHING_TO_CONFIGURE: "Brak opcji do skonfigurowania" BUTTON_CLOSE: "Zamknij" BUTTON_SAVE: "Zapisz" @@ -239,7 +240,7 @@ pl_PL: TITLE_LANGUAGES: "Wybierz swój język" HINTS: BETA: "Beta" - UNSTABLE: "Niestabilna" + UNSTABLE: "Niestabilne" WARNING: "Ostrzeżenie!" NOT_SUPPORTED: "nieobsługiwana" REQUIRES_PHP_54: "Wymaga PHP w wersji 5.4 lub wyższej" @@ -247,32 +248,32 @@ pl_PL: DOMAIN_ALREADY_EXISTS: "Ta domena już istnieje" UNKNOWN_ERROR: "Nieznany błąd" NOTIFICATIONS: - INVALID_TOKEN: "Nieważny token" + INVALID_TOKEN: "Nieprawidłowy token" AUTH_ERROR: "Autoryzacja zakończona niepowodzeniem" ACCESS_ERROR: "Błąd dostępu" CONNECTION_ERROR: "Nie można połączyć się z serwerem" CAPTCHA_ERROR: "Niepoprawny kod CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Logowanie poprzez tą platformę, nie zostało jeszcze aktywowane dla żadnego + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Logowanie poprzez tą platformę nie zostało jeszcze aktywowane dla żadnego z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję w ustawieniach konta. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Logowanie poprzez tą platformę, nie zostało jeszcze aktywowane dla żadnego + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Logowanie poprzez tą platformę nie zostało jeszcze aktywowane dla żadnego z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję w ustawieniach konta. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Logowanie poprzez tą platformę, nie zostało jeszcze aktywowane dla żadnego + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Logowanie poprzez tą platformę nie zostało jeszcze aktywowane dla żadnego z kont e-mail. Zaloguj się używając loginu i hasła, a następnie włącz tą funkcję w ustawieniach konta. - DOMAIN_NOT_ALLOWED: "Brak zezwolenia na użycie tej domeny" - ACCOUNT_NOT_ALLOWED: "Brak zezwolenia dla tego konta" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Wymagana dwuskładnikowa autoryzacja" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Błąd autoryzacji dwuskładnikowej" + DOMAIN_NOT_ALLOWED: "Domena niedozwolona" + ACCOUNT_NOT_ALLOWED: "Konto jest niedozwolone" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Wymagana autoryzacja dwuetapowa" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Błąd autoryzacji dwuetapowej" COULD_NOT_SAVE_NEW_PASSWORD: "Nie można było zapisać nowego hasła" CURRENT_PASSWORD_INCORRECT: "Bieżące hasło jest niepoprawne" NEW_PASSWORD_SHORT: "Wybrane hasło jest za krótkie" NEW_PASSWORD_WEAK: "Wybrane hasło jest zbyt proste" - NEW_PASSWORD_FORBIDDENT: "Wybrane hasło zawiera zakazane znaki" + NEW_PASSWORD_FORBIDDENT: "Wybrane hasło zawiera niedozwolone znaki" CONTACTS_SYNC_ERROR: "Błąd synchronizacji kontaktów" CANT_GET_MESSAGE_LIST: "Nie można pobrać listy wiadomości" CANT_GET_MESSAGE: "Nie można pobrać wiadomości" @@ -309,17 +310,17 @@ pl_PL: UNKNOWN_ERROR: "Nieznany błąd" STATIC: BACK_LINK: "Odśwież" - DOMAIN_LIST_DESC: "Lista domen, do których można uzyskać dostęp za pomocą tego klienta." + DOMAIN_LIST_DESC: "Lista domen, do których można uzyskać dostęp za pomocą tego webmaila." PHP_EXSTENSIONS_ERROR_DESC: "Brak wymaganych rozszerzeń w konfiguracji PHP!" - PHP_VERSION_ERROR_DESC: "Twoja wersja PHP: (%VERSION%), jest niższa niż minimalna: 5.3.0!" - NO_SCRIPT_TITLE: "Ta aplikacja do poprawnej pracy wymaga javascript-u." + PHP_VERSION_ERROR_DESC: "Twoja wersja PHP (%VERSION%) jest niższa niż minimalna: 5.3.0!" + NO_SCRIPT_TITLE: "Ta aplikacja do poprawnej pracy wymaga JavaScript." NO_SCRIPT_DESC: | - Twoja przeglądarka nie obsługuje javascript-u. - Proszę o jego włączenie i ponowną próbę. + Twoja przeglądarka nie obsługuje JavaScript. + Włącz obsługę JavaScript i spróbuj ponownie. NO_COOKIE_TITLE: "Obsługa plików cookies jest wymagana dla poprawnego działania skryptu." NO_COOKIE_DESC: | Twoja przeglądarka nie obsługuje plików cookies. - Proszę o ich włączenie i ponowną próbę. + Włącz obsługę cookies i spróbuj ponownie. BAD_BROWSER_TITLE: "Posiadasz nieaktualną wersję przeglądarki." BAD_BROWSER_DESC: | W celu wykorzystania wszystkich funkcji tej aplikacji, diff --git a/rainloop/v/0.0.0/app/localization/admin/sl_SI.yml b/rainloop/v/0.0.0/app/localization/admin/sl_SI.yml index 13ef86afa..f205a22b8 100644 --- a/rainloop/v/0.0.0/app/localization/admin/sl_SI.yml +++ b/rainloop/v/0.0.0/app/localization/admin/sl_SI.yml @@ -34,6 +34,7 @@ sl_SI: LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Dovoli dodatne račune" LABEL_ALLOW_IDENTITIES: "Dovoli več identitet" LABEL_ALLOW_TEMPLATES: "Dovoli predloge" + ALERT_DATA_ACCESS: "Mapa z RainLoop podatki je prosto ogledljiva. Prosimo, nastavite strežnik, da skrije mapo pred zunanjimi dostopi. Preberite več tukaj:" ALERT_WARNING: "Pozor!" HTML_ALERT_WEAK_PASSWORD: | V uporabi je privzeto geslo administratorja diff --git a/rainloop/v/0.0.0/app/localization/webmail/bg_BG.yml b/rainloop/v/0.0.0/app/localization/webmail/bg_BG.yml index 53bbc3df1..90fd99ac4 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/bg_BG.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/bg_BG.yml @@ -314,7 +314,7 @@ bg_BG: LABEL_CODE: "Код" BUTTON_TEST: "Тест" POPUPS_FILTER: - TITLE_CREATE_FILTER: "Въздай филтър?" + TITLE_CREATE_FILTER: "Създай филтър?" TITLE_EDIT_FILTER: "Обнови филтъра?" FILTER_NAME: "Име" LEGEND_CONDITIONS: "Условия" diff --git a/rainloop/v/0.0.0/app/localization/webmail/fa_IR.yml b/rainloop/v/0.0.0/app/localization/webmail/fa_IR.yml index 76c95e25d..63429dbeb 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/fa_IR.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/fa_IR.yml @@ -145,11 +145,13 @@ fa_IR: PRINT_LABEL_ATTACHMENTS: "پیوست‌ها" MESSAGE_LOADING: "در حال بارگذاری" MESSAGE_VIEW_DESC: "پیام را در لیست جهت مشاهده انتخاب کنید" + MESSAGE_VIEW_MOVE_DESC: "بر روی نام شاخه در پنل سمت راست جهت انتخاب مقصد کلیک کنید" PGP_PASSWORD_INPUT_PLACEHOLDER: "گذرواژه" PGP_SIGNED_MESSAGE_DESC: "پیام توسط OpenPGP امضاء شد (برای بررسی کلیک کنید)" PGP_ENCRYPTED_MESSAGE_DESC: "پیام توسط OpenPGP رمزنگاری شد (برای خارج شدن از حالت رمز کلیک کنید)" LINK_DOWNLOAD_AS_ZIP: "دریافت با پسوند zip" LINK_SAVE_TO_OWNCLOUD: "ذخیره در OwnCloud" + LINK_SAVE_TO_CLOUD: "در فضای ابری ذخیره کن" LINK_SAVE_TO_DROPBOX: "ذخیره در Dropbox" READ_RECEIPT: SUBJECT: "برگرداندن گیرنده (نمایش داده شد) - %SUBJECT%" @@ -580,6 +582,7 @@ fa_IR: TITLE_PUBLIC: "عمومی" DELETING_ASK: "اطمینان دارید؟" GENERATE_ONLY_HTTPS: "تنها HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "ذخیره خودکار پیش‌نویس" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "راهنمای میانبر‌های کیبرد" TAB_MAILBOX: "صندوق پستی" diff --git a/rainloop/v/0.0.0/app/localization/webmail/nb_NO.yml b/rainloop/v/0.0.0/app/localization/webmail/nb_NO.yml index ea528954d..ec62d4253 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/nb_NO.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/nb_NO.yml @@ -673,7 +673,7 @@ nb_NO: CANT_CREATE_FOLDER: "Klarte ikke å lage mappe" CANT_RENAME_FOLDER: "Klarte ikke å endre navn på mappe" CANT_DELETE_FOLDER: "Klarte ikke å slette mappe" - CANT_DELETE_NON_EMPTY_FOLDER: "Klarte ikke å slette mappe med innhold" + CANT_DELETE_NON_EMPTY_FOLDER: "Du må slette mappeinnholdet før du kan slette mappa" CANT_SUBSCRIBE_FOLDER: "Klarte ikke å abonnere på mappe" CANT_UNSUBSCRIBE_FOLDER: "Klarte ikke å avslutte abonnement" CANT_SAVE_SETTINGS: "Klarte ikke å lagre innstillinger" diff --git a/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml b/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml index 5fa1378ac..0592e8efb 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml @@ -5,12 +5,12 @@ pl_PL: LABEL_PASSWORD: "Hasło" LABEL_SIGN_ME: "Zapamiętaj mnie" LABEL_VERIFICATION_CODE: "Kod weryfikujący" - LABEL_DONT_ASK_VERIFICATION_CODE: "Nie pytaj o kod przez 2 tygodnie" + LABEL_DONT_ASK_VERIFICATION_CODE: "Nie pytaj o kod przez kolejne 2 tygodnie" BUTTON_SIGN_IN: "Zaloguj" TITLE_SIGN_IN_GOOGLE: "Zaloguj się przez Google" TITLE_SIGN_IN_FACEBOOK: "Zaloguj się przez Facebook" TITLE_SIGN_IN_TWITTER: "Zaloguj się przez Twitter" - LABEL_FORGOT_PASSWORD: "Zapomniałem hasło" + LABEL_FORGOT_PASSWORD: "Zapomniałem(-am) hasło" LABEL_REGISTRATION: "Rejestracja" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Dodaj konto" @@ -23,16 +23,16 @@ pl_PL: SEARCH: MAIN_INPUT_PLACEHOLDER: "Szukaj" TITLE_ADV: "Wyszukiwanie zaawansowane" - LABEL_ADV_FROM: "Od:" - LABEL_ADV_TO: "Do:" - LABEL_ADV_SUBJECT: "Temat:" - LABEL_ADV_TEXT: "Tekst:" - LABEL_ADV_HAS_ATTACHMENT: "Załącznik" - LABEL_ADV_HAS_ATTACHMENTS: "Ma załączniki" + LABEL_ADV_FROM: "Od" + LABEL_ADV_TO: "Do" + LABEL_ADV_SUBJECT: "Temat" + LABEL_ADV_TEXT: "Tekst" + LABEL_ADV_HAS_ATTACHMENT: "Posiada załącznik" + LABEL_ADV_HAS_ATTACHMENTS: "Posiada załączniki" LABEL_ADV_FLAGGED: "Oznaczona" LABEL_ADV_UNSEEN: "Nieprzeczytana" - LABEL_ADV_DATE: "Data:" - LABEL_ADV_DATE_ALL: "wszystkie" + LABEL_ADV_DATE: "Data" + LABEL_ADV_DATE_ALL: "Wszystkie" LABEL_ADV_DATE_3_DAYS: "do 3 dni" LABEL_ADV_DATE_7_DAYS: "do tygodnia" LABEL_ADV_DATE_MONTH: "do miesiąca" @@ -47,7 +47,7 @@ pl_PL: LOADING: "Ładowanie..." GALLERY_PREV: "Poprzedni (strzałka w lewo)" GALLERY_NEXT: "Następny (strzałka w prawo)" - GALLERY_COUNTER: "%curr% z: %total%" + GALLERY_COUNTER: "%curr% z %total%" IMAGE_ERROR: "Nie można załadować obrazu." AJAX_ERROR: "Nie można załadować zawartości." FOLDER_LIST: @@ -56,22 +56,22 @@ pl_PL: BUTTON_NEW_MESSAGE: "Nowa wiadomość" INBOX_NAME: "Odebrane" SENT_NAME: "Wysłane" - DRAFTS_NAME: "Wersje robocze" - SPAM_NAME: "Wiadomości śmieci - SPAM" + DRAFTS_NAME: "Szkice" + SPAM_NAME: "Spam" TRASH_NAME: "Kosz" ARCHIVE_NAME: "Archiwum" QUOTA: - TITLE: "Wykorzystanie miejsca" + TITLE: "Wykorzystane miejsce" MESSAGE_LIST: - BUTTON_RELOAD: "Odśwież" - BUTTON_MOVE_TO: "Przenieś" + BUTTON_RELOAD: "Odśwież listę wiadomości" + BUTTON_MOVE_TO: "Przenieś do" BUTTON_DELETE: "Usuń" BUTTON_ARCHIVE: "Archiwizuj" BUTTON_SPAM: "Oznacz jako SPAM" BUTTON_NOT_SPAM: "Oznacz jako pożądane" BUTTON_EMPTY_FOLDER: "Usuń zawartość folderu" - BUTTON_MULTY_FORWARD: "Przekaż dalej" - BUTTON_DELETE_WITHOUT_MOVE: "Usuń (pernamentnie)" + BUTTON_MULTY_FORWARD: "Przekaż dalej jako załącznik(i)" + BUTTON_DELETE_WITHOUT_MOVE: "Usuń permanentnie" BUTTON_MORE: "Więcej" MENU_SET_SEEN: "Oznacz jako przeczytane" MENU_SET_ALL_SEEN: "Oznacz wszystkie jako przeczytane" @@ -85,18 +85,18 @@ pl_PL: MENU_SELECT_SEEN: "Przeczytane" MENU_SELECT_FLAGGED: "Oznaczone jako ważne" MENU_SELECT_UNFLAGGED: "Oznaczone jako nieważne" - EMPTY_LIST: "Pusta lista" - EMPTY_SEARCH_LIST: "Brak wiadomości spełniających kryteria wyszukiwania" - SEARCH_RESULT_FOR: "Wyniki wyszukiwania dla: \"%SEARCH%\"" + EMPTY_LIST: "Brak wiadomości." + EMPTY_SEARCH_LIST: "Brak wiadomości spełniających kryteria wyszukiwania." + SEARCH_RESULT_FOR: "Wyniki wyszukiwania dla \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "powrót do listy wiadomości" LIST_LOADING: "Ładowanie..." EMPTY_SUBJECT_TEXT: "(Brak tematu)" - PUT_MESSAGE_HERE: "Przeciągnij tutaj wiadomość, żeby zobaczyć ją na liście" - TODAY_AT: "dzisiaj: %TIME%" - YESTERDAY_AT: "wczoraj: %TIME%" + PUT_MESSAGE_HERE: "Przeciągnij wiadomość tutaj, żeby zobaczyć ją na liście" + TODAY_AT: "dzisiaj o %TIME%" + YESTERDAY_AT: "wczoraj o %TIME%" SEARCH_PLACEHOLDER: "Szukaj" NEW_MESSAGE_NOTIFICATION: "Masz: %COUNT% now(-ą,-e,-ych) wiadomości!" - QUOTA_SIZE: "Wykorzystano: %SIZE% (%PROC%%) z: %LIMIT%" + QUOTA_SIZE: "Wykorzystano %SIZE% (%PROC%%) z %LIMIT%" MESSAGE: BUTTON_EDIT: "Edytuj" BUTTON_BACK: "Wstecz" @@ -106,22 +106,22 @@ pl_PL: BUTTON_ARCHIVE: "Archiwizuj" BUTTON_SPAM: "Oznacz jako niechcianą" BUTTON_NOT_SPAM: "Oznacz jako pożądaną" - BUTTON_MOVE_TO: "Przenieś" + BUTTON_MOVE_TO: "Przenieś do" BUTTON_MORE: "Więcej" BUTTON_REPLY: "Odpowiedz" BUTTON_REPLY_ALL: "Odpowiedz wszystkim" BUTTON_FORWARD: "Przekaż dalej" - BUTTON_FORWARD_AS_ATTACHMENT: "Przekaż jako załącznik" + BUTTON_FORWARD_AS_ATTACHMENT: "Przekaż dalej jako załącznik" BUTTON_EDIT_AS_NEW: "Zredaguj jako nową wiadomość" - BUTTON_SHOW_IMAGES: "Wyświetl obrazy" - BUTTON_NOTIFY_READ_RECEIPT: "Nadawca prosi o potwierdzenie odczytania tej wiadomości" + BUTTON_SHOW_IMAGES: "Wyświetl zewnętrzne obrazy" + BUTTON_NOTIFY_READ_RECEIPT: "Nadawca prosi o potwierdzenie odczytania tej wiadomości." BUTTON_IN_NEW_WINDOW: "Wyświetl w osobnym oknie" BUTTON_THREAD_LIST: "Lista wątków" BUTTON_THREAD_PREV: "Poprzedni" BUTTON_THREAD_NEXT: "Następny" BUTTON_THREAD_MORE: "Więcej wiadomości" MENU_HEADERS: "Pokaż nagłówki wiadomości" - MENU_VIEW_ORIGINAL: "Pokaż zródło" + MENU_VIEW_ORIGINAL: "Pokaż źródło" MENU_DOWNLOAD_ORIGINAL: "Pobierz jako plik eml" MENU_FILTER_SIMILAR: "Filtruj podobne wiadomości" MENU_PRINT: "Drukuj" @@ -129,32 +129,34 @@ pl_PL: LABEL_SUBJECT: "Temat" LABEL_DATE: "Data" LABEL_FROM: "Od" - LABEL_FROM_SHORT: "Od" + LABEL_FROM_SHORT: "od" LABEL_TO: "Do" - LABEL_TO_SHORT: "Do" + LABEL_TO_SHORT: "do" LABEL_CC: "Kopia" - LABEL_BCC: "Ukr. kopia" - LABEL_REPLY_TO: "Zwrot do" + LABEL_BCC: "Kopia ukryta" + LABEL_REPLY_TO: "Odpisz do" PRINT_LABEL_FROM: "Od" PRINT_LABEL_TO: "Do" PRINT_LABEL_CC: "Kopia" - PRINT_LABEL_BCC: "Ukr. kopia" - PRINT_LABEL_REPLY_TO: "Zwrot do" + PRINT_LABEL_BCC: "Kopia ukryta" + PRINT_LABEL_REPLY_TO: "Odpisz do" PRINT_LABEL_DATE: "Data" PRINT_LABEL_SUBJECT: "Temat" PRINT_LABEL_ATTACHMENTS: "Załączniki" MESSAGE_LOADING: "Ładowanie wiadomości..." - MESSAGE_VIEW_DESC: "Wybierz wiadomość do wyświetlenia" + MESSAGE_VIEW_DESC: "Wybierz wiadomość do wyświetlenia." + MESSAGE_VIEW_MOVE_DESC: "Kliknij nazwę folderu w lewym panelu, aby wybrać folder docelowy." PGP_PASSWORD_INPUT_PLACEHOLDER: "Hasło" - PGP_SIGNED_MESSAGE_DESC: "Podpisana" - PGP_ENCRYPTED_MESSAGE_DESC: "Zaszyfrowana" + PGP_SIGNED_MESSAGE_DESC: "Wiadomość podpisana OpenPGP (kliknij aby zweryfikować)" + PGP_ENCRYPTED_MESSAGE_DESC: "Wiadomość zaszyfrowana OpenPGP (kliknij aby odszyfrować)" LINK_DOWNLOAD_AS_ZIP: "Pobierz jako plik zip" LINK_SAVE_TO_OWNCLOUD: "Zapisz w ownCloud" + LINK_SAVE_TO_CLOUD: "Zapisz w chmurze" LINK_SAVE_TO_DROPBOX: "Zapisz w Dropbox-ie" READ_RECEIPT: - SUBJECT: "Potwierdzenie wyświetlenia wiadomości o tytule: %SUBJECT%" + SUBJECT: "Żądaj potwierdzenia wyświetlenia wiadomości - %SUBJECT%" BODY: | - Potwierdzenie wyświetlenia wiadomości wysłanej na adres: %READ-RECEIPT%. + Potwierdzenie wyświetlenia wiadomości wysłanej na adres %READ-RECEIPT%. Uwaga: Otrzymanie tego potwierdzenia jest dowodem na to, że wiadomość została wyświetlona na komputerze odbiorcy. Nie ma jednak żadnej gwarancji, że odbiorca faktycznie zapoznał się z jej treścią. @@ -175,15 +177,15 @@ pl_PL: EMPTY_SEARCH: "Nie znaleziono żadnych kontaktów" CLEAR_SEARCH: "Wyczyść wyniki" CONTACT_VIEW_DESC: "Wybierz kontakt do wyświetlenia" - LABEL_DISPLAY_NAME: "Nazwa:" - LABEL_EMAIL: "Adres e-mail:" - LABEL_PHONE: "Telefon:" - LABEL_WEB: "Strona WWW:" - LABEL_BIRTHDAY: "Urodziny:" + LABEL_DISPLAY_NAME: "Nazwa wyświetlana" + LABEL_EMAIL: "Adres e-mail" + LABEL_PHONE: "Telefon" + LABEL_WEB: "Strona WWW" + LABEL_BIRTHDAY: "Urodziny" LINK_ADD_EMAIL: "Dodaj adres e-mail" LINK_ADD_PHONE: "Dodaj nr telefonu" LINK_BIRTHDAY: "Urodziny" - PLACEHOLDER_ENTER_DISPLAY_NAME: "Nazwa" + PLACEHOLDER_ENTER_DISPLAY_NAME: "Nazwa wyświetlana" PLACEHOLDER_ENTER_LAST_NAME: "Nazwisko" PLACEHOLDER_ENTER_FIRST_NAME: "Imię" PLACEHOLDER_ENTER_NICK_NAME: "Pseudonim" @@ -194,7 +196,7 @@ pl_PL: ADD_MENU_NOTES: "Notatki" ADD_MENU_EMAIL: "Adres e-mail" ADD_MENU_PHONE: "Telefon" - ADD_MENU_URL: "Adres www" + ADD_MENU_URL: "Adres URL" ADD_MENU_ADDRESS: "Adres" ADD_MENU_BIRTHDAY: "Urodziny" ADD_MENU_TAGS: "Tagi" @@ -205,8 +207,8 @@ pl_PL: TITLE_FROM: "Od" TITLE_TO: "Do" TITLE_CC: "Kopia" - TITLE_BCC: "Ukr. kopia" - TITLE_REPLY_TO: "Zwrot do" + TITLE_BCC: "Kopia ukryta" + TITLE_REPLY_TO: "Odpisz do" TITLE_SUBJECT: "Temat" LINK_SHOW_INPUTS: "Pokaż wszystkie pola" BUTTON_SEND: "Wyślij" @@ -214,185 +216,185 @@ pl_PL: BUTTON_DELETE: "Usuń" BUTTON_CANCEL: "Anuluj" BUTTON_MINIMIZE: "Minimalizuj" - SAVED_TIME: "Zapisane: %TIME%" - SAVED_ERROR_ON_SEND: "Wiadomość została wysłana, ale nie została zapisana w folderze: Wysłane" + SAVED_TIME: "Zapisano o %TIME%" + SAVED_ERROR_ON_SEND: "Wiadomość została wysłana, ale nie została zapisana w folderze Wysłane" DISCARD_UNSAVED_DATA: "Odrzucić niezapisane dane?" ATTACH_FILES: "Dodaj załącznik" ATTACH_DROP_FILES_DESC: "Przeciągnij pliki tutaj" ATTACH_ITEM_CANCEL: "Anuluj" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Dysk Google" - REPLY_MESSAGE_TITLE: "%DATETIME% - %EMAIL%" - FORWARD_MESSAGE_TOP_TITLE: "-------- Przekierowana wiadomość -------" - FORWARD_MESSAGE_TOP_FROM: "Od:" - FORWARD_MESSAGE_TOP_TO: "Do:" - FORWARD_MESSAGE_TOP_CC: "Kopia do:" - FORWARD_MESSAGE_TOP_SENT: "Wysłany:" - FORWARD_MESSAGE_TOP_SUBJECT: "Temat:" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL%" + FORWARD_MESSAGE_TOP_TITLE: "-------- Wiadomość przekazana -------" + FORWARD_MESSAGE_TOP_FROM: "Od" + FORWARD_MESSAGE_TOP_TO: "Do" + FORWARD_MESSAGE_TOP_CC: "Kopia do" + FORWARD_MESSAGE_TOP_SENT: "Wysłano" + FORWARD_MESSAGE_TOP_SUBJECT: "Temat" EMPTY_TO_ERROR_DESC: "Wprowadź co najmniej jednego odbiorcę" - NO_ATTACHMENTS_HERE_DESC: "Brak załączników" - ATTACHMENTS_ERROR_DESC: "Ostrzeżenie! Nie wszystkie załaczniki zostały przesłane" - ATTACHMENTS_UPLOAD_ERROR_DESC: "Nie przesłano jeszcze wszystkich załączników" - BUTTON_REQUEST_READ_RECEIPT: "Potwierdzenie wyświetlenia wiadomości" + NO_ATTACHMENTS_HERE_DESC: "Brak załączników." + ATTACHMENTS_ERROR_DESC: "Ostrzeżenie! Nie wszystkie załączniki zostały przesłane na serwer." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Jeszcze nie wszystkie załączniki zostały przesłane na serwer." + BUTTON_REQUEST_READ_RECEIPT: "Żądaj potwierdzenia wyświetlenia wiadomości" BUTTON_MARK_AS_IMPORTANT: "Oznacz jako ważną" BUTTON_OPEN_PGP: "OpenPGP (tylko wiadomości tekstowe)" - BUTTON_REQUEST_DSN: "Potwierdzenie dostarczenia wiadomości" + BUTTON_REQUEST_DSN: "Żądaj potwierdzenia dostarczenia wiadomości" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Zamknij" POPUPS_ASK: BUTTON_YES: "Tak" BUTTON_NO: "Nie" DESC_WANT_CLOSE_THIS_WINDOW: "Na pewno zamknąć to okno?" - DESC_WANT_DELETE_MESSAGES: "Na pewno usunąć wiadomość(-i)?" + DESC_WANT_DELETE_MESSAGES: "Na pewno usunąć wiadomość(-ci)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Wybierz język" POPUPS_ADD_ACCOUNT: - TITLE_ADD_ACCOUNT: "Dodawanie konta" + TITLE_ADD_ACCOUNT: "Czy dodać konto?" BUTTON_ADD_ACCOUNT: "Dodaj" - TITLE_UPDATE_ACCOUNT: "Aktualizacja konta" + TITLE_UPDATE_ACCOUNT: "Czy zaktualizować konto?" BUTTON_UPDATE_ACCOUNT: "Aktualizuj" POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Dodawanie tożsamości" - TITLE_UPDATE_IDENTITY: "Aktualizacja tożsamości" + TITLE_ADD_IDENTITY: "Czy dodać tożsamość?" + TITLE_UPDATE_IDENTITY: "Czy zaktualizować tożsamość?" BUTTON_ADD_IDENTITY: "Dodaj" BUTTON_UPDATE_IDENTITY: "Aktualizuj" - LABEL_EMAIL: "Adres e-mail:" - LABEL_NAME: "Nazwa:" - LABEL_REPLY_TO: "Zwrot do" - LABEL_SIGNATURE: "Podpis:" + LABEL_EMAIL: "Adres e-mail" + LABEL_NAME: "Nazwa" + LABEL_REPLY_TO: "Odpisz do" + LABEL_SIGNATURE: "Podpis" LABEL_CC: "Kopia" - LABEL_BCC: "Ukr. kopia" - LABEL_SIGNATURE_INSERT_BEFORE: "Umieść podpis przed cytowanym tekstem" + LABEL_BCC: "Kopia ukryta" + LABEL_SIGNATURE_INSERT_BEFORE: "Umieszczaj ten podpis przed cytowanym tekstem w odpowiedziach" POPUPS_CREATE_FOLDER: - TITLE_CREATE_FOLDER: "Tworzenie folderu" - LABEL_NAME: "Nazwa folderu:" - LABEL_PARENT: "Folder nadrzędny:" + TITLE_CREATE_FOLDER: "Czy stworzyć folder?" + LABEL_NAME: "Nazwa folderu" + LABEL_PARENT: "Folder nadrzędny" BUTTON_CREATE: "Utwórz" BUTTON_CANCEL: "Anuluj" BUTTON_CLOSE: "Zamknij" TITLE_CREATING_PROCESS: "Tworzenie folderu" POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Usuwanie wszystkich wiadomości z folderu" + TITLE_CLEAR_FOLDER: "Czy usunąć wszystkie wiadomości z folderu?" BUTTON_CLEAR: "Usuń wszystkie" BUTTON_CANCEL: "Anuluj" BUTTON_CLOSE: "Zamknij" DANGER_DESC_WARNING: "Ostrzeżenie!" - DANGER_DESC_HTML_1: "Wszystkie wiadomości w folderze: %FOLDER%, zostaną bezpowrotnie usunięte!" - DANGER_DESC_HTML_2: "Po rozpoczęciu, nie można przerwać lub anulować zadania." + DANGER_DESC_HTML_1: "Wszystkie wiadomości w folderze %FOLDER% zostaną bezpowrotnie usunięte!" + DANGER_DESC_HTML_2: "Po rozpoczęciu nie będzie możliwe przerwanie lub anulowanie zadania." TITLE_CLEARING_PROCESS: "Trwa usuwanie wszystkich wiadomości z folderu..." POPUPS_IMPORT_OPEN_PGP_KEY: TITLE_IMPORT_OPEN_PGP_KEY: "Importowanie klucza OpenPGP" BUTTON_IMPORT_OPEN_PGP_KEY: "Importuj" POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "Klucz OpenPGP" + TITLE_VIEW_OPEN_PGP_KEY: "Podgląd klucza OpenPGP" BUTTON_SELECT: "Zaznacz" BUTTON_CLOSE: "Zamknij" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Generowanie klucza OpenPGP" - LABEL_EMAIL: "Adres e-mail:" - LABEL_NAME: "Imię i nazwisko:" - LABEL_PASSWORD: "Hasło:" - LABEL_KEY_BIT_LENGTH: "Długość klucza:" + LABEL_EMAIL: "Adres e-mail" + LABEL_NAME: "Nazwa" + LABEL_PASSWORD: "Hasło" + LABEL_KEY_BIT_LENGTH: "Długość klucza" BUTTON_GENERATE_OPEN_PGP_KEYS: "Generuj" POPUPS_COMPOSE_OPEN_PGP: - TITLE_COMPOSE_OPEN_PGP: "Podpisywanie/szyfrowanie" + TITLE_COMPOSE_OPEN_PGP: "Podpisywanie/szyfrowanie OpenPGP" LABEL_SIGN: "Podpisz" - LABEL_ENCRYPT: "Szyfruj" - LABEL_PASSWORD: "Hasło:" + LABEL_ENCRYPT: "Zaszyfruj" + LABEL_PASSWORD: "Hasło" BUTTON_SIGN: "Podpisz" - BUTTON_ENCRYPT: "Szyfruj" - BUTTON_SIGN_AND_ENCRYPT: "Podpisz i szyfruj" + BUTTON_ENCRYPT: "Zaszyfruj" + BUTTON_SIGN_AND_ENCRYPT: "Podpisz i zaszyfruj" POPUPS_MESSAGE_OPEN_PGP: - TITLE_MESSAGE_OPEN_PGP: "OpenPGP Decrypt" + TITLE_MESSAGE_OPEN_PGP: "Odszyfrowywanie OpenPGP" LABEL_KEY: "Klucz prywatny" LABEL_PASSWORD: "Password" - BUTTON_DECRYPT: "Decrypt" + BUTTON_DECRYPT: "Odszyfruj" POPUPS_TWO_FACTOR_TEST: - TITLE_TEST_CODE: "Test autoryzacji dwuskładnikowej" + TITLE_TEST_CODE: "Test autoryzacji 2-etapowej" LABEL_CODE: "Kod" BUTTON_TEST: "Testuj" POPUPS_FILTER: - TITLE_CREATE_FILTER: "Tworzenie filtra" - TITLE_EDIT_FILTER: "Aktualizacja filtra" + TITLE_CREATE_FILTER: "Czy stworzyć filtr?" + TITLE_EDIT_FILTER: "Czy zaktualizować filtr?" FILTER_NAME: "Nazwa" LEGEND_CONDITIONS: "Warunki" LEGEND_ACTIONS: "Działania" BUTTON_DONE: "Gotowe" BUTTON_ADD_CONDITION: "Dodaj warunek" SELECT_ACTION_NONE: "Brak" - SELECT_ACTION_MOVE_TO: "Przenieś" + SELECT_ACTION_MOVE_TO: "Przenieś do" SELECT_ACTION_FORWARD_TO: "Prześlij dalej" SELECT_ACTION_REJECT: "Odrzuć" SELECT_ACTION_VACATION_MESSAGE: "Wiadomość urlopowa" - SELECT_ACTION_DISCARD: "Usuń" - SELECT_FIELD_FROM: "Pole 'Od'" - SELECT_FIELD_RECIPIENTS: "Pole 'Kopia' lub 'Ukr. kopia'" - SELECT_FIELD_SUBJECT: "Pole 'Temat'" + SELECT_ACTION_DISCARD: "Porzuć" + SELECT_FIELD_FROM: "Od" + SELECT_FIELD_RECIPIENTS: "Adresaci (Do lub DW)" + SELECT_FIELD_SUBJECT: "Temat" SELECT_FIELD_HEADER: "Nagłówek" SELECT_FIELD_SIZE: "Rozmiar" SELECT_TYPE_CONTAINS: "zawiera" SELECT_TYPE_NOT_CONTAINS: "nie zawiera" - SELECT_TYPE_MATCHES: "zawiera (*,?)" - SELECT_TYPE_NOT_MATCHES: "nie zawiera (*,?)" - SELECT_TYPE_REGEXP: "Wyrażenie regularne:" - SELECT_TYPE_NOT_REGEXP: "Niepoprawne wyrażenie regularne:" - SELECT_TYPE_EQUAL_TO: "Zawiera:" - SELECT_TYPE_NOT_EQUAL_TO: "Nie zawiera:" + SELECT_TYPE_MATCHES: "zawiera (*, ?)" + SELECT_TYPE_NOT_MATCHES: "nie zawiera (*, ?)" + SELECT_TYPE_REGEXP: "Wyrażenie regularne" + SELECT_TYPE_NOT_REGEXP: "Niepoprawne wyrażenie regularne" + SELECT_TYPE_EQUAL_TO: "równy" + SELECT_TYPE_NOT_EQUAL_TO: "nierówny" SELECT_TYPE_OVER: "powyżej" SELECT_TYPE_UNDER: "poniżej" SELECT_MATCH_ANY: "Spełnia dowolny z warunków" SELECT_MATCH_ALL: "Spełnia wszystkie warunki" MARK_AS_READ_LABEL: "Oznacz jako przeczytane" - REPLY_INTERVAL_LABEL: "Liczba dni, po których wysłać odp." + REPLY_INTERVAL_LABEL: "Interwał odpowiedzi (dni)" KEEP_LABEL: "Zachowaj" STOP_LABEL: "Nie zatrzymuj przetwarzania reguł" EMAIL_LABEL: "Adres e-mail" VACATION_SUBJECT_LABEL: "Temat (opcjonalnie)" VACATION_MESSAGE_LABEL: "Wiadomość" VACATION_RECIPIENTS_LABEL: "Odbiorcy (rodzielone przecinkami)" - REJECT_MESSAGE_LABEL: "Powód odrzucenia" + REJECT_MESSAGE_LABEL: "Odrzuć wiadomość" ALL_INCOMING_MESSAGES_DESC: "Wszystkie przychodzące wiadomości" POPUPS_SYSTEM_FOLDERS: - TITLE_SYSTEM_FOLDERS: "Wybieranie folderów systemowych" - SELECT_CHOOSE_ONE: "wybierz" + TITLE_SYSTEM_FOLDERS: "Wybierz foldery systemowe" + SELECT_CHOOSE_ONE: "Wybierz" SELECT_UNUSE_NAME: "nie używaj" - LABEL_SENT: "Wysłane:" - LABEL_DRAFTS: "Wersje robocze:" - LABEL_SPAM: "Niechciane:" - LABEL_TRASH: "Kosz:" - LABEL_ARCHIVE: "Archiwum:" + LABEL_SENT: "Wysłane" + LABEL_DRAFTS: "Szkice" + LABEL_SPAM: "Spam" + LABEL_TRASH: "Kosz" + LABEL_ARCHIVE: "Archiwum" BUTTON_CANCEL: "Anuluj" BUTTON_CLOSE: "Zamknij" NOTIFICATION_SENT: | - Nie wybrano folderu: "Wysłane", do którego przenoszone są wysłane wiadomości. - Jeżeli wysyłane wiadomości nie mają być przechowywane, proszę zaznaczyć opcję: "Nie używaj". - NOTIFICATION_DRAFTS: "Nie wybrano folderu: \"Wersje robocze\", do którego są zapisywane wiadomości w trakcie ich tworzenia." + Nie wybrano folderu systemowego "Wysłane", do którego przenoszone są wysłane wiadomości. + Jeżeli wysyłane wiadomości nie mają być przechowywane, proszę zaznaczyć opcję "Nie używaj". + NOTIFICATION_DRAFTS: "Nie wybrano folderu \"Wersje robocze\", do którego są zapisywane wiadomości w trakcie ich tworzenia." NOTIFICATION_SPAM: | - Nie wybrano folderu: "Niechciane", do którego przenoszone są niepożadane wiadomości. - Jeżeli niechciane wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji: "Nie używaj". + Nie wybrano folderu "Spam", do którego przenoszone są niepożądane wiadomości. + Jeżeli niechciane wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji "Nie używaj". NOTIFICATION_TRASH: | - Nie wybrano folderu: "Kosz", do którego przenoszone są wszystkie usunięte wiadomości. - Jeżeli wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji: "Nie używaj". + Nie wybrano folderu "Kosz", do którego przenoszone są wszystkie usunięte wiadomości. + Jeżeli wiadomości mają być usuwane na stałe, proszę o zaznaczenie opcji "Nie używaj". NOTIFICATION_ARCHIVE: "Nie został wybrany folder \"Archiwum\", zostanie użyty systemowy folder archiwizacji wiadomości." POPUPS_TWO_FACTOR_CFG: - LEGEND_TWO_FACTOR_AUTH: "Dwuskładnikowa autoryzacja" - LABEL_ENABLE_TWO_FACTOR: "Włącz dwuskładnikową autoryzację" - LABEL_TWO_FACTOR_USER: "Użytkownik:" - LABEL_TWO_FACTOR_STATUS: "Status:" - LABEL_TWO_FACTOR_SECRET: "Tajna fraza:" - LABEL_TWO_FACTOR_BACKUP_CODES: "Kody zapasowe:" + LEGEND_TWO_FACTOR_AUTH: "Autoryzacja 2-etapowa (TOTP)" + LABEL_ENABLE_TWO_FACTOR: "Włącz autoryzację 2-etapową" + LABEL_TWO_FACTOR_USER: "Użytkownik" + LABEL_TWO_FACTOR_STATUS: "Status" + LABEL_TWO_FACTOR_SECRET: "Tajna fraza" + LABEL_TWO_FACTOR_BACKUP_CODES: "Kody zapasowe" BUTTON_CREATE: "Utwórz nową frazę" BUTTON_ACTIVATE: "Aktywuj" BUTTON_CLEAR: "Wyczyść" BUTTON_LOGOUT: "Wyloguj" BUTTON_DONE: "Zamknij" BUTTON_TEST: "Testuj" - LINK_TEST: "Test" + LINK_TEST: "test" BUTTON_SHOW_SECRET: "Pokaż frazę" BUTTON_HIDE_SECRET: "Ukryj frazę" - TWO_FACTOR_REQUIRE_DESC: "Twoje konto wymaga skonfigurowania dwuskładnikowej autoryzacji ." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Skonfigurowana" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nie skonfigurowana" + TWO_FACTOR_REQUIRE_DESC: "Twoje konto wymaga skonfigurowania autoryzacji 2-etapowej." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Skonfigurowano" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nie skonfigurowano" TWO_FACTOR_SECRET_DESC: >- Użyj tych informacji w usłudze Google Authenticator (lub innym kliencie TOTP), używając poniższego kodu QR lub wpisując kod ręcznie. @@ -403,17 +405,17 @@ pl_PL: TITLES: LOADING: "Ładowanie..." LOGIN: "Login" - MAILBOX: "Skrzynka Pocztowa" + MAILBOX: "Skrzynka Odbiorcza" SETTINGS: "Ustawienia" COMPOSE: "Utwórz" UPLOAD: ERROR_FILE_IS_TOO_BIG: "Plik jest za duży" - ERROR_FILE_PARTIALLY_UPLOADED: "Z powodu nieokreślonego błędu, plik nie został przesłany w całości" - ERROR_NO_FILE_UPLOADED: "Nie przesłano żadnego pliku" - ERROR_MISSING_TEMP_FOLDER: "Brakuje pliku tymczasowego" - ERROR_ON_SAVING_FILE: "Wystąpił nieoczekiwany błąd w trakcie przesyłania pliku" + ERROR_FILE_PARTIALLY_UPLOADED: "Z powodu nieokreślonego błędu plik nie został przesłany w całości" + ERROR_NO_FILE_UPLOADED: "Nie przesłano żadnego pliku na serwer" + ERROR_MISSING_TEMP_FOLDER: "Brak pliku tymczasowego" + ERROR_ON_SAVING_FILE: "Wystąpił nieoczekiwany błąd w trakcie przesyłania pliku na serwer" ERROR_FILE_TYPE: "Nieprawidłowy typ pliku" - ERROR_UNKNOWN: "Wystąpił nieznany błąd w trakcie przesyłania pliku" + ERROR_UNKNOWN: "Wystąpił nieznany błąd w trakcie przesyłania pliku na serwer" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> zwykły tekst" TEXT_SWITCHER_RICH_FORMATTING: "Wzbogacony format tekstowy" @@ -429,7 +431,7 @@ pl_PL: LABEL_FILTERS_NAME: "Filtry" LABEL_TEMPLATES_NAME: "Szablony" LABEL_SECURITY_NAME: "Bezpieczeństwo" - LABEL_SOCIAL_NAME: "Sieci społecznościowe" + LABEL_SOCIAL_NAME: "Media społecznościowe" LABEL_THEMES_NAME: "Motywy" LABEL_CHANGE_PASSWORD_NAME: "Hasło" LABEL_OPEN_PGP_NAME: "OpenPGP" @@ -439,39 +441,39 @@ pl_PL: BUTTON_SAVE: "Zapisz" BUTTON_ADD_FILTER: "Dodaj filtr" BUTTON_DELETE: "Usuń" - BUTTON_RAW_SCRIPT: "Utwórz własny skrypt użytkownika" + BUTTON_RAW_SCRIPT: "Użyj własnego skryptu użytkownika" SUBNAME_NONE: "Brak" SUBNAME_MOVE_TO: "Przenieś do \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Przekaż do \"%EMAIL%\"" SUBNAME_REJECT: "Odrzuć" SUBNAME_VACATION_MESSAGE: "Wiadomość urlopowa" - SUBNAME_DISCARD: "Usuń" + SUBNAME_DISCARD: "Porzuć" CAPABILITY_LABEL: "Możliwości" LOADING_PROCESS: "Aktualizowanie listy filtrów" DELETING_ASK: "Czy jesteś pewny(a)?" CHACHES_NEED_TO_BE_SAVED_DESC: "Zmiany te muszą zostać zapisane na serwerze." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Tożsamość" - LABEL_DISPLAY_NAME: "Imię i nazwisko" - LABEL_REPLY_TO: "Zwrot do" + LABEL_DISPLAY_NAME: "Nazwa" + LABEL_REPLY_TO: "Odpisz do" LABEL_SIGNATURE: "Podpis" - LABEL_ADD_SIGNATURE_TO_ALL: "Dadawaj podpis do wszystkich wiadomości" + LABEL_ADD_SIGNATURE_TO_ALL: "Dodawaj podpis do wszystkich wiadomości wychodzących" SETTINGS_SECURITY: LEGEND_SECURITY: "Bezpieczeństwo" - LABEL_CONFIGURE_TWO_FACTOR: "Konfiguracja dwuskładnikowej autoryzacji" - LABEL_AUTOLOGOUT: "Auto. wylogowanie:" + LABEL_CONFIGURE_TWO_FACTOR: "Konfiguracja autoryzacji 2-etapowej" + LABEL_AUTOLOGOUT: "Automatyczne wylogowanie" AUTOLOGIN_NEVER_OPTION_NAME: "Nidgy" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut(a)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% godzina(-y)" SETTINGS_GENERAL: LEGEND_GENERAL: "Ogólne" - LABEL_LANGUAGE: "Język:" - LABEL_IDENTITY: "Tożsamość:" - LABEL_LAYOUT: "Układ:" + LABEL_LANGUAGE: "Język" + LABEL_IDENTITY: "Tożsamość" + LABEL_LAYOUT: "Układ" LABEL_LAYOUT_NO_SPLIT: "bez podziału" LABEL_LAYOUT_VERTICAL_SPLIT: "podział w pionie" LABEL_LAYOUT_HORIZONTAL_SPLIT: "podział w poziomie" - LABEL_EDITOR: "Format wiadomości:" + LABEL_EDITOR: "Format wiadomości" LABEL_EDITOR_HTML: "HTML" LABEL_EDITOR_PLAIN: "zwykły tekst" LABEL_EDITOR_HTML_FORCED: "HTML (wymuszony)" @@ -482,49 +484,49 @@ pl_PL: LABEL_ANIMATION_NONE: "brak" LABEL_VIEW_OPTIONS: "Opcje wyświetlania" LABEL_USE_PREVIEW_PANE: "Wyświetl okno podglądu" - LABEL_USE_CHECKBOXES_IN_LIST: "Wyświetl pola zaznaczenia w listach" + LABEL_USE_CHECKBOXES_IN_LIST: "Pokazuj pola zaznaczenia na listach" LABEL_USE_THREADS: "Używaj wątków" LABEL_REPLY_SAME_FOLDER: "Umieść odpowiedzi w folderach, z których pochodzą wiadomości" - LABEL_SHOW_IMAGES: "Zawsze wyświetlaj obrazy w wiadomościach" + LABEL_SHOW_IMAGES: "Zawsze wyświetlaj zewnętrzne obrazy w treści wiadomości" LABEL_SHOW_ANIMATION: "Użyj animacji" - LABEL_MESSAGE_PER_PAGE: "Wiad. na stronie:" + LABEL_MESSAGE_PER_PAGE: "Wiadomości na stronę" LABEL_NOTIFICATIONS: "Powiadomienia" LABEL_SOUND_NOTIFICATION: "Powiadomienia dźwiękowe" LABEL_CHROME_NOTIFICATION_DESC: "Wyświetlaj powiadomienia o nowych wiadomościach" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Zablokowane przez przeglądarkę)" SETTINGS_CONTACTS: LEGEND_CONTACTS: "Kontakty" - LABEL_CONTACTS_AUTOSAVE: "Automatycznie dodaj nieznanych nadawców i odbiorców do książki adresowej" + LABEL_CONTACTS_AUTOSAVE: "Automatycznie dodawaj odbiorców do książki adresowej" LEGEND_CONTACTS_SYNC: "Zdalna synchronizacja (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Włącz zdalną synchronizację" - LABEL_CONTACTS_SYNC_SERVER: "Serwer:" - LABEL_CONTACTS_SYNC_AB_URL: "Adres URL:" - LABEL_CONTACTS_SYNC_USER: "Użytkownik:" - LABEL_CONTACTS_SYNC_PASSWORD: "Hasło:" + LABEL_CONTACTS_SYNC_SERVER: "Serwer" + LABEL_CONTACTS_SYNC_AB_URL: "URL książki adresowej" + LABEL_CONTACTS_SYNC_USER: "Użytkownik" + LABEL_CONTACTS_SYNC_PASSWORD: "Hasło" SETTINGS_THEMES: - LEGEND_THEMES: "Motyw" - LEGEND_THEMES_CUSTOM: "Własny motyw" + LEGEND_THEMES: "Motywy" + LEGEND_THEMES_CUSTOM: "Konfiguracja własnego motywu" LABEL_CUSTOM_TYPE: "Typ" LABEL_CUSTOM_TYPE_LIGHT: "Jasny" LABEL_CUSTOM_TYPE_DARK: "Ciemny" LABEL_CUSTOM_BACKGROUND_IMAGE: "Tło" - BUTTON_UPLOAD_BACKGROUND_IMAGE: "Prześlij własne tło (.JPG, .PNG)" - ERROR_FILE_IS_TOO_BIG: "Plik jest za duży (1MB+)" - ERROR_FILE_TYPE_ERROR: "Nieprawidłowy format pliku (obsługiwane są wyłącznie pliki .JPG i .PNG)" - ERROR_UNKNOWN: "Wystąpił nieznany błąd w trakcie przesyłania" + BUTTON_UPLOAD_BACKGROUND_IMAGE: "Prześlij własne tło (JPG, PNG)" + ERROR_FILE_IS_TOO_BIG: "Plik jest za duży" + ERROR_FILE_TYPE_ERROR: "Nieprawidłowy format pliku (obsługiwane są wyłącznie pliki JPG i PNG)" + ERROR_UNKNOWN: "Wystąpił nieznany błąd w trakcie przesyłania pliku na serwer" SETTINGS_SOCIAL: LEGEND_GOOGLE: "Konto Google" BUTTON_GOOGLE_CONNECT: "Połącz z Google" - BUTTON_GOOGLE_DISCONNECT: "Odłącz" - MAIN_GOOGLE_DESC: "Po zezwoleniu na logowanie przez: Google, możesz zalogować się na to konto używając przycisku: \"Google\" w panelu logowania." + BUTTON_GOOGLE_DISCONNECT: "Odłącz Google" + MAIN_GOOGLE_DESC: "Po zezwoleniu na logowanie przez Google, możesz zalogować się na to konto używając przycisku \"Google\" w panelu logowania." LEGEND_FACEBOOK: "Facebook" BUTTON_FACEBOOK_CONNECT: "Połącz z Facebook" - BUTTON_FACEBOOK_DISCONNECT: "Odłącz" - MAIN_FACEBOOK_DESC: "Po zezwoleniu na logowanie przez: Facebook, możesz zalogować się na to konto używając przycisku: \"Facebook\" w panelu logowania." + BUTTON_FACEBOOK_DISCONNECT: "Odłącz Facebook" + MAIN_FACEBOOK_DESC: "Po zezwoleniu na logowanie przez Facebook, możesz zalogować się na to konto używając przycisku \"Facebook\" w panelu logowania." LEGEND_TWITTER: "Twitter" BUTTON_TWITTER_CONNECT: "Połącz z Twitter" - BUTTON_TWITTER_DISCONNECT: "Odłącz" - MAIN_TWITTER_DESC: "Po zezwoleniu na logowanie przez: Twitter, możesz zalogować się na to konto używając przycisku: \"Twitter\" w panelu logowania." + BUTTON_TWITTER_DISCONNECT: "Odłącz Twitter" + MAIN_TWITTER_DESC: "Po zezwoleniu na logowanie przez Twitter, możesz zalogować się na to konto używając przycisku \"Twitter\" w panelu logowania." SETTINGS_FOLDERS: LEGEND_FOLDERS: "Lista folderów" BUTTON_CREATE: "Utwórz folder" @@ -556,21 +558,21 @@ pl_PL: LEGEND_IDENTITY: "Tożsamość" LEGEND_IDENTITIES: "Dodatkowe tożsamości" LABEL_DEFAULT: "Domyślna" - LABEL_DISPLAY_NAME: "Nazwa:" - LABEL_REPLY_TO: "Odpowiedź do:" - LABEL_SIGNATURE: "Podpis:" - LABEL_ADD_SIGNATURE_TO_ALL: "Dodaj podpis do wszystkich wysyłanych wiadomości" + LABEL_DISPLAY_NAME: "Nazwa" + LABEL_REPLY_TO: "Odpisz do" + LABEL_SIGNATURE: "Podpis" + LABEL_ADD_SIGNATURE_TO_ALL: "Dodaj podpis do wszystkich wiadomości wychodzących" BUTTON_ADD_IDENTITY: "Dodaj tożsamość" BUTTON_DELETE: "Usuń" LOADING_PROCESS: "Trwa aktualizowanie listy tożsamości" DELETING_ASK: "Czy na pewno chcesz usunąć?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Zmiana hasła" - LABEL_CURRENT_PASSWORD: "Aktualne hasło:" - LABEL_NEW_PASSWORD: "Nowe hasło:" - LABEL_REPEAT_PASSWORD: "Powtórz nowe hasło:" + LABEL_CURRENT_PASSWORD: "Aktualne hasło" + LABEL_NEW_PASSWORD: "Nowe hasło" + LABEL_REPEAT_PASSWORD: "Powtórz nowe hasło" BUTTON_UPDATE_PASSWORD: "Zmień hasło na nowe" - ERROR_PASSWORD_MISMATCH: "Wpisane hasła nie pasują do siebie, proszę spróbować ponownie" + ERROR_PASSWORD_MISMATCH: "Podane hasła nie pasują do siebie, spróbuj ponownie" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" BUTTON_ADD_OPEN_PGP_KEY: "Importuj klucz OpenPGP" @@ -579,26 +581,27 @@ pl_PL: TITLE_PUBLIC: "Publiczny" DELETING_ASK: "Czy na pewno chcesz usunąć?" GENERATE_ONLY_HTTPS: "Tylko HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatycznie zapisuj szkic" SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Skróty klawiaturowe" - TAB_MAILBOX: "Skrzynka pocztowa" + LEGEND_SHORTCUTS_HELP: "Pomoc dotycząca skrótów klawiaturowych" + TAB_MAILBOX: "Skrzynka odbiorcza" TAB_MESSAGE_LIST: "Lista wiadomości" TAB_MESSAGE_VIEW: "Widok wiadomości" TAB_COMPOSE: "Tworzenie wiadomości" LABEL_OPEN_USER_DROPDOWN: "Otwórz podręczne menu użytkownika" LABEL_REPLY: "Odpowiedz" LABEL_REPLY_ALL: "Odpowiedz wszystkim" - LABEL_FORWARD: "Przekaż" - LABEL_FORWARD_MULTIPLY: "Przekaż (wielokrotnie)" + LABEL_FORWARD: "Przekaż dalej" + LABEL_FORWARD_MULTIPLY: "Przekaż dalej jako załącznik(i)" LABEL_HELP: "Pomoc" - LABEL_CHECK_ALL: "Sprawdź wszystkie wiadomości" + LABEL_CHECK_ALL: "Zaznacz wszystkie wiadomości" LABEL_ARCHIVE: "Archiwum" LABEL_DELETE: "Usuń" LABEL_OPEN_THREAD: "Otwórz wybrany wątek" LABEL_MOVE: "Przenieś" - LABEL_READ: "Oznacz zaznaczone wiadomości, jako przeczytane" - LABEL_UNREAD: "Oznacz zaznaczone wiadomości, jako nieprzeczytane" - LABEL_IMPORTANT: "Oznacz zaznaczone wiadomości, jako ważne" + LABEL_READ: "Oznacz zaznaczone wiadomości jako przeczytane" + LABEL_UNREAD: "Oznacz zaznaczone wiadomości jako nieprzeczytane" + LABEL_IMPORTANT: "Oznacz zaznaczone wiadomości jako ważne" LABEL_SEARCH: "Szukaj" LABEL_CANCEL_SEARCH: "Anuluj szukanie" LABEL_FULLSCREEN_ENTER: "Pełny ekran (aktywny podgląd wiadomości)" @@ -621,46 +624,46 @@ pl_PL: LABEL_CLOSE_COMPOSE: "Zamknij okno tworzenia wiadomości" PGP_NOTIFICATIONS: NO_PUBLIC_KEYS_FOUND: "Nie znaleziono klucza publicznego" - NO_PUBLIC_KEYS_FOUND_FOR: "Nie znaleziono klucza publicznego dla adresu: \"%EMAIL%\"" + NO_PUBLIC_KEYS_FOUND_FOR: "Nie znaleziono klucza publicznego dla adresu \"%EMAIL%\"" NO_PRIVATE_KEY_FOUND: "Nie znaleziono klucza prywatnego" - NO_PRIVATE_KEY_FOUND_FOR: "Nie znaleziono klucza prywatnego dla adresu: \"%EMAIL%\"" + NO_PRIVATE_KEY_FOUND_FOR: "Nie znaleziono klucza prywatnego dla adresu \"%EMAIL%\"" ADD_A_PUBLICK_KEY: "Dodaj klucz publiczny" SELECT_A_PRIVATE_KEY: "Wybierz klucz prywatny" - UNVERIFIRED_SIGNATURE: "Niezweryfikowana" - DECRYPTION_ERROR: "Błąd deszyfrowania OpenPGP" - GOOD_SIGNATURE: "Podpisana przez: %USER%" + UNVERIFIRED_SIGNATURE: "Podpis niezweryfikowany" + DECRYPTION_ERROR: "Błąd odszyfrowywania OpenPGP" + GOOD_SIGNATURE: "Poprawnie podpisana przez %USER%" PGP_ERROR: "Błąd OpenPGP: %ERROR%" - SPECIFY_FROM_EMAIL: "Proszę podać adres e-mail w polu: OD" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Proszę podać przynajmniej jednego odbiorcę" + SPECIFY_FROM_EMAIL: "Podaj adres e-mail w polu OD" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Podaj przynajmniej jednego odbiorcę" NOTIFICATIONS: INVALID_TOKEN: "Nieprawidłowy token" AUTH_ERROR: "Błąd autoryzacji" ACCESS_ERROR: "Błąd dostępu" CONNECTION_ERROR: "Błąd połączenia z serwerem" - CAPTCHA_ERROR: "Nieprawidłowy kod CAPTCHA" + CAPTCHA_ERROR: "Nieprawidłowy kod CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - To społecznościowe ID (Facebooku), nie jest powiązane z żadnym kontem pocztowym. - Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: - Ustawienia > Sieci społecznościowe. + Ten identyfikator społecznościowy (Facebook) nie jest powiązany z żadnym kontem + pocztowym. Zaloguj się używając danych swojego konta e-mail i skonfiguruj + tę opcję w: Ustawienia > Sieci społecznościowe. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - To społecznościowe ID (Twitter), nie jest powiązane z żadnym kontem pocztowym. - Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: - Ustawienia > Sieci społecznościowe. + Ten identyfikator społecznościowy (Twitter) nie jest powiązany z żadnym kontem + pocztowym. Zaloguj się używając danych swojego konta e-mail i skonfiguruj + tę opcję w: Ustawienia > Sieci społecznościowe. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - To społecznościowe ID (Konto Google), nie jest powiązane z żadnym kontem pocztowym. - Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: - Ustawienia > Sieci społecznościowe. + Ten identyfikator społecznościowy (Konto Google) nie jest powiązany z żadnym + kontem pocztowym. Zaloguj się używając danych swojego konta e-mail i skonfiguruj + tę opcję w: Ustawienia > Sieci społecznościowe. DOMAIN_NOT_ALLOWED: "Domena niedozwolona" ACCOUNT_NOT_ALLOWED: "Konto nie jest dozwolone" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Wymagana dwuskładnikowa autoryzacja" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Błąd dwuskładnikowej autoryzacji" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Wymagana autoryzacja dwuetapowa" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Błąd autoryzacji dwuetapowej" COULD_NOT_SAVE_NEW_PASSWORD: "Nie można było zapisać nowego hasła" CURRENT_PASSWORD_INCORRECT: "Obecne hasło jest niepoprawne" NEW_PASSWORD_SHORT: "Hasło jest za krótkie" NEW_PASSWORD_WEAK: "Hasło jest zbyt łatwe" - NEW_PASSWORD_FORBIDDENT: "Hasło zawiera zakazane znaki" + NEW_PASSWORD_FORBIDDENT: "Hasło zawiera niedozwolone znaki" CONTACTS_SYNC_ERROR: "Błąd synchronizacji kontaktów" - CANT_GET_MESSAGE_LIST: "Nie jest możliwe pobranie listy wiadomości" + CANT_GET_MESSAGE_LIST: "Nie można pobrać listy wiadomości" CANT_GET_MESSAGE: "Nie można pobrać wiadomości" CANT_DELETE_MESSAGE: "Nie można usunąć wiadomości" CANT_MOVE_MESSAGE: "Nie można przenieść wiadomości" @@ -669,25 +672,25 @@ pl_PL: INVALID_RECIPIENTS: "Nieprawidłowy adres odbiorcy" CANT_SAVE_FILTERS: "Nie można zapisać filtrów" CANT_GET_FILTERS: "Nie można pobrać filtrów" - FILTERS_ARE_NOT_CORRECT: "Filtry sa nieprawidłowe" + FILTERS_ARE_NOT_CORRECT: "Filtry są nieprawidłowe" CANT_CREATE_FOLDER: "Nie można utworzyć folderu" CANT_RENAME_FOLDER: "Nie można zmienić nazwy folderu" CANT_DELETE_FOLDER: "Nie można usunąć folderu" - CANT_DELETE_NON_EMPTY_FOLDER: "Nie można usunąć folderu w którym znajdują się wiadomości" - CANT_SUBSCRIBE_FOLDER: "Nie można przypisać folderu" - CANT_UNSUBSCRIBE_FOLDER: "Nie można wypisać z folderu" - CANT_SAVE_SETTINGS: "Nie można zmienić ustawień" - CANT_SAVE_PLUGIN_SETTINGS: "Nie mozna zmienić ustawień wtyczki" + CANT_DELETE_NON_EMPTY_FOLDER: "Nie można usunąć folderu, w którym znajdują się wiadomości" + CANT_SUBSCRIBE_FOLDER: "Nie można zasubskrybować folderu" + CANT_UNSUBSCRIBE_FOLDER: "Nie można usunąć subskrypcji folderu" + CANT_SAVE_SETTINGS: "Nie można zapisać ustawień" + CANT_SAVE_PLUGIN_SETTINGS: "Nie można zapisać ustawień" DOMAIN_ALREADY_EXISTS: "Domena już istnieje" CANT_INSTALL_PACKAGE: "Nieudana instalacja pakietu" CANT_DELETE_PACKAGE: "Nieudane usunięcie pakietu" INVALID_PLUGIN_PACKAGE: "Nieprawidłowy pakiet rozszerzenia" UNSUPPORTED_PLUGIN_PACKAGE: "Nieobsługiwany pakiet rozszerzenia" LICENSING_SERVER_IS_UNAVAILABLE: "Serwer subskrypcji jest niedostępny" - LICENSING_DOMAIN_EXPIRED: "Subskrypcja dla tej domeny wygasła" - LICENSING_DOMAIN_BANNED: "Subskrypcja dla tej domeny została zablokowana" - DEMO_SEND_MESSAGE_ERROR: "Ze względów bezpieczeństwa, to konto testowe nie ma możliwości przesyłania, wiadomości na zewnętrzne adresy e-mail." - DEMO_ACCOUNT_ERROR: "Ze względów bezpieczeństwa, ta akcja jest niedozwolona na tym koncie!" + LICENSING_DOMAIN_EXPIRED: "Subskrypcja dla tej domeny wygasła." + LICENSING_DOMAIN_BANNED: "Subskrypcja dla tej domeny została zablokowana." + DEMO_SEND_MESSAGE_ERROR: "Ze względów bezpieczeństwa konto testowe nie ma możliwości przesyłania wiadomości na zewnętrzne adresy e-mail." + DEMO_ACCOUNT_ERROR: "Ze względów bezpieczeństwa ta akcja jest niedozwolona na tym koncie!" ACCOUNT_ALREADY_EXISTS: "Konto o takiej nazwie już istnieje" ACCOUNT_DOES_NOT_EXIST: "Konto nie istnieje" MAIL_SERVER_ERROR: "Wystąpił błąd w trakcie połączenia z serwerem poczty" @@ -695,18 +698,18 @@ pl_PL: UNKNOWN_ERROR: "Nieznany błąd" STATIC: BACK_LINK: "Odśwież" - DOMAIN_LIST_DESC: "Lista domen do których webmail ma dostęp" + DOMAIN_LIST_DESC: "Lista domen, do których webmail ma dostęp." PHP_EXSTENSIONS_ERROR_DESC: "Wymagane rozszerzenia PHP są niedostępne!" PHP_VERSION_ERROR_DESC: "Aktualnie zainstalowana wersja PHP: (%VERSION%), jest niższa niż minimalnie wymagana 5.3.0!" - NO_SCRIPT_TITLE: "Ta aplikacja wymaga JavaScript" + NO_SCRIPT_TITLE: "Ta aplikacja wymaga JavaScript." NO_SCRIPT_DESC: | - Twoja przeglądarka nie obsługuje JavaScript - Proszę o umożliwienie obsługi JavaScript w przeglądarce, oraz ponowne załadowanie tej strony. + Twoja przeglądarka nie obsługuje JavaScript. + Włącz obsługę JavaScript w przeglądarce i ponowne załaduj tę stronę. NO_COOKIE_TITLE: "Ta aplikacja wymaga plików Cookies" NO_COOKIE_DESC: | - Obsługa Cookies jest wyłączona w twojej przeglądarce - Proszę o umożliwienie obsługi plików Cookie w przeglądarce oraz ponowne uruchomienie tej strony. - BAD_BROWSER_TITLE: "Twoja przeglądarka jest przestarzała!" + Obsługa Cookies jest wyłączona w Twojej przeglądarce. + Włącz obsługę plików Cookie w przeglądarce i spróbuj ponowne. + BAD_BROWSER_TITLE: "Twoja przeglądarka jest przestarzała." BAD_BROWSER_DESC: | W celu wykorzystania wszystkich funkcji tej aplikacji, zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek: diff --git a/rainloop/v/0.0.0/app/localization/webmail/ro_RO.yml b/rainloop/v/0.0.0/app/localization/webmail/ro_RO.yml index 7d216b6a9..afb0ee8ff 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/ro_RO.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/ro_RO.yml @@ -45,8 +45,8 @@ ro_RO: ZOOM: "Zoom in/out" CLOSE: "Închide (Esc)" LOADING: "Se îcarcă..." - GALLERY_PREV: "Precedentul (Стрелка ←)" - GALLERY_NEXT: "Următorul (Стрелка →)" + GALLERY_PREV: "Precedentul (săgeată stânga)" + GALLERY_NEXT: "Următorul (săgeată dreapta)" GALLERY_COUNTER: "%curr% din %total%" IMAGE_ERROR: "Imaginea nu a putut fi încărcată" AJAX_ERROR: "Conținutul nu a putut fi încărcat" diff --git a/rainloop/v/0.0.0/app/localization/webmail/sl_SI.yml b/rainloop/v/0.0.0/app/localization/webmail/sl_SI.yml index e92a7ff7d..c177681e3 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/sl_SI.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/sl_SI.yml @@ -151,6 +151,7 @@ sl_SI: PGP_ENCRYPTED_MESSAGE_DESC: "Sporočilo, šifrirano z OpenPGP (kliknite za dešifriranje)" LINK_DOWNLOAD_AS_ZIP: "Prenesi kot .zip datoteko" LINK_SAVE_TO_OWNCLOUD: "Shrani na ownCloud" + LINK_SAVE_TO_CLOUD: "Shrani v oblak" LINK_SAVE_TO_DROPBOX: "Shrani na Dropbox" READ_RECEIPT: SUBJECT: "Povratno poročilo (prikazano) - %SUBJECT%" @@ -580,6 +581,7 @@ sl_SI: TITLE_PUBLIC: "Javni" DELETING_ASK: "Ste prepričani?" GENERATE_ONLY_HTTPS: "Samo HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Samodejno shrani osnutek" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Tipkovne bližnjice" TAB_MAILBOX: "Nabiralnik" From 6b99a4889844127f6420e7540643ba041ffc6f17 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Tue, 24 Jul 2018 00:09:44 +0300 Subject: [PATCH 62/83] Update devDependencies --- gulpfile.js | 1 + package.json | 17 +- yarn.lock | 527 +++++++++++---------------------------------------- 3 files changed, 116 insertions(+), 429 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index face3f488..86da4b74b 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -193,6 +193,7 @@ cfg.paths.js = { name: 'libs.js', src: [ 'node_modules/jquery/dist/jquery.min.js', + 'node_modules/jquery-migrate/dist/jquery-migrate.min.js', 'node_modules/jquery-mousewheel/jquery.mousewheel.js', 'node_modules/jquery-scrollstop/jquery.scrollstop.js', 'node_modules/jquery-backstretch/jquery.backstretch.min.js', diff --git a/package.json b/package.json index 443c74a74..8f2861dc1 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "devDependencies": { "autolinker": "1.6.2", "babel-core": "6.26.3", - "babel-eslint": "8.2.5", + "babel-eslint": "8.2.6", "babel-loader": "7.1.5", "babel-plugin-transform-decorators-legacy": "1.3.5", "babel-plugin-transform-runtime": "6.23.0", @@ -64,7 +64,7 @@ "emailjs-addressparser": "2.0.2", "es6-object-assign": "1.1.0", "es6-promise-polyfill": "1.2.0", - "eslint": "5.1.0", + "eslint": "5.2.0", "gulp": "3.9.1", "gulp-autoprefixer": "5.0.0", "gulp-cached": "1.1.1", @@ -73,15 +73,15 @@ "gulp-concat-util": "0.5.5", "gulp-eol": "0.2.0", "gulp-eslint": "5.0.0", - "gulp-expect-file": "0.0.7", + "gulp-expect-file": "1.0.0", "gulp-filter": "5.1.0", "gulp-header": "2.0.5", "gulp-if": "2.0.2", - "gulp-less": "4.0.0", + "gulp-less": "4.0.1", "gulp-livereload": "3.8.1", "gulp-notify": "3.2.0", "gulp-plumber": "1.2.0", - "gulp-rename": "1.3.0", + "gulp-rename": "1.4.0", "gulp-replace": "1.0.0", "gulp-rimraf": "0.2.2", "gulp-size": "3.0.0", @@ -92,8 +92,9 @@ "gulp-zip": "4.1.0", "ifvisible.js": "1.0.6", "intersection-observer": "0.5.0", - "jquery": "2.2.4", + "jquery": "3.3.1", "jquery-backstretch": "2.1.16", + "jquery-migrate": "^3.0.1", "jquery-mousewheel": "3.1.13", "jquery-scrollstop": "1.2.0", "js-cookie": "2.2.0", @@ -102,7 +103,7 @@ "knockout": "3.4.2", "knockout-sortable": "1.1.0", "knockout-transformations": "2.1.0", - "lozad": "1.4.0", + "lozad": "1.5.0", "matchmedia-polyfill": "0.3.1", "moment": "2.22.2", "node-fs": "0.1.7", @@ -117,7 +118,7 @@ "simplestatemanager": "4.1.1", "style-loader": "0.21.0", "underscore": "1.9.1", - "webpack": "4.15.1", + "webpack": "4.16.2", "webpack-notifier": "1.6.0" } } diff --git a/yarn.lock b/yarn.lock index 6d919f4c6..28c3970c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -289,6 +289,10 @@ ansi-colors@^1.0.1: dependencies: ansi-wrap "^0.1.0" +ansi-colors@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-2.0.5.tgz#5da37825fef3e75f3bda47f760d64bfd10e15e10" + ansi-cyan@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" @@ -400,10 +404,6 @@ array-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" @@ -464,9 +464,11 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@^0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" +async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + dependencies: + lodash "^4.17.10" asynckit@^0.4.0: version "0.4.0" @@ -531,15 +533,15 @@ babel-core@6.26.3, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.7" -babel-eslint@8.2.5: - version "8.2.5" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.5.tgz#dc2331c259d36782aa189da510c43dedd5adc7a3" +babel-eslint@8.2.6: + version "8.2.6" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/traverse" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" babylon "7.0.0-beta.44" - eslint-scope "~3.7.1" + eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" babel-generator@^6.26.0: @@ -1264,12 +1266,13 @@ browserify-cipher@^1.0.0: evp_bytestokey "^1.0.0" browserify-des@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c" + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" dependencies: cipher-base "^1.0.1" des.js "^1.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" browserify-rsa@^4.0.0: version "4.0.1" @@ -1323,10 +1326,6 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -1381,24 +1380,13 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864: - version "1.0.30000864" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000864.tgz#7a08c78da670f23c06f11aa918831b8f2dd60ddc" + version "1.0.30000865" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" caseless@~0.12.0: version "0.12.0" @@ -1411,7 +1399,7 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@^0.5.0, chalk@^0.5.1: +chalk@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" dependencies: @@ -1524,7 +1512,7 @@ clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" -clone-stats@^0.0.1, clone-stats@~0.0.1: +clone-stats@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" @@ -1734,12 +1722,6 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -1754,13 +1736,6 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -dateformat@^1.0.7-1.2.3: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - dateformat@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" @@ -1783,7 +1758,7 @@ debug@~2.2.0: dependencies: ms "0.7.1" -decamelize@^1.0.0, decamelize@^1.1.2: +decamelize@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1955,8 +1930,8 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" electron-to-chromium@^1.3.47: - version "1.3.51" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.51.tgz#6a42b49daaf7f22a5b37b991daf949f34dbdb9b5" + version "1.3.52" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" element-dataset@2.2.6: version "2.2.6" @@ -2016,12 +1991,6 @@ errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - dependencies: - is-arrayish "^0.2.1" - es-abstract@^1.10.0: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" @@ -2052,7 +2021,7 @@ escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^ version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -eslint-scope@^3.7.1, eslint-scope@~3.7.1: +eslint-scope@3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" dependencies: @@ -2074,9 +2043,9 @@ eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" -eslint@5.1.0, eslint@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.1.0.tgz#2ed611f1ce163c0fb99e1e0cda5af8f662dff645" +eslint@5.2.0, eslint@^5.0.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.2.0.tgz#3901ae249195d473e633c4acbc370068b1c964dc" dependencies: ajv "^6.5.0" babel-code-frame "^6.26.0" @@ -2094,7 +2063,7 @@ eslint@5.1.0, eslint@^5.0.1: functional-red-black-tree "^1.0.1" glob "^7.1.2" globals "^11.7.0" - ignore "^3.3.3" + ignore "^4.0.2" imurmurhash "^0.1.4" inquirer "^5.2.0" is-resolvable "^1.1.0" @@ -2126,8 +2095,8 @@ espree@^4.0.0: acorn-jsx "^4.1.1" esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" esquery@^1.0.1: version "1.0.1" @@ -2210,8 +2179,8 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: is-extendable "^1.0.1" extend@^3.0.0, extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" external-editor@^2.1.0: version "2.2.0" @@ -2306,13 +2275,6 @@ find-index@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -2462,10 +2424,6 @@ gaze@^0.5.1: dependencies: globule "~0.1.0" -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -2679,15 +2637,18 @@ gulp-eslint@5.0.0: fancy-log "^1.3.2" plugin-error "^1.0.1" -gulp-expect-file@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/gulp-expect-file/-/gulp-expect-file-0.0.7.tgz#913e731db0dd6f5866149ba400ad835eb34623ad" +gulp-expect-file@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulp-expect-file/-/gulp-expect-file-1.0.0.tgz#19e6619f6fb658abccb5dc94f5ac33a2f60dd1b9" dependencies: - async "^0.9.0" - gulp-util "^2.2.16" - minimatch "^0.3.0" - through2 "^1.0.0" - xtend "^3.0.0" + ansi-colors "^2.0.3" + async "^2.6.1" + fancy-log "^1.3.2" + minimatch "^3.0.4" + plugin-error "^1.0.1" + through2 "^2.0.3" + vinyl "^2.2.0" + xtend "^4.0.1" gulp-filter@5.1.0: version "5.1.0" @@ -2713,12 +2674,12 @@ gulp-if@2.0.2, gulp-if@^2.0.0: ternary-stream "^2.0.1" through2 "^2.0.1" -gulp-less@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gulp-less/-/gulp-less-4.0.0.tgz#3c49deb96bdca913e436921ef792fb4c24296fcd" +gulp-less@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/gulp-less/-/gulp-less-4.0.1.tgz#348c33a5dde7a207c5771b1d8261d1ac1021ceed" dependencies: accord "^0.29.0" - less "2.6.x || ^3.0.0" + less "2.6.x || ^3.7.1" object-assign "^4.0.1" plugin-error "^0.1.2" replace-ext "^1.0.0" @@ -2763,9 +2724,9 @@ gulp-plumber@1.2.0: plugin-error "^0.1.2" through2 "^2.0.3" -gulp-rename@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.3.0.tgz#2e789d8f563ab0c924eeb62967576f37ff4cb826" +gulp-rename@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.4.0.tgz#de1c718e7c4095ae861f7296ef4f3248648240bd" gulp-replace@1.0.0: version "1.0.0" @@ -2848,19 +2809,6 @@ gulp-util@3.0.8, gulp-util@^3.0.0, gulp-util@^3.0.2, gulp-util@^3.0.6, gulp-util through2 "^2.0.0" vinyl "^0.5.0" -gulp-util@^2.2.16: - version "2.2.20" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" - dependencies: - chalk "^0.5.0" - dateformat "^1.0.7-1.2.3" - lodash._reinterpolate "^2.4.1" - lodash.template "^2.4.1" - minimist "^0.2.0" - multipipe "^0.1.0" - through2 "^0.5.0" - vinyl "^0.2.1" - gulp-zip@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-4.1.0.tgz#dab178bd99afa190923f1eb78abaf0db47817704" @@ -2984,11 +2932,11 @@ hash-base@^3.0.0: safe-buffer "^5.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.4.tgz#8b50e1f35d51bd01e5ed9ece4dbe3549ccfa0a3c" + version "1.1.5" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" dependencies: inherits "^2.0.3" - minimalistic-assert "^1.0.0" + minimalistic-assert "^1.0.1" hmac-drbg@^1.0.0: version "1.0.1" @@ -3011,10 +2959,6 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - http-errors@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" @@ -3066,10 +3010,14 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.3, ignore@^3.3.5: +ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" +ignore@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.2.tgz#0a8dd228947ec78c2d7f736b1642a9f7317c1905" + image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" @@ -3078,12 +3026,6 @@ imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -3166,10 +3108,6 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -3180,12 +3118,6 @@ is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" @@ -3386,6 +3318,10 @@ jquery-backstretch@2.1.16: dependencies: jquery "^3.1.1" +jquery-migrate@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jquery-migrate/-/jquery-migrate-3.0.1.tgz#141de3abfe6d301baaa4130b0ec7b9a839845e72" + jquery-mousewheel@3.1.13: version "3.1.13" resolved "https://registry.yarnpkg.com/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz#06f0335f16e353a695e7206bf50503cb523a6ee5" @@ -3396,11 +3332,7 @@ jquery-scrollstop@1.2.0: dependencies: jquery ">=1.2.3" -jquery@2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.4.tgz#2c89d6889b5eac522a7eea32c14521559c6cbf02" - -jquery@>=1.2.3, jquery@^3.1.1: +jquery@3.3.1, jquery@>=1.2.3, jquery@^3.1.1: version "3.3.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" @@ -3412,6 +3344,10 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + js-yaml@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" @@ -3520,9 +3456,9 @@ lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" -"less@2.6.x || ^3.0.0": - version "3.5.3" - resolved "https://registry.yarnpkg.com/less/-/less-3.5.3.tgz#108f656b5ee09a281b757a603a80aa091acf6384" +"less@2.6.x || ^3.7.1": + version "3.8.0" + resolved "https://registry.yarnpkg.com/less/-/less-3.8.0.tgz#44785e40c23841c15ba3be741d36bd2775dd0596" optionalDependencies: errno "^0.1.1" graceful-fs "^4.1.2" @@ -3557,16 +3493,6 @@ livereload-js@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -3617,36 +3543,14 @@ lodash._createassigner@^3.0.0: lodash._isiterateecall "^3.0.0" lodash.restparam "^3.0.0" -lodash._escapehtmlchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" - dependencies: - lodash._htmlescapes "~2.4.1" - -lodash._escapestringchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" - lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" -lodash._htmlescapes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" - lodash._isiterateecall@^3.0.0: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" -lodash._isnative@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" - -lodash._objecttypes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" - lodash._reescape@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" @@ -3655,31 +3559,14 @@ lodash._reevaluate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" -lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" - lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" -lodash._reunescapedhtml@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" - dependencies: - lodash._htmlescapes "~2.4.1" - lodash.keys "~2.4.1" - lodash._root@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" -lodash._shimkeys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" - dependencies: - lodash._objecttypes "~2.4.1" - lodash.assign@^3.0.0, lodash.assign@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" @@ -3700,27 +3587,12 @@ lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" -lodash.defaults@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" - dependencies: - lodash._objecttypes "~2.4.1" - lodash.keys "~2.4.1" - lodash.escape@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" dependencies: lodash._root "^3.0.0" -lodash.escape@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" - dependencies: - lodash._escapehtmlchar "~2.4.1" - lodash._reunescapedhtml "~2.4.1" - lodash.keys "~2.4.1" - lodash.flatten@^4.2.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" @@ -3733,12 +3605,6 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" -lodash.isobject@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" - dependencies: - lodash._objecttypes "~2.4.1" - lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -3747,14 +3613,6 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash.keys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" - dependencies: - lodash._isnative "~2.4.1" - lodash._shimkeys "~2.4.1" - lodash.isobject "~2.4.1" - lodash.merge@^4.4.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" @@ -3771,18 +3629,6 @@ lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" -lodash.template@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" - dependencies: - lodash._escapestringchar "~2.4.1" - lodash._reinterpolate "~2.4.1" - lodash.defaults "~2.4.1" - lodash.escape "~2.4.1" - lodash.keys "~2.4.1" - lodash.templatesettings "~2.4.1" - lodash.values "~2.4.1" - lodash.template@^3.0.0: version "3.6.2" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" @@ -3817,24 +3663,11 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "~3.0.0" -lodash.templatesettings@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" - dependencies: - lodash._reinterpolate "~2.4.1" - lodash.escape "~2.4.1" - lodash.uniq@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash.values@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" - dependencies: - lodash.keys "~2.4.1" - -lodash@^4.13.1, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0: +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -3861,21 +3694,14 @@ longest@^1.0.1: resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lozad@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.4.0.tgz#78d29514608074a34645ba1c5c7747f82c14cbfc" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lozad@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.5.0.tgz#736aab3486aed391e76bb2b8d68839c988f1b41b" lru-cache@2: version "2.7.3" @@ -3918,10 +3744,6 @@ map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" @@ -3954,21 +3776,6 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - merge-stream@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" @@ -4000,15 +3807,15 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" +mime-db@~1.35.0: + version "1.35.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + version "2.1.19" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" dependencies: - mime-db "~1.33.0" + mime-db "~1.35.0" mime@^1.4.1: version "1.6.0" @@ -4029,7 +3836,7 @@ mini-lr@^0.1.8: parseurl "~1.3.0" qs "~2.2.3" -minimalistic-assert@^1.0.0: +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -4037,13 +3844,6 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" -minimatch@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - minimatch@^2.0.1: version "2.0.10" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" @@ -4067,11 +3867,7 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" - -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -4148,7 +3944,7 @@ multimatch@^2.0.0: arrify "^1.0.0" minimatch "^3.0.0" -multipipe@^0.1.0, multipipe@^0.1.2: +multipipe@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" dependencies: @@ -4284,15 +4080,6 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -4520,12 +4307,6 @@ parse-filepath@^1.0.1: map-cache "^0.2.0" path-root "^0.1.1" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -4546,12 +4327,6 @@ path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -4582,14 +4357,6 @@ path-root@^0.1.1: dependencies: path-root-regex "^0.1.0" -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -4826,21 +4593,6 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -4862,7 +4614,7 @@ read-pkg@^1.0.0: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@~1.1.9: +readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" dependencies: @@ -4886,13 +4638,6 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - regenerate@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" @@ -5116,14 +4861,14 @@ schema-utils@^0.4.4, schema-utils@^0.4.5: ajv "^6.1.0" ajv-keywords "^3.1.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" +semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + sequencify@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" @@ -5272,28 +5017,6 @@ sparkles@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" -spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" - split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -5461,18 +5184,6 @@ strip-bom@^1.0.0: first-chunk-stream "^1.0.0" is-utf8 "^0.2.0" -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -5553,7 +5264,7 @@ through2@2.0.3, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: readable-stream "^2.1.5" xtend "~4.0.1" -through2@^0.5.0, through2@^0.5.1: +through2@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" dependencies: @@ -5567,13 +5278,6 @@ through2@^0.6.1: readable-stream ">=1.0.33-1 <1.1.0-0" xtend ">=4.0.0 <4.1.0-0" -through2@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545" - dependencies: - readable-stream ">=1.1.13-1 <1.2.0-0" - xtend ">=4.0.0 <4.1.0-0" - through2@~0.4: version "0.4.2" resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" @@ -5647,10 +5351,6 @@ tough-cookie@~2.3.3: dependencies: punycode "^1.4.1" -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -5707,8 +5407,8 @@ uglify-js@^2.8.22: uglify-to-browserify "~1.0.0" uglify-js@^3.0.5: - version "3.4.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.4.tgz#92e79532a3aeffd4b6c65755bdba8d5bad98d607" + version "3.4.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.5.tgz#650889c0766cf0f6fd5346cea09cd212f544be69" dependencies: commander "~2.16.0" source-map "~0.6.1" @@ -5796,10 +5496,8 @@ url@^0.11.0: querystring "0.2.0" use@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" - dependencies: - kind-of "^6.0.2" + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" user-home@^1.1.1: version "1.1.1" @@ -5831,13 +5529,6 @@ v8flags@^2.0.2: dependencies: user-home "^1.1.1" -validate-npm-package-license@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -5865,12 +5556,6 @@ vinyl-sourcemaps-apply@0.2.1, vinyl-sourcemaps-apply@^0.2.0: dependencies: source-map "^0.5.1" -vinyl@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" - dependencies: - clone-stats "~0.0.1" - vinyl@^0.4.0: version "0.4.6" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" @@ -5886,7 +5571,7 @@ vinyl@^0.5.0: clone-stats "^0.0.1" replace-ext "0.0.1" -vinyl@^2.1.0: +vinyl@^2.1.0, vinyl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" dependencies: @@ -5926,9 +5611,9 @@ webpack-sources@^1.0.1, webpack-sources@^1.1.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@4.15.1: - version "4.15.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.15.1.tgz#dc716779a3b88827c369f18c71a6137fa7e582fd" +webpack@4.16.2: + version "4.16.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.16.2.tgz#c3e0e771adc94582e0543dd18d7436066051e885" dependencies: "@webassemblyjs/ast" "1.5.13" "@webassemblyjs/helper-module-context" "1.5.13" @@ -5941,7 +5626,7 @@ webpack@4.15.1: ajv-keywords "^3.1.0" chrome-trace-event "^1.0.0" enhanced-resolve "^4.1.0" - eslint-scope "^3.7.1" + eslint-scope "^4.0.0" json-parse-better-errors "^1.0.2" loader-runner "^2.3.0" loader-utils "^1.1.0" @@ -6023,16 +5708,16 @@ write@^0.2.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" -xtend@^3.0.0, xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - xtend@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" dependencies: object-keys "~0.4.0" +xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" From 379d012b1f923426a1a30f4fca5aa6fd0ea1b9e1 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Tue, 31 Jul 2018 00:20:06 +0300 Subject: [PATCH 63/83] 1.12.1 --- .cmds | 4 +++- package.json | 10 +++++----- yarn.lock | 31 ++++++++++++++++--------------- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/.cmds b/.cmds index 7abc4c692..98857f945 100644 --- a/.cmds +++ b/.cmds @@ -6,8 +6,9 @@ yarn upgrade xxx@1.2.3 # transifex tx pull -a -# dependencies checker (checking only) +# dependencies yarn outdated +yarn upgrade-interactive --exact --latest # webpack webpack --color --watch @@ -15,3 +16,4 @@ webpack --color --watch # gpg --import x gpg --detach-sign --armor --openpgp -u 87DA4591 x +for ff in `ls *.zip`; do gpg --detach-sign --armor --openpgp -u 87DA4591 $ff; done diff --git a/package.json b/package.json index 8f2861dc1..462452b15 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "firefox esr" ], "devDependencies": { - "autolinker": "1.6.2", + "autolinker": "1.7.0", "babel-core": "6.26.3", "babel-eslint": "8.2.6", "babel-loader": "7.1.5", @@ -87,9 +87,9 @@ "gulp-size": "3.0.0", "gulp-stripbom": "1.0.4", "gulp-through": "0.4.0", - "gulp-uglify": "3.0.0", + "gulp-uglify": "3.0.1", "gulp-util": "3.0.8", - "gulp-zip": "4.1.0", + "gulp-zip": "4.2.0", "ifvisible.js": "1.0.6", "intersection-observer": "0.5.0", "jquery": "3.3.1", @@ -103,7 +103,7 @@ "knockout": "3.4.2", "knockout-sortable": "1.1.0", "knockout-transformations": "2.1.0", - "lozad": "1.5.0", + "lozad": "1.6.0", "matchmedia-polyfill": "0.3.1", "moment": "2.22.2", "node-fs": "0.1.7", @@ -118,7 +118,7 @@ "simplestatemanager": "4.1.1", "style-loader": "0.21.0", "underscore": "1.9.1", - "webpack": "4.16.2", + "webpack": "4.16.3", "webpack-notifier": "1.6.0" } } diff --git a/yarn.lock b/yarn.lock index 28c3970c7..39bbe3188 100644 --- a/yarn.lock +++ b/yarn.lock @@ -478,9 +478,9 @@ atob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" -autolinker@1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.6.2.tgz#67ae9da272e808e0d8eb8e02cbc8cde303947457" +autolinker@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.7.0.tgz#6131619b53fb425588feb432d633ed0f9ca5e7c5" autoprefixer@^8.0.0: version "8.6.5" @@ -2774,14 +2774,15 @@ gulp-through@0.4.0: through2 "^2.0.0" xtend "^4.0.1" -gulp-uglify@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca" +gulp-uglify@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.1.tgz#8d3eee466521bea6b10fd75dff72adf8b7ea2d97" dependencies: gulplog "^1.0.0" has-gulplog "^0.1.0" lodash "^4.13.1" make-error-cause "^1.1.1" + safe-buffer "^5.1.2" through2 "^2.0.0" uglify-js "^3.0.5" vinyl-sourcemaps-apply "^0.2.0" @@ -2809,9 +2810,9 @@ gulp-util@3.0.8, gulp-util@^3.0.0, gulp-util@^3.0.2, gulp-util@^3.0.6, gulp-util through2 "^2.0.0" vinyl "^0.5.0" -gulp-zip@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-4.1.0.tgz#dab178bd99afa190923f1eb78abaf0db47817704" +gulp-zip@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-4.2.0.tgz#e25e738c41ad0795ad853d1d8aeb1744d2a4ca82" dependencies: get-stream "^3.0.0" plugin-error "^0.1.2" @@ -3699,9 +3700,9 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lozad@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.5.0.tgz#736aab3486aed391e76bb2b8d68839c988f1b41b" +lozad@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.6.0.tgz#e96c37c2e334bf626138aaac547a7230773d6647" lru-cache@2: version "2.7.3" @@ -5611,9 +5612,9 @@ webpack-sources@^1.0.1, webpack-sources@^1.1.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@4.16.2: - version "4.16.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.16.2.tgz#c3e0e771adc94582e0543dd18d7436066051e885" +webpack@4.16.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.16.3.tgz#861be3176d81e7e3d71c66c8acc9bba35588b525" dependencies: "@webassemblyjs/ast" "1.5.13" "@webassemblyjs/helper-module-context" "1.5.13" From 26c507398f51bf5af1f3f86b3c89c6c2f24b92c5 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Tue, 18 Sep 2018 23:35:41 +0300 Subject: [PATCH 64/83] babel 6 -> 7 --- Makefile | 7 + package.json | 30 +- webpack.config.builder.js | 33 +- yarn.lock | 2457 +++++++++++++++++-------------------- 4 files changed, 1159 insertions(+), 1368 deletions(-) diff --git a/Makefile b/Makefile index e077968f7..964f3d037 100644 --- a/Makefile +++ b/Makefile @@ -57,6 +57,13 @@ rl-build: rl-build-pro: @docker-compose run --no-deps --rm node gulp all --pro +yarn-install: + @docker-compose run --no-deps --rm node yarn install +yarn-outdated: + @docker-compose run --no-deps --rm node yarn outdated +yarn-upgrade: + @docker-compose run --no-deps --rm node yarn upgrade-interactive --exact --latest + gpg: docker run -it --rm -w=/var/www \ -v $(shell pwd)/.docker/.cache/.gnupg:/root/.gnupg \ diff --git a/package.json b/package.json index 462452b15..de51f885c 100644 --- a/package.json +++ b/package.json @@ -49,27 +49,27 @@ "firefox esr" ], "devDependencies": { - "autolinker": "1.7.0", - "babel-core": "6.26.3", - "babel-eslint": "8.2.6", - "babel-loader": "7.1.5", - "babel-plugin-transform-decorators-legacy": "1.3.5", - "babel-plugin-transform-runtime": "6.23.0", - "babel-preset-env": "1.7.0", - "babel-preset-stage-0": "6.24.1", - "babel-runtime": "6.26.0", + "@babel/core": "7.1.0", + "@babel/plugin-proposal-class-properties": "7.1.0", + "@babel/plugin-proposal-decorators": "7.1.0", + "@babel/plugin-transform-runtime": "7.1.0", + "@babel/preset-env": "7.1.0", + "@babel/runtime-corejs2": "7.0.0", + "autolinker": "1.7.1", + "babel-eslint": "9.0.0", + "babel-loader": "8.0.2", "classnames": "2.2.6", "copy-webpack-plugin": "4.5.2", "element-dataset": "2.2.6", "emailjs-addressparser": "2.0.2", "es6-object-assign": "1.1.0", "es6-promise-polyfill": "1.2.0", - "eslint": "5.2.0", + "eslint": "5.6.0", "gulp": "3.9.1", - "gulp-autoprefixer": "5.0.0", + "gulp-autoprefixer": "6.0.0", "gulp-cached": "1.1.1", "gulp-chmod": "2.0.0", - "gulp-clean-css": "3.9.4", + "gulp-clean-css": "3.10.0", "gulp-concat-util": "0.5.5", "gulp-eol": "0.2.0", "gulp-eslint": "5.0.0", @@ -78,7 +78,7 @@ "gulp-header": "2.0.5", "gulp-if": "2.0.2", "gulp-less": "4.0.1", - "gulp-livereload": "3.8.1", + "gulp-livereload": "4.0.0", "gulp-notify": "3.2.0", "gulp-plumber": "1.2.0", "gulp-rename": "1.4.0", @@ -116,9 +116,9 @@ "rimraf": "2.6.2", "run-sequence": "2.2.1", "simplestatemanager": "4.1.1", - "style-loader": "0.21.0", + "style-loader": "0.23.0", "underscore": "1.9.1", - "webpack": "4.16.3", + "webpack": "4.19.1", "webpack-notifier": "1.6.0" } } diff --git a/webpack.config.builder.js b/webpack.config.builder.js index 610ba773b..4fe5f76e0 100644 --- a/webpack.config.builder.js +++ b/webpack.config.builder.js @@ -21,8 +21,11 @@ module.exports = function(publicPath, pro) { filename: '[name].js', publicPath: publicPath || 'rainloop/v/0.0.0/static/' }, + optimization: { + concatenateModules: false, + minimize: false + }, plugins: [ - // new webpack.optimize.ModuleConcatenationPlugin(), new webpack.DefinePlugin({ 'RL_COMMUNITY': !pro, 'process.env': { @@ -46,19 +49,29 @@ module.exports = function(publicPath, pro) { module: { rules: [ { - test: /\.js$/, + test: /\.(js|ts)$/, loader: 'babel-loader', include: [devPath], options: { cacheDirectory: true, - presets: [['env', { - loose: loose, - modules: false, - targets: { - browsers: ['last 3 versions', 'ie >= 9', 'firefox esr'] - } - }], 'stage-0'], - plugins: ['transform-runtime', 'transform-decorators-legacy'] + presets: [ + ['@babel/preset-env', { + loose: loose, + modules: false, + targets: { + browsers: ['last 3 versions', 'ie >= 9', 'firefox esr'] + } + }] + ], + plugins: [ + ['@babel/plugin-transform-runtime', { + corejs: 2 + }], + ['@babel/plugin-proposal-decorators', { + legacy: true + }], + '@babel/plugin-proposal-class-properties' + ] } }, { diff --git a/yarn.lock b/yarn.lock index 39bbe3188..ea7a5d80e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,217 +2,706 @@ # yarn lockfile v1 -"@babel/code-frame@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" dependencies: - "@babel/highlight" "7.0.0-beta.44" + "@babel/highlight" "^7.0.0" -"@babel/generator@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" +"@babel/core@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.0.tgz#08958f1371179f62df6966d8a614003d11faeb04" dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/helpers" "^7.1.0" + "@babel/parser" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + convert-source-map "^1.1.0" + debug "^3.1.0" + json5 "^0.5.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0.tgz#1efd58bffa951dc846449e58ce3a1d7f02d393aa" + dependencies: + "@babel/types" "^7.0.0" jsesc "^2.5.1" - lodash "^4.2.0" + lodash "^4.17.10" source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-function-name@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.44" - "@babel/template" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" + "@babel/types" "^7.0.0" -"@babel/helper-get-function-arity@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" dependencies: - "@babel/types" "7.0.0-beta.44" + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" -"@babel/highlight@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" +"@babel/helper-define-map@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz#470d4f9676d9fad50b324cdcce5fbabbc3da5787" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-wrap-function@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz#8cf54e9190706067f016af8f75cb3df829cc8c66" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helpers@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.0.tgz#429bf0f0020be56a4242883432084e3d70a8a141" + dependencies: + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" dependencies: chalk "^2.0.0" esutils "^2.0.2" - js-tokens "^3.0.0" + js-tokens "^4.0.0" -"@babel/template@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - lodash "^4.2.0" +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.0.tgz#a7cd42cb3c12aec52e24375189a47b39759b783e" -"@babel/traverse@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" +"@babel/plugin-proposal-async-generator-functions@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz#41c1a702e10081456e23a7b74d891922dd1bb6ce" dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/generator" "7.0.0-beta.44" - "@babel/helper-function-name" "7.0.0-beta.44" - "@babel/helper-split-export-declaration" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + +"@babel/plugin-proposal-class-properties@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.1.0.tgz#9af01856b1241db60ec8838d84691aa0bd1e8df4" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + +"@babel/plugin-proposal-decorators@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.1.0.tgz#bb39ae934318e4560db2d724b0fca8da0299b120" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.1.0" + +"@babel/plugin-proposal-json-strings@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.0.0" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz#498b39cd72536cd7c4b26177d030226eba08cd33" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-syntax-async-generators@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz#bf0891dcdbf59558359d0c626fdc9490e20bc13c" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-class-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0.tgz#e051af5d300cbfbcec4a7476e37a803489881634" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-decorators@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.1.0.tgz#2fa7c1a7905a299c9853ebcef340306675f9cbdc" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz#0d259a68090e15b383ce3710e01d5b23f3770cbd" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz#109e036496c51dd65857e16acab3bafdf3c57811" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" + +"@babel/plugin-transform-classes@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz#ab3f8a564361800cbc8ab1ca6f21108038432249" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0.tgz#68e911e1935dda2f06b6ccbbf184ffb024e9d43a" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz#73a24da69bc3c370251f43a3d048198546115e58" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/plugin-transform-duplicate-keys@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz#a0601e580991e7cace080e4cf919cfd58da74e86" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz#9c34c2ee7fd77e02779cfa37e403a2e1003ccc73" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz#29c5550d5c46208e7f730516d41eeddd4affadbb" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz#f9e0a7072c12e296079b5a59f408ff5b97bf86a8" + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz#0a9d86451cbbfb29bd15186306897c67f6f9a05c" + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0.tgz#8873d876d4fee23209decc4d1feab8f198cf2df4" + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz#a29a7d85d6f28c3561c33964442257cc6a21f2a8" + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz#b1ae194a054b826d8d4ba7ca91486d4ada0f91bb" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz#44f492f9d618c9124026e62301c296bf606a7aed" + dependencies: + "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + dependencies: + regenerator-transform "^0.13.3" + +"@babel/plugin-transform-runtime@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz#9f76920d42551bb577e2dc594df229b5f7624b63" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz#4dcf1e52e943e5267b7313bff347fdbe0f81cec9" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/preset-env@7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.1.0.tgz#e67ea5b0441cfeab1d6f41e9b5c79798800e8d11" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.1.0" + "@babel/plugin-proposal-json-strings" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.0.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.1.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.1.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-dotall-regex" "^7.0.0" + "@babel/plugin-transform-duplicate-keys" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.1.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.1.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-amd" "^7.1.0" + "@babel/plugin-transform-modules-commonjs" "^7.1.0" + "@babel/plugin-transform-modules-systemjs" "^7.0.0" + "@babel/plugin-transform-modules-umd" "^7.1.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.1.0" + "@babel/plugin-transform-parameters" "^7.1.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typeof-symbol" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + browserslist "^4.1.0" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/runtime-corejs2@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.0.0.tgz#786711ee099c2c2af7875638866c1259eff30a8c" + dependencies: + core-js "^2.5.7" + regenerator-runtime "^0.12.0" + +"@babel/template@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.0.tgz#58cc9572e1bfe24fe1537fdf99d839d53e517e22" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.0.tgz#503ec6669387efd182c3888c4eec07bcc45d91b2" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" debug "^3.1.0" globals "^11.1.0" - invariant "^2.2.0" - lodash "^4.2.0" + lodash "^4.17.10" -"@babel/types@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" +"@babel/types@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" dependencies: esutils "^2.0.2" - lodash "^4.2.0" + lodash "^4.17.10" to-fast-properties "^2.0.0" -"@webassemblyjs/ast@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" +"@webassemblyjs/ast@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.6.tgz#3ef8c45b3e5e943a153a05281317474fef63e21e" dependencies: - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - debug "^3.1.0" + "@webassemblyjs/helper-module-context" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/wast-parser" "1.7.6" mamacro "^0.0.3" -"@webassemblyjs/floating-point-hex-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298" +"@webassemblyjs/floating-point-hex-parser@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.6.tgz#7cb37d51a05c3fe09b464ae7e711d1ab3837801f" -"@webassemblyjs/helper-api-error@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59" +"@webassemblyjs/helper-api-error@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.6.tgz#99b7e30e66f550a2638299a109dda84a622070ef" -"@webassemblyjs/helper-buffer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e" +"@webassemblyjs/helper-buffer@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.6.tgz#ba0648be12bbe560c25c997e175c2018df39ca3e" + +"@webassemblyjs/helper-code-frame@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.6.tgz#5a94d21b0057b69a7403fca0c253c3aaca95b1a5" dependencies: - debug "^3.1.0" + "@webassemblyjs/wast-printer" "1.7.6" -"@webassemblyjs/helper-code-frame@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58" +"@webassemblyjs/helper-fsm@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.6.tgz#ae1741c6f6121213c7a0b587fb964fac492d3e49" + +"@webassemblyjs/helper-module-context@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.6.tgz#116d19a51a6cebc8900ad53ca34ff8269c668c23" dependencies: - "@webassemblyjs/wast-printer" "1.5.13" - -"@webassemblyjs/helper-fsm@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924" - -"@webassemblyjs/helper-module-context@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5" - dependencies: - debug "^3.1.0" mamacro "^0.0.3" -"@webassemblyjs/helper-wasm-bytecode@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747" +"@webassemblyjs/helper-wasm-bytecode@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.6.tgz#98e515eaee611aa6834eb5f6a7f8f5b29fefb6f1" -"@webassemblyjs/helper-wasm-section@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d" +"@webassemblyjs/helper-wasm-section@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.6.tgz#783835867bdd686df7a95377ab64f51a275e8333" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - debug "^3.1.0" + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-buffer" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/wasm-gen" "1.7.6" -"@webassemblyjs/ieee754@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364" +"@webassemblyjs/ieee754@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.6.tgz#c34fc058f2f831fae0632a8bb9803cf2d3462eb1" dependencies: - ieee754 "^1.1.11" + "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee" +"@webassemblyjs/leb128@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.6.tgz#197f75376a29f6ed6ace15898a310d871d92f03b" dependencies: - long "4.0.0" + "@xtuc/long" "4.2.1" -"@webassemblyjs/utf8@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469" +"@webassemblyjs/utf8@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.6.tgz#eb62c66f906af2be70de0302e29055d25188797d" -"@webassemblyjs/wasm-edit@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8" +"@webassemblyjs/wasm-edit@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.6.tgz#fa41929160cd7d676d4c28ecef420eed5b3733c5" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/helper-wasm-section" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - "@webassemblyjs/wast-printer" "1.5.13" - debug "^3.1.0" + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-buffer" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/helper-wasm-section" "1.7.6" + "@webassemblyjs/wasm-gen" "1.7.6" + "@webassemblyjs/wasm-opt" "1.7.6" + "@webassemblyjs/wasm-parser" "1.7.6" + "@webassemblyjs/wast-printer" "1.7.6" -"@webassemblyjs/wasm-gen@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e" +"@webassemblyjs/wasm-gen@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.6.tgz#695ac38861ab3d72bf763c8c75e5f087ffabc322" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/ieee754" "1.7.6" + "@webassemblyjs/leb128" "1.7.6" + "@webassemblyjs/utf8" "1.7.6" -"@webassemblyjs/wasm-opt@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138" +"@webassemblyjs/wasm-opt@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.6.tgz#fbafa78e27e1a75ab759a4b658ff3d50b4636c21" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - debug "^3.1.0" + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-buffer" "1.7.6" + "@webassemblyjs/wasm-gen" "1.7.6" + "@webassemblyjs/wasm-parser" "1.7.6" -"@webassemblyjs/wasm-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f" +"@webassemblyjs/wasm-parser@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.6.tgz#84eafeeff405ad6f4c4b5777d6a28ae54eed51fe" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-api-error" "1.7.6" + "@webassemblyjs/helper-wasm-bytecode" "1.7.6" + "@webassemblyjs/ieee754" "1.7.6" + "@webassemblyjs/leb128" "1.7.6" + "@webassemblyjs/utf8" "1.7.6" -"@webassemblyjs/wast-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea" +"@webassemblyjs/wast-parser@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.6.tgz#ca4d20b1516e017c91981773bd7e819d6bd9c6a7" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/floating-point-hex-parser" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-code-frame" "1.5.13" - "@webassemblyjs/helper-fsm" "1.5.13" - long "^3.2.0" + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/floating-point-hex-parser" "1.7.6" + "@webassemblyjs/helper-api-error" "1.7.6" + "@webassemblyjs/helper-code-frame" "1.7.6" + "@webassemblyjs/helper-fsm" "1.7.6" + "@xtuc/long" "4.2.1" mamacro "^0.0.3" -"@webassemblyjs/wast-printer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95" +"@webassemblyjs/wast-printer@1.7.6": + version "1.7.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.6.tgz#a6002c526ac5fa230fe2c6d2f1bdbf4aead43a5e" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - long "^3.2.0" + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/wast-parser" "1.7.6" + "@xtuc/long" "4.2.1" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + +"@xtuc/long@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" abbrev@1: version "1.1.1" @@ -250,14 +739,14 @@ acorn-jsx@^4.1.1: acorn "^5.0.3" acorn@^5.0.0, acorn@^5.0.3, acorn@^5.6.0, acorn@^5.6.2: - version "5.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" ajv-keywords@^3.0.0, ajv-keywords@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" -ajv@^5.1.0: +ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: @@ -266,14 +755,14 @@ ajv@^5.1.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.0.1, ajv@^6.1.0, ajv@^6.5.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" +ajv@^6.0.1, ajv@^6.1.0, ajv@^6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" - uri-js "^4.2.1" + uri-js "^4.2.2" align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" @@ -315,10 +804,6 @@ ansi-red@^0.1.1: dependencies: ansi-wrap "0.1.0" -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -327,10 +812,6 @@ ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -443,8 +924,10 @@ asn1.js@^4.0.0: minimalistic-assert "^1.0.0" asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + dependencies: + safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" @@ -475,678 +958,59 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" -autolinker@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.7.0.tgz#6131619b53fb425588feb432d633ed0f9ca5e7c5" +autolinker@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.7.1.tgz#36397dd0c09c369433142677b5247ed4c9d2d705" -autoprefixer@^8.0.0: - version "8.6.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-8.6.5.tgz#343f3d193ed568b3208e00117a1b96eb691d4ee9" +autoprefixer@^9.1.3: + version "9.1.5" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.1.5.tgz#8675fd8d1c0d43069f3b19a2c316f3524e4f6671" dependencies: - browserslist "^3.2.8" - caniuse-lite "^1.0.30000864" + browserslist "^4.1.0" + caniuse-lite "^1.0.30000884" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^6.0.23" + postcss "^7.0.2" postcss-value-parser "^3.2.3" aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" -aws4@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" +babel-eslint@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-9.0.0.tgz#7d9445f81ed9f60aff38115f838970df9f2b6220" dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@6.26.3, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-eslint@8.2.6: - version "8.2.6" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.6.tgz#6270d0c73205628067c0f7ae1693a9e797acefd9" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/traverse" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-bindify-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-explode-class@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" - dependencies: - babel-helper-bindify-decorators "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-loader@7.1.5: - version "7.1.5" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" +babel-loader@8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.2.tgz#2079b8ec1628284a929241da3d90f5b3de2a5ae5" dependencies: find-cache-dir "^1.0.0" loader-utils "^1.0.2" mkdirp "^0.5.1" + util.promisify "^1.0.0" -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-async-generators@^6.5.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" - -babel-plugin-syntax-class-constructor-call@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - -babel-plugin-syntax-decorators@^6.1.18, babel-plugin-syntax-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" - -babel-plugin-syntax-do-expressions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" - -babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-export-extensions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" - -babel-plugin-syntax-function-bind@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-generator-functions@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-class-constructor-call@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" - dependencies: - babel-plugin-syntax-class-constructor-call "^6.18.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-decorators-legacy@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz#0e492dffa0edd70529072887f8aa86d4dd8b40a1" - dependencies: - babel-plugin-syntax-decorators "^6.1.18" - babel-runtime "^6.2.0" - babel-template "^6.3.0" - -babel-plugin-transform-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" - dependencies: - babel-helper-explode-class "^6.24.1" - babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-do-expressions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" - dependencies: - babel-plugin-syntax-do-expressions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-export-extensions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" - dependencies: - babel-plugin-syntax-export-extensions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-function-bind@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" - dependencies: - babel-plugin-syntax-function-bind "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-runtime@6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-stage-0@6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" - dependencies: - babel-plugin-transform-do-expressions "^6.22.0" - babel-plugin-transform-function-bind "^6.22.0" - babel-preset-stage-1 "^6.24.1" - -babel-preset-stage-1@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" - dependencies: - babel-plugin-transform-class-constructor-call "^6.24.1" - babel-plugin-transform-export-extensions "^6.22.0" - babel-preset-stage-2 "^6.24.1" - -babel-preset-stage-2@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-plugin-transform-class-properties "^6.24.1" - babel-plugin-transform-decorators "^6.24.1" - babel-preset-stage-3 "^6.24.1" - -babel-preset-stage-3@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" - dependencies: - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-generator-functions "^6.24.1" - babel-plugin-transform-async-to-generator "^6.24.1" - babel-plugin-transform-exponentiation-operator "^6.24.1" - babel-plugin-transform-object-rest-spread "^6.22.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@6.26.0, babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: +babel-runtime@^6.23.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@7.0.0-beta.44: - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -1186,35 +1050,29 @@ big.js@^3.1.3: resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + version "1.12.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" binaryextensions@2: version "2.1.1" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" bluebird@^3.0.6, bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + version "3.5.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" -body-parser@~1.14.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9" +body@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" dependencies: - bytes "2.2.0" - content-type "~1.0.1" - debug "~2.2.0" - depd "~1.1.0" - http-errors "~1.3.1" - iconv-lite "0.4.13" - on-finished "~2.3.0" - qs "5.2.0" - raw-body "~2.1.5" - type-is "~1.6.10" + continuable-cache "^0.3.1" + error "^7.0.0" + raw-body "~1.1.0" + safe-json-parse "~1.0.1" bonzo@1.x: version "1.4.0" @@ -1248,7 +1106,7 @@ brorand@^1.0.1: browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -1276,7 +1134,7 @@ browserify-des@^1.0.0: browserify-rsa@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1299,20 +1157,21 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^3.2.6, browserslist@^3.2.8: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" +browserslist@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.1.tgz#328eb4ff1215b12df6589e9ab82f8adaa4fc8cd6" dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" + caniuse-lite "^1.0.30000884" + electron-to-chromium "^1.3.62" + node-releases "^1.0.0-alpha.11" buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" buffer-from@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" buffer-xor@^1.0.3: version "1.0.3" @@ -1320,7 +1179,7 @@ buffer-xor@^1.0.3: buffer@^4.3.0: version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -1330,13 +1189,9 @@ builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" -bytes@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588" - -bytes@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" +bytes@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" cacache@^10.0.4: version "10.0.4" @@ -1384,9 +1239,9 @@ camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" -caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864: - version "1.0.30000865" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" +caniuse-lite@^1.0.30000884: + version "1.0.30000885" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz#e889e9f8e7e50e769f2a49634c932b8aee622984" caseless@~0.12.0: version "0.12.0" @@ -1399,19 +1254,9 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1427,9 +1272,9 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" chokidar@^2.0.2: version "2.0.4" @@ -1451,8 +1296,8 @@ chokidar@^2.0.2: fsevents "^1.2.2" chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" chrome-trace-event@^1.0.0: version "1.0.0" @@ -1484,11 +1329,11 @@ classnames@2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" -clean-css@4.1.11: - version "4.1.11" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" +clean-css@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" dependencies: - source-map "0.5.x" + source-map "~0.6.0" cli-cursor@^2.1.0: version "2.1.0" @@ -1528,9 +1373,9 @@ clone@^1.0.0, clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" -clone@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" +clone@^2.1.1, clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" cloneable-readable@^1.0.0: version "1.1.2" @@ -1556,22 +1401,28 @@ collection-visit@^1.0.0: object-visit "^1.0.0" color-convert@^1.9.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" dependencies: - color-name "1.1.1" + color-name "1.1.3" -color-name@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" -combined-stream@1.0.6, combined-stream@~1.0.5: +combined-stream@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + resolved "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" dependencies: delayed-stream "~1.0.0" @@ -1579,9 +1430,9 @@ commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" -commander@~2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" commondir@^1.0.1: version "1.0.1" @@ -1624,13 +1475,15 @@ constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" -content-type@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" +continuable-cache@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" -convert-source-map@^1.5.0, convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" +convert-source-map@^1.1.0, convert-source-map@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + dependencies: + safe-buffer "~5.1.1" copy-concurrently@^1.0.0: version "1.0.5" @@ -1660,7 +1513,7 @@ copy-webpack-plugin@4.5.2: p-limit "^1.0.0" serialize-javascript "^1.4.0" -core-js@^2.4.0, core-js@^2.5.0: +core-js@^2.4.0, core-js@^2.5.7: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" @@ -1677,7 +1530,7 @@ create-ecdh@^4.0.0: create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" dependencies: cipher-base "^1.0.1" inherits "^2.0.1" @@ -1687,7 +1540,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -1740,23 +1593,17 @@ dateformat@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" -debug@^2.1.0, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + version "3.2.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407" dependencies: - ms "2.0.0" - -debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" + ms "^2.1.1" decamelize@^1.0.0: version "1.2.0" @@ -1787,11 +1634,10 @@ defaults@^1.0.0: clone "^1.0.2" define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" + object-keys "^1.0.12" define-property@^0.2.5: version "0.2.5" @@ -1832,10 +1678,6 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" -depd@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - deprecated@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" @@ -1851,19 +1693,13 @@ detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" diffie-hellman@^5.0.0: version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" @@ -1904,7 +1740,7 @@ duplexer2@~0.1.0: duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0: version "3.6.0" @@ -1916,22 +1752,19 @@ duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0: stream-shift "^1.0.0" ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" editions@^1.3.3: version "1.3.4" resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -electron-to-chromium@^1.3.47: - version "1.3.52" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" +electron-to-chromium@^1.3.62: + version "1.3.69" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.69.tgz#0fd5d4bfd89ba6a431a144375245aea65073e3ca" element-dataset@2.2.6: version "2.2.6" @@ -1940,8 +1773,8 @@ element-dataset@2.2.6: babel-runtime "^6.23.0" elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -1991,7 +1824,14 @@ errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -es-abstract@^1.10.0: +error@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + dependencies: + string-template "~0.2.1" + xtend "~4.0.0" + +es-abstract@^1.5.1: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" dependencies: @@ -2017,7 +1857,7 @@ es6-promise-polyfill@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz#f38925f23cb3e3e8ce6cda8ff774fcebbb090cde" -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -2043,12 +1883,12 @@ eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" -eslint@5.2.0, eslint@^5.0.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.2.0.tgz#3901ae249195d473e633c4acbc370068b1c964dc" +eslint@5.6.0, eslint@^5.0.1: + version "5.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.6.0.tgz#b6f7806041af01f71b3f1895cbb20971ea4b6223" dependencies: - ajv "^6.5.0" - babel-code-frame "^6.26.0" + "@babel/code-frame" "^7.0.0" + ajv "^6.5.3" chalk "^2.1.0" cross-spawn "^6.0.5" debug "^3.1.0" @@ -2063,11 +1903,11 @@ eslint@5.2.0, eslint@^5.0.1: functional-red-black-tree "^1.0.1" glob "^7.1.2" globals "^11.7.0" - ignore "^4.0.2" + ignore "^4.0.6" imurmurhash "^0.1.4" - inquirer "^5.2.0" + inquirer "^6.1.0" is-resolvable "^1.1.0" - js-yaml "^3.11.0" + js-yaml "^3.12.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" lodash "^4.17.5" @@ -2078,10 +1918,9 @@ eslint@5.2.0, eslint@^5.0.1: path-is-inside "^1.0.2" pluralize "^7.0.0" progress "^2.0.0" - regexpp "^1.1.0" + regexpp "^2.0.0" require-uncached "^1.0.3" - semver "^5.5.0" - string.prototype.matchall "^2.0.0" + semver "^5.5.1" strip-ansi "^4.0.0" strip-json-comments "^2.0.1" table "^4.0.3" @@ -2118,17 +1957,18 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -event-stream@^3.1.7: - version "3.3.4" - resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" +event-stream@^3.3.4: + version "3.3.6" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.6.tgz#cac1230890e07e73ec9cacd038f60a5b66173eef" dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" + duplexer "^0.1.1" + flatmap-stream "^0.1.0" + from "^0.1.7" + map-stream "0.0.7" + pause-stream "^0.0.11" + split "^1.0.1" + stream-combiner "^0.2.2" + through "^2.3.8" events@^1.0.0: version "1.1.1" @@ -2178,16 +2018,16 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.1: +extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" -external-editor@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" +external-editor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" + chardet "^0.7.0" + iconv-lite "^0.4.24" tmp "^0.0.33" extglob@^2.0.4: @@ -2235,11 +2075,11 @@ fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" -faye-websocket@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11" +faye-websocket@~0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" dependencies: - websocket-driver ">=0.3.6" + websocket-driver ">=0.5.1" figures@^2.0.0: version "2.0.0" @@ -2317,6 +2157,10 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +flatmap-stream@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/flatmap-stream/-/flatmap-stream-0.1.0.tgz#ed54e01422cd29281800914fcb968d58b685d5f1" + flush-write-stream@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" @@ -2334,10 +2178,6 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -2346,7 +2186,7 @@ fork-stream@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70" -form-data@~2.3.1: +form-data@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" dependencies: @@ -2367,7 +2207,7 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -from@~0: +from@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" @@ -2478,8 +2318,8 @@ glob@^4.3.1: once "^1.3.0" glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2518,10 +2358,6 @@ globals@^11.1.0, globals@^11.7.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" @@ -2576,14 +2412,14 @@ growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" -gulp-autoprefixer@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-5.0.0.tgz#8237c278a69775270a1cafe7d6f101cfcd585544" +gulp-autoprefixer@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gulp-autoprefixer/-/gulp-autoprefixer-6.0.0.tgz#7034ef12c24a92a5b20158d63623ebbd900faed8" dependencies: - autoprefixer "^8.0.0" + autoprefixer "^9.1.3" fancy-log "^1.3.2" plugin-error "^1.0.1" - postcss "^6.0.1" + postcss "^7.0.2" through2 "^2.0.0" vinyl-sourcemaps-apply "^0.2.0" @@ -2602,11 +2438,11 @@ gulp-chmod@2.0.0: stat-mode "^0.2.0" through2 "^2.0.0" -gulp-clean-css@3.9.4: - version "3.9.4" - resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.9.4.tgz#c6d3f8bb7a600fbe661962a72348a330954d343b" +gulp-clean-css@3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.10.0.tgz#bccd4605eff104bfa4980014cc4b3c24c571736d" dependencies: - clean-css "4.1.11" + clean-css "4.2.1" plugin-error "1.0.1" through2 "2.0.3" vinyl-sourcemaps-apply "0.2.1" @@ -2686,16 +2522,17 @@ gulp-less@4.0.1: through2 "^2.0.0" vinyl-sourcemaps-apply "^0.2.0" -gulp-livereload@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/gulp-livereload/-/gulp-livereload-3.8.1.tgz#00f744b2d749d3e9e3746589c8a44acac779b50f" +gulp-livereload@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp-livereload/-/gulp-livereload-4.0.0.tgz#be4a6b01731a93f76f4fb29c9e62e323affe7d03" dependencies: - chalk "^0.5.1" - debug "^2.1.0" - event-stream "^3.1.7" - gulp-util "^3.0.2" - lodash.assign "^3.0.0" - mini-lr "^0.1.8" + chalk "^2.4.1" + debug "^3.1.0" + event-stream "^3.3.4" + fancy-log "^1.3.2" + lodash.assign "^4.2.0" + tiny-lr "^1.1.1" + vinyl "^2.2.0" gulp-match@^1.0.3: version "1.0.3" @@ -2787,7 +2624,7 @@ gulp-uglify@3.0.1: uglify-js "^3.0.5" vinyl-sourcemaps-apply "^0.2.0" -gulp-util@3.0.8, gulp-util@^3.0.0, gulp-util@^3.0.2, gulp-util@^3.0.6, gulp-util@^3.0.7: +gulp-util@3.0.8, gulp-util@^3.0.0, gulp-util@^3.0.6, gulp-util@^3.0.7: version "3.0.8" resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" dependencies: @@ -2855,19 +2692,13 @@ har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" +har-validator@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" dependencies: - ajv "^5.1.0" + ajv "^5.3.0" har-schema "^2.0.0" -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - dependencies: - ansi-regex "^0.2.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -2884,10 +2715,6 @@ has-gulplog@^0.1.0: dependencies: sparkles "^1.0.0" -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -2947,26 +2774,12 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" dependencies: parse-passwd "^1.0.0" -http-errors@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" - dependencies: - inherits "~2.0.1" - statuses "1" - http-parser-js@>=0.4.0: version "0.4.13" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137" @@ -2983,17 +2796,13 @@ https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" -iconv-lite@0.4.13: - version "0.4.13" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" - -iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" +iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.11, ieee754@^1.1.4: +ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" @@ -3015,9 +2824,9 @@ ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" -ignore@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.2.tgz#0a8dd228947ec78c2d7f736b1642a9f7317c1905" +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" image-size@~0.5.0: version "0.5.5" @@ -3058,20 +2867,20 @@ ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" -inquirer@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" +inquirer@^6.1.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^2.1.0" + external-editor "^3.0.0" figures "^2.0.0" - lodash "^4.3.0" + lodash "^4.17.10" mute-stream "0.0.7" run-async "^2.2.0" - rxjs "^5.5.2" + rxjs "^6.1.0" string-width "^2.1.0" strip-ansi "^4.0.0" through "^2.3.6" @@ -3084,7 +2893,7 @@ intersection-observer@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.5.0.tgz#9fe8bee3953c755b1485c38efd9633d535775ea6" -invariant@^2.2.0, invariant@^2.2.2: +invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: @@ -3169,12 +2978,6 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -3205,7 +3008,7 @@ is-number@^3.0.0: is-obj@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" is-path-cwd@^1.0.0: version "1.0.0" @@ -3341,15 +3144,15 @@ js-cookie@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.0.tgz#1b2c279a6eece380a12168b92485265b35b1effb" -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" +js-levenshtein@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5" -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" -js-yaml@^3.11.0: +js-yaml@^3.12.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: @@ -3360,10 +3163,6 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" @@ -3404,7 +3203,7 @@ json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.5.0, json5@^0.5.1: +json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -3458,8 +3257,10 @@ lazy-cache@^1.0.3: resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" "less@2.6.x || ^3.7.1": - version "3.8.0" - resolved "https://registry.yarnpkg.com/less/-/less-3.8.0.tgz#44785e40c23841c15ba3be741d36bd2775dd0596" + version "3.8.1" + resolved "https://registry.yarnpkg.com/less/-/less-3.8.1.tgz#f31758598ef5a1930dd4caefa9e4340641e71e1d" + dependencies: + clone "^2.1.2" optionalDependencies: errno "^0.1.1" graceful-fs "^4.1.2" @@ -3490,7 +3291,7 @@ liftoff@^2.1.0: rechoir "^0.6.2" resolve "^1.1.7" -livereload-js@^2.2.0: +livereload-js@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a" @@ -3568,7 +3369,7 @@ lodash._root@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" -lodash.assign@^3.0.0, lodash.assign@^3.2.0: +lodash.assign@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" dependencies: @@ -3576,6 +3377,10 @@ lodash.assign@^3.0.0, lodash.assign@^3.2.0: lodash._createassigner "^3.0.0" lodash.keys "^3.0.0" +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + lodash.clone@^4.3.2: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" @@ -3668,13 +3473,13 @@ lodash.uniq@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" lodash@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + resolved "http://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" log-symbols@^1.0.0: version "1.0.2" @@ -3682,14 +3487,6 @@ log-symbols@^1.0.0: dependencies: chalk "^1.0.0" -long@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - -long@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" - longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -3728,8 +3525,8 @@ make-error-cause@^1.1.1: make-error "^1.2.0" make-error@^1.2.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" + version "1.3.5" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" make-iterator@^1.0.0: version "1.0.1" @@ -3745,9 +3542,9 @@ map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" +map-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" map-visit@^1.0.0: version "1.0.0" @@ -3766,10 +3563,6 @@ md5.js@^1.3.4: hash-base "^3.0.0" inherits "^2.0.1" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -3783,7 +3576,7 @@ merge-stream@^1.0.0: dependencies: readable-stream "^2.0.1" -micromatch@^3.0.4, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" dependencies: @@ -3808,15 +3601,15 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@~1.35.0: - version "1.35.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" +mime-db@~1.36.0: + version "1.36.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18: - version "2.1.19" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.20" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" dependencies: - mime-db "~1.35.0" + mime-db "~1.36.0" mime@^1.4.1: version "1.6.0" @@ -3826,17 +3619,6 @@ mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" -mini-lr@^0.1.8: - version "0.1.9" - resolved "https://registry.yarnpkg.com/mini-lr/-/mini-lr-0.1.9.tgz#02199d27347953d1fd1d6dbded4261f187b2d0f6" - dependencies: - body-parser "~1.14.0" - debug "^2.2.0" - faye-websocket "~0.7.2" - livereload-js "^2.2.0" - parseurl "~1.3.0" - qs "~2.2.3" - minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -3851,7 +3633,7 @@ minimatch@^2.0.1: dependencies: brace-expansion "^1.0.0" -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@^3.0.0, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -3866,15 +3648,15 @@ minimatch@~0.2.11: minimist@0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" minimist@^1.1.0, minimist@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" minipass@^2.2.1, minipass@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + version "2.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" @@ -3909,7 +3691,7 @@ mixin-deep@^1.2.0: mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" @@ -3928,14 +3710,14 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + multimatch@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" @@ -3956,8 +3738,8 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + version "2.11.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" nanomatch@^1.2.9: version "1.2.13" @@ -3976,28 +3758,28 @@ nanomatch@^1.2.9: to-regex "^3.0.1" natives@^1.1.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.4.tgz#2f0f224fc9a7dd53407c7667c84cf8dbe773de58" + version "1.1.5" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.5.tgz#3bdbdb4104023e5dd239b56fc7ef3d9a17acc6aa" natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" needle@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" + version "2.2.3" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.3.tgz#c1b04da378cd634d8befe2de965dc2cfb0fd65ca" dependencies: debug "^2.1.2" iconv-lite "^0.4.4" sax "^1.2.4" neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + version "2.5.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" nice-try@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" node-fetch@^1.3.3: version "1.7.3" @@ -4040,7 +3822,7 @@ node-libs-browser@^2.0.0: node-localstorage@~1.3.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-1.3.1.tgz#3177ef42837f398aee5dd75e319b281e40704243" + resolved "http://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.1.tgz#3177ef42837f398aee5dd75e319b281e40704243" dependencies: write-file-atomic "^1.1.4" @@ -4068,6 +3850,12 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-releases@^1.0.0-alpha.11: + version "1.0.0-alpha.11" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.11.tgz#73c810acc2e5b741a17ddfbb39dfca9ab9359d8a" + dependencies: + semver "^5.3.0" + node.extend@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-2.0.0.tgz#7525a2875677ea534784a5e10ac78956139614df" @@ -4096,12 +3884,12 @@ normalize.css@8.0.0: resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.0.tgz#14ac5e461612538a4ce9be90a7da23f86e718493" npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" npm-packlist@^1.1.6: - version "1.1.10" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" + version "1.1.11" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -4123,9 +3911,9 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" object-assign@^3.0.0: version "3.0.0" @@ -4143,7 +3931,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-keys@^1.0.8: +object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -4166,6 +3954,13 @@ object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.map@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" @@ -4179,12 +3974,6 @@ object.pick@^1.2.0, object.pick@^1.3.0: dependencies: isobject "^3.0.1" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -4251,7 +4040,7 @@ os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -4292,7 +4081,7 @@ parallel-transform@^1.1.0: parse-asn1@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -4312,10 +4101,6 @@ parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" -parseurl@~1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -4332,7 +4117,7 @@ path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -4345,8 +4130,8 @@ path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" path-root-regex@^0.1.0: version "0.1.2" @@ -4364,9 +4149,9 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" -pause-stream@0.0.11: +pause-stream@^0.0.11: version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + resolved "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" dependencies: through "~2.3" @@ -4445,9 +4230,9 @@ postcss-value-parser@^3.2.3: version "3.3.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" -postcss@^6.0.1, postcss@^6.0.23: - version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" +postcss@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.2.tgz#7b5a109de356804e27f95a960bef0e4d5bc9bb18" dependencies: chalk "^2.4.1" source-map "^0.6.1" @@ -4465,7 +4250,7 @@ pretty-hrtime@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" -private@^0.1.6, private@^0.1.8: +private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -4499,9 +4284,13 @@ pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +psl@^1.1.24: + version "1.1.29" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + public-encrypt@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" + resolved "http://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" @@ -4536,15 +4325,7 @@ punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" -qs@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be" - -qs@~2.2.3: - version "2.2.5" - resolved "https://registry.yarnpkg.com/qs/-/qs-2.2.5.tgz#1088abaf9dcc0ae5ae45b709e6c6b5888b23923c" - -qs@~6.5.1: +qs@^6.4.0, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -4573,13 +4354,12 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -raw-body@~2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" +raw-body@~1.1.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" dependencies: - bytes "2.4.0" - iconv-lite "0.4.13" - unpipe "1.0.0" + bytes "1" + string_decoder "0.10" raw-loader@0.5.1: version "0.5.1" @@ -4596,7 +4376,7 @@ rc@^1.2.7: "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -4608,7 +4388,7 @@ rc@^1.2.7: "readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -4617,7 +4397,7 @@ rc@^1.2.7: readable-stream@~1.1.9: version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -4625,13 +4405,12 @@ readable-stream@~1.1.9: string_decoder "~0.10.x" readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" rechoir@^0.6.2: version "0.6.2" @@ -4639,7 +4418,13 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -regenerate@^1.2.1: +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" @@ -4647,12 +4432,14 @@ regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" private "^0.1.6" regex-not@^1.0.0, regex-not@^1.0.2: @@ -4662,31 +4449,28 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" - dependencies: - define-properties "^1.1.2" - -regexpp@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" - -regexpu-core@^2.0.0: +regexpp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.0.tgz#b2a7534a85ca1b033bcf5ce9ff8e56d4e0755365" + +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.4.0" + regjsparser "^0.3.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" +regjsgen@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" +regjsparser@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" dependencies: jsesc "~0.5.0" @@ -4695,19 +4479,13 @@ remove-trailing-separator@^1.0.1: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - replace-ext@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" @@ -4725,29 +4503,29 @@ replacestream@^4.0.0: readable-stream "^2.0.2" request@^2.83.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" dependencies: aws-sign2 "~0.7.0" - aws4 "^1.6.0" + aws4 "^1.8.0" caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" + combined-stream "~1.0.6" + extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" + form-data "~2.3.2" + har-validator "~5.1.0" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" + mime-types "~2.1.19" + oauth-sign "~0.9.0" performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" tunnel-agent "^0.6.0" - uuid "^3.1.0" + uuid "^3.3.2" require-uncached@^1.0.3: version "1.0.3" @@ -4775,7 +4553,7 @@ resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.5.0: +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" dependencies: @@ -4831,23 +4609,27 @@ run-sequence@2.2.1: fancy-log "^1.3.2" plugin-error "^0.1.2" -rxjs@^5.5.2: - version "5.5.11" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87" +rxjs@^6.1.0: + version "6.3.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f" dependencies: - symbol-observable "1.0.1" + tslib "^1.9.0" safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" +safe-json-parse@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -4856,8 +4638,8 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" dependencies: ajv "^6.1.0" ajv-keywords "^3.1.0" @@ -4866,9 +4648,9 @@ semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" -semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" sequencify@~0.0.7: version "0.0.7" @@ -4882,10 +4664,6 @@ set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" @@ -4910,7 +4688,7 @@ setimmediate@^1.0.4: sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -4996,17 +4774,11 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" - source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -5024,9 +4796,9 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" +split@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" dependencies: through "2" @@ -5066,10 +4838,6 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -statuses@1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" @@ -5084,11 +4852,12 @@ stream-combiner2@^1.1.1: duplexer2 "~0.1.0" readable-stream "^2.0.2" -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" +stream-combiner@^0.2.2: + version "0.2.2" + resolved "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" dependencies: duplexer "~0.1.1" + through "~2.3.4" stream-consume@~0.1.0: version "0.1.1" @@ -5099,8 +4868,8 @@ stream-counter@^1.0.0: resolved "https://registry.yarnpkg.com/stream-counter/-/stream-counter-1.0.0.tgz#91cf2569ce4dc5061febcd7acb26394a5a114751" stream-each@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" dependencies: end-of-stream "^1.1.0" stream-shift "^1.0.0" @@ -5125,6 +4894,10 @@ streamfilter@^1.0.5: dependencies: readable-stream "^2.0.2" +string-template@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -5140,15 +4913,9 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string.prototype.matchall@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz#2af8fe3d2d6dc53ca2a59bd376b089c3c152b3c8" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.10.0" - function-bind "^1.1.1" - has-symbols "^1.0.0" - regexp.prototype.flags "^1.2.0" +string_decoder@0.10, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" string_decoder@^1.0.0, string_decoder@~1.1.1: version "1.1.1" @@ -5156,16 +4923,6 @@ string_decoder@^1.0.0, string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - dependencies: - ansi-regex "^0.2.1" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -5189,34 +4946,26 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -style-loader@0.21.0: - version "0.21.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.21.0.tgz#68c52e5eb2afc9ca92b6274be277ee59aea3a852" +style-loader@0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.0.tgz#8377fefab68416a2e05f1cabd8c3a3acfcce74f1" dependencies: loader-utils "^1.1.0" schema-utils "^0.4.5" -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" supports-color@^5.3.0, supports-color@^5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" dependencies: has-flag "^3.0.0" -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - table@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" + resolved "http://registry.npmjs.org/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" dependencies: ajv "^6.0.1" ajv-keywords "^3.0.0" @@ -5225,13 +4974,13 @@ table@^4.0.3: slice-ansi "1.0.0" string-width "^2.1.1" -tapable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" tar@^4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" + version "4.4.6" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" dependencies: chownr "^1.0.1" fs-minipass "^1.2.5" @@ -5286,9 +5035,9 @@ through2@~0.4: readable-stream "~1.0.17" xtend "~2.1.1" -through@2, through@^2.3.6, through@~2.3, through@~2.3.1: +through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.4: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" tildify@^1.0.0: version "1.2.0" @@ -5306,6 +5055,17 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +tiny-lr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab" + dependencies: + body "^5.1.0" + debug "^3.1.0" + faye-websocket "~0.10.0" + livereload-js "^2.3.0" + object-assign "^4.1.0" + qs "^6.4.0" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -5316,10 +5076,6 @@ to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -5346,10 +5102,11 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@~2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" dependencies: + psl "^1.1.24" punycode "^1.4.1" trim-right@^1.0.1: @@ -5380,13 +5137,6 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-is@~1.6.10: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.18" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -5408,10 +5158,10 @@ uglify-js@^2.8.22: uglify-to-browserify "~1.0.0" uglify-js@^3.0.5: - version "3.4.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.5.tgz#650889c0766cf0f6fd5346cea09cd212f544be69" + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" dependencies: - commander "~2.16.0" + commander "~2.17.1" source-map "~0.6.1" uglify-to-browserify@~1.0.0: @@ -5419,8 +5169,8 @@ uglify-to-browserify@~1.0.0: resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" uglifyjs-webpack-plugin@^1.2.4: - version "1.2.7" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" + version "1.3.0" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" @@ -5439,6 +5189,25 @@ underscore@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -5464,10 +5233,6 @@ unique-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -5479,7 +5244,7 @@ upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" -uri-js@^4.2.1: +uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" dependencies: @@ -5508,6 +5273,13 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -5520,7 +5292,7 @@ util@^0.10.3: dependencies: inherits "2.0.3" -uuid@^3.1.0: +uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" @@ -5605,22 +5377,21 @@ webpack-notifier@1.6.0: object-assign "^4.1.0" strip-ansi "^3.0.1" -webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" +webpack-sources@^1.1.0, webpack-sources@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2" dependencies: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@4.16.3: - version "4.16.3" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.16.3.tgz#861be3176d81e7e3d71c66c8acc9bba35588b525" +webpack@4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.19.1.tgz#096674bc3b573f8756c762754366e5b333d6576f" dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/wasm-edit" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" + "@webassemblyjs/ast" "1.7.6" + "@webassemblyjs/helper-module-context" "1.7.6" + "@webassemblyjs/wasm-edit" "1.7.6" + "@webassemblyjs/wasm-parser" "1.7.6" acorn "^5.6.2" acorn-dynamic-import "^3.0.0" ajv "^6.1.0" @@ -5637,12 +5408,12 @@ webpack@4.16.3: neo-async "^2.5.0" node-libs-browser "^2.0.0" schema-utils "^0.4.4" - tapable "^1.0.0" + tapable "^1.1.0" uglifyjs-webpack-plugin "^1.2.4" watchpack "^1.5.0" - webpack-sources "^1.0.1" + webpack-sources "^1.2.0" -websocket-driver@>=0.3.6: +websocket-driver@>=0.5.1: version "0.7.0" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" dependencies: @@ -5705,7 +5476,7 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -5733,7 +5504,7 @@ yallist@^3.0.0, yallist@^3.0.2: yargs@~3.10.0: version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + resolved "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" dependencies: camelcase "^1.0.2" cliui "^2.1.0" From 87bfa64af047122ec9b0aef0ef8ac0cb95acfd40 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Tue, 18 Sep 2018 23:40:45 +0300 Subject: [PATCH 65/83] Synchronize localizations from Transifex --- .../v/0.0.0/app/localization/admin/id_ID.yml | 324 ++++++++++++ .../v/0.0.0/app/localization/admin/ja_JP.yml | 1 + .../0.0.0/app/localization/webmail/cs_CZ.yml | 3 +- .../0.0.0/app/localization/webmail/id_ID.yml | 8 +- .../0.0.0/app/localization/webmail/is_IS.yml | 488 +++++++++--------- .../0.0.0/app/localization/webmail/sk_SK.yml | 1 + 6 files changed, 581 insertions(+), 244 deletions(-) create mode 100644 rainloop/v/0.0.0/app/localization/admin/id_ID.yml diff --git a/rainloop/v/0.0.0/app/localization/admin/id_ID.yml b/rainloop/v/0.0.0/app/localization/admin/id_ID.yml new file mode 100644 index 000000000..f929b07a4 --- /dev/null +++ b/rainloop/v/0.0.0/app/localization/admin/id_ID.yml @@ -0,0 +1,324 @@ +id_ID: + LOGIN: + LABEL_LOGIN: "Login" + LABEL_PASSWORD: "Password" + BUTTON_LOGIN: "Login ke panel admin" + TOP_PANEL: + LABEL_PREMIUM: "Premium" + LABEL_ADMIN_PANEL: "Panel Admin" + TABS_LABELS: + LABEL_GENERAL_NAME: "Umum" + LABEL_LOGIN_NAME: "Login" + LABEL_BRANDING_NAME: "Branding" + LABEL_CONTACTS_NAME: "Kontak" + LABEL_DOMAINS_NAME: "Domain" + LABEL_SECURITY_NAME: "Keamanan" + LABEL_INTEGRATION_NAME: "Integrasi" + LABEL_PLUGINS_NAME: "Plugin" + LABEL_PACKAGES_NAME: "Paket" + LABEL_LICENSING_NAME: "Lisensi" + LABEL_ABOUT_NAME: "Tentang" + TAB_GENERAL: + LEGEND_INTERFACE: "Antarmuka" + LABEL_LANGUAGE: "Bahasa" + LABEL_LANGUAGE_ADMIN: "Bahasa (admin)" + LABEL_THEME: "Tema" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Izinkan pemilihan bahasa pada laman pengaturan" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Izinkan pemilihan tema di laman pengaturan" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Izinkan pemilihan gambar latar di laman pengaturan" + LABEL_NEW_FOLDER_MOVE: "Tombol \"pindahkan ke folder\" baru" + LABEL_SHOW_THUMBNAILS: "Tampikankan gambar kecil (lampiran)" + LABEL_ALLOW_GRAVATAR: "Izinkan Gravatar" + LEGEND_MAIN: "Utama" + LABEL_ATTACHMENT_SIZE_LIMIT: "Batas ukuran lampiran" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Izinkan akun tambahan" + LABEL_ALLOW_IDENTITIES: "Izinkan identitas jamak" + LABEL_ALLOW_TEMPLATES: "Izinkan penggunaan template" + ALERT_DATA_ACCESS: "Data foldel RainLoop bisa diakses. Silahkan atur web server anda untuk menyembunyikan folder data dari akses eksternal. Baca selengkapnya di sini:" + ALERT_WARNING: "Peringatan!" + HTML_ALERT_WEAK_PASSWORD: | + Anda menggunakan password admin bawaan. +
      + Atas alasan keamanan, mohon + mengganti + password dengan frasa yang lainnya segera. + TAB_LOGIN: + LEGEND_LOGIN_SCREEN: "Laman login" + LABEL_DEFAULT_DOMAIN: "Domain bawaan" + LABEL_DETERMINE_USER_DOMAIN: "Coba untuk memeriksa user domain" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Izinkan pemilihan bahasa di laman login" + LABEL_DETERMINE_USER_LANGUAGE: "Coba untuk memeriksa bahasa user" + TAB_BRANDING: + LEGEND_BRANDING: "Branding" + LABEL_PAGE_TITLE: "Judul laman" + LABEL_LOADING_DESCRIPTION: "Deskripsi loading" + LABEL_FAVICON_URL: "Favicon" + LEGEND_LOGIN: "Login" + LABEL_LOGIN_LOGO: "Logo" + LABEL_LOGIN_DESCRIPTION: "Deskripsi" + LABEL_LOGIN_BACKGROUND: "Gambar latar" + LABEL_LOGIN_CUSTOM_CSS: "Custom CSS" + LABEL_LOGIN_SHOW_POWERED_LINK: "Tampilkan link \"Powered by RainLoop\"" + LEGEND_USER: "User" + LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Judul Logo" + LABEL_USER_LOGO_MESSAGE: "Logo (Tampilan Pesan)" + LABEL_USER_CUSTOM_CSS: "Custom CSS" + LEGEND_WELCOME_PAGE: "Laman selamat datang" + LABEL_WELCOME_PAGE_TITLE: "Judul" + LABEL_WELCOME_PAGE_URL: "URL" + LABEL_WELCOME_PAGE_DISPLAY: "Tampilan" + OPTION_WELCOME_PAGE_DISPLAY_NONE: "Tidak ada" + OPTION_WELCOME_PAGE_DISPLAY_ONCE: "Sekali" + OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Selalu" + HTML_ALERT_PREMIUM: "Fungsi ini tersedia hanya untuk pengguna Premium." + TAB_CONTACTS: + LEGEND_CONTACTS: "Kontak" + LEGEND_STORAGE: "Media simpan (PDO)" + LABEL_ENABLE_CONTACTS: "Izinkan kontak" + LABEL_ALLOW_SYNC: "Izinkan sinkronisasi kontak (dengan server CardDAV eksternal)" + LABEL_STORAGE_TYPE: "Tipe" + LABEL_STORAGE_DSN: "Dsn" + LABEL_STORAGE_USER: "User" + LABEL_STORAGE_PASSWORD: "Password" + BUTTON_TEST: "Ujicoba" + ALERT_NOTICE: "Perhatian!" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Jangan gunakan tipe database ini untuk jumlah user aktif yang besar." + HTML_ALERT_DOES_NOT_SUPPORTED: | + Sistem anda tidak mendukung kontak +
      + Anda harus memasang atau mengaktifkan PDO (SQLite / MySQL / PostgreSQL) extension pada server anda. + TAB_DOMAINS: + LEGEND_DOMAINS: "Domain" + BUTTON_ADD_DOMAIN: "Tambah domain" + BUTTON_ADD_ALIAS: "Tambah alias" + DELETE_ARE_YOU_SURE: "Anda yakin?" + HTML_DOMAINS_HELPER: | + Daftar domain webmail yang diizinkan mengakses. +
      + Klik pada nama domain untuk mengatur domain. + TAB_SECURITY: + LEGEND_SECURITY: "Keamanan" + LABEL_ALLOW_TWO_STEP: "Izinkan Verifikasi 2-Langkah" + LABEL_FORCE_TWO_STEP: "Pasakan Verifikasi 2-Langkah" + LABEL_USE_IMAGE_PROXY: "Gunakan proxy lokal untuk gambar dari luar" + LABEL_ALLOW_OPEN_PGP: "Izinkan OpenPGP" + LABEL_SHOW_PHP_INFO: "Tampilkan informasi PHP" + LEGEND_ADMIN_PANEL_ACCESS_CREDENTIALS: "Hak Akses Panel Admin" + LABEL_CURRENT_PASSWORD: "Password saat ini" + LABEL_NEW_LOGIN: "Login baru" + LABEL_NEW_PASSWORD: "Password baru" + LABEL_REPEAT_PASSWORD: "Ulangi" + BUTTON_UPDATE_PASSWORD: "Perbarui Password" + LEGEND_SSL: "SSL" + LABEL_REQUIRE_VERIFICATION: "Diperlukan verifikasi sertifikat SSL dengan (IMAP/SMTP) " + LABEL_ALLOW_SELF_SIGNED: "Izinkan sertifikat yang dibuat sendiri" + TAB_INTEGRATIONS: + LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Aktifkan Integrasi Google" + LABEL_GOOGLE_AUTH: "Otorisasi" + LABEL_GOOGLE_DRIVE: "Integrasi Google Drive (Tampilan compose)" + LABEL_GOOGLE_PREVIEW: "Intergrasi Google Viewer (Pratinjau untuk Microsoft Word, Excel dan file PowerPoint)" + LABEL_GOOGLE_CLIENT_ID: "ID Klien" + LABEL_GOOGLE_CLIENT_SECRET: "Kode Rahasia Klien" + LABEL_GOOGLE_API_KEY: "Kunci API" + HINT_GOOGLE_API_KEY: "Diperlukan untuk Google Drive File Picker" + LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Aktifkan Integrasi Facebook (Otorisasi)" + LABEL_FACEBOOK_APP_ID: "ID App" + LABEL_FACEBOOK_APP_SECRET: "Kode rahasia App" + LEGEND_TWITTER: "Twitter" + LABEL_ENABLE_TWITTER: "Aktifkan Integrasi Twitter (Otorisasi)" + LABEL_TWITTER_CONSUMER_KEY: "Kunci Consumer" + LABEL_TWITTER_CONSUMER_SECRET: "Kode Rahasia Consumer" + LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Aktifkan Integrasi Dropbox" + LABEL_DROPBOX_API_KEY: "Kunci API" + TOP_ALERT: "Informasi lengkap di Integrasi medsos ditemukan pada" + TAB_PLUGINS: + LEGEND_PLUGINS: "Plugins" + LABEL_ENABLE_PLUGINS: "Aktifkan plugins" + ALERT_NO_PLUGINS: "Belum ada plugins yang terinstal" + LINK_INSTALL_NEW: "Klik di sini untuk menginstall yang baru" + HINT_CLICK_NAME: "Klik pada nama untuk mengatur plugins" + TAB_PACKAGES: + LEGEND_AVAILABLE_FOR_UPDATE: "Tersedia untuk Pembaruan" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Tersedia untuk Instalasi" + LEGEND_INSTALLED_PACKAGES: "Paket Terinstal" + ALERT_CANNOT_ACCESS_REPOSITORY: "Tidak bisa menjangkau repositori saat ini" + TAB_LICENSING: + LABEL_YOUR_DOMAIN: "Domain anda" + LABEL_VERSION: "Versi" + LABEL_CHECKING: "Memeriksa" + TYPE_BASIC_HINT: "Domain ini belum dilisensikan untuk penggunaan komersil (dengan fitur tambahan)." + TYPE_BASIC_HINT_2: "Domain ini tidak bisa dilinsensikan" + HTML_ALERT_TOP_1: "RainLoop Webmail dilisensi di bawah" + HTML_ALERT_TOP_2: "Anda gratis jika ditujukan proyek pribadi." + HTML_ALERT_TOP_3: | + Tujuan penggunaan komersil (dengan fitur tambahan) RainLoop Webmail harus + langganan. + TYPE_PREMIUM_LIFETIME: "Seumur hidup" + LABEL_SUB_EXPIRES: "Langganan berakhir" + BUTTON_ACTIVATE: "Aktifkan Kunci Langganan untuk domain ini" + BUTTON_PURCHASE: "Beli" + BUTTON_TRIAL: "Percobaan" + TAB_ABOUT: + LEGEND_ABOUT: "Tentang" + LABEL_TAG_HINT: "Klien web-based email yang simpel, modern & cepat" + LABEL_ALL_RIGHTS_RESERVED: "Hak Cipta" + HINT_READ_CHANGE_LOG: "Mohon baca log perubahan sebelum melakukan pembaruan" + HINT_IS_UP_TO_DATE: "RainLoop sudah terbaru" + HTML_NEW_VERSION: "Versi %VERSION% baru tersedia" + LABEL_UPDATING: "Memperbarui" + LABEL_CHECKING: "Memeriksa pembaruan" + BUTTON_UPDATE: "Pembaruan" + BUTTON_DOWNLOAD: "Mengunduh" + BUTTON_CHANGELOG: "Log Perubahan" + POPUPS_ACTIVATE: + TITLE_ACTIVATE: "Akifkan kunci berlangganan?" + TITLE_ACTIVATION: "Mengaktivasi..." + LABEL_DOMAIN: "Domain" + LABEL_SUB_KEY: "Kunci Berlangganan" + BUTTON_ACTIVATE: "Aktivasi" + LABEL_ACTIVATED: "Sudah Diaktivasi" + ERROR_INVALID_SUBS_KEY: "Kunci Berlangganan tidak sah" + SUBS_KEY_ACTIVATED: "Kunci berlangganan berhasil diaktifkan" + HTML_DESC: | + Setelah aktivasi, langganan premium untuk %DOMAIN% akan diperpanjang. +
      + Ingat bahwa kunci berlangganan hanya berlaku untuk domain tunggal. +

      + Setelah Dimulai, proses aktivasi tidak bisa dicegah dan dibatalkan. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Tambah Alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Domain" + BUTTON_CLOSE: "Tutup" + BUTTON_ADD: "Tambah" + POPUPS_DOMAIN: + TITLE_ADD_DOMAIN: "Tambah Domain" + TITLE_ADD_DOMAIN_WITH_NAME: "Tambah \"%NAME%\" Domain" + TITLE_EDIT_DOMAIN: "Ubah Domain \"%NAME%\"" + LABEL_NAME: "Nama" + NAME_HELPER: "Mendukung Wildcard" + LABEL_IMAP: "IMAP" + LABEL_SMTP: "SMTP" + LABEL_SIEVE: "SIEVE" + LABEL_SERVER: "Server" + LABEL_PORT: "Port" + LABEL_SECURE: "Aman" + LABEL_WHITE_LIST: "Daftar Putih" + SECURE_OPTION_NONE: "Tidak satupun" + SECURE_OPTION_SSL: "SSL/TLS" + SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Izinkan script sieve" + LABEL_ALLOW_USER_SCRIPT: "Izinkan script user yang dikustomisasi" + LABEL_USE_SHORT_LOGIN: "Gunakan login singkat" + LABEL_USE_AUTH: "Gunakan otentikasi" + LABEL_USE_PHP_MAIL: "Gunakan fungsi mail() PHP" + BUTTON_TEST: "Ujicoba" + BUTTON_WHITE_LIST: "Daftar Putih" + BUTTON_SIEVE_CONFIGURATION: "Konfigurasi Sieve" + BUTTON_BACK_TO_IMAP: "Kembali ke pengaturan IMAP" + BUTTON_BACK: "Kembali" + BUTTON_CLOSE: "Tutup" + BUTTON_ADD: "Tambah" + BUTTON_UPDATE: "Perbarui" + NEW_DOMAIN_DESC: "Domain ini mengizinkan anda bekerja dengan alamat email
      juga%NAME% " + WHITE_LIST_ALERT: | + Daftar domain webmail user yang diizinkan diakses. + Gunakan spasi untuk pemisahnya + POPUPS_PLUGIN: + TITLE_PLUGIN: "Plugin" + DESC_NOTHING_TO_CONFIGURE: "Tidak ada yang dikonfigurasi" + BUTTON_CLOSE: "Tutup" + BUTTON_SAVE: "Simpan" + TOOLTIP_ABOUT_TITLE: "Tentang" + POPUPS_ASK: + DESC_WANT_CLOSE_THIS_WINDOW: "Anda yakin menutup jendela ini?" + POPUPS_LANGUAGES: + TITLE_LANGUAGES: "Pilih bahasa anda" + HINTS: + BETA: "beta" + UNSTABLE: "Tidak stabil" + WARNING: "Peringatan!" + NOT_SUPPORTED: "tidak didukung" + REQUIRES_PHP_54: "Membutuhkan PHP 5.4 atau terbaru" + ERRORS: + DOMAIN_ALREADY_EXISTS: "Domain sudah ada" + UNKNOWN_ERROR: "Kesalahan tidak diketahui" + NOTIFICATIONS: + INVALID_TOKEN: "Token invalid" + AUTH_ERROR: "Otentikasi gagal" + ACCESS_ERROR: "Akses error" + CONNECTION_ERROR: "Tidak bisa terhubung ke server" + CAPTCHA_ERROR: "CAPTCHA salah" + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Social ID ini tidak dipasangkan untuk akun email manapun. Login dengan kredensial + email dan aktifkan fitur ini pada seting akun. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Social ID ini tidak dipasangkan untuk akun email manapun. Login dengan kredensial + email dan aktifkan fitur ini pada seting akun. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Social ID ini tidak dipasangkan untuk akun email manapun. Login dengan kredensial + email dan aktifkan fitur ini pada seting akun. + DOMAIN_NOT_ALLOWED: "Domain tidak diizinkan" + ACCOUNT_NOT_ALLOWED: "Akun tidak diizinkan" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Dibutuhkan verifikasi dua langkah" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Kesalahan verifikasi dua langkah" + COULD_NOT_SAVE_NEW_PASSWORD: "Tidak bisa menyimpan password baru" + CURRENT_PASSWORD_INCORRECT: "Password saat ini salah" + NEW_PASSWORD_SHORT: "Password terlalu pendek" + NEW_PASSWORD_WEAK: "Password terlalu mudah" + NEW_PASSWORD_FORBIDDENT: "Password mengandung karakter terlarang" + CONTACTS_SYNC_ERROR: "Singkronisasi kontak error" + CANT_GET_MESSAGE_LIST: "Tidak bisa mengambil daftar pesan" + CANT_GET_MESSAGE: "Tidak bisa mengambil pesan" + CANT_DELETE_MESSAGE: "Tidak bisa menghapus pesan" + CANT_MOVE_MESSAGE: "Tidak bisa memindahkan pesan" + CANT_SAVE_MESSAGE: "Tidak bisa menyimpan pesan" + CANT_SEND_MESSAGE: "Tidak bisa mengirim pesan" + INVALID_RECIPIENTS: "Penerima tidak sah" + CANT_SAVE_FILTERS: "Tidak bisa menyimpan filter" + CANT_GET_FILTERS: "Tidak bisa mengambil filter" + FILTERS_ARE_NOT_CORRECT: "Filter tidak benar" + CANT_CREATE_FOLDER: "Tidak bisa membuat folder" + CANT_RENAME_FOLDER: "Tidak bisa mengubah nama folder" + CANT_DELETE_FOLDER: "Tidak bisa menghapus folder" + CANT_DELETE_NON_EMPTY_FOLDER: "Tidak bisa menghapus direktori yang berisi" + CANT_SUBSCRIBE_FOLDER: "Tidak bisa mengaitkan folder" + CANT_UNSUBSCRIBE_FOLDER: "Tidak bisa memutuskan folder" + CANT_SAVE_SETTINGS: "Tidak bisa menyimpan pengaturan" + CANT_SAVE_PLUGIN_SETTINGS: "Tidak bisa menyimpan pengaturan" + DOMAIN_ALREADY_EXISTS: "Domain sudah ada" + CANT_INSTALL_PACKAGE: "Gagal memasang paket" + CANT_DELETE_PACKAGE: "Gagal menghapus paket" + INVALID_PLUGIN_PACKAGE: "Paket plugin tidak sah" + UNSUPPORTED_PLUGIN_PACKAGE: "Paket plugin tidak didukung" + LICENSING_SERVER_IS_UNAVAILABLE: "Server berlangganan tidak tersedia" + LICENSING_DOMAIN_EXPIRED: "Berlangganan untuk domain ini telah habis." + LICENSING_DOMAIN_BANNED: "Berlangganan untuk domain ini ditolak." + DEMO_SEND_MESSAGE_ERROR: "Untuk alasan keamanan, akun ini tidak diizinkan untuk mengirim pesan ke alamat e-mail eksternal!" + DEMO_ACCOUNT_ERROR: "Untuk alasan keamanan, akun ini tidak diizinkan melakukan aksi ini!" + ACCOUNT_ALREADY_EXISTS: "Akun telah ada" + ACCOUNT_DOES_NOT_EXIST: "Akun tidak ada" + MAIL_SERVER_ERROR: "Terjadi kesalahan saat mengakses mail server" + INVALID_INPUT_ARGUMENT: "Argumen input tidak sah" + UNKNOWN_ERROR: "Kesalahan tidak diketahui" + STATIC: + BACK_LINK: "Muat ulang" + DOMAIN_LIST_DESC: "Daftar domain yang diizinkan untuk diakses." + PHP_EXSTENSIONS_ERROR_DESC: "Ekstensi PHP yang diperlukan tidak tersedia dalam konfigurasi PHP anda!" + PHP_VERSION_ERROR_DESC: "Versi PHP anda (%VERSION%) lebih rendah dari syarat minimal 5.3.0!" + NO_SCRIPT_TITLE: "Javascript diperlukan oleh aplikasi ini." + NO_SCRIPT_DESC: | + Dukungan Javascript tidak tersedia pada browser anda + Aktifkan Javascript pada pengaturan browser kemudian coba lagi. + NO_COOKIE_TITLE: "Dukungan Cookie diperlukan oleh aplikasi ini." + NO_COOKIE_DESC: | + Dukungan Cookie tidak tersedia pada browser anda + Aktifkan Cookie pada pengaturan browser kemudian coba lagi + BAD_BROWSER_TITLE: "Browser anda kadaluarsa." + BAD_BROWSER_DESC: | + Untuk bisa menggunakan seluruh fitur aplikasi, + download dan install salah satu browser berikut. diff --git a/rainloop/v/0.0.0/app/localization/admin/ja_JP.yml b/rainloop/v/0.0.0/app/localization/admin/ja_JP.yml index 640e92855..113c93ca6 100644 --- a/rainloop/v/0.0.0/app/localization/admin/ja_JP.yml +++ b/rainloop/v/0.0.0/app/localization/admin/ja_JP.yml @@ -34,6 +34,7 @@ ja_JP: LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "追加のアカウントを使用する" LABEL_ALLOW_IDENTITIES: "複数の表示名を使用する" LABEL_ALLOW_TEMPLATES: "テンプレートを許可する" + ALERT_DATA_ACCESS: "RainLoop のデータフォルダがアクセス可能になっています。外部から RainLoop のデータフォルダにアクセスできないよう、Web サーバーを設定してください。詳しくは以下をご覧ください:" ALERT_WARNING: "警告!" HTML_ALERT_WEAK_PASSWORD: | デフォルトの管理者パスワードを使用しています。 diff --git a/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml b/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml index 970aa02e6..5ddaee1b6 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml @@ -149,13 +149,14 @@ cs_CZ: PGP_ENCRYPTED_MESSAGE_DESC: "Zpráva šifrovaná OpenPGP (klikněte pro dešifraci)" LINK_DOWNLOAD_AS_ZIP: "Stáhnout jako zip" LINK_SAVE_TO_OWNCLOUD: "Uložit do ownCloud" + LINK_SAVE_TO_CLOUD: "Uložit do Cloudu" LINK_SAVE_TO_DROPBOX: "Uložit do Dropbox" READ_RECEIPT: SUBJECT: "Potvrzení o zobrazení zprávy - %SUBJECT%" BODY: | Toto je potrvzení o zaslání emailu na adresu %READ-RECEIPT%. - Poznámka: Toto potvrzení zajištujě, že zpráva byla zobrazena v poštovní schrnánce příjemce. Nezajišťuje, že ji příjemce čelt a rozuměl jí. + Poznámka: Toto potvrzení zajišťuje, že zpráva byla zobrazena v poštovní schránce příjemce. Nezajišťuje, že ji příjemce četl a rozuměl jí. SUGGESTIONS: SEARCHING_DESC: "Hledám..." CONTACTS: diff --git a/rainloop/v/0.0.0/app/localization/webmail/id_ID.yml b/rainloop/v/0.0.0/app/localization/webmail/id_ID.yml index 2b4c31886..dc0c23346 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/id_ID.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/id_ID.yml @@ -701,13 +701,13 @@ id_ID: PHP_VERSION_ERROR_DESC: "Versi PHP anda (%VERSION%) lebih rendah dari syarat minimal yaitu 5.3.0!" NO_SCRIPT_TITLE: "JavaScript diperlukan oleh aplikasi ini." NO_SCRIPT_DESC: | - Dukungan Javascript tidak tersedia di peramban anda + Dukungan Javascript tidak tersedia di browser anda Silahkan aktifkan dukungan Javascript di pengaturan peramban anda dan coba lagi. NO_COOKIE_TITLE: "Dukurangan Cookies diperlukan oleh aplikasi ini." NO_COOKIE_DESC: | Dukungan cookies tidak tersedia di peramban anda. - Silahkan aktifkan dukungan Cookies di pengaturan peramban dan coba lagi. - BAD_BROWSER_TITLE: "Peramban anda kadaluarsa." + Silahkan aktifkan dukungan Cookies di pengaturan browser dan coba lagi. + BAD_BROWSER_TITLE: "Browser anda kadaluarsa." BAD_BROWSER_DESC: | Untuk bisa menggunakan semua fitur aplikasi, - unduh dan pasang salah satu peramban berikut: + unduh dan pasang salah satu browser berikut: diff --git a/rainloop/v/0.0.0/app/localization/webmail/is_IS.yml b/rainloop/v/0.0.0/app/localization/webmail/is_IS.yml index ce8e24f5d..0ded9715c 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/is_IS.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/is_IS.yml @@ -1,12 +1,12 @@ is_IS: LOGIN: - LABEL_EMAIL: "Netfang" - LABEL_LOGIN: "Innskrá" + LABEL_EMAIL: "Tölvupóstfang" + LABEL_LOGIN: "Innskráning" LABEL_PASSWORD: "Lykilorð" LABEL_SIGN_ME: "Muna" LABEL_VERIFICATION_CODE: "Sannvottunarkóði" LABEL_DONT_ASK_VERIFICATION_CODE: "Ekki spyrja um kóðann næstu 2 vikur" - BUTTON_SIGN_IN: "Innskrá" + BUTTON_SIGN_IN: "Skrá inn" TITLE_SIGN_IN_GOOGLE: "Innskráning með Google" TITLE_SIGN_IN_FACEBOOK: "Innskráning með Facebook" TITLE_SIGN_IN_TWITTER: "Innskráning með Twitter" @@ -19,7 +19,7 @@ is_IS: BUTTON_LOGOUT: "Útskrá" MOBILE: BUTTON_MOBILE_VERSION: "Farsímaútgáfa" - BUTTON_DESKTOP_VERSION: "Skjáborðsútgáfa" + BUTTON_DESKTOP_VERSION: "Vinnutölvuútgáfa" SEARCH: MAIN_INPUT_PLACEHOLDER: "Leita" TITLE_ADV: "Ítarleg leit" @@ -42,7 +42,7 @@ is_IS: BUTTON_ADV_SEARCH: "Leita" PREVIEW_POPUP: FULLSCREEN: "Víxla heilskjá af/á" - ZOOM: "Aðdráttir að/frá" + ZOOM: "Aðdráttur að/frá" CLOSE: "Loka (Esc)" LOADING: "Hleð..." GALLERY_PREV: "Fyrra (vinstri örvarhnappur)" @@ -70,7 +70,7 @@ is_IS: BUTTON_SPAM: "Ruslpóstur" BUTTON_NOT_SPAM: "Ekki ruslpóstur" BUTTON_EMPTY_FOLDER: "Hreinsa möppu" - BUTTON_MULTY_FORWARD: "Áframsenda skilaboð" + BUTTON_MULTY_FORWARD: "Áframsenda sem viðhengi" BUTTON_DELETE_WITHOUT_MOVE: "Eyða endanlega" BUTTON_MORE: "Meira" MENU_SET_SEEN: "Merkja lesið" @@ -95,7 +95,7 @@ is_IS: TODAY_AT: "í dag kl. %TIME%" YESTERDAY_AT: "í gær kl. %TIME%" SEARCH_PLACEHOLDER: "Leita" - NEW_MESSAGE_NOTIFICATION: "Þú átt %COUNT% ný bréf!" + NEW_MESSAGE_NOTIFICATION: "Þú átt %COUNT% ný skilaboð!" QUOTA_SIZE: "Notar %SIZE% (%PROC%%) af %LIMIT%" MESSAGE: BUTTON_EDIT: "Breyta" @@ -120,13 +120,13 @@ is_IS: BUTTON_THREAD_PREV: "Fyrra" BUTTON_THREAD_NEXT: "Næsta" BUTTON_THREAD_MORE: "Fleiri skilaboð" - MENU_HEADERS: "Sýna bréfahausa" + MENU_HEADERS: "Sýna skilaboðahausa" MENU_VIEW_ORIGINAL: "Sýna upprunalegt" - MENU_DOWNLOAD_ORIGINAL: "Niðurhala sem .eml skrá" - MENU_FILTER_SIMILAR: "Sía skilaboð eins og þetta" + MENU_DOWNLOAD_ORIGINAL: "Sækja sem .eml skrá" + MENU_FILTER_SIMILAR: "Sía skilaboð eins og þessi" MENU_PRINT: "Prenta" - EMPTY_SUBJECT_TEXT: "(Ekkert viðhengi)" - LABEL_SUBJECT: "Viðhengi" + EMPTY_SUBJECT_TEXT: "(Ekkert viðfangsefni)" + LABEL_SUBJECT: "Viðfangsefni" LABEL_DATE: "Dagsetning" LABEL_FROM: "Frá" LABEL_FROM_SHORT: "frá" @@ -134,22 +134,24 @@ is_IS: LABEL_TO_SHORT: "til" LABEL_CC: "CC" LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Svara á" + LABEL_REPLY_TO: "Svara-til" PRINT_LABEL_FROM: "Frá" PRINT_LABEL_TO: "Til" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Svara á" + PRINT_LABEL_REPLY_TO: "Svara-til" PRINT_LABEL_DATE: "Dagsetning" - PRINT_LABEL_SUBJECT: "Viðhengi" + PRINT_LABEL_SUBJECT: "Viðfangsefni" PRINT_LABEL_ATTACHMENTS: "Viðhengi" MESSAGE_LOADING: "Hleð" - MESSAGE_VIEW_DESC: "Veldu bréf úr listanum til að skoða hér." + MESSAGE_VIEW_DESC: "Veldu skilaboð úr listanum til að skoða hér." + MESSAGE_VIEW_MOVE_DESC: "Smelltu á heiti möppu á spjaldinu til vinstri til að velja áfangastaðinn." PGP_PASSWORD_INPUT_PLACEHOLDER: "Lykilorð" PGP_SIGNED_MESSAGE_DESC: "Skeyti undirritað með OpenPGP (smelltu til að sannvotta)" PGP_ENCRYPTED_MESSAGE_DESC: "Skeyti dulritað með OpenPGP (smelltu til að afkóða)" LINK_DOWNLOAD_AS_ZIP: "Sækja sem .zip skrá" LINK_SAVE_TO_OWNCLOUD: "Vista í ownCloud" + LINK_SAVE_TO_CLOUD: "Vista í tölvuský" LINK_SAVE_TO_DROPBOX: "Vista í Dropbox" READ_RECEIPT: SUBJECT: "Móttökukvittun (birt) - %SUBJECT%" @@ -206,8 +208,8 @@ is_IS: TITLE_TO: "Til" TITLE_CC: "CC" TITLE_BCC: "BCC" - TITLE_REPLY_TO: "Svara á" - TITLE_SUBJECT: "Viðhengi" + TITLE_REPLY_TO: "Svara-til" + TITLE_SUBJECT: "Viðfangsefni" LINK_SHOW_INPUTS: "sýna alla reiti" BUTTON_SEND: "Senda" BUTTON_SAVE: "Vista" @@ -258,10 +260,11 @@ is_IS: BUTTON_UPDATE_IDENTITY: "Uppfæra" LABEL_EMAIL: "Tölvupóstfang" LABEL_NAME: "Nafn" - LABEL_REPLY_TO: "Svara á" + LABEL_REPLY_TO: "Svara-til" LABEL_SIGNATURE: "Undirskrift" LABEL_CC: "Cc" LABEL_BCC: "Bcc" + LABEL_SIGNATURE_INSERT_BEFORE: "Setja þessa undirskrift inn á undan tilvitnuðum texta þegar verið er að svara" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Búa til möppu?" LABEL_NAME: "Nafn á möppu" @@ -271,12 +274,12 @@ is_IS: BUTTON_CLOSE: "Loka" TITLE_CREATING_PROCESS: "Bý til möppu" POPUPS_CLEAR_FOLDER: - TITLE_CLEAR_FOLDER: "Fjarlægja öll bréf úr þessari möppu?" + TITLE_CLEAR_FOLDER: "Fjarlægja öll skilaboð úr þessari möppu?" BUTTON_CLEAR: "Hreinsa" BUTTON_CANCEL: "Hætta við" BUTTON_CLOSE: "Loka" DANGER_DESC_WARNING: "Aðvörun!" - DANGER_DESC_HTML_1: "Þessi aðgerð veldur því að öll bréf úr %FOLDER% möppunni." + DANGER_DESC_HTML_1: "Þessi aðgerð veldur því að öll skilaboð úr %FOLDER% möppunni verða fjarlægð." DANGER_DESC_HTML_2: "Það er ekki hægt að hætta við aðgerðina eftir að búið er að keyra hana." TITLE_CLEARING_PROCESS: "Tæmi möppu..." POPUPS_IMPORT_OPEN_PGP_KEY: @@ -322,7 +325,7 @@ is_IS: SELECT_ACTION_MOVE_TO: "Færa í" SELECT_ACTION_FORWARD_TO: "Áframsenda til" SELECT_ACTION_REJECT: "Hafna" - SELECT_ACTION_VACATION_MESSAGE: "Skilaboð vegna frís" + SELECT_ACTION_VACATION_MESSAGE: "Skilaboð vegna fría" SELECT_ACTION_DISCARD: "Henda" SELECT_FIELD_FROM: "Frá" SELECT_FIELD_RECIPIENTS: "Viðtakendur (Til eða CC)" @@ -342,6 +345,7 @@ is_IS: SELECT_MATCH_ANY: "Samsvarar EINHVERRI af eftirfarandi reglum" SELECT_MATCH_ALL: "Samsvarar ÖLLUM eftirfarandi reglum" MARK_AS_READ_LABEL: "Merkja sem lesið" + REPLY_INTERVAL_LABEL: "Bil milli svara (dagar)" KEEP_LABEL: "Halda" STOP_LABEL: "Ekki hætta að vinna með reglur" EMAIL_LABEL: "Tölvupóstfang" @@ -358,48 +362,50 @@ is_IS: LABEL_DRAFTS: "Drög" LABEL_SPAM: "Ruslpóstur" LABEL_TRASH: "Ruslafata" - LABEL_ARCHIVE: "Safnskrá" + LABEL_ARCHIVE: "Safn" BUTTON_CANCEL: "Hætta við" BUTTON_CLOSE: "Loka" NOTIFICATION_SENT: | - Þú hefur ekki valið kerfismöppuna "Sent" fyrir bréf eftir sendingu. - Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". - NOTIFICATION_DRAFTS: "Þú hefur ekki valið kerfismöppuna \"Drög\" þar sem bréf sem eru vistuð í á meðan þú skrifar." + Þú hefur ekki valið kerfismöppuna "Sent" fyrir skilaboð eftir sendingu. + Ef þú vilt ekki vista send skilaboð, veldu þá valkostinn "Ekki nota". + NOTIFICATION_DRAFTS: "Þú hefur ekki valið kerfismöppuna \"Drög\" þar sem skilaboð sem eru vistuð í á meðan þú skrifar." NOTIFICATION_SPAM: | Þú hefur ekki valið kerfismöppuna "Ruslpóstur" sem ruslsendingar eru settar í. - Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". + Ef þú vilt fjarlægja skilaboðin endanlega, veldu þá valkostinn "Ekki nota". NOTIFICATION_TRASH: | - Þú hefur ekki valið kerfismöppuna "Ruslafata" sem eydd bréf eru sett í. - Ef þú vilt fjarlægja bréfið endanlega, veldu þá valkostinn "Ekki nota". - NOTIFICATION_ARCHIVE: "Þú hefur ekki valið kerfismöppuna \"Safnskrá\" undir bréf sem á að geyma til langs tíma." + Þú hefur ekki valið kerfismöppuna "Ruslafata" sem eydd skilaboð eru sett í. + Ef þú vilt fjarlægja skilaboðin endanlega, veldu þá valkostinn "Ekki nota". + NOTIFICATION_ARCHIVE: "Þú hefur ekki valið kerfismöppuna \"Safnskrá\" undir skilaboð sem á að geyma til langs tíma." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-þrepa sannvottun (TOTP)" LABEL_ENABLE_TWO_FACTOR: "Virkja 2-þrepa sannvottun" LABEL_TWO_FACTOR_USER: "Notandi" LABEL_TWO_FACTOR_STATUS: "Staða" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Create New Secret" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" - BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" - TWO_FACTOR_SECRET_DESC: >- - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: >- - If you can't receive codes via Google Authenticator, you can use backup codes - to sign in. After you’ve used a backup code to sign in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + LABEL_TWO_FACTOR_SECRET: "Leynikóði" + LABEL_TWO_FACTOR_BACKUP_CODES: "Öryggiskóðar" + BUTTON_CREATE: "Búa til leynikóða" + BUTTON_ACTIVATE: "Virkja" + BUTTON_CLEAR: "Hreinsa" + BUTTON_LOGOUT: "Útskráning" + BUTTON_DONE: "Lokið" + BUTTON_TEST: "Prófa" + LINK_TEST: "prófa" + BUTTON_SHOW_SECRET: "Sýna leynikóða" + BUTTON_HIDE_SECRET: "Fela leynikóða" + TWO_FACTOR_REQUIRE_DESC: "Aðgangurinn þinn krefst uppsetningar á 2-þrepa auðkenningu." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Stillt" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Ekki stillt" + TWO_FACTOR_SECRET_DESC: > + Flyttu þessar upplýsingar inn í Google Authenticator forritið (eða annað TOTP-forrit) + með því að nota QR-kóðann hér fyrir neðan eða með því að skrifa kóðann inn. + TWO_FACTOR_BACKUP_CODES_DESC: > + Ef þú getur ekki tekið við kóðum með Google Authenticator forritinu (eða öðru + TOTP-forriti), geturðu notað öryggiskóða til að skrá þig inn. Eftir að þú + hefur notað öryggiskóða til að skrá þig inn, verður hann óvirkur. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Þú getur ekki breytt þessari stillingu fyrir prófun." TITLES: - LOADING: "Hleð" - LOGIN: "Innskrá" + LOADING: "Hleð inn" + LOGIN: "Innskráning" MAILBOX: "Pósthólf" SETTINGS: "Stillingar" COMPOSE: "Semja" @@ -407,103 +413,103 @@ is_IS: ERROR_FILE_IS_TOO_BIG: "Skráin er of stór" ERROR_FILE_PARTIALLY_UPLOADED: "Innsending á skrá heppnaðist ekki vegna óþekktrar villu" ERROR_NO_FILE_UPLOADED: "Engin skrá send inn" - ERROR_MISSING_TEMP_FOLDER: "Tímabundna skráin er ekki til staðar" - ERROR_ON_SAVING_FILE: "Óþekkt innsendingar villa kom upp" - ERROR_FILE_TYPE: "Röng skráar tegund" - ERROR_UNKNOWN: "Óþekkt innsendingar villa kom upp" + ERROR_MISSING_TEMP_FOLDER: "Bráðabirgðaskráin er ekki til staðar" + ERROR_ON_SAVING_FILE: "Óþekkt innsendingarvilla kom upp" + ERROR_FILE_TYPE: "Röng skráartegund" + ERROR_UNKNOWN: "Óþekkt innsendingarvilla kom upp" EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXTI" - TEXT_SWITCHER_RICH_FORMATTING: "Rich forsnið" - TEXT_SWITCHER_CONFIRM: "Texta forsnið og myndir munu týnast. Ertu viss um að þú viljir halda áfram?" + TEXT_SWITCHER_RICH_FORMATTING: "Ríkuleg textasnið" + TEXT_SWITCHER_CONFIRM: "Snið á texta og myndir munu tapast. Ertu viss um að þú viljir halda áfram?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Persónulegt" LABEL_GENERAL_NAME: "Almennt" - LABEL_CONTACTS_NAME: "Contacts" + LABEL_CONTACTS_NAME: "Tengiliðir" LABEL_FOLDERS_NAME: "Möppur" LABEL_ACCOUNTS_NAME: "Aðgangar" - LABEL_IDENTITY_NAME: "Identity" - LABEL_IDENTITIES_NAME: "Identities" - LABEL_FILTERS_NAME: "Filters" - LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Security" - LABEL_SOCIAL_NAME: "Social" - LABEL_THEMES_NAME: "Þemur" + LABEL_IDENTITY_NAME: "Auðkenni" + LABEL_IDENTITIES_NAME: "Auðkenni" + LABEL_FILTERS_NAME: "Síur" + LABEL_TEMPLATES_NAME: "Sniðmát" + LABEL_SECURITY_NAME: "Öryggi" + LABEL_SOCIAL_NAME: "Samfélagsmiðlar" + LABEL_THEMES_NAME: "Þemu" LABEL_CHANGE_PASSWORD_NAME: "Lykilorð" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Til baka" SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" - SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" - SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" - SUBNAME_REJECT: "Reject" - SUBNAME_VACATION_MESSAGE: "Vacation message" - SUBNAME_DISCARD: "Discard" - CAPABILITY_LABEL: "Capability" - LOADING_PROCESS: "Updating filter list" - DELETING_ASK: "Are you sure?" - CHACHES_NEED_TO_BE_SAVED_DESC: "These changes need to be saved to the server." + LEGEND_FILTERS: "Síur" + BUTTON_SAVE: "Vista" + BUTTON_ADD_FILTER: "Bæta við síu" + BUTTON_DELETE: "Eyða" + BUTTON_RAW_SCRIPT: "Nota sérsniðna notandaskriftu" + SUBNAME_NONE: "Ekkert" + SUBNAME_MOVE_TO: "Færa í \"%FOLDER%\"" + SUBNAME_FORWARD_TO: "Áframsenda til \"%EMAIL%\"" + SUBNAME_REJECT: "Hafna" + SUBNAME_VACATION_MESSAGE: "Skilaboð vegna fría" + SUBNAME_DISCARD: "Henda" + CAPABILITY_LABEL: "Geta" + LOADING_PROCESS: "Uppfæri síulista" + DELETING_ASK: "Ertu viss?" + CHACHES_NEED_TO_BE_SAVED_DESC: "Það þarf að vista þessar breytingar á þjóninum." SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identity" + LEGEND_IDENTITY: "Auðkenni" LABEL_DISPLAY_NAME: "Nafn" - LABEL_REPLY_TO: "Svara" + LABEL_REPLY_TO: "Svara-til" LABEL_SIGNATURE: "Undirskrift" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" + LABEL_ADD_SIGNATURE_TO_ALL: "Bættu undirskrift við öll útsend skilaboð" SETTINGS_SECURITY: - LEGEND_SECURITY: "Security" + LEGEND_SECURITY: "Öryggi" LABEL_CONFIGURE_TWO_FACTOR: "Stilla 2-þrepa sannvottun" - LABEL_AUTOLOGOUT: "Auto Logout" - AUTOLOGIN_NEVER_OPTION_NAME: "Never" - AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minute(s)" + LABEL_AUTOLOGOUT: "Sjálfvirk útskráning" + AUTOLOGIN_NEVER_OPTION_NAME: "Aldrei" + AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% mínútu(r)" AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% klukkustund(ir)" SETTINGS_GENERAL: LEGEND_GENERAL: "Almennt" LABEL_LANGUAGE: "Tungumál" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" - LABEL_LAYOUT_NO_SPLIT: "No Split" - LABEL_LAYOUT_VERTICAL_SPLIT: "Vertical Split" - LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontal Split" + LABEL_IDENTITY: "Auðkenni" + LABEL_LAYOUT: "Framsetning" + LABEL_LAYOUT_NO_SPLIT: "Ekki klofið" + LABEL_LAYOUT_VERTICAL_SPLIT: "Klofið lóðrétt" + LABEL_LAYOUT_HORIZONTAL_SPLIT: "Klofið lárétt" LABEL_EDITOR: "Sjálfgefinn textaritill" - LABEL_EDITOR_HTML: "Html" - LABEL_EDITOR_PLAIN: "Venjulegur" - LABEL_EDITOR_HTML_FORCED: "Html (forced)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (forced)" - LABEL_ANIMATION: "Interface animation" + LABEL_EDITOR_HTML: "HTML" + LABEL_EDITOR_PLAIN: "Venjulegt" + LABEL_EDITOR_HTML_FORCED: "HTML (þvingað)" + LABEL_EDITOR_PLAIN_FORCED: "Einfalt (þvingað)" + LABEL_ANIMATION: "Hreyfingar í viðmóti" LABEL_ANIMATION_FULL: "Full" - LABEL_ANIMATION_NORMAL: "Normal" - LABEL_ANIMATION_NONE: "None" - LABEL_VIEW_OPTIONS: "Sýni valmöguleikar" + LABEL_ANIMATION_NORMAL: "Venjulegt" + LABEL_ANIMATION_NONE: "Ekkert" + LABEL_VIEW_OPTIONS: "Valkostir skoðunar" LABEL_USE_PREVIEW_PANE: "Nota forskoðunarham" LABEL_USE_CHECKBOXES_IN_LIST: "Sýna valkassa í listanum" LABEL_USE_THREADS: "Nota þræði" - LABEL_REPLY_SAME_FOLDER: "Setja svör í möppu þar sem bréfið sem er verið að svara" - LABEL_SHOW_IMAGES: "Sýna ávallt myndir í bréfum" + LABEL_REPLY_SAME_FOLDER: "Setja svör í möppu skilaboðanna sem er verið að svara" + LABEL_SHOW_IMAGES: "Sýna ávallt myndir í skilaboðum" LABEL_SHOW_ANIMATION: "Sýna hreyfingar" - LABEL_MESSAGE_PER_PAGE: "Bréf á síðu" + LABEL_MESSAGE_PER_PAGE: "Skilaboð á síðu" LABEL_NOTIFICATIONS: "Tilkynningar" - LABEL_SOUND_NOTIFICATION: "Sound notification" - LABEL_CHROME_NOTIFICATION_DESC: "Sýna tilkynningarglugga fyrir ný bréf" + LABEL_SOUND_NOTIFICATION: "Tilkynningarhljóð" + LABEL_CHROME_NOTIFICATION_DESC: "Sýna tilkynningarglugga fyrir ný skilaboð" LABEL_CHROME_NOTIFICATION_DESC_DENIED: "(Lokað af vafra)" SETTINGS_CONTACTS: - LEGEND_CONTACTS: "Contacts" - LABEL_CONTACTS_AUTOSAVE: "Automatically add recipients to your address book" - LEGEND_CONTACTS_SYNC: "Remote Synchronization (CardDAV)" - LABEL_CONTACTS_SYNC_ENABLE: "Enable remote synchronization" - LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" - LABEL_CONTACTS_SYNC_USER: "User" - LABEL_CONTACTS_SYNC_PASSWORD: "Password" + LEGEND_CONTACTS: "Tengiliðir" + LABEL_CONTACTS_AUTOSAVE: "Bæta viðtakendum sjálfkrafa í nafnaskrá" + LEGEND_CONTACTS_SYNC: "Fjartengd samstilling (CardDAV)" + LABEL_CONTACTS_SYNC_ENABLE: "Virkja fjartengda samstillingu" + LABEL_CONTACTS_SYNC_SERVER: "Þjónn" + LABEL_CONTACTS_SYNC_AB_URL: "Slóð á nafnaskrá" + LABEL_CONTACTS_SYNC_USER: "Notandi" + LABEL_CONTACTS_SYNC_PASSWORD: "Lykilorð" SETTINGS_THEMES: - LEGEND_THEMES: "Þemur" - LEGEND_THEMES_CUSTOM: "Sérsniðin þemu stilling" + LEGEND_THEMES: "Þemu" + LEGEND_THEMES_CUSTOM: "Sérsniðin þemastilling" LABEL_CUSTOM_TYPE: "Tegund" - LABEL_CUSTOM_TYPE_LIGHT: "Ljós" - LABEL_CUSTOM_TYPE_DARK: "Dökk" + LABEL_CUSTOM_TYPE_LIGHT: "Ljóst" + LABEL_CUSTOM_TYPE_DARK: "Dökkt" LABEL_CUSTOM_BACKGROUND_IMAGE: "Bakgrunnur" BUTTON_UPLOAD_BACKGROUND_IMAGE: "Senda inn bakgrunnsmynd (JPG, PNG)" ERROR_FILE_IS_TOO_BIG: "Skrá er of stór" @@ -529,141 +535,145 @@ is_IS: BUTTON_DELETE: "Eyða" BUTTON_SUBSCRIBE: "Áskrift" BUTTON_UNSUBSCRIBE: "Afskrá" - LOADING_PROCESS: "Uppfæri möppu lista" + LOADING_PROCESS: "Uppfæri möppulista" CREATING_PROCESS: "Bý til möppu" DELETING_PROCESS: "Eyði möppu" RENAMING_PROCESS: "Endurnefna möppu" DELETING_ASK: "Ertu viss?" - TO_MANY_FOLDERS_DESC_1: "You have too many folders!" - TO_MANY_FOLDERS_DESC_2: "We have shown only a part of them, to avoid performance problems." - HELP_DELETE_FOLDER: "Delete folder" - HELP_SHOW_HIDE_FOLDER: "Show/hide folder" - HELP_CHECK_FOR_NEW_MESSAGES: "Check/don't check for new messages" + TO_MANY_FOLDERS_DESC_1: "Þú ert með allt of margar möppur!" + TO_MANY_FOLDERS_DESC_2: "Við höfum birt aðeins hluta þeirra, til að koma í veg fyrir vandamál með afköst." + HELP_DELETE_FOLDER: "Eyða möppu" + HELP_SHOW_HIDE_FOLDER: "Birta/fela möppu" + HELP_CHECK_FOR_NEW_MESSAGES: "Athuga/ekki athuga með ný skilaboð" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Aðgangslisti" - LEGEND_IDENTITIES: "Identities" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Accounts and Identities" + LEGEND_IDENTITIES: "Auðkenni" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Aðgangar og auðkenni" BUTTON_ADD_ACCOUNT: "Bæta við aðgangi" - BUTTON_ADD_IDENTITY: "Add an Identity" + BUTTON_ADD_IDENTITY: "Bæta við auðkenni" BUTTON_DELETE: "Eyða" LOADING_PROCESS: "Uppfæri aðgangslista" DELETING_ASK: "Ertu viss?" - DEFAULT_IDENTITY_LABEL: "default" + DEFAULT_IDENTITY_LABEL: "sjálfgefið" SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identity" - LEGEND_IDENTITIES: "Additional Identities" - LABEL_DEFAULT: "Default" + LEGEND_IDENTITY: "Auðkenni" + LEGEND_IDENTITIES: "Viðbótarauðkenni" + LABEL_DEFAULT: "Sjálfgefið" LABEL_DISPLAY_NAME: "Nafn" - LABEL_REPLY_TO: "Svara" + LABEL_REPLY_TO: "Svara-til" LABEL_SIGNATURE: "Undirskrift" - LABEL_ADD_SIGNATURE_TO_ALL: "Add your signature to all the outgoing messages" - BUTTON_ADD_IDENTITY: "Add Identity" - BUTTON_DELETE: "Delete" - LOADING_PROCESS: "Updating identity list" - DELETING_ASK: "Are you sure?" + LABEL_ADD_SIGNATURE_TO_ALL: "Bættu undirskrift við öll útsend skilaboð" + BUTTON_ADD_IDENTITY: "Bæta við auðkenni" + BUTTON_DELETE: "Eyða" + LOADING_PROCESS: "Uppfæri auðkennalista" + DELETING_ASK: "Ertu viss?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Breyta lykilorði" LABEL_CURRENT_PASSWORD: "Núverandi lykilorð" LABEL_NEW_PASSWORD: "Nýtt lykilorð" LABEL_REPEAT_PASSWORD: "Nýtt lykilorð aftur" BUTTON_UPDATE_PASSWORD: "Setja nýtt lykilorð" - ERROR_PASSWORD_MISMATCH: "Passwords do not match, please try again" + ERROR_PASSWORD_MISMATCH: "Lykilorðin stemma ekki, reyndu aftur" SETTINGS_OPEN_PGP: LEGEND_OPEN_PGP: "OpenPGP" - BUTTON_ADD_OPEN_PGP_KEY: "Import OpenPGP Key" - BUTTON_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP Keys" - TITLE_PRIVATE: "Private" - TITLE_PUBLIC: "Public" - DELETING_ASK: "Are you sure?" - GENERATE_ONLY_HTTPS: "HTTPS only" + BUTTON_ADD_OPEN_PGP_KEY: "Flytja inn OpenPGP-lykil" + BUTTON_GENERATE_OPEN_PGP_KEYS: "Búa til OpenPGP-lykla" + TITLE_PRIVATE: "Einkalykill" + TITLE_PUBLIC: "Dreifilykill" + DELETING_ASK: "Ertu viss?" + GENERATE_ONLY_HTTPS: "Einungis HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Vista drög sjálfkrafa" SHORTCUTS_HELP: - LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" - TAB_MAILBOX: "Mailbox" - TAB_MESSAGE_LIST: "Message list" - TAB_MESSAGE_VIEW: "Message view" - TAB_COMPOSE: "Compose" - LABEL_OPEN_USER_DROPDOWN: "Open user dropdown" - LABEL_REPLY: "Reply" - LABEL_REPLY_ALL: "Reply All" - LABEL_FORWARD: "Forward" - LABEL_FORWARD_MULTIPLY: "Forward (multiply)" - LABEL_HELP: "Help" - LABEL_CHECK_ALL: "Select all messages" - LABEL_ARCHIVE: "Archive" - LABEL_DELETE: "Delete" - LABEL_OPEN_THREAD: "Open selected thread" - LABEL_MOVE: "Move" - LABEL_READ: "Read selected messages" - LABEL_UNREAD: "Unread selected messages" + LEGEND_SHORTCUTS_HELP: "Hjálp fyrir flýtilykla" + TAB_MAILBOX: "Pósthólf" + TAB_MESSAGE_LIST: "Skilaboðalisti" + TAB_MESSAGE_VIEW: "Skilaboðasýn" + TAB_COMPOSE: "Semja" + LABEL_OPEN_USER_DROPDOWN: "Opna fellilista notenda" + LABEL_REPLY: "Svara" + LABEL_REPLY_ALL: "Svara öllum" + LABEL_FORWARD: "Áframsenda" + LABEL_FORWARD_MULTIPLY: "Áframsenda sem viðhengi" + LABEL_HELP: "Hjálp" + LABEL_CHECK_ALL: "Velja öll skilaboð" + LABEL_ARCHIVE: "Setja í safn" + LABEL_DELETE: "Eyða" + LABEL_OPEN_THREAD: "Opna valinn þráð" + LABEL_MOVE: "Færa" + LABEL_READ: "Lesa valin skilaboð" + LABEL_UNREAD: "Gera valin skilaboð ólesin" LABEL_IMPORTANT: "Mikilvægt, flagga valin skeyti" - LABEL_SEARCH: "Search" - LABEL_CANCEL_SEARCH: "Cancel search" - LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" - LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" - LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" - LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" - LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" - LABEL_PRINT: "Print" - LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" - LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" - LABEL_SWITCH_TO_LIST: "Switch focus back to message list" - LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" - LABEL_SAVE_MESSAGE: "Save message" - LABEL_SEND_MESSAGE: "Send message" - LABEL_CLOSE_COMPOSE: "Close compose" + LABEL_SEARCH: "Leita" + LABEL_CANCEL_SEARCH: "Hætta við leit" + LABEL_FULLSCREEN_ENTER: "Á öllum skjánum (með forskoðunarspjaldi)" + LABEL_VIEW_MESSAGE_ENTER: "Skoða skilaboð (ekkert forskoðunarspjald)" + LABEL_SWITCH_TO_MESSAGE: "Skipta virkni á valin skilaboð" + LABEL_SWITCH_TO_FOLDER_LIST: "Skipta virkni á möppulista" + LABEL_FULLSCREEN_TOGGLE: "Víxla heilskjá af/á" + LABEL_BLOCKQUOTES_TOGGLE: "Víxla inndregnum tilvitnunum skilaboða af/á" + LABEL_THREAD_NEXT: "Næstu skilaboð í þræði" + LABEL_THREAD_PREV: "Fyrri skilaboð í þræði" + LABEL_PRINT: "Prenta" + LABEL_EXIT_FULLSCREEN: "Fara úr fullum skjá" + LABEL_CLOSE_MESSAGE: "Loka skilaboðum (ekkert forskoðunarspjald)" + LABEL_SWITCH_TO_LIST: "Skipta virkni til baka í skilaboðalista" + LABEL_OPEN_COMPOSE_POPUP: "Opna riltilglugga" + LABEL_MINIMIZE_COMPOSE_POPUP: "Lágmarka riltilglugga" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Opna fellilista með persónuauðkennum" + LABEL_SAVE_MESSAGE: "Vista skilaboð" + LABEL_SEND_MESSAGE: "Senda skilaboð" + LABEL_CLOSE_COMPOSE: "Loka ritli" PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No public keys found" - NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "No private key found" - NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" + NO_PUBLIC_KEYS_FOUND: "Engir dreifilyklar fundust" + NO_PUBLIC_KEYS_FOUND_FOR: "Engir dreifilyklar fundust fyrir \"%EMAIL%\" póstfangið" + NO_PRIVATE_KEY_FOUND: "Enginn einkalykill fannst" + NO_PRIVATE_KEY_FOUND_FOR: "Engir einkalyklar fundust fyrir \"%EMAIL%\" póstfangið" + ADD_A_PUBLICK_KEY: "Bættu við dreifilykli" SELECT_A_PRIVATE_KEY: "Veldu einkalykil" - UNVERIFIRED_SIGNATURE: "Unverified signature" - DECRYPTION_ERROR: "OpenPGP decryption error" - GOOD_SIGNATURE: "Good signature from %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "Please specify FROM email address" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" + UNVERIFIRED_SIGNATURE: "Óstaðfest undirritun" + DECRYPTION_ERROR: "OpenPGP afkóðunarvilla" + GOOD_SIGNATURE: "Gild undirritun frá %USER%" + PGP_ERROR: "OpenPGP villa: %ERROR%" + SPECIFY_FROM_EMAIL: "Tilgreindu FRÁ tölvupóstfang" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Tiltaktu að minnsta kosti einn viðtakanda" NOTIFICATIONS: INVALID_TOKEN: "Rangt tákn" AUTH_ERROR: "Auðkenning mistókst" ACCESS_ERROR: "Aðgangsvilla" CONNECTION_ERROR: "Get ekki tengst á netþjón" CAPTCHA_ERROR: "Rangt CAPTCHA." - SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: >- - Þetta samfélags ID er ekki úthlutað á neitt netfang ennþá. Skráðu þig inn - með netfangs upplýsingum og bættu þessum valmöguleika við í aðgangsstillingum. - SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: >- - Þetta samfélags ID er ekki úthlutað á neitt netfang ennþá. Skráðu þig inn - með netfangs upplýsingum og bættu þessum valmöguleika við í aðgangsstillingum. - SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: >- - Þetta samfélags ID er ekki úthlutað á neitt netfang ennþá. Skráðu þig inn - með netfangs upplýsingum og bættu þessum valmöguleika við í aðgangsstillingum. + SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > + Þessu samfélagsauðkenni er ekki úthlutað á neitt tölvupóstfang ennþá. Skráðu + þig inn með notandaupplýsingum tölvupóstfangsins og bættu þessum valmöguleika + við í aðgangsstillingum. + SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > + Þessu samfélagsauðkenni er ekki úthlutað á neitt tölvupóstfang ennþá. Skráðu + þig inn með notandaupplýsingum tölvupóstfangsins og bættu þessum valmöguleika + við í aðgangsstillingum. + SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > + Þessu samfélagsauðkenni er ekki úthlutað á neitt tölvupóstfang ennþá. Skráðu + þig inn með notandaupplýsingum tölvupóstfangsins og bættu þessum valmöguleika + við í aðgangsstillingum. DOMAIN_NOT_ALLOWED: "Lén ekki leyft" - ACCOUNT_NOT_ALLOWED: "Account is not allowed" - ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Two factor verification required" - ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Two factor verification error" - COULD_NOT_SAVE_NEW_PASSWORD: "Could not save new password" - CURRENT_PASSWORD_INCORRECT: "Current password incorrect" - NEW_PASSWORD_SHORT: "Password is too short" - NEW_PASSWORD_WEAK: "Password is too easy" - NEW_PASSWORD_FORBIDDENT: "Password contains forbidden characters" - CONTACTS_SYNC_ERROR: "Contacts synchronization error" - CANT_GET_MESSAGE_LIST: "Get ekki sótt bréfa lista" - CANT_GET_MESSAGE: "Get ekki sótt bréf" - CANT_DELETE_MESSAGE: "Get ekki eytt bréfi" - CANT_MOVE_MESSAGE: "Get ekki fært bréf" - CANT_SAVE_MESSAGE: "Get ekki vistað bréf" - CANT_SEND_MESSAGE: "Get ekki sent bréf" + ACCOUNT_NOT_ALLOWED: "Aðgangur er ekki leyfður" + ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Krafist er 2-þrepa sannvottunar" + ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Villa í 2-þrepa sannvottun" + COULD_NOT_SAVE_NEW_PASSWORD: "Gat ekki vistað nýtt lykilorð" + CURRENT_PASSWORD_INCORRECT: "Núverandi lykilorð er rangt" + NEW_PASSWORD_SHORT: "Lykilorð er of stutt" + NEW_PASSWORD_WEAK: "Lykilorð er of auðvelt" + NEW_PASSWORD_FORBIDDENT: "Lykilorð inniheldur óleyfilega stafi" + CONTACTS_SYNC_ERROR: "Villa í samstillingu tengiliða" + CANT_GET_MESSAGE_LIST: "Get ekki sótt skilaboðlista" + CANT_GET_MESSAGE: "Get ekki sótt skilaboð" + CANT_DELETE_MESSAGE: "Get ekki eytt skilaboðum" + CANT_MOVE_MESSAGE: "Get ekki fært skilaboð" + CANT_SAVE_MESSAGE: "Get ekki vistað skilaboð" + CANT_SEND_MESSAGE: "Get ekki sent skilaboð" INVALID_RECIPIENTS: "Rangir viðtakendur" - CANT_SAVE_FILTERS: "Can't save filters" - CANT_GET_FILTERS: "Can't get filters" - FILTERS_ARE_NOT_CORRECT: "Filters are not correct" + CANT_SAVE_FILTERS: "Get ekki vistað síur" + CANT_GET_FILTERS: "Get ekki sótt síur" + FILTERS_ARE_NOT_CORRECT: "Síur eru ekki réttar" CANT_CREATE_FOLDER: "Get ekki búið til möppu" CANT_RENAME_FOLDER: "Get ekki endurnefnt möppu" CANT_DELETE_FOLDER: "Get ekki eytt möppu" @@ -672,35 +682,35 @@ is_IS: CANT_UNSUBSCRIBE_FOLDER: "Get ekki hætt áskrift á möppu" CANT_SAVE_SETTINGS: "Get ekki vistað stillingar" CANT_SAVE_PLUGIN_SETTINGS: "Get ekki stillingar" - DOMAIN_ALREADY_EXISTS: "Lén tilstaðar núþegar" + DOMAIN_ALREADY_EXISTS: "Lén er nú þegar til staðar" CANT_INSTALL_PACKAGE: "Mistókst að setja inn pakka" CANT_DELETE_PACKAGE: "Mistókst að fjarlægja pakka" - INVALID_PLUGIN_PACKAGE: "Rangur forrita pakki" - UNSUPPORTED_PLUGIN_PACKAGE: "Óstuddur forrita pakki" - LICENSING_SERVER_IS_UNAVAILABLE: "Áskriftar netþjónn er ekki aðgengilegur" - LICENSING_DOMAIN_EXPIRED: "Áskrift furir þetta lén hefur runnið út." + INVALID_PLUGIN_PACKAGE: "Ógildur viðbótapakki" + UNSUPPORTED_PLUGIN_PACKAGE: "Óstuddur viðbótapakki" + LICENSING_SERVER_IS_UNAVAILABLE: "Áskriftarnetþjónn er ekki aðgengilegur" + LICENSING_DOMAIN_EXPIRED: "Áskrift fyrir þetta lén hefur runnið út." LICENSING_DOMAIN_BANNED: "Áskrift fyrir þetta lén er bönnuð." - DEMO_SEND_MESSAGE_ERROR: "Vegna öryggissjónarmiða, þá hefur þessi sýni aðgangur ekki leyfi til að senda bréf á utanaðkomandi netföng!" - DEMO_ACCOUNT_ERROR: "For security purposes, this account is not allowed for this action!" - ACCOUNT_ALREADY_EXISTS: "Aðgangur er til núþegar" + DEMO_SEND_MESSAGE_ERROR: "Vegna öryggissjónarmiða, þá hefur þessi aðgangur ekki leyfi til að senda póst á utanaðkomandi netföng!" + DEMO_ACCOUNT_ERROR: "Vegna öryggissjónarmiða, þá hefur þessi aðgangur ekki heimild fyrir þessa aðgerð!" + ACCOUNT_ALREADY_EXISTS: "Aðgangur er nú þegar til staðar" ACCOUNT_DOES_NOT_EXIST: "Aðgangur er ekki til" - MAIL_SERVER_ERROR: "Villa kom upp við tilraun til að tengjast netþjóni" - INVALID_INPUT_ARGUMENT: "Invalid input argument" + MAIL_SERVER_ERROR: "Villa kom upp við tilraun til að tengjast póstþjóni" + INVALID_INPUT_ARGUMENT: "Óleyfilegt inntaksviðfang" UNKNOWN_ERROR: "Óþekkt villa" STATIC: BACK_LINK: "Endurhlaða" DOMAIN_LIST_DESC: "Listi yfir lén sem vefpóstur má tengjast." - PHP_EXSTENSIONS_ERROR_DESC: "Nauðsynlegar PHP framlenginar eru ekki til staðar í PHP uppsetningunni þinni!" - PHP_VERSION_ERROR_DESC: "PHP útgáfan þín (%VERSION%) er eldri en lágmarks útgáfa sem krafist er (5.3.0)!" + PHP_EXSTENSIONS_ERROR_DESC: "Nauðsynlegir PHP-viðaukar eru ekki til staðar í PHP uppsetningunni þinni!" + PHP_VERSION_ERROR_DESC: "PHP útgáfan þín (%VERSION%) er eldri en lágmarksútgáfan sem krafist er (5.3.0)!" NO_SCRIPT_TITLE: "JavaScript er nauðsynlegt fyrir þetta forrit." NO_SCRIPT_DESC: | - JavaScript stuðningur er ekki til staðar fyrir vafrann þinn. - Vinsamlegast gerðu JavaScript virkt í vafranum þínum og reyndu aftur. - NO_COOKIE_TITLE: "Köku stuðningur er nauðsynlegur fyrir þetta forrit." + JavaScript stuðningur er ekki virkt í vafranum þínum. + Gerðu JavaScript virkt í stillingum vafrans og reyndu aftur. + NO_COOKIE_TITLE: "Stuðningur við vefkökur er nauðsynlegur fyrir þetta forrit." NO_COOKIE_DESC: | - Köku stuðningur er ekki til staðar í vafranum þínum. - Vinsamlegast gerðu JavaScript virkt í vafranum þínum og reyndu aftur. + Stuðningur við vefkökur er ekki til staðar í vafranum þínum. + Gerðu vefkökur virkar í vafranum þínum og reyndu aftur. BAD_BROWSER_TITLE: "Vafrinn þinn er úreltur." BAD_BROWSER_DESC: | - Til að geta notað alla valmöguleika í þessu forriti, - niðurhalaðu og settu upp einn af þessum vöfrum: + Til að geta notað alla eiginleikana í þessu forriti, + náðu í og settu upp einn af þessum vöfrum: diff --git a/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml b/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml index d58f7f2df..77f3c97f1 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml @@ -580,6 +580,7 @@ sk_SK: TITLE_PUBLIC: "Public" DELETING_ASK: "Are you sure?" GENERATE_ONLY_HTTPS: "HTTPS only" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Automaticky uložiť koncept." SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Keyboard shortcuts help" TAB_MAILBOX: "Mailbox" From 95eb786a3f8f1b1df421b42cf681f5ce4880f99c Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Sat, 6 Oct 2018 02:13:58 +0300 Subject: [PATCH 66/83] Update deps --- Makefile | 7 +- dev/Common/Booter.js | 10 +- dev/Common/Utils.js | 1 - jsconfig.json | 9 +- package.json | 20 +- webpack.config.builder.js | 52 ++-- yarn.lock | 575 ++++++++++++++++++++++++++++---------- 7 files changed, 489 insertions(+), 185 deletions(-) diff --git a/Makefile b/Makefile index 964f3d037..d72119ad7 100644 --- a/Makefile +++ b/Makefile @@ -50,8 +50,11 @@ rl-lint: @docker-compose run --no-deps --rm node gulp lint rl-dev: @docker-compose run --no-deps --rm node gulp -rl-watch: - @docker-compose run --no-deps --rm node gulp watch +rl-watch-css: + @docker-compose run --no-deps --rm node npm run watch-css +rl-watch-js: + @docker-compose run --no-deps --rm node npm run watch-js + rl-build: @docker-compose run --no-deps --rm node gulp all rl-build-pro: diff --git a/dev/Common/Booter.js b/dev/Common/Booter.js index 70309ae93..179a37efe 100644 --- a/dev/Common/Booter.js +++ b/dev/Common/Booter.js @@ -7,16 +7,13 @@ import {getHash, setHash, clearHash} from 'Storage/RainLoop'; let RL_APP_DATA_STORAGE = null; -/* eslint-disable */ +/* eslint-disable camelcase,spaced-comment */ window.__rlah = () => getHash(); window.__rlah_set = () => setHash(); window.__rlah_clear = () => clearHash(); window.__rlah_data = () => RL_APP_DATA_STORAGE; -/* eslint-enable */ const useJsNextBundle = (function() { - - /* eslint-disable */ // try { // // (function() { @@ -47,10 +44,9 @@ const useJsNextBundle = (function() { // return true; // } // catch (e) {} - - return false; - /* eslint-enable */ + return false; }()); +/* eslint-enable */ /** * @param {string} id diff --git a/dev/Common/Utils.js b/dev/Common/Utils.js index 703894fa1..1d3203418 100644 --- a/dev/Common/Utils.js +++ b/dev/Common/Utils.js @@ -736,7 +736,6 @@ export function settingsSaveHelperSubscribeFunction(remote, settingName, type, f */ export function findEmailAndLinks(html) { -// return html; return Autolinker ? Autolinker.link(html, { newWindow: true, stripPrefix: false, diff --git a/jsconfig.json b/jsconfig.json index 2e7f3b080..869ced397 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -2,8 +2,15 @@ "compilerOptions": { "target": "es2015", "module": "commonjs", + "moduleResolution": "node", "allowSyntheticDefaultImports": true, - "experimentalDecorators": true + "experimentalDecorators": true, + "baseUrl": "./dev", + "paths": { + "*": [ + "*", + ] + }, }, "exclude": [ "build", diff --git a/package.json b/package.json index de51f885c..4ed8bddc6 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,6 @@ "version": "1.12.1", "ownCloudVersion": "5.1.1", "homepage": "https://www.rainloop.net", - "main": "gulpfile.js", "author": { "name": "RainLoop Team", "email": "support@rainloop.net", @@ -16,6 +15,10 @@ "type": "git", "url": "git://github.com/RainLoop/rainloop-webmail.git" }, + "scripts": { + "watch-css": "gulp watch", + "watch-js": "webpack --color --watch" + }, "license": "SEE LICENSE IN LICENSE", "licenses": [ { @@ -49,22 +52,22 @@ "firefox esr" ], "devDependencies": { - "@babel/core": "7.1.0", + "@babel/core": "7.1.2", "@babel/plugin-proposal-class-properties": "7.1.0", - "@babel/plugin-proposal-decorators": "7.1.0", + "@babel/plugin-proposal-decorators": "7.1.2", "@babel/plugin-transform-runtime": "7.1.0", "@babel/preset-env": "7.1.0", - "@babel/runtime-corejs2": "7.0.0", + "@babel/runtime-corejs2": "7.1.2", "autolinker": "1.7.1", - "babel-eslint": "9.0.0", - "babel-loader": "8.0.2", + "babel-eslint": "10.0.1", + "babel-loader": "8.0.4", "classnames": "2.2.6", "copy-webpack-plugin": "4.5.2", "element-dataset": "2.2.6", "emailjs-addressparser": "2.0.2", "es6-object-assign": "1.1.0", "es6-promise-polyfill": "1.2.0", - "eslint": "5.6.0", + "eslint": "5.6.1", "gulp": "3.9.1", "gulp-autoprefixer": "6.0.0", "gulp-cached": "1.1.1", @@ -118,7 +121,8 @@ "simplestatemanager": "4.1.1", "style-loader": "0.23.0", "underscore": "1.9.1", - "webpack": "4.19.1", + "webpack": "4.20.2", + "webpack-cli": "3.1.2", "webpack-notifier": "1.6.0" } } diff --git a/webpack.config.builder.js b/webpack.config.builder.js index 4fe5f76e0..8f72f5bbf 100644 --- a/webpack.config.builder.js +++ b/webpack.config.builder.js @@ -7,9 +7,34 @@ const WebpackNotifierPlugin = require('webpack-notifier'), loose = true; +const babelLoaderOptions = function() { + return { + cacheDirectory: true, + presets: [ + ['@babel/preset-env', { + loose: loose, + modules: false, + targets: { + browsers: ['last 3 versions', 'ie >= 9', 'firefox esr'] + } + }] + ], + plugins: [ + ['@babel/plugin-transform-runtime', { + corejs: 2 + }], + ['@babel/plugin-proposal-decorators', { + legacy: true + }], + '@babel/plugin-proposal-class-properties' + ] + }; +}; + process.noDeprecation = true; module.exports = function(publicPath, pro) { return { + mode: 'production', entry: { 'js/boot': path.join(__dirname, 'dev', 'boot.js'), 'js/app': path.join(__dirname, 'dev', 'app.js'), @@ -21,6 +46,9 @@ module.exports = function(publicPath, pro) { filename: '[name].js', publicPath: publicPath || 'rainloop/v/0.0.0/static/' }, + performance: { + hints: false + }, optimization: { concatenateModules: false, minimize: false @@ -49,30 +77,10 @@ module.exports = function(publicPath, pro) { module: { rules: [ { - test: /\.(js|ts)$/, + test: /\.js$/, loader: 'babel-loader', include: [devPath], - options: { - cacheDirectory: true, - presets: [ - ['@babel/preset-env', { - loose: loose, - modules: false, - targets: { - browsers: ['last 3 versions', 'ie >= 9', 'firefox esr'] - } - }] - ], - plugins: [ - ['@babel/plugin-transform-runtime', { - corejs: 2 - }], - ['@babel/plugin-proposal-decorators', { - legacy: true - }], - '@babel/plugin-proposal-class-properties' - ] - } + options: babelLoaderOptions() }, { test: /\.(html|css)$/, diff --git a/yarn.lock b/yarn.lock index ea7a5d80e..5656f4548 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,17 +8,17 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.0.tgz#08958f1371179f62df6966d8a614003d11faeb04" +"@babel/core@7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.2.tgz#f8d2a9ceb6832887329a7b60f9d035791400ba4e" dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.0.0" - "@babel/helpers" "^7.1.0" - "@babel/parser" "^7.1.0" - "@babel/template" "^7.1.0" + "@babel/generator" "^7.1.2" + "@babel/helpers" "^7.1.2" + "@babel/parser" "^7.1.2" + "@babel/template" "^7.1.2" "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/types" "^7.1.2" convert-source-map "^1.1.0" debug "^3.1.0" json5 "^0.5.0" @@ -37,6 +37,16 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.2.tgz#fde75c072575ce7abbd97322e8fef5bae67e4630" + dependencies: + "@babel/types" "^7.1.2" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -173,13 +183,13 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helpers@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.0.tgz#429bf0f0020be56a4242883432084e3d70a8a141" +"@babel/helpers@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.2.tgz#ab752e8c35ef7d39987df4e8586c63b8846234b5" dependencies: - "@babel/template" "^7.1.0" + "@babel/template" "^7.1.2" "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/types" "^7.1.2" "@babel/highlight@^7.0.0": version "7.0.0" @@ -193,6 +203,10 @@ version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.0.tgz#a7cd42cb3c12aec52e24375189a47b39759b783e" +"@babel/parser@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.2.tgz#85c5c47af6d244fab77bce6b9bd830e38c978409" + "@babel/plugin-proposal-async-generator-functions@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz#41c1a702e10081456e23a7b74d891922dd1bb6ce" @@ -212,9 +226,9 @@ "@babel/helper-replace-supers" "^7.1.0" "@babel/plugin-syntax-class-properties" "^7.0.0" -"@babel/plugin-proposal-decorators@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.1.0.tgz#bb39ae934318e4560db2d724b0fca8da0299b120" +"@babel/plugin-proposal-decorators@7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.1.2.tgz#79829bd75fced6581ec6c7ab1930e8d738e892e7" dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.1.0" @@ -529,9 +543,9 @@ js-levenshtein "^1.1.3" semver "^5.3.0" -"@babel/runtime-corejs2@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.0.0.tgz#786711ee099c2c2af7875638866c1259eff30a8c" +"@babel/runtime-corejs2@7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.1.2.tgz#8695811a3fd8091f54f274b9320334e5e8c62200" dependencies: core-js "^2.5.7" regenerator-runtime "^0.12.0" @@ -544,6 +558,14 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/template@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.2" + "@babel/types" "^7.1.2" + "@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.0.tgz#503ec6669387efd182c3888c4eec07bcc45d91b2" @@ -566,133 +588,137 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@webassemblyjs/ast@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.6.tgz#3ef8c45b3e5e943a153a05281317474fef63e21e" +"@babel/types@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.2.tgz#183e7952cf6691628afdc2e2b90d03240bac80c0" dependencies: - "@webassemblyjs/helper-module-context" "1.7.6" - "@webassemblyjs/helper-wasm-bytecode" "1.7.6" - "@webassemblyjs/wast-parser" "1.7.6" - mamacro "^0.0.3" + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" -"@webassemblyjs/floating-point-hex-parser@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.6.tgz#7cb37d51a05c3fe09b464ae7e711d1ab3837801f" - -"@webassemblyjs/helper-api-error@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.6.tgz#99b7e30e66f550a2638299a109dda84a622070ef" - -"@webassemblyjs/helper-buffer@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.6.tgz#ba0648be12bbe560c25c997e175c2018df39ca3e" - -"@webassemblyjs/helper-code-frame@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.6.tgz#5a94d21b0057b69a7403fca0c253c3aaca95b1a5" +"@webassemblyjs/ast@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.8.tgz#f31f480debeef957f01b623f27eabc695fa4fe8f" dependencies: - "@webassemblyjs/wast-printer" "1.7.6" + "@webassemblyjs/helper-module-context" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/wast-parser" "1.7.8" -"@webassemblyjs/helper-fsm@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.6.tgz#ae1741c6f6121213c7a0b587fb964fac492d3e49" +"@webassemblyjs/floating-point-hex-parser@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.8.tgz#1b3ed0e27e384032254e9322fc646dd3e70ef1b9" -"@webassemblyjs/helper-module-context@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.6.tgz#116d19a51a6cebc8900ad53ca34ff8269c668c23" +"@webassemblyjs/helper-api-error@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.8.tgz#a2b49c11f615e736f815ec927f035dcfa690d572" + +"@webassemblyjs/helper-buffer@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.8.tgz#3fc66bfa09c1c60e824cf3d5887826fac062877d" + +"@webassemblyjs/helper-code-frame@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.8.tgz#cc5a7e9522b70e7580df056dfd34020cf29645b0" dependencies: - mamacro "^0.0.3" + "@webassemblyjs/wast-printer" "1.7.8" -"@webassemblyjs/helper-wasm-bytecode@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.6.tgz#98e515eaee611aa6834eb5f6a7f8f5b29fefb6f1" +"@webassemblyjs/helper-fsm@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.8.tgz#fe4607430af466912797c21acafd3046080182ea" -"@webassemblyjs/helper-wasm-section@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.6.tgz#783835867bdd686df7a95377ab64f51a275e8333" +"@webassemblyjs/helper-module-context@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.8.tgz#3c2e7ee93d14ff4768ba66fb1be42fdc9dc7160a" + +"@webassemblyjs/helper-wasm-bytecode@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.8.tgz#89bdb78cd6dd5209ae2ed2925de78d0f0e00b6f0" + +"@webassemblyjs/helper-wasm-section@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.8.tgz#c68ef7d26a6fc12421b2e6e56f9bc810dfb33e87" dependencies: - "@webassemblyjs/ast" "1.7.6" - "@webassemblyjs/helper-buffer" "1.7.6" - "@webassemblyjs/helper-wasm-bytecode" "1.7.6" - "@webassemblyjs/wasm-gen" "1.7.6" + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-buffer" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/wasm-gen" "1.7.8" -"@webassemblyjs/ieee754@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.6.tgz#c34fc058f2f831fae0632a8bb9803cf2d3462eb1" +"@webassemblyjs/ieee754@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.8.tgz#1f37974b13cb486a9237e73ce04cac7a2f1265ed" dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.6.tgz#197f75376a29f6ed6ace15898a310d871d92f03b" +"@webassemblyjs/leb128@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.8.tgz#1bee83426819192db2ea1a234b84c7ebc6d34c1f" dependencies: "@xtuc/long" "4.2.1" -"@webassemblyjs/utf8@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.6.tgz#eb62c66f906af2be70de0302e29055d25188797d" +"@webassemblyjs/utf8@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.8.tgz#2b489d5cf43e0aebb93d8e2d792aff9879c61f05" -"@webassemblyjs/wasm-edit@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.6.tgz#fa41929160cd7d676d4c28ecef420eed5b3733c5" +"@webassemblyjs/wasm-edit@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.8.tgz#f8bdbe7088718eca27b1c349bb7c06b8a457950c" dependencies: - "@webassemblyjs/ast" "1.7.6" - "@webassemblyjs/helper-buffer" "1.7.6" - "@webassemblyjs/helper-wasm-bytecode" "1.7.6" - "@webassemblyjs/helper-wasm-section" "1.7.6" - "@webassemblyjs/wasm-gen" "1.7.6" - "@webassemblyjs/wasm-opt" "1.7.6" - "@webassemblyjs/wasm-parser" "1.7.6" - "@webassemblyjs/wast-printer" "1.7.6" + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-buffer" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/helper-wasm-section" "1.7.8" + "@webassemblyjs/wasm-gen" "1.7.8" + "@webassemblyjs/wasm-opt" "1.7.8" + "@webassemblyjs/wasm-parser" "1.7.8" + "@webassemblyjs/wast-printer" "1.7.8" -"@webassemblyjs/wasm-gen@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.6.tgz#695ac38861ab3d72bf763c8c75e5f087ffabc322" +"@webassemblyjs/wasm-gen@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.8.tgz#7e8abf1545eae74ac6781d545c034af3cfd0c7d5" dependencies: - "@webassemblyjs/ast" "1.7.6" - "@webassemblyjs/helper-wasm-bytecode" "1.7.6" - "@webassemblyjs/ieee754" "1.7.6" - "@webassemblyjs/leb128" "1.7.6" - "@webassemblyjs/utf8" "1.7.6" + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/ieee754" "1.7.8" + "@webassemblyjs/leb128" "1.7.8" + "@webassemblyjs/utf8" "1.7.8" -"@webassemblyjs/wasm-opt@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.6.tgz#fbafa78e27e1a75ab759a4b658ff3d50b4636c21" +"@webassemblyjs/wasm-opt@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.8.tgz#7ada6e211914728fce02ff0ff9c344edc6d41f26" dependencies: - "@webassemblyjs/ast" "1.7.6" - "@webassemblyjs/helper-buffer" "1.7.6" - "@webassemblyjs/wasm-gen" "1.7.6" - "@webassemblyjs/wasm-parser" "1.7.6" + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-buffer" "1.7.8" + "@webassemblyjs/wasm-gen" "1.7.8" + "@webassemblyjs/wasm-parser" "1.7.8" -"@webassemblyjs/wasm-parser@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.6.tgz#84eafeeff405ad6f4c4b5777d6a28ae54eed51fe" +"@webassemblyjs/wasm-parser@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.8.tgz#dac47c291fb6a3e63529aecd647592cd34afbf94" dependencies: - "@webassemblyjs/ast" "1.7.6" - "@webassemblyjs/helper-api-error" "1.7.6" - "@webassemblyjs/helper-wasm-bytecode" "1.7.6" - "@webassemblyjs/ieee754" "1.7.6" - "@webassemblyjs/leb128" "1.7.6" - "@webassemblyjs/utf8" "1.7.6" + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-api-error" "1.7.8" + "@webassemblyjs/helper-wasm-bytecode" "1.7.8" + "@webassemblyjs/ieee754" "1.7.8" + "@webassemblyjs/leb128" "1.7.8" + "@webassemblyjs/utf8" "1.7.8" -"@webassemblyjs/wast-parser@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.6.tgz#ca4d20b1516e017c91981773bd7e819d6bd9c6a7" +"@webassemblyjs/wast-parser@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.8.tgz#f8aab9a450c048c1f9537695c89faeb92fabfba5" dependencies: - "@webassemblyjs/ast" "1.7.6" - "@webassemblyjs/floating-point-hex-parser" "1.7.6" - "@webassemblyjs/helper-api-error" "1.7.6" - "@webassemblyjs/helper-code-frame" "1.7.6" - "@webassemblyjs/helper-fsm" "1.7.6" + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/floating-point-hex-parser" "1.7.8" + "@webassemblyjs/helper-api-error" "1.7.8" + "@webassemblyjs/helper-code-frame" "1.7.8" + "@webassemblyjs/helper-fsm" "1.7.8" "@xtuc/long" "4.2.1" - mamacro "^0.0.3" -"@webassemblyjs/wast-printer@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.6.tgz#a6002c526ac5fa230fe2c6d2f1bdbf4aead43a5e" +"@webassemblyjs/wast-printer@1.7.8": + version "1.7.8" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.8.tgz#e7e965782c1912f6a965f14a53ff43d8ad0403a5" dependencies: - "@webassemblyjs/ast" "1.7.6" - "@webassemblyjs/wast-parser" "1.7.6" + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/wast-parser" "1.7.8" "@xtuc/long" "4.2.1" "@xtuc/ieee754@^1.2.0": @@ -984,9 +1010,9 @@ aws4@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" -babel-eslint@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-9.0.0.tgz#7d9445f81ed9f60aff38115f838970df9f2b6220" +babel-eslint@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed" dependencies: "@babel/code-frame" "^7.0.0" "@babel/parser" "^7.0.0" @@ -995,9 +1021,9 @@ babel-eslint@9.0.0: eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" -babel-loader@8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.2.tgz#2079b8ec1628284a929241da3d90f5b3de2a5ae5" +babel-loader@8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.4.tgz#7bbf20cbe4560629e2e41534147692d3fecbdce6" dependencies: find-cache-dir "^1.0.0" loader-utils "^1.0.2" @@ -1239,6 +1265,10 @@ camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + caniuse-lite@^1.0.30000884: version "1.0.30000885" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz#e889e9f8e7e50e769f2a49634c932b8aee622984" @@ -1353,6 +1383,14 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -1549,7 +1587,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" dependencies: @@ -1605,10 +1643,22 @@ debug@^3.1.0: dependencies: ms "^2.1.1" +debug@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.0.1.tgz#f9bb36d439b8d1f0dd52d8fb6b46e4ebb8c1cd5b" + dependencies: + ms "^2.1.1" + decamelize@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + dependencies: + xregexp "4.0.0" + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -1883,7 +1933,50 @@ eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" -eslint@5.6.0, eslint@^5.0.1: +eslint@5.6.1: + version "5.6.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.6.1.tgz#348134e32ccc09abb2df1bf282b3f6eed8c7b480" + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.5.3" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^2.1.0" + eslint-scope "^4.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^4.0.0" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + imurmurhash "^0.1.4" + inquirer "^6.1.0" + is-resolvable "^1.1.0" + js-yaml "^3.12.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.5" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^2.0.0" + require-uncached "^1.0.3" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^4.0.3" + text-table "^0.2.0" + +eslint@^5.0.1: version "5.6.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.6.0.tgz#b6f7806041af01f71b3f1895cbb20971ea4b6223" dependencies: @@ -1981,6 +2074,18 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -2121,6 +2226,12 @@ find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + dependencies: + locate-path "^3.0.0" + findup-sync@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" @@ -2264,6 +2375,10 @@ gaze@^0.5.1: dependencies: globule "~0.1.0" +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -2336,6 +2451,10 @@ glob@~3.1.21: inherits "1" minimatch "~0.2.11" +global-modules-path@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -2832,6 +2951,13 @@ image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -2885,7 +3011,7 @@ inquirer@^6.1.0: strip-ansi "^4.0.0" through "^2.3.6" -interpret@^1.0.0: +interpret@^1.0.0, interpret@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" @@ -2899,6 +3025,10 @@ invariant@^2.2.2: dependencies: loose-envify "^1.0.0" +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + is-absolute@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" @@ -3052,7 +3182,7 @@ is-resolvable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" -is-stream@^1.0.1: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -3256,6 +3386,12 @@ lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + dependencies: + invert-kv "^2.0.0" + "less@2.6.x || ^3.7.1": version "3.8.1" resolved "https://registry.yarnpkg.com/less/-/less-3.8.1.tgz#f31758598ef5a1930dd4caefa9e4340641e71e1d" @@ -3314,6 +3450,13 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" @@ -3534,9 +3677,11 @@ make-iterator@^1.0.0: dependencies: kind-of "^6.0.2" -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" +map-age-cleaner@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" + dependencies: + p-defer "^1.0.0" map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" @@ -3563,6 +3708,14 @@ md5.js@^1.3.4: hash-base "^3.0.0" inherits "^2.0.1" +mem@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^1.0.0" + p-is-promise "^1.1.0" + memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -3894,6 +4047,12 @@ npm-packlist@^1.1.6: ignore-walk "^3.0.1" npm-bundled "^1.0.1" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -4040,6 +4199,14 @@ os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" +os-locale@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" + dependencies: + execa "^0.10.0" + lcid "^2.0.0" + mem "^4.0.0" + os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -4051,22 +4218,50 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + p-limit@^1.0.0, p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" dependencies: p-try "^1.0.0" +p-limit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + dependencies: + p-limit "^2.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" @@ -4125,7 +4320,7 @@ path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" -path-key@^2.0.1: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -4199,6 +4394,12 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + dependencies: + find-up "^3.0.0" + plugin-error@1.0.1, plugin-error@^1.0.1, plugin-error@~1.0: version "1.0.1" resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" @@ -4527,6 +4728,14 @@ request@^2.83.0: tunnel-agent "^0.6.0" uuid "^3.3.2" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -4538,6 +4747,12 @@ reqwest@0.x: version "0.9.7" resolved "https://registry.yarnpkg.com/reqwest/-/reqwest-0.9.7.tgz#11a2de9704dc8d52c9675265d7177103febf3a63" +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + dependencies: + resolve-from "^3.0.0" + resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" @@ -4549,6 +4764,10 @@ resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -4660,7 +4879,7 @@ serialize-javascript@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" -set-blocking@~2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -4906,7 +5125,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: @@ -4942,6 +5161,10 @@ strip-bom@^1.0.0: first-chunk-stream "^1.0.0" is-utf8 "^0.2.0" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -4957,7 +5180,7 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^5.3.0, supports-color@^5.4.0: +supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" dependencies: @@ -5296,6 +5519,10 @@ uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" +v8-compile-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" + v8flags@^2.0.2: version "2.1.1" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" @@ -5369,6 +5596,21 @@ watchpack@^1.5.0: graceful-fs "^4.1.2" neo-async "^2.5.0" +webpack-cli@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746" + dependencies: + chalk "^2.4.1" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.0" + global-modules-path "^2.3.0" + import-local "^2.0.0" + interpret "^1.1.0" + loader-utils "^1.1.0" + supports-color "^5.5.0" + v8-compile-cache "^2.0.2" + yargs "^12.0.2" + webpack-notifier@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/webpack-notifier/-/webpack-notifier-1.6.0.tgz#ffac8e55ff8c469752b8c1bbb011a16f10986e02" @@ -5377,21 +5619,28 @@ webpack-notifier@1.6.0: object-assign "^4.1.0" strip-ansi "^3.0.1" -webpack-sources@^1.1.0, webpack-sources@^1.2.0: +webpack-sources@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2" dependencies: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.19.1.tgz#096674bc3b573f8756c762754366e5b333d6576f" +webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" dependencies: - "@webassemblyjs/ast" "1.7.6" - "@webassemblyjs/helper-module-context" "1.7.6" - "@webassemblyjs/wasm-edit" "1.7.6" - "@webassemblyjs/wasm-parser" "1.7.6" + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.20.2: + version "4.20.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.20.2.tgz#89f6486b6bb276a91b0823453d377501fc625b5a" + dependencies: + "@webassemblyjs/ast" "1.7.8" + "@webassemblyjs/helper-module-context" "1.7.8" + "@webassemblyjs/wasm-edit" "1.7.8" + "@webassemblyjs/wasm-parser" "1.7.8" acorn "^5.6.2" acorn-dynamic-import "^3.0.0" ajv "^6.1.0" @@ -5411,7 +5660,7 @@ webpack@4.19.1: tapable "^1.1.0" uglifyjs-webpack-plugin "^1.2.4" watchpack "^1.5.0" - webpack-sources "^1.2.0" + webpack-sources "^1.3.0" websocket-driver@>=0.5.1: version "0.7.0" @@ -5428,6 +5677,10 @@ when@^3.7.8: version "3.7.8" resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -5458,6 +5711,13 @@ worker-farm@^1.5.2: dependencies: errno "~0.1.7" +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -5476,6 +5736,10 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -5490,7 +5754,7 @@ xtend@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" -y18n@^4.0.0: +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" @@ -5502,6 +5766,29 @@ yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" +yargs-parser@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + dependencies: + camelcase "^4.1.0" + +yargs@^12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" + dependencies: + cliui "^4.0.0" + decamelize "^2.0.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^10.1.0" + yargs@~3.10.0: version "3.10.0" resolved "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" From b17e5dd11dcefcdc01be1d8267f912101cecdf61 Mon Sep 17 00:00:00 2001 From: rolfen Date: Sat, 20 Oct 2018 12:35:57 +0000 Subject: [PATCH 67/83] try to plug the hole in the custom sql plugin --- .../ChangePasswordCustomSqlDriver.php | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/plugins/change-password-custom-sql/ChangePasswordCustomSqlDriver.php b/plugins/change-password-custom-sql/ChangePasswordCustomSqlDriver.php index c0dd532b4..33f79c279 100644 --- a/plugins/change-password-custom-sql/ChangePasswordCustomSqlDriver.php +++ b/plugins/change-password-custom-sql/ChangePasswordCustomSqlDriver.php @@ -146,7 +146,7 @@ class ChangePasswordCustomSqlDriver implements \RainLoop\Providers\ChangePasswor $dsn = 'mysql:host='.$this->mHost.';dbname='.$this->mDatabase.';charset=utf8'; $options = array( - PDO::ATTR_EMULATE_PREPARES => false, + PDO::ATTR_EMULATE_PREPARES => true, PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ); @@ -160,15 +160,43 @@ class ChangePasswordCustomSqlDriver implements \RainLoop\Providers\ChangePasswor $sEmailUser = \MailSo\Base\Utils::GetAccountNameFromEmail($sEmail); $sEmailDomain = \MailSo\Base\Utils::GetDomainFromEmail($sEmail); - //simple check + // some variables cannot be prepared + /* + $this->mSql = str_replace(array( + ':table' + ), array( + $this->mTable + ), $this->mSql); + */ - $old = array(':email', ':oldpass', ':newpass', ':domain', ':username', ':table' ); - $new = array($sEmail, $sPrevPassword, $sNewPassword, $sEmailDomain, $sEmailUser, $this->mTable); + $placeholders = array( + ':table' => $this->mTable, + ':email' => $sEmail, + ':oldpass' => $sPrevPassword, + ':newpass' => $sNewPassword, + ':domain' => $sEmailDomain, + ':username' => $sEmailUser + ); - $this->mSql = str_replace($old, $new, $this->mSql); + $statement = $conn->prepare($this->mSql); + + $this->oLogger->Write($this->mSql); + + $statement->bindValue(':table', 'accounts'); + $statement->bindValue(':email', $sEmail); + $statement->bindValue(':oldpass', $sPrevPassword); + $statement->bindValue(':newpass', $sNewPassword); + $statement->bindValue(':domain', $sEmailDomain); + $statement->bindValue(':username', $sEmailUser); + + $mSqlReturn = $statement->execute(); + + ob_start(); + $statement->debugDumpParams(); + $r = ob_get_contents(); + ob_end_clean(); + $this->oLogger->Write($r); - $update = $conn->prepare($this->mSql); - $mSqlReturn = $update->execute(array()); if ($mSqlReturn == true) { $bResult = true; From 353964e72988b8cf1d0c5735415406969a6d1d56 Mon Sep 17 00:00:00 2001 From: rolfen Date: Sat, 20 Oct 2018 15:13:05 +0000 Subject: [PATCH 68/83] working version --- .../ChangePasswordCustomSqlDriver.php | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/plugins/change-password-custom-sql/ChangePasswordCustomSqlDriver.php b/plugins/change-password-custom-sql/ChangePasswordCustomSqlDriver.php index 33f79c279..1a60346e2 100644 --- a/plugins/change-password-custom-sql/ChangePasswordCustomSqlDriver.php +++ b/plugins/change-password-custom-sql/ChangePasswordCustomSqlDriver.php @@ -161,16 +161,13 @@ class ChangePasswordCustomSqlDriver implements \RainLoop\Providers\ChangePasswor $sEmailDomain = \MailSo\Base\Utils::GetDomainFromEmail($sEmail); // some variables cannot be prepared - /* $this->mSql = str_replace(array( ':table' ), array( $this->mTable ), $this->mSql); - */ $placeholders = array( - ':table' => $this->mTable, ':email' => $sEmail, ':oldpass' => $sPrevPassword, ':newpass' => $sNewPassword, @@ -178,24 +175,36 @@ class ChangePasswordCustomSqlDriver implements \RainLoop\Providers\ChangePasswor ':username' => $sEmailUser ); + // we have to check that all placehoders are used in the query, passing any unused placeholders will generate an error + $used_placeholders = array(); + + foreach($placeholders as $placeholder => $value) { + if(preg_match_all('/'.$placeholder . '(?![a-zA-Z0-9\-])'.'/', $this->mSql) === 1) { + // backwards-compabitibility: remove single and double quotes around placeholders + $this->mSql = str_replace('`'.$placeholder.'`', $placeholder, $this->mSql); + $this->mSql = str_replace("'".$placeholder."'", $placeholder, $this->mSql); + $this->mSql = str_replace('"'.$placeholder.'"', $placeholder, $this->mSql); + $used_placeholders[$placeholder] = $value; + } + } + $statement = $conn->prepare($this->mSql); - $this->oLogger->Write($this->mSql); - - $statement->bindValue(':table', 'accounts'); - $statement->bindValue(':email', $sEmail); - $statement->bindValue(':oldpass', $sPrevPassword); - $statement->bindValue(':newpass', $sNewPassword); - $statement->bindValue(':domain', $sEmailDomain); - $statement->bindValue(':username', $sEmailUser); + // everything is ready (hopefully), bind the values + foreach($used_placeholders as $placeholder => $value) { + $statement->bindValue($placeholder, $value); + } + // and execute $mSqlReturn = $statement->execute(); + /* can be used for debugging ob_start(); $statement->debugDumpParams(); $r = ob_get_contents(); ob_end_clean(); $this->oLogger->Write($r); + */ if ($mSqlReturn == true) { From 32ccf8c76fa5805466f9118aae46f944ffb0bb08 Mon Sep 17 00:00:00 2001 From: rolfen Date: Sat, 20 Oct 2018 15:40:11 +0000 Subject: [PATCH 69/83] improve description --- plugins/change-password-custom-sql/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/change-password-custom-sql/index.php b/plugins/change-password-custom-sql/index.php index ad7f7e222..692f86e7e 100644 --- a/plugins/change-password-custom-sql/index.php +++ b/plugins/change-password-custom-sql/index.php @@ -46,7 +46,7 @@ class ChangePasswordCustomSqlPlugin extends \RainLoop\Plugins\AbstractPlugin \RainLoop\Plugins\Property::NewInstance('mTable')->SetLabel('MySQL Table'), \RainLoop\Plugins\Property::NewInstance('mSql')->SetLabel('SQL statement') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) - ->SetDescription('SQL statement (allowed wildcards :table, :email, :oldpass, :newpass, :domain, :username). When using MD5 OR SHA1 at tables, write it directly here as SQL functions. Fro non-SQL encryptions use another plugin or wait for new version.') + ->SetDescription('SQL statement (allowed wildcards :table, :email, :oldpass, :newpass, :domain, :username). Use SQL functions for encryption.') ->SetDefaultValue('UPDATE :table SET password = md5(:newpass) WHERE domain = :domain AND username = :username and oldpass = md5(:oldpass)') ); } From 2898ecc5e06738486f1f26849472aaf4fc8cab32 Mon Sep 17 00:00:00 2001 From: Gabriel P Date: Thu, 29 Nov 2018 12:00:25 -0500 Subject: [PATCH 70/83] auto-domain-grab use MX record for Host --- plugins/auto-domain-grab/index.php | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/plugins/auto-domain-grab/index.php b/plugins/auto-domain-grab/index.php index b4bfc5763..9edc7c4e4 100644 --- a/plugins/auto-domain-grab/index.php +++ b/plugins/auto-domain-grab/index.php @@ -36,7 +36,15 @@ class AutoDomainGrabPlugin extends \RainLoop\Plugins\AbstractPlugin if (!empty($aImapCredentials['Host']) && 'auto' === $aImapCredentials['Host']) { $domain = substr(strrchr($oAccount->Email(), "@"), 1); - $aImapCredentials['Host'] = $this->imap_prefix.$domain; + $mxhosts = array(); + if(getmxrr($domain, $mxhosts) && sizeof($mxhosts) > 0) + { + $aImapCredentials['Host'] = $mxhosts[0]; + } + else + { + $aImapCredentials['Host'] = $this->imap_prefix.$domain; + } } } } @@ -55,7 +63,15 @@ class AutoDomainGrabPlugin extends \RainLoop\Plugins\AbstractPlugin if (!empty($aSmtpCredentials['Host']) && 'auto' === $aSmtpCredentials['Host']) { $domain = substr(strrchr($oAccount->Email(), "@"), 1); - $aSmtpCredentials['Host'] = $this->smtp_prefix.$domain; + $mxhosts = array(); + if(getmxrr($domain, $mxhosts) && sizeof($mxhosts) > 0) + { + $aSmtpCredentials['Host'] = $mxhosts[0]; + } + else + { + $aSmtpCredentials['Host'] = $this->smtp_prefix.$domain; + } } } } From 134c99624c5439b292796aafe1936dd16ea4db2a Mon Sep 17 00:00:00 2001 From: Gabriel P Date: Thu, 29 Nov 2018 12:26:22 -0500 Subject: [PATCH 71/83] update comment --- plugins/auto-domain-grab/index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/auto-domain-grab/index.php b/plugins/auto-domain-grab/index.php index 9edc7c4e4..a2174926d 100644 --- a/plugins/auto-domain-grab/index.php +++ b/plugins/auto-domain-grab/index.php @@ -23,7 +23,7 @@ class AutoDomainGrabPlugin extends \RainLoop\Plugins\AbstractPlugin } /** - * This function detects the IMAP Host, and if it is set to "auto", replaces it with the email domain. + * This function detects the IMAP Host, and if it is set to "auto", replaces it with the MX or email domain. * * @param \RainLoop\Model\Account $oAccount * @param array $aImapCredentials @@ -50,7 +50,7 @@ class AutoDomainGrabPlugin extends \RainLoop\Plugins\AbstractPlugin } /** - * This function detects the SMTP Host, and if it is set to "auto", replaces it with the email domain. + * This function detects the SMTP Host, and if it is set to "auto", replaces it with the MX or email domain. * * @param \RainLoop\Model\Account $oAccount * @param array $aSmtpCredentials From bb602a52a387c4745bb1196d2275df506ff0ac29 Mon Sep 17 00:00:00 2001 From: imt-mines-albi Date: Fri, 30 Nov 2018 12:54:28 +0000 Subject: [PATCH 72/83] ldap-contacts-suggestions: Allow anonymous ldap_bind() if bind DN is not filled up in plugin config --- .../LdapContactsSuggestions.php | 17 ++++++++++++----- plugins/ldap-contacts-suggestions/VERSION | 2 +- plugins/ldap-contacts-suggestions/index.php | 6 +++--- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php b/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php index 9eb538678..0197becd7 100644 --- a/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php +++ b/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php @@ -15,12 +15,12 @@ class LdapContactsSuggestions implements \RainLoop\Providers\Suggestions\ISugges /** * @var string */ - private $sAccessDn = ''; + private $sAccessDn = NULL; /** * @var string */ - private $sAccessPassword = ''; + private $sAccessPassword = NULL; /** * @var string @@ -68,8 +68,11 @@ class LdapContactsSuggestions implements \RainLoop\Providers\Suggestions\ISugges { $this->sHostName = $sHostName; $this->iHostPort = $iHostPort; - $this->sAccessDn = $sAccessDn; - $this->sAccessPassword = $sAccessPassword; + if (0 < \strlen($sAccessDn)) + { + $this->sAccessDn = $sAccessDn; + $this->sAccessPassword = $sAccessPassword; + } $this->sUsersDn = $sUsersDn; $this->sObjectClass = $sObjectClass; $this->sNameField = $sNameField; @@ -181,7 +184,11 @@ class LdapContactsSuggestions implements \RainLoop\Providers\Suggestions\ISugges if (!@\ldap_bind($oCon, $this->sAccessDn, $this->sAccessPassword)) { - $this->logLdapError($oCon, 'ldap_bind'); + if ( is_null($this->sAccessDn) ) { + $this->logLdapError($oCon, 'ldap_bind (anonymous)'); + } else { + $this->logLdapError($oCon, 'ldap_bind'); + } return $aResult; } diff --git a/plugins/ldap-contacts-suggestions/VERSION b/plugins/ldap-contacts-suggestions/VERSION index 9f8e9b69a..9459d4ba2 100644 --- a/plugins/ldap-contacts-suggestions/VERSION +++ b/plugins/ldap-contacts-suggestions/VERSION @@ -1 +1 @@ -1.0 \ No newline at end of file +1.1 diff --git a/plugins/ldap-contacts-suggestions/index.php b/plugins/ldap-contacts-suggestions/index.php index b02fc1c37..bc2cade76 100644 --- a/plugins/ldap-contacts-suggestions/index.php +++ b/plugins/ldap-contacts-suggestions/index.php @@ -44,8 +44,7 @@ class LdapContactsSuggestionsPlugin extends \RainLoop\Plugins\AbstractPlugin $sNameField = \trim($this->Config()->Get('plugin', 'name_field', '')); $sEmailField = \trim($this->Config()->Get('plugin', 'mail_field', '')); - if (0 < \strlen($sAccessDn) && 0 < \strlen($sAccessPassword) && 0 < \strlen($sUsersDn) && - 0 < \strlen($sObjectClass) && 0 < \strlen($sEmailField)) + if (0 < \strlen($sUsersDn) && 0 < \strlen($sObjectClass) && 0 < \strlen($sEmailField)) { include_once __DIR__.'/LdapContactsSuggestions.php'; @@ -71,6 +70,7 @@ class LdapContactsSuggestionsPlugin extends \RainLoop\Plugins\AbstractPlugin ->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) ->SetDefaultValue(389), \RainLoop\Plugins\Property::NewInstance('access_dn')->SetLabel('Access dn (login)') + ->SetDescription('LDAP bind DN to authentifcate with. If left blank, anonymous bind will be tried and Access password will be ignored') ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('access_password')->SetLabel('Access password') ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) @@ -89,4 +89,4 @@ class LdapContactsSuggestionsPlugin extends \RainLoop\Plugins\AbstractPlugin ->SetDefaultValue('*') ); } -} \ No newline at end of file +} From 20f53825d9c9747199d16720da124e8b5e7ea07f Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Wed, 30 Jan 2019 17:58:52 +0300 Subject: [PATCH 73/83] Update deps --- package.json | 54 +- yarn.lock | 1991 +++++++++++++++++++++++++------------------------- 2 files changed, 1032 insertions(+), 1013 deletions(-) diff --git a/package.json b/package.json index 4ed8bddc6..fc49b5b9a 100644 --- a/package.json +++ b/package.json @@ -52,22 +52,22 @@ "firefox esr" ], "devDependencies": { - "@babel/core": "7.1.2", - "@babel/plugin-proposal-class-properties": "7.1.0", - "@babel/plugin-proposal-decorators": "7.1.2", - "@babel/plugin-transform-runtime": "7.1.0", - "@babel/preset-env": "7.1.0", - "@babel/runtime-corejs2": "7.1.2", + "@babel/core": "7.2.2", + "@babel/plugin-proposal-class-properties": "7.3.0", + "@babel/plugin-proposal-decorators": "7.3.0", + "@babel/plugin-transform-runtime": "7.2.0", + "@babel/preset-env": "7.3.1", + "@babel/runtime-corejs2": "7.3.1", "autolinker": "1.7.1", "babel-eslint": "10.0.1", - "babel-loader": "8.0.4", + "babel-loader": "8.0.5", "classnames": "2.2.6", - "copy-webpack-plugin": "4.5.2", + "copy-webpack-plugin": "4.6.0", "element-dataset": "2.2.6", "emailjs-addressparser": "2.0.2", "es6-object-assign": "1.1.0", "es6-promise-polyfill": "1.2.0", - "eslint": "5.6.1", + "eslint": "5.12.1", "gulp": "3.9.1", "gulp-autoprefixer": "6.0.0", "gulp-cached": "1.1.1", @@ -76,14 +76,14 @@ "gulp-concat-util": "0.5.5", "gulp-eol": "0.2.0", "gulp-eslint": "5.0.0", - "gulp-expect-file": "1.0.0", + "gulp-expect-file": "1.0.1", "gulp-filter": "5.1.0", - "gulp-header": "2.0.5", + "gulp-header": "2.0.7", "gulp-if": "2.0.2", "gulp-less": "4.0.1", - "gulp-livereload": "4.0.0", + "gulp-livereload": "4.0.1", "gulp-notify": "3.2.0", - "gulp-plumber": "1.2.0", + "gulp-plumber": "1.2.1", "gulp-rename": "1.4.0", "gulp-replace": "1.0.0", "gulp-rimraf": "0.2.2", @@ -94,10 +94,10 @@ "gulp-util": "3.0.8", "gulp-zip": "4.2.0", "ifvisible.js": "1.0.6", - "intersection-observer": "0.5.0", + "intersection-observer": "0.5.1", "jquery": "3.3.1", - "jquery-backstretch": "2.1.16", - "jquery-migrate": "^3.0.1", + "jquery-backstretch": "2.1.17", + "jquery-migrate": "3.0.1", "jquery-mousewheel": "3.1.13", "jquery-scrollstop": "1.2.0", "js-cookie": "2.2.0", @@ -106,23 +106,23 @@ "knockout": "3.4.2", "knockout-sortable": "1.1.0", "knockout-transformations": "2.1.0", - "lozad": "1.6.0", + "lozad": "1.8.0", "matchmedia-polyfill": "0.3.1", - "moment": "2.22.2", + "moment": "2.24.0", "node-fs": "0.1.7", - "node-notifier": "5.2.1", - "normalize.css": "8.0.0", + "node-notifier": "5.3.0", + "normalize.css": "8.0.1", "openpgp": "2.6.2", "opentip": "2.4.3", - "pikaday": "1.7.0", - "raw-loader": "0.5.1", - "rimraf": "2.6.2", + "pikaday": "1.8.0", + "raw-loader": "1.0.0", + "rimraf": "2.6.3", "run-sequence": "2.2.1", "simplestatemanager": "4.1.1", - "style-loader": "0.23.0", + "style-loader": "0.23.1", "underscore": "1.9.1", - "webpack": "4.20.2", - "webpack-cli": "3.1.2", - "webpack-notifier": "1.6.0" + "webpack": "4.29.0", + "webpack-cli": "3.2.1", + "webpack-notifier": "1.7.0" } } diff --git a/yarn.lock b/yarn.lock index 5656f4548..09ee123aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,40 +8,30 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.2.tgz#f8d2a9ceb6832887329a7b60f9d035791400ba4e" +"@babel/core@7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.1.2" - "@babel/helpers" "^7.1.2" - "@babel/parser" "^7.1.2" - "@babel/template" "^7.1.2" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.1.2" + "@babel/generator" "^7.2.2" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.2.2" + "@babel/template" "^7.2.2" + "@babel/traverse" "^7.2.2" + "@babel/types" "^7.2.2" convert-source-map "^1.1.0" - debug "^3.1.0" - json5 "^0.5.0" + debug "^4.1.0" + json5 "^2.1.0" lodash "^4.17.10" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0.tgz#1efd58bffa951dc846449e58ce3a1d7f02d393aa" +"@babel/generator@^7.2.2": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.0.tgz#f663838cd7b542366de3aa608a657b8ccb2a99eb" dependencies: - "@babel/types" "^7.0.0" - jsesc "^2.5.1" - lodash "^4.17.10" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/generator@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.2.tgz#fde75c072575ce7abbd97322e8fef5bae67e4630" - dependencies: - "@babel/types" "^7.1.2" + "@babel/types" "^7.3.0" jsesc "^2.5.1" lodash "^4.17.10" source-map "^0.5.0" @@ -68,6 +58,16 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-create-class-features-plugin@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.0.tgz#2b01a81b3adc2b1287f9ee193688ef8dc71e718f" + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.2.3" + "@babel/helper-define-map@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" @@ -116,14 +116,14 @@ "@babel/types" "^7.0.0" "@babel/helper-module-transforms@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz#470d4f9676d9fad50b324cdcce5fbabbc3da5787" + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/template" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" lodash "^4.17.10" "@babel/helper-optimise-call-expression@^7.0.0": @@ -152,13 +152,13 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-replace-supers@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz#5fc31de522ec0ef0899dc9b3e7cf6a5dd655f362" +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz#19970020cf22677d62b3a689561dbd9644d8c5e5" dependencies: "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.1.0" + "@babel/traverse" "^7.2.3" "@babel/types" "^7.0.0" "@babel/helper-simple-access@^7.1.0": @@ -175,21 +175,21 @@ "@babel/types" "^7.0.0" "@babel/helper-wrap-function@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz#8cf54e9190706067f016af8f75cb3df829cc8c66" + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/template" "^7.1.0" "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/types" "^7.2.0" -"@babel/helpers@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.2.tgz#ab752e8c35ef7d39987df4e8586c63b8846234b5" +"@babel/helpers@^7.2.0": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.3.1.tgz#949eec9ea4b45d3210feb7dc1c22db664c9e44b9" dependencies: "@babel/template" "^7.1.2" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.3.0" "@babel/highlight@^7.0.0": version "7.0.0" @@ -199,137 +199,122 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.0.tgz#a7cd42cb3c12aec52e24375189a47b39759b783e" +"@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.2.3": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.1.tgz#8f4ffd45f779e6132780835ffa7a215fa0b2d181" -"@babel/parser@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.2.tgz#85c5c47af6d244fab77bce6b9bd830e38c978409" - -"@babel/plugin-proposal-async-generator-functions@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz#41c1a702e10081456e23a7b74d891922dd1bb6ce" +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.1.0" - "@babel/plugin-syntax-async-generators" "^7.0.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" -"@babel/plugin-proposal-class-properties@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.1.0.tgz#9af01856b1241db60ec8838d84691aa0bd1e8df4" +"@babel/plugin-proposal-class-properties@7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz#272636bc0fa19a0bc46e601ec78136a173ea36cd" dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-member-expression-to-functions" "^7.0.0" - "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-create-class-features-plugin" "^7.3.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" -"@babel/plugin-proposal-decorators@7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.1.2.tgz#79829bd75fced6581ec6c7ab1930e8d738e892e7" +"@babel/plugin-proposal-decorators@7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.3.0.tgz#637ba075fa780b1f75d08186e8fb4357d03a72a7" + dependencies: + "@babel/helper-create-class-features-plugin" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-decorators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/plugin-syntax-decorators" "^7.1.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" -"@babel/plugin-proposal-json-strings@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e" +"@babel/plugin-proposal-object-rest-spread@^7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.1.tgz#f69fb6a1ea6a4e1c503994a91d9cf76f3c4b36e8" dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" -"@babel/plugin-proposal-optional-catch-binding@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" - -"@babel/plugin-proposal-unicode-property-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz#498b39cd72536cd7c4b26177d030226eba08cd33" +"@babel/plugin-proposal-unicode-property-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" regexpu-core "^4.2.0" -"@babel/plugin-syntax-async-generators@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz#bf0891dcdbf59558359d0c626fdc9490e20bc13c" +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-class-properties@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0.tgz#e051af5d300cbfbcec4a7476e37a803489881634" +"@babel/plugin-syntax-decorators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-decorators@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.1.0.tgz#2fa7c1a7905a299c9853ebcef340306675f9cbdc" +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-json-strings@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz#0d259a68090e15b383ce3710e01d5b23f3770cbd" +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-optional-catch-binding@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-arrow-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/plugin-transform-async-to-generator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz#109e036496c51dd65857e16acab3bafdf3c57811" +"@babel/plugin-transform-async-to-generator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz#68b8a438663e88519e65b776f8938f3445b1a2ff" dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.1.0" -"@babel/plugin-transform-block-scoped-functions@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc" +"@babel/plugin-transform-block-scoping@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.10" -"@babel/plugin-transform-classes@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz#ab3f8a564361800cbc8ab1ca6f21108038432249" +"@babel/plugin-transform-classes@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-define-map" "^7.1.0" @@ -340,103 +325,109 @@ "@babel/helper-split-export-declaration" "^7.0.0" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0.tgz#68e911e1935dda2f06b6ccbbf184ffb024e9d43a" +"@babel/plugin-transform-destructuring@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz#e75269b4b7889ec3a332cd0d0c8cff8fed0dc6f3" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz#73a24da69bc3c370251f43a3d048198546115e58" +"@babel/plugin-transform-dotall-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" regexpu-core "^4.1.3" -"@babel/plugin-transform-duplicate-keys@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz#a0601e580991e7cace080e4cf919cfd58da74e86" +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-exponentiation-operator@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz#9c34c2ee7fd77e02779cfa37e403a2e1003ccc73" +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-for-of@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" +"@babel/plugin-transform-for-of@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz#29c5550d5c46208e7f730516d41eeddd4affadbb" +"@babel/plugin-transform-function-name@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-literals@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz#f9e0a7072c12e296079b5a59f408ff5b97bf86a8" +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-commonjs@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz#0a9d86451cbbfb29bd15186306897c67f6f9a05c" +"@babel/plugin-transform-modules-commonjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" -"@babel/plugin-transform-modules-systemjs@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0.tgz#8873d876d4fee23209decc4d1feab8f198cf2df4" +"@babel/plugin-transform-modules-systemjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" dependencies: "@babel/helper-hoist-variables" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-umd@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz#a29a7d85d6f28c3561c33964442257cc6a21f2a8" +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz#140b52985b2d6ef0cb092ef3b29502b990f9cd50" + dependencies: + regexp-tree "^0.1.0" + "@babel/plugin-transform-new-target@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-object-super@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz#b1ae194a054b826d8d4ba7ca91486d4ada0f91bb" +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.1.0" -"@babel/plugin-transform-parameters@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz#44f492f9d618c9124026e62301c296bf606a7aed" +"@babel/plugin-transform-parameters@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" dependencies: "@babel/helper-call-delegate" "^7.1.0" "@babel/helper-get-function-arity" "^7.0.0" @@ -448,277 +439,263 @@ dependencies: regenerator-transform "^0.13.3" -"@babel/plugin-transform-runtime@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz#9f76920d42551bb577e2dc594df229b5f7624b63" +"@babel/plugin-transform-runtime@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz#566bc43f7d0aedc880eaddbd29168d0f248966ea" dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-spread@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-sticky-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" -"@babel/plugin-transform-template-literals@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typeof-symbol@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz#4dcf1e52e943e5267b7313bff347fdbe0f81cec9" +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-unicode-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" +"@babel/plugin-transform-unicode-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" regexpu-core "^4.1.3" -"@babel/preset-env@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.1.0.tgz#e67ea5b0441cfeab1d6f41e9b5c79798800e8d11" +"@babel/preset-env@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.1.tgz#389e8ca6b17ae67aaf9a2111665030be923515db" dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.1.0" - "@babel/plugin-proposal-json-strings" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.0.0" - "@babel/plugin-syntax-async-generators" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.1.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.1.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-dotall-regex" "^7.0.0" - "@babel/plugin-transform-duplicate-keys" "^7.0.0" - "@babel/plugin-transform-exponentiation-operator" "^7.1.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.1.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-modules-amd" "^7.1.0" - "@babel/plugin-transform-modules-commonjs" "^7.1.0" - "@babel/plugin-transform-modules-systemjs" "^7.0.0" - "@babel/plugin-transform-modules-umd" "^7.1.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.3.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.2.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.2.0" + "@babel/plugin-transform-classes" "^7.2.0" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-dotall-regex" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-function-name" "^7.2.0" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@babel/plugin-transform-modules-systemjs" "^7.2.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0" "@babel/plugin-transform-new-target" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.1.0" - "@babel/plugin-transform-parameters" "^7.1.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.2.0" "@babel/plugin-transform-regenerator" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - "@babel/plugin-transform-typeof-symbol" "^7.0.0" - "@babel/plugin-transform-unicode-regex" "^7.0.0" - browserslist "^4.1.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.2.0" + browserslist "^4.3.4" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.3.0" -"@babel/runtime-corejs2@7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.1.2.tgz#8695811a3fd8091f54f274b9320334e5e8c62200" +"@babel/runtime-corejs2@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.3.1.tgz#0c113242e2328f9674d42703a89bee6ebebe9a82" dependencies: core-js "^2.5.7" regenerator-runtime "^0.12.0" -"@babel/template@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.0.tgz#58cc9572e1bfe24fe1537fdf99d839d53e517e22" +"@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" -"@babel/template@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.1.2" - "@babel/types" "^7.1.2" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.0.tgz#503ec6669387efd182c3888c4eec07bcc45d91b2" - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.0.0" + "@babel/generator" "^7.2.2" "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - debug "^3.1.0" + "@babel/parser" "^7.2.3" + "@babel/types" "^7.2.2" + debug "^4.1.0" globals "^11.1.0" lodash "^4.17.10" -"@babel/types@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.0.tgz#61dc0b336a93badc02bf5f69c4cd8e1353f2ffc0" dependencies: esutils "^2.0.2" lodash "^4.17.10" to-fast-properties "^2.0.0" -"@babel/types@^7.1.2": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.2.tgz#183e7952cf6691628afdc2e2b90d03240bac80c0" +"@webassemblyjs/ast@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" dependencies: - esutils "^2.0.2" - lodash "^4.17.10" - to-fast-properties "^2.0.0" + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" -"@webassemblyjs/ast@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.8.tgz#f31f480debeef957f01b623f27eabc695fa4fe8f" +"@webassemblyjs/floating-point-hex-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" + +"@webassemblyjs/helper-api-error@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" + +"@webassemblyjs/helper-buffer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" + +"@webassemblyjs/helper-code-frame@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" dependencies: - "@webassemblyjs/helper-module-context" "1.7.8" - "@webassemblyjs/helper-wasm-bytecode" "1.7.8" - "@webassemblyjs/wast-parser" "1.7.8" + "@webassemblyjs/wast-printer" "1.7.11" -"@webassemblyjs/floating-point-hex-parser@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.8.tgz#1b3ed0e27e384032254e9322fc646dd3e70ef1b9" +"@webassemblyjs/helper-fsm@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" -"@webassemblyjs/helper-api-error@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.8.tgz#a2b49c11f615e736f815ec927f035dcfa690d572" +"@webassemblyjs/helper-module-context@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" -"@webassemblyjs/helper-buffer@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.8.tgz#3fc66bfa09c1c60e824cf3d5887826fac062877d" +"@webassemblyjs/helper-wasm-bytecode@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" -"@webassemblyjs/helper-code-frame@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.8.tgz#cc5a7e9522b70e7580df056dfd34020cf29645b0" +"@webassemblyjs/helper-wasm-section@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" dependencies: - "@webassemblyjs/wast-printer" "1.7.8" + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" -"@webassemblyjs/helper-fsm@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.8.tgz#fe4607430af466912797c21acafd3046080182ea" - -"@webassemblyjs/helper-module-context@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.8.tgz#3c2e7ee93d14ff4768ba66fb1be42fdc9dc7160a" - -"@webassemblyjs/helper-wasm-bytecode@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.8.tgz#89bdb78cd6dd5209ae2ed2925de78d0f0e00b6f0" - -"@webassemblyjs/helper-wasm-section@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.8.tgz#c68ef7d26a6fc12421b2e6e56f9bc810dfb33e87" - dependencies: - "@webassemblyjs/ast" "1.7.8" - "@webassemblyjs/helper-buffer" "1.7.8" - "@webassemblyjs/helper-wasm-bytecode" "1.7.8" - "@webassemblyjs/wasm-gen" "1.7.8" - -"@webassemblyjs/ieee754@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.8.tgz#1f37974b13cb486a9237e73ce04cac7a2f1265ed" +"@webassemblyjs/ieee754@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.8.tgz#1bee83426819192db2ea1a234b84c7ebc6d34c1f" +"@webassemblyjs/leb128@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" dependencies: "@xtuc/long" "4.2.1" -"@webassemblyjs/utf8@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.8.tgz#2b489d5cf43e0aebb93d8e2d792aff9879c61f05" +"@webassemblyjs/utf8@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" -"@webassemblyjs/wasm-edit@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.8.tgz#f8bdbe7088718eca27b1c349bb7c06b8a457950c" +"@webassemblyjs/wasm-edit@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" dependencies: - "@webassemblyjs/ast" "1.7.8" - "@webassemblyjs/helper-buffer" "1.7.8" - "@webassemblyjs/helper-wasm-bytecode" "1.7.8" - "@webassemblyjs/helper-wasm-section" "1.7.8" - "@webassemblyjs/wasm-gen" "1.7.8" - "@webassemblyjs/wasm-opt" "1.7.8" - "@webassemblyjs/wasm-parser" "1.7.8" - "@webassemblyjs/wast-printer" "1.7.8" + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/helper-wasm-section" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-opt" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/wast-printer" "1.7.11" -"@webassemblyjs/wasm-gen@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.8.tgz#7e8abf1545eae74ac6781d545c034af3cfd0c7d5" +"@webassemblyjs/wasm-gen@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" dependencies: - "@webassemblyjs/ast" "1.7.8" - "@webassemblyjs/helper-wasm-bytecode" "1.7.8" - "@webassemblyjs/ieee754" "1.7.8" - "@webassemblyjs/leb128" "1.7.8" - "@webassemblyjs/utf8" "1.7.8" + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" -"@webassemblyjs/wasm-opt@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.8.tgz#7ada6e211914728fce02ff0ff9c344edc6d41f26" +"@webassemblyjs/wasm-opt@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" dependencies: - "@webassemblyjs/ast" "1.7.8" - "@webassemblyjs/helper-buffer" "1.7.8" - "@webassemblyjs/wasm-gen" "1.7.8" - "@webassemblyjs/wasm-parser" "1.7.8" + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" -"@webassemblyjs/wasm-parser@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.8.tgz#dac47c291fb6a3e63529aecd647592cd34afbf94" +"@webassemblyjs/wasm-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" dependencies: - "@webassemblyjs/ast" "1.7.8" - "@webassemblyjs/helper-api-error" "1.7.8" - "@webassemblyjs/helper-wasm-bytecode" "1.7.8" - "@webassemblyjs/ieee754" "1.7.8" - "@webassemblyjs/leb128" "1.7.8" - "@webassemblyjs/utf8" "1.7.8" + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" -"@webassemblyjs/wast-parser@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.8.tgz#f8aab9a450c048c1f9537695c89faeb92fabfba5" +"@webassemblyjs/wast-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" dependencies: - "@webassemblyjs/ast" "1.7.8" - "@webassemblyjs/floating-point-hex-parser" "1.7.8" - "@webassemblyjs/helper-api-error" "1.7.8" - "@webassemblyjs/helper-code-frame" "1.7.8" - "@webassemblyjs/helper-fsm" "1.7.8" + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/floating-point-hex-parser" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-code-frame" "1.7.11" + "@webassemblyjs/helper-fsm" "1.7.11" "@xtuc/long" "4.2.1" -"@webassemblyjs/wast-printer@1.7.8": - version "1.7.8" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.8.tgz#e7e965782c1912f6a965f14a53ff43d8ad0403a5" +"@webassemblyjs/wast-printer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" dependencies: - "@webassemblyjs/ast" "1.7.8" - "@webassemblyjs/wast-parser" "1.7.8" + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" "@xtuc/long" "4.2.1" "@xtuc/ieee754@^1.2.0": @@ -752,38 +729,29 @@ accord@^0.29.0: uglify-js "^2.8.22" when "^3.7.8" -acorn-dynamic-import@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" - dependencies: - acorn "^5.0.0" +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" -acorn-jsx@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e" - dependencies: - acorn "^5.0.3" +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" -acorn@^5.0.0, acorn@^5.0.3, acorn@^5.6.0, acorn@^5.6.2: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" +acorn@^6.0.2, acorn@^6.0.5: + version "6.0.6" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.6.tgz#cd75181670d5b99bdb1b1c993941d3a239ab1f56" -ajv-keywords@^3.0.0, ajv-keywords@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" -ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" +ajv-keywords@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.3.0.tgz#cb6499da9b83177af8bc1732b2f0a1a1a3aacf8c" -ajv@^6.0.1, ajv@^6.1.0, ajv@^6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" +ajv@^6.1.0, ajv@^6.5.3, ajv@^6.5.5, ajv@^6.6.1: + version "6.7.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96" dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -804,9 +772,9 @@ ansi-colors@^1.0.1: dependencies: ansi-wrap "^0.1.0" -ansi-colors@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-2.0.5.tgz#5da37825fef3e75f3bda47f760d64bfd10e15e10" +ansi-colors@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" ansi-cyan@^0.1.1: version "0.1.1" @@ -814,9 +782,9 @@ ansi-cyan@^0.1.1: dependencies: ansi-wrap "0.1.0" -ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" ansi-gray@^0.1.1: version "0.1.1" @@ -838,11 +806,15 @@ ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" +ansi-regex@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" dependencies: @@ -933,7 +905,7 @@ array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" -arrify@^1.0.0, arrify@^1.0.1: +arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -969,6 +941,10 @@ assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" @@ -992,15 +968,15 @@ autolinker@1.7.1: resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.7.1.tgz#36397dd0c09c369433142677b5247ed4c9d2d705" autoprefixer@^9.1.3: - version "9.1.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.1.5.tgz#8675fd8d1c0d43069f3b19a2c316f3524e4f6671" + version "9.4.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.4.7.tgz#f997994f9a810eae47b38fa6d8a119772051c4ff" dependencies: - browserslist "^4.1.0" - caniuse-lite "^1.0.30000884" + browserslist "^4.4.1" + caniuse-lite "^1.0.30000932" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.2" - postcss-value-parser "^3.2.3" + postcss "^7.0.14" + postcss-value-parser "^3.3.1" aws-sign2@~0.7.0: version "0.7.0" @@ -1021,11 +997,11 @@ babel-eslint@10.0.1: eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" -babel-loader@8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.4.tgz#7bbf20cbe4560629e2e41534147692d3fecbdce6" +babel-loader@8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.5.tgz#225322d7509c2157655840bba52e46b6c2f2fe33" dependencies: - find-cache-dir "^1.0.0" + find-cache-dir "^2.0.0" loader-utils "^1.0.2" mkdirp "^0.5.1" util.promisify "^1.0.0" @@ -1071,21 +1047,21 @@ beeper@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" binary-extensions@^1.0.0: version "1.12.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" binaryextensions@2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.1.tgz#3209a51ca4a4ad541a3b8d3d6a6d5b83a2485935" + version "2.1.2" + resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.2.tgz#c83c3d74233ba7674e4f313cb2a2b70f54e94b7c" -bluebird@^3.0.6, bluebird@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" +bluebird@^3.0.6, bluebird@^3.5.1, bluebird@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" @@ -1132,7 +1108,7 @@ brorand@^1.0.1: browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" - resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -1160,7 +1136,7 @@ browserify-des@^1.0.0: browserify-rsa@^4.0.0: version "4.0.1" - resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1183,13 +1159,13 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.1.tgz#328eb4ff1215b12df6589e9ab82f8adaa4fc8cd6" +browserslist@^4.3.4, browserslist@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062" dependencies: - caniuse-lite "^1.0.30000884" - electron-to-chromium "^1.3.62" - node-releases "^1.0.0-alpha.11" + caniuse-lite "^1.0.30000929" + electron-to-chromium "^1.3.103" + node-releases "^1.1.3" buffer-crc32@~0.2.3: version "0.2.13" @@ -1205,7 +1181,7 @@ buffer-xor@^1.0.3: buffer@^4.3.0: version "4.9.1" - resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -1237,6 +1213,25 @@ cacache@^10.0.4: unique-filename "^1.1.0" y18n "^4.0.0" +cacache@^11.0.2: + version "11.3.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" + dependencies: + bluebird "^3.5.3" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -1251,27 +1246,21 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" +callsites@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" +camelcase@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" -caniuse-lite@^1.0.30000884: - version "1.0.30000885" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz#e889e9f8e7e50e769f2a49634c932b8aee622984" +caniuse-lite@^1.0.30000929, caniuse-lite@^1.0.30000932: + version "1.0.30000933" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000933.tgz#5871ff54b3177675ae1c2a275b2aae7abf2b9222" caseless@~0.12.0: version "0.12.0" @@ -1286,7 +1275,7 @@ center-align@^0.1.1: chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" - resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1294,9 +1283,9 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -1325,7 +1314,7 @@ chokidar@^2.0.2: optionalDependencies: fsevents "^1.2.2" -chownr@^1.0.1: +chownr@^1.0.1, chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" @@ -1371,6 +1360,15 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-table3@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -1423,10 +1421,6 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -1452,22 +1446,16 @@ color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" -combined-stream@1.0.6: - version "1.0.6" - resolved "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" +colors@^1.1.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" -combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" dependencies: delayed-stream "~1.0.0" -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" @@ -1493,7 +1481,7 @@ concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" -concat-with-sourcemaps@*, concat-with-sourcemaps@^1.0.4: +concat-with-sourcemaps@^1.0.4, concat-with-sourcemaps@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" dependencies: @@ -1538,9 +1526,9 @@ copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" -copy-webpack-plugin@4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz#d53444a8fea2912d806e78937390ddd7e632ee5c" +copy-webpack-plugin@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz#e7f40dd8a68477d405dd1b7a854aae324b158bae" dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" @@ -1552,8 +1540,8 @@ copy-webpack-plugin@4.5.2: serialize-javascript "^1.4.0" core-js@^2.4.0, core-js@^2.5.7: - version "2.5.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + version "2.6.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.3.tgz#4b70938bdffdaf64931e66e2db158f0892289c49" core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -1568,7 +1556,7 @@ create-ecdh@^4.0.0: create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" - resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" dependencies: cipher-base "^1.0.1" inherits "^2.0.1" @@ -1578,7 +1566,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: version "1.1.7" - resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -1638,27 +1626,21 @@ debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: ms "2.0.0" debug@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407" + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" dependencies: ms "^2.1.1" -debug@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.0.1.tgz#f9bb36d439b8d1f0dd52d8fb6b46e4ebb8c1cd5b" +debug@^4.0.1, debug@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" dependencies: ms "^2.1.1" -decamelize@^1.0.0: +decamelize@^1.0.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" -decamelize@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" - dependencies: - xregexp "4.0.0" - decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -1708,18 +1690,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1749,17 +1719,16 @@ detect-libc@^1.0.2: diffie-hellman@^5.0.0: version "5.0.3" - resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" randombytes "^2.0.0" dir-glob@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" dependencies: - arrify "^1.0.1" path-type "^3.0.0" doctrine@^2.1.0: @@ -1790,11 +1759,11 @@ duplexer2@~0.1.0: duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.1" - resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" duplexify@^3.4.2, duplexify@^3.5.0, duplexify@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" + version "3.6.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" @@ -1812,9 +1781,9 @@ editions@^1.3.3: version "1.3.4" resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" -electron-to-chromium@^1.3.62: - version "1.3.69" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.69.tgz#0fd5d4bfd89ba6a431a144375245aea65073e3ca" +electron-to-chromium@^1.3.103: + version "1.3.111" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.111.tgz#9bde11c953425c1756f85c66e61de2b74ced75d0" element-dataset@2.2.6: version "2.2.6" @@ -1882,22 +1851,23 @@ error@^7.0.0: xtend "~4.0.0" es-abstract@^1.5.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" dependencies: - es-to-primitive "^1.1.1" + es-to-primitive "^1.2.0" function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" + has "^1.0.3" + is-callable "^1.1.4" is-regex "^1.0.4" + object-keys "^1.0.12" -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" dependencies: - is-callable "^1.1.1" + is-callable "^1.1.4" is-date-object "^1.0.1" - is-symbol "^1.0.1" + is-symbol "^1.0.2" es6-object-assign@1.1.0: version "1.1.0" @@ -1933,9 +1903,9 @@ eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" -eslint@5.6.1: - version "5.6.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.6.1.tgz#348134e32ccc09abb2df1bf282b3f6eed8c7b480" +eslint@5.12.1, eslint@^5.0.1: + version "5.12.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.12.1.tgz#5ca9931fb9029d04e7be92b03ce3b58edfac7e3b" dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.5.3" @@ -1946,7 +1916,7 @@ eslint@5.6.1: eslint-scope "^4.0.0" eslint-utils "^1.3.1" eslint-visitor-keys "^1.0.0" - espree "^4.0.0" + espree "^5.0.0" esquery "^1.0.1" esutils "^2.0.2" file-entry-cache "^2.0.0" @@ -1954,9 +1924,9 @@ eslint@5.6.1: glob "^7.1.2" globals "^11.7.0" ignore "^4.0.6" + import-fresh "^3.0.0" imurmurhash "^0.1.4" inquirer "^6.1.0" - is-resolvable "^1.1.0" js-yaml "^3.12.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" @@ -1968,63 +1938,20 @@ eslint@5.6.1: path-is-inside "^1.0.2" pluralize "^7.0.0" progress "^2.0.0" - regexpp "^2.0.0" - require-uncached "^1.0.3" + regexpp "^2.0.1" semver "^5.5.1" strip-ansi "^4.0.0" strip-json-comments "^2.0.1" - table "^4.0.3" + table "^5.0.2" text-table "^0.2.0" -eslint@^5.0.1: - version "5.6.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.6.0.tgz#b6f7806041af01f71b3f1895cbb20971ea4b6223" +espree@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.0.tgz#fc7f984b62b36a0f543b13fb9cd7b9f4a7f5b65c" dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.5.3" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^4.0.0" - eslint-utils "^1.3.1" + acorn "^6.0.2" + acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" - espree "^4.0.0" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - imurmurhash "^0.1.4" - inquirer "^6.1.0" - is-resolvable "^1.1.0" - js-yaml "^3.12.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.5" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - regexpp "^2.0.0" - require-uncached "^1.0.3" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^4.0.3" - text-table "^0.2.0" - -espree@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-4.0.0.tgz#253998f20a0f82db5d866385799d912a83a36634" - dependencies: - acorn "^5.6.0" - acorn-jsx "^4.1.1" esprima@^4.0.0: version "4.0.1" @@ -2050,22 +1977,21 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -event-stream@^3.3.4: - version "3.3.6" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.6.tgz#cac1230890e07e73ec9cacd038f60a5b66173eef" +event-stream@3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" dependencies: - duplexer "^0.1.1" - flatmap-stream "^0.1.0" - from "^0.1.7" - map-stream "0.0.7" - pause-stream "^0.0.11" - split "^1.0.1" - stream-combiner "^0.2.2" - through "^2.3.8" + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -2074,12 +2000,12 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" dependencies: cross-spawn "^6.0.0" - get-stream "^3.0.0" + get-stream "^4.0.0" is-stream "^1.1.0" npm-run-path "^2.0.0" p-finally "^1.0.0" @@ -2127,7 +2053,7 @@ extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" -external-editor@^3.0.0: +external-editor@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" dependencies: @@ -2156,18 +2082,15 @@ extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" -fancy-log@^1.1.0, fancy-log@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" +fancy-log@^1.1.0, fancy-log@^1.3.2, fancy-log@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" dependencies: ansi-gray "^0.1.1" color-support "^1.1.3" + parse-node-version "^1.0.0" time-stamp "^1.0.0" -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -2186,6 +2109,10 @@ faye-websocket@~0.10.0: dependencies: websocket-driver ">=0.5.1" +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -2216,6 +2143,14 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-cache-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^3.0.0" + find-index@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" @@ -2242,8 +2177,8 @@ findup-sync@^2.0.0: resolve-dir "^1.0.1" fined@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" + version "1.1.1" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.1.tgz#95d88ff329123dd1a6950fdfcd321f746271e01f" dependencies: expand-tilde "^2.0.2" is-plain-object "^2.0.3" @@ -2256,22 +2191,18 @@ first-chunk-stream@^1.0.0: resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" flagged-respawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7" + version "1.0.1" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + version "1.3.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" dependencies: circular-json "^0.3.1" - del "^2.0.2" graceful-fs "^4.1.2" + rimraf "~2.6.2" write "^0.2.1" -flatmap-stream@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/flatmap-stream/-/flatmap-stream-0.1.0.tgz#ed54e01422cd29281800914fcb968d58b685d5f1" - flush-write-stream@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" @@ -2298,11 +2229,11 @@ fork-stream@^0.0.4: resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70" form-data@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" dependencies: asynckit "^0.4.0" - combined-stream "1.0.6" + combined-stream "^1.0.6" mime-types "^2.1.12" fragment-cache@^0.2.1: @@ -2318,7 +2249,7 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -from@^0.1.7: +from@~0: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" @@ -2342,8 +2273,8 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" dependencies: nan "^2.9.2" node-pre-gyp "^0.10.0" @@ -2383,6 +2314,12 @@ get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -2432,7 +2369,7 @@ glob@^4.3.1: minimatch "^2.0.1" once "^1.3.0" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: +glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: @@ -2452,8 +2389,8 @@ glob@~3.1.21: minimatch "~0.2.11" global-modules-path@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" + version "2.3.1" + resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.1.tgz#e541f4c800a1a8514a990477b267ac67525b9931" global-modules@^1.0.0: version "1.0.0" @@ -2474,19 +2411,8 @@ global-prefix@^1.0.1: which "^1.2.14" globals@^11.1.0, globals@^11.7.0: - version "11.7.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" + version "11.10.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.10.0.tgz#1e09776dffda5e01816b3bb4077c8b59c24eaa50" globby@^7.1.1: version "7.1.1" @@ -2508,8 +2434,8 @@ globule@~0.1.0: minimatch "~0.2.11" glogg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" + version "1.0.2" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.2.tgz#2d7dd702beda22eb3bffadf880696da6d846313f" dependencies: sparkles "^1.0.0" @@ -2519,9 +2445,9 @@ graceful-fs@^3.0.0: dependencies: natives "^1.1.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" graceful-fs@~1.2.0: version "1.2.3" @@ -2592,16 +2518,16 @@ gulp-eslint@5.0.0: fancy-log "^1.3.2" plugin-error "^1.0.1" -gulp-expect-file@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulp-expect-file/-/gulp-expect-file-1.0.0.tgz#19e6619f6fb658abccb5dc94f5ac33a2f60dd1b9" +gulp-expect-file@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gulp-expect-file/-/gulp-expect-file-1.0.1.tgz#3820fb254896d2ca3a2bb662af5b38ac0423eccd" dependencies: - ansi-colors "^2.0.3" + ansi-colors "^3.2.3" async "^2.6.1" - fancy-log "^1.3.2" + fancy-log "^1.3.3" minimatch "^3.0.4" plugin-error "^1.0.1" - through2 "^2.0.3" + through2 "^3.0.0" vinyl "^2.2.0" xtend "^4.0.1" @@ -2613,12 +2539,13 @@ gulp-filter@5.1.0: plugin-error "^0.1.2" streamfilter "^1.0.5" -gulp-header@2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-2.0.5.tgz#16e229c73593ade301168024fea68dab75d9d38c" +gulp-header@2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-2.0.7.tgz#07505740eb432e8d2bb2af68744858dabaaf491b" dependencies: - concat-with-sourcemaps "*" + concat-with-sourcemaps "^1.1.0" lodash.template "^4.4.0" + map-stream "0.0.7" through2 "^2.0.0" gulp-if@2.0.2, gulp-if@^2.0.0: @@ -2641,13 +2568,13 @@ gulp-less@4.0.1: through2 "^2.0.0" vinyl-sourcemaps-apply "^0.2.0" -gulp-livereload@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gulp-livereload/-/gulp-livereload-4.0.0.tgz#be4a6b01731a93f76f4fb29c9e62e323affe7d03" +gulp-livereload@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/gulp-livereload/-/gulp-livereload-4.0.1.tgz#cb438e62f24363e26b44ddf36fd37c274b8b15ee" dependencies: chalk "^2.4.1" debug "^3.1.0" - event-stream "^3.3.4" + event-stream "3.3.4" fancy-log "^1.3.2" lodash.assign "^4.2.0" tiny-lr "^1.1.1" @@ -2671,9 +2598,9 @@ gulp-notify@3.2.0: plugin-error "^0.1.2" through2 "^2.0.3" -gulp-plumber@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.2.0.tgz#18ea03912c9ee483f8a5499973b5954cd90f6ad8" +gulp-plumber@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/gulp-plumber/-/gulp-plumber-1.2.1.tgz#d38700755a300b9d372318e4ffb5ff7ced0b2c84" dependencies: chalk "^1.1.3" fancy-log "^1.3.2" @@ -2812,10 +2739,10 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" har-validator@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" dependencies: - ajv "^5.3.0" + ajv "^6.5.5" har-schema "^2.0.0" has-ansi@^2.0.0: @@ -2834,6 +2761,10 @@ has-gulplog@^0.1.0: dependencies: sparkles "^1.0.0" +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -2865,7 +2796,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1: +has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" dependencies: @@ -2879,8 +2810,8 @@ hash-base@^3.0.0: safe-buffer "^5.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" @@ -2900,8 +2831,8 @@ homedir-polyfill@^1.0.1: parse-passwd "^1.0.0" http-parser-js@>=0.4.0: - version "0.4.13" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137" + version "0.5.0" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" http-signature@~1.2.0: version "1.2.0" @@ -2951,6 +2882,13 @@ image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" +import-fresh@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -2994,30 +2932,30 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" inquirer@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" + version "6.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" + ansi-escapes "^3.2.0" + chalk "^2.4.2" cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^3.0.0" + external-editor "^3.0.3" figures "^2.0.0" - lodash "^4.17.10" + lodash "^4.17.11" mute-stream "0.0.7" run-async "^2.2.0" - rxjs "^6.1.0" + rxjs "^6.4.0" string-width "^2.1.0" - strip-ansi "^4.0.0" + strip-ansi "^5.0.0" through "^2.3.6" interpret@^1.0.0, interpret@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" -intersection-observer@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.5.0.tgz#9fe8bee3953c755b1485c38efd9633d535775ea6" +intersection-observer@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.5.1.tgz#e340fc56ce74290fe2b2394d1ce88c4353ac6dfa" invariant@^2.2.2: version "2.2.4" @@ -3058,7 +2996,7 @@ is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" -is-callable@^1.1.1, is-callable@^1.1.3: +is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" @@ -3138,23 +3076,7 @@ is-number@^3.0.0: is-obj@^1.0.0: version "1.0.1" - resolved "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - dependencies: - path-is-inside "^1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" @@ -3178,17 +3100,15 @@ is-relative@^1.0.0: dependencies: is-unc-path "^1.0.0" -is-resolvable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + dependencies: + has-symbols "^1.0.0" is-typedarray@~1.0.0: version "1.0.0" @@ -3209,8 +3129,8 @@ is-windows@^1.0.1, is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" is@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" + version "3.3.0" + resolved "https://registry.yarnpkg.com/is/-/is-3.3.0.tgz#61cff6dd3c4193db94a3d62582072b44e5645d79" isarray@0.0.1: version "0.0.1" @@ -3246,13 +3166,13 @@ istextorbinary@2.2.1: editions "^1.3.3" textextensions "2" -jquery-backstretch@2.1.16: - version "2.1.16" - resolved "https://registry.yarnpkg.com/jquery-backstretch/-/jquery-backstretch-2.1.16.tgz#4ee7547dcb85cf69eed2639cac0c9131651dc5e7" +jquery-backstretch@2.1.17: + version "2.1.17" + resolved "https://registry.yarnpkg.com/jquery-backstretch/-/jquery-backstretch-2.1.17.tgz#0694ce452756936beac3d5b60df4dde2d8794fbb" dependencies: jquery "^3.1.1" -jquery-migrate@^3.0.1: +jquery-migrate@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/jquery-migrate/-/jquery-migrate-3.0.1.tgz#141de3abfe6d301baaa4130b0ec7b9a839845e72" @@ -3275,16 +3195,16 @@ js-cookie@2.2.0: resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.0.tgz#1b2c279a6eece380a12168b92485265b35b1effb" js-levenshtein@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5" + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" js-yaml@^3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + version "3.12.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -3294,8 +3214,8 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" jsesc@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" jsesc@~0.5.0: version "0.5.0" @@ -3309,10 +3229,6 @@ json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -3333,9 +3249,17 @@ json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + dependencies: + minimist "^1.2.0" + +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + dependencies: + minimist "^1.2.0" jsprim@^1.2.2: version "1.4.1" @@ -3393,8 +3317,8 @@ lcid@^2.0.0: invert-kv "^2.0.0" "less@2.6.x || ^3.7.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/less/-/less-3.8.1.tgz#f31758598ef5a1930dd4caefa9e4340641e71e1d" + version "3.9.0" + resolved "https://registry.yarnpkg.com/less/-/less-3.9.0.tgz#b7511c43f37cf57dc87dffd9883ec121289b1474" dependencies: clone "^2.1.2" optionalDependencies: @@ -3427,21 +3351,25 @@ liftoff@^2.1.0: rechoir "^0.6.2" resolve "^1.1.7" +lightercollective@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lightercollective/-/lightercollective-0.1.0.tgz#70df102c530dcb8d0ccabfe6175a8d00d5f61300" + livereload-js@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.3.0.tgz#c3ab22e8aaf5bf3505d80d098cbad67726548c9a" + version "2.4.0" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" dependencies: - big.js "^3.1.3" + big.js "^5.2.2" emojis-list "^2.0.0" - json5 "^0.5.0" + json5 "^1.0.1" locate-path@^2.0.0: version "2.0.0" @@ -3616,13 +3544,13 @@ lodash.uniq@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5: +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" lodash@~1.0.1: version "1.0.2" - resolved "http://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" log-symbols@^1.0.0: version "1.0.2" @@ -3640,21 +3568,27 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lozad@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.6.0.tgz#e96c37c2e334bf626138aaac547a7230773d6647" +lozad@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.8.0.tgz#852e46e6403d2aa4456dcefb38242db54ed23f6f" lru-cache@2: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" lru-cache@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + dependencies: + yallist "^3.0.2" + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -3678,8 +3612,8 @@ make-iterator@^1.0.0: kind-of "^6.0.2" map-age-cleaner@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" dependencies: p-defer "^1.0.0" @@ -3691,6 +3625,10 @@ map-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -3702,19 +3640,20 @@ matchmedia-polyfill@0.3.1: resolved "https://registry.yarnpkg.com/matchmedia-polyfill/-/matchmedia-polyfill-0.3.1.tgz#83e754b3b4a297179fcdb71c3aefa0980bff7b18" md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" dependencies: hash-base "^3.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" mem@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" + version "4.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.1.0.tgz#aeb9be2d21f47e78af29e4ac5978e8afa2ca5b8a" dependencies: map-age-cleaner "^0.1.1" mimic-fn "^1.0.0" - p-is-promise "^1.1.0" + p-is-promise "^2.0.0" memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" @@ -3754,15 +3693,15 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@~1.36.0: - version "1.36.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" +mime-db@~1.37.0: + version "1.37.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.20" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" + version "2.1.21" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" dependencies: - mime-db "~1.36.0" + mime-db "~1.37.0" mime@^1.4.1: version "1.6.0" @@ -3801,22 +3740,22 @@ minimatch@~0.2.11: minimist@0.0.8: version "0.0.8" - resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" minimist@^1.1.0, minimist@^1.2.0: version "1.2.0" - resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -minipass@^2.2.1, minipass@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" dependencies: minipass "^2.2.1" @@ -3835,6 +3774,21 @@ mississippi@^2.0.0: stream-each "^1.1.0" through2 "^2.0.0" +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" @@ -3844,13 +3798,13 @@ mixin-deep@^1.2.0: mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" - resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" -moment@2.22.2, moment@2.x: - version "2.22.2" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" +moment@2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" move-concurrently@^1.0.1: version "1.0.1" @@ -3891,8 +3845,8 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" nan@^2.9.2: - version "2.11.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" + version "2.12.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" nanomatch@^1.2.9: version "1.2.13" @@ -3911,24 +3865,24 @@ nanomatch@^1.2.9: to-regex "^3.0.1" natives@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.5.tgz#3bdbdb4104023e5dd239b56fc7ef3d9a17acc6aa" + version "1.1.6" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb" natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" needle@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.3.tgz#c1b04da378cd634d8befe2de965dc2cfb0fd65ca" + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" dependencies: debug "^2.1.2" iconv-lite "^0.4.4" sax "^1.2.4" neo-async@^2.5.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" + version "2.6.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" nice-try@^1.0.4: version "1.0.5" @@ -3946,8 +3900,8 @@ node-fs@0.1.7: resolved "https://registry.yarnpkg.com/node-fs/-/node-fs-0.1.7.tgz#32323cccb46c9fbf0fc11812d45021cc31d325bb" node-libs-browser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -3956,7 +3910,7 @@ node-libs-browser@^2.0.0: constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^1.0.0" + events "^3.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" path-browserify "0.0.0" @@ -3970,21 +3924,21 @@ node-libs-browser@^2.0.0: timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" - util "^0.10.3" + util "^0.11.0" vm-browserify "0.0.4" node-localstorage@~1.3.0: version "1.3.1" - resolved "http://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.1.tgz#3177ef42837f398aee5dd75e319b281e40704243" + resolved "https://registry.yarnpkg.com/node-localstorage/-/node-localstorage-1.3.1.tgz#3177ef42837f398aee5dd75e319b281e40704243" dependencies: write-file-atomic "^1.1.4" -node-notifier@5.2.1, node-notifier@^5.1.2, node-notifier@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" +node-notifier@5.3.0, node-notifier@^5.1.2, node-notifier@^5.2.1: + version "5.3.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.3.0.tgz#c77a4a7b84038733d5fb351aafd8a268bfe19a01" dependencies: growly "^1.3.0" - semver "^5.4.1" + semver "^5.5.0" shellwords "^0.1.1" which "^1.3.0" @@ -4003,16 +3957,17 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.0.0-alpha.11: - version "1.0.0-alpha.11" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.11.tgz#73c810acc2e5b741a17ddfbb39dfca9ab9359d8a" +node-releases@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.6.tgz#47d160033e24a64e79487a62de63cf691052ec54" dependencies: semver "^5.3.0" node.extend@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-2.0.0.tgz#7525a2875677ea534784a5e10ac78956139614df" + version "2.0.2" + resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-2.0.2.tgz#b4404525494acc99740f3703c496b7d5182cc6cc" dependencies: + has "^1.0.3" is "^3.2.1" nopt@^4.0.1: @@ -4032,17 +3987,17 @@ normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" -normalize.css@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.0.tgz#14ac5e461612538a4ce9be90a7da23f86e718493" +normalize.css@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" npm-packlist@^1.1.6: - version "1.1.11" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" + version "1.2.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.2.0.tgz#55a60e793e272f00862c7089274439a4cc31fc7f" dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -4200,10 +4155,10 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" os-locale@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" dependencies: - execa "^0.10.0" + execa "^1.0.0" lcid "^2.0.0" mem "^4.0.0" @@ -4226,9 +4181,9 @@ p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" -p-is-promise@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" +p-is-promise@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5" p-limit@^1.0.0, p-limit@^1.1.0: version "1.3.0" @@ -4237,8 +4192,8 @@ p-limit@^1.0.0, p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" dependencies: p-try "^2.0.0" @@ -4263,8 +4218,8 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" + version "1.0.8" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.8.tgz#6844890aab9c635af868ad5fecc62e8acbba3ea4" parallel-transform@^1.1.0: version "1.1.0" @@ -4274,15 +4229,22 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" +parent-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.0.tgz#df250bdc5391f4a085fb589dad761f5ad6b865b5" + dependencies: + callsites "^3.0.0" + parse-asn1@^5.0.0: - version "5.1.1" - resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + version "5.1.3" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.3.tgz#1600c6cc0727365d68b97f3aa78939e735a75204" dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" parse-filepath@^1.0.1: version "1.0.2" @@ -4292,6 +4254,10 @@ parse-filepath@^1.0.1: map-cache "^0.2.0" path-root "^0.1.1" +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -4316,7 +4282,7 @@ path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1, path-is-inside@^1.0.2: +path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" @@ -4324,7 +4290,7 @@ path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" -path-parse@^1.0.5: +path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -4344,15 +4310,15 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" -pause-stream@^0.0.11: +pause-stream@0.0.11: version "0.0.11" - resolved "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" dependencies: through "~2.3" pbkdf2@^3.0.3: - version "3.0.16" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -4364,29 +4330,13 @@ performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" -pikaday@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/pikaday/-/pikaday-1.7.0.tgz#78bf26e709f7c135b674762bbab79d75ac589ab6" - optionalDependencies: - moment "2.x" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pikaday@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/pikaday/-/pikaday-1.8.0.tgz#ce930e257042e852e6aadee1115e01554b2d71c5" pkg-dir@^2.0.0: version "2.0.0" @@ -4427,17 +4377,17 @@ posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" -postcss-value-parser@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" +postcss-value-parser@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" -postcss@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.2.tgz#7b5a109de356804e27f95a960bef0e4d5bc9bb18" +postcss@^7.0.14, postcss@^7.0.2: + version "7.0.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" dependencies: - chalk "^2.4.1" + chalk "^2.4.2" source-map "^0.6.1" - supports-color "^5.4.0" + supports-color "^6.1.0" prelude-ls@~1.1.2: version "1.1.2" @@ -4464,8 +4414,8 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" promise-inflight@^1.0.1: version "1.0.1" @@ -4486,18 +4436,19 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" psl@^1.1.24: - version "1.1.29" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" public-encrypt@^4.0.0: - version "4.0.2" - resolved "http://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" create-hash "^1.1.0" parse-asn1 "^5.0.0" randombytes "^2.0.1" + safe-buffer "^5.1.2" pump@^2.0.0, pump@^2.0.1: version "2.0.1" @@ -4506,6 +4457,13 @@ pump@^2.0.0, pump@^2.0.1: end-of-stream "^1.1.0" once "^1.3.1" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" @@ -4526,7 +4484,11 @@ punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" -qs@^6.4.0, qs@~6.5.2: +qs@^6.4.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2" + +qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -4562,9 +4524,12 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" -raw-loader@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" +raw-loader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-1.0.0.tgz#3f9889e73dadbda9a424bce79809b4133ad46405" + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" rc@^1.2.7: version "1.2.8" @@ -4575,9 +4540,9 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" - resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -4587,9 +4552,17 @@ rc@^1.2.7: string_decoder "~1.1.1" util-deprecate "~1.0.1" +"readable-stream@2 || 3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz#ed6bbc6c5ba58b090039ff18ce670515795aeb06" + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + "readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: version "1.0.34" - resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -4598,7 +4571,7 @@ rc@^1.2.7: readable-stream@~1.1.9: version "1.1.14" - resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -4650,28 +4623,36 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexpp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.0.tgz#b2a7534a85ca1b033bcf5ce9ff8e56d4e0755365" +regexp-tree@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.1.tgz#27b455f9b138ca2e84c090e9aff1ffe2a04d97fa" + dependencies: + cli-table3 "^0.5.0" + colors "^1.1.2" + yargs "^12.0.5" + +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" regexpu-core@^4.1.3, regexpu-core@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" + version "4.4.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" dependencies: regenerate "^1.4.0" regenerate-unicode-properties "^7.0.0" - regjsgen "^0.4.0" - regjsparser "^0.3.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.0.2" -regjsgen@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" -regjsparser@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" dependencies: jsesc "~0.5.0" @@ -4736,13 +4717,6 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - reqwest@0.x: version "0.9.7" resolved "https://registry.yarnpkg.com/reqwest/-/reqwest-0.9.7.tgz#11a2de9704dc8d52c9675265d7177103febf3a63" @@ -4760,23 +4734,23 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" dependencies: - path-parse "^1.0.5" + path-parse "^1.0.6" restore-cursor@^2.0.0: version "2.0.0" @@ -4795,11 +4769,11 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2.6.2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" +rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" dependencies: - glob "^7.0.5" + glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" @@ -4828,9 +4802,9 @@ run-sequence@2.2.1: fancy-log "^1.3.2" plugin-error "^0.1.2" -rxjs@^6.1.0: - version "6.3.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f" +rxjs@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" dependencies: tslib "^1.9.0" @@ -4856,28 +4830,36 @@ sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" -schema-utils@^0.4.4, schema-utils@^0.4.5: +schema-utils@^0.4.4: version "0.4.7" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" dependencies: ajv "^6.1.0" ajv-keywords "^3.1.0" +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" sequencify@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" serialize-javascript@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" + version "1.6.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" @@ -4907,7 +4889,7 @@ setimmediate@^1.0.4: sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -4942,10 +4924,12 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" +slice-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" slide@^1.1.5: @@ -4980,8 +4964,8 @@ snapdragon@^0.8.1: use "^3.1.0" source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" source-map-resolve@^0.5.0: version "0.5.2" @@ -4993,6 +4977,13 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@~0.5.6: + version "0.5.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -5001,7 +4992,7 @@ source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -5015,9 +5006,9 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" dependencies: through "2" @@ -5026,18 +5017,17 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - safer-buffer "^2.0.2" - optionalDependencies: bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" ecc-jsbn "~0.1.1" + getpass "^0.1.1" jsbn "~0.1.0" + safer-buffer "^2.0.2" tweetnacl "~0.14.0" ssri@^5.2.4: @@ -5046,6 +5036,12 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + dependencies: + figgy-pudding "^3.5.1" + stat-mode@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" @@ -5058,8 +5054,8 @@ static-extend@^0.1.1: object-copy "^0.1.0" stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" dependencies: inherits "~2.0.1" readable-stream "^2.0.2" @@ -5071,12 +5067,11 @@ stream-combiner2@^1.1.1: duplexer2 "~0.1.0" readable-stream "^2.0.2" -stream-combiner@^0.2.2: - version "0.2.2" - resolved "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" dependencies: duplexer "~0.1.1" - through "~2.3.4" stream-consume@~0.1.0: version "0.1.1" @@ -5136,7 +5131,13 @@ string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" -string_decoder@^1.0.0, string_decoder@~1.1.1: +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + dependencies: + safe-buffer "~5.1.0" + +string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" dependencies: @@ -5154,6 +5155,12 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" + dependencies: + ansi-regex "^4.0.0" + strip-bom@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" @@ -5169,46 +5176,50 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -style-loader@0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.0.tgz#8377fefab68416a2e05f1cabd8c3a3acfcce74f1" +style-loader@0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" dependencies: loader-utils "^1.1.0" - schema-utils "^0.4.5" + schema-utils "^1.0.0" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" dependencies: has-flag "^3.0.0" -table@^4.0.3: - version "4.0.3" - resolved "http://registry.npmjs.org/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" dependencies: - ajv "^6.0.1" - ajv-keywords "^3.0.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" + has-flag "^3.0.0" + +table@^5.0.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/table/-/table-5.2.2.tgz#61d474c9e4d8f4f7062c98c7504acb3c08aa738f" + dependencies: + ajv "^6.6.1" + lodash "^4.17.11" + slice-ansi "^2.0.0" string-width "^2.1.1" tapable@^1.0.0, tapable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" + version "1.1.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" tar@^4: - version "4.4.6" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" dependencies: - chownr "^1.0.1" + chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.3" - minizlib "^1.1.0" + minipass "^2.3.4" + minizlib "^1.1.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" yallist "^3.0.2" @@ -5222,15 +5233,36 @@ ternary-stream@^2.0.1: merge-stream "^1.0.0" through2 "^2.0.1" +terser-webpack-plugin@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz#7545da9ae5f4f9ae6a0ac961eb46f5e7c845cc26" + dependencies: + cacache "^11.0.2" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + terser "^3.8.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +terser@^3.8.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.14.1.tgz#cc4764014af570bc79c79742358bd46926018a32" + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + source-map-support "~0.5.6" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" textextensions@2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" + version "2.4.0" + resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.4.0.tgz#6a143a985464384cc2cff11aea448cd5b018e72b" -through2@2.0.3, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: +through2@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" dependencies: @@ -5251,6 +5283,20 @@ through2@^0.6.1: readable-stream ">=1.0.33-1 <1.1.0-0" xtend ">=4.0.0 <4.1.0-0" +through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.0.tgz#468b461df9cd9fcc170f22ebf6852e467e578ff2" + dependencies: + readable-stream "2 || 3" + xtend "~4.0.1" + through2@~0.4: version "0.4.2" resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" @@ -5258,9 +5304,9 @@ through2@~0.4: readable-stream "~1.0.17" xtend "~2.1.1" -through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.4: +through@2, through@^2.3.6, through@~2.3, through@~2.3.1: version "2.3.8" - resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" tildify@^1.0.0: version "1.2.0" @@ -5364,13 +5410,6 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - uglify-js@^2.8.22: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" @@ -5391,19 +5430,6 @@ uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" -uglifyjs-webpack-plugin@^1.2.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - schema-utils "^0.4.5" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-es "^3.3.4" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" @@ -5440,15 +5466,15 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" -unique-filename@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" +unique-filename@^1.1.0, unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" dependencies: unique-slug "^2.0.0" unique-slug@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" dependencies: imurmurhash "^0.1.4" @@ -5492,7 +5518,7 @@ user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -5509,9 +5535,9 @@ util@0.10.3: dependencies: inherits "2.0.1" -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" dependencies: inherits "2.0.3" @@ -5596,53 +5622,49 @@ watchpack@^1.5.0: graceful-fs "^4.1.2" neo-async "^2.5.0" -webpack-cli@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746" +webpack-cli@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.2.1.tgz#779c696c82482491f0803907508db2e276ed3b61" dependencies: chalk "^2.4.1" cross-spawn "^6.0.5" enhanced-resolve "^4.1.0" + findup-sync "^2.0.0" + global-modules "^1.0.0" global-modules-path "^2.3.0" import-local "^2.0.0" interpret "^1.1.0" + lightercollective "^0.1.0" loader-utils "^1.1.0" supports-color "^5.5.0" v8-compile-cache "^2.0.2" - yargs "^12.0.2" + yargs "^12.0.4" -webpack-notifier@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/webpack-notifier/-/webpack-notifier-1.6.0.tgz#ffac8e55ff8c469752b8c1bbb011a16f10986e02" +webpack-notifier@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/webpack-notifier/-/webpack-notifier-1.7.0.tgz#4e03ea3ba1c0588d863935363f145d067815068a" dependencies: node-notifier "^5.1.2" object-assign "^4.1.0" strip-ansi "^3.0.1" -webpack-sources@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2" - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack-sources@^1.3.0: +webpack-sources@^1.1.0, webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" dependencies: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@4.20.2: - version "4.20.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.20.2.tgz#89f6486b6bb276a91b0823453d377501fc625b5a" +webpack@4.29.0: + version "4.29.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.0.tgz#f2cfef83f7ae404ba889ff5d43efd285ca26e750" dependencies: - "@webassemblyjs/ast" "1.7.8" - "@webassemblyjs/helper-module-context" "1.7.8" - "@webassemblyjs/wasm-edit" "1.7.8" - "@webassemblyjs/wasm-parser" "1.7.8" - acorn "^5.6.2" - acorn-dynamic-import "^3.0.0" + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/wasm-edit" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + acorn "^6.0.5" + acorn-dynamic-import "^4.0.0" ajv "^6.1.0" ajv-keywords "^3.1.0" chrome-trace-event "^1.0.0" @@ -5658,7 +5680,7 @@ webpack@4.20.2: node-libs-browser "^2.0.0" schema-utils "^0.4.4" tapable "^1.1.0" - uglifyjs-webpack-plugin "^1.2.4" + terser-webpack-plugin "^1.1.0" watchpack "^1.5.0" webpack-sources "^1.3.0" @@ -5713,7 +5735,7 @@ worker-farm@^1.5.2: wrap-ansi@^2.0.0: version "2.1.0" - resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -5736,10 +5758,6 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -xregexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" - "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -5763,21 +5781,22 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" -yargs-parser@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" dependencies: - camelcase "^4.1.0" + camelcase "^5.0.0" + decamelize "^1.2.0" -yargs@^12.0.2: - version "12.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" +yargs@^12.0.4, yargs@^12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" dependencies: cliui "^4.0.0" - decamelize "^2.0.0" + decamelize "^1.2.0" find-up "^3.0.0" get-caller-file "^1.0.1" os-locale "^3.0.0" @@ -5787,11 +5806,11 @@ yargs@^12.0.2: string-width "^2.0.0" which-module "^2.0.0" y18n "^3.2.1 || ^4.0.0" - yargs-parser "^10.1.0" + yargs-parser "^11.1.1" yargs@~3.10.0: version "3.10.0" - resolved "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" dependencies: camelcase "^1.0.2" cliui "^2.1.0" @@ -5799,7 +5818,7 @@ yargs@~3.10.0: window-size "0.1.0" yazl@^2.1.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.3.tgz#ec26e5cc87d5601b9df8432dbdd3cd2e5173a071" + version "2.5.1" + resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35" dependencies: buffer-crc32 "~0.2.3" From 41c164add74bd79221c6881a7ea124557c2d6bfb Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Fri, 1 Feb 2019 19:00:31 +0300 Subject: [PATCH 74/83] Synchronize localizations from Transifex --- .../v/0.0.0/app/localization/admin/cs_CZ.yml | 47 ++-- .../v/0.0.0/app/localization/admin/pl_PL.yml | 22 +- .../v/0.0.0/app/localization/admin/pt_BR.yml | 1 + .../v/0.0.0/app/localization/admin/sk_SK.yml | 49 +++- .../v/0.0.0/app/localization/admin/sv_SE.yml | 3 +- .../0.0.0/app/localization/webmail/cs_CZ.yml | 139 ++++++----- .../0.0.0/app/localization/webmail/pl_PL.yml | 56 ++--- .../0.0.0/app/localization/webmail/pt_BR.yml | 2 + .../0.0.0/app/localization/webmail/sk_SK.yml | 233 +++++++++--------- .../0.0.0/app/localization/webmail/sv_SE.yml | 8 +- 10 files changed, 313 insertions(+), 247 deletions(-) diff --git a/rainloop/v/0.0.0/app/localization/admin/cs_CZ.yml b/rainloop/v/0.0.0/app/localization/admin/cs_CZ.yml index ab8d3ccf7..3bf2aaaad 100644 --- a/rainloop/v/0.0.0/app/localization/admin/cs_CZ.yml +++ b/rainloop/v/0.0.0/app/localization/admin/cs_CZ.yml @@ -26,18 +26,20 @@ cs_CZ: LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Povolit výběr jazyka na přihlašovací obrazovce" LABEL_ALLOW_THEMES_ON_SETTINGS: "Povolit výběr motivu na přihlašovací obrazovce" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Povolit výběr pozadí na přihlašovací obrazovce" + LABEL_NEW_FOLDER_MOVE: "Nové tlačítko \"přesunout do adresáře\"" LABEL_SHOW_THUMBNAILS: "Zobrazovat miniatury (přílohy)" - LABEL_ALLOW_GRAVATAR: "Povolit nastavení avatara" + LABEL_ALLOW_GRAVATAR: "Povolit Gravatar" LEGEND_MAIN: "Hlavní" LABEL_ATTACHMENT_SIZE_LIMIT: "Limit velikosti přílohy" LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Povolit přidávat další účty" LABEL_ALLOW_IDENTITIES: "Povolit další identity" LABEL_ALLOW_TEMPLATES: "Povolit šablony" + ALERT_DATA_ACCESS: "Adresář s RainLoop daty je veřejně přístupný. Nakonfigurujte prosím webový server tak, aby skryl adresář data z externího přístupu. Více zde:" ALERT_WARNING: "Upozornění!" HTML_ALERT_WEAK_PASSWORD: | Používáte výchozí administrátorské heslo.
      - Z bezpečnostních důvodů jeji prosím + Z bezpečnostních důvodů jej prosím změnte. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Přihlašovací obrazovka" @@ -89,6 +91,7 @@ cs_CZ: TAB_DOMAINS: LEGEND_DOMAINS: "Domény" BUTTON_ADD_DOMAIN: "Přidat Doménu" + BUTTON_ADD_ALIAS: "Přidat alias" DELETE_ARE_YOU_SURE: "Jste si jistí?" HTML_DOMAINS_HELPER: | Seznam domén, ke kterým je možné přistupovat přes webmail. @@ -113,24 +116,24 @@ cs_CZ: TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" LABEL_ENABLE_GOOGLE: "Povolit Google integraci" - LABEL_GOOGLE_AUTH: "Authorizace" - LABEL_GOOGLE_DRIVE: "Google Drive integrace (Compose view)" + LABEL_GOOGLE_AUTH: "Autorizace" + LABEL_GOOGLE_DRIVE: "Google Drive integrace (Psaní zpráv)" LABEL_GOOGLE_PREVIEW: "Google Viewer integrace (náhled pro Microsoft Word, Excel a PowerPoint soubory)" LABEL_GOOGLE_CLIENT_ID: "Klient ID" LABEL_GOOGLE_CLIENT_SECRET: "Klient Secret" LABEL_GOOGLE_API_KEY: "Api klíč" HINT_GOOGLE_API_KEY: "Vyžadováno pro Google Drive File Picker" LEGEND_FACEBOOK: "Facebook" - LABEL_ENABLE_FACEBOOK: "Povolit Facebook integraci (Authorizaci)" + LABEL_ENABLE_FACEBOOK: "Povolit Facebook integraci (Autorizaci)" LABEL_FACEBOOK_APP_ID: "App ID" LABEL_FACEBOOK_APP_SECRET: "App Secret" LEGEND_TWITTER: "Twitter" - LABEL_ENABLE_TWITTER: "Povolit Twitter integraci (Authorizaci)" + LABEL_ENABLE_TWITTER: "Povolit Twitter integraci (Autorizaci)" LABEL_TWITTER_CONSUMER_KEY: "Consumer Key" LABEL_TWITTER_CONSUMER_SECRET: "Consumer Secret" LEGEND_DROPBOX: "Dropbox" LABEL_ENABLE_DROPBOX: "Povolit Dropbox integraci" - LABEL_DROPBOX_API_KEY: "Api key" + LABEL_DROPBOX_API_KEY: "Api klíč" TOP_ALERT: "Detailní informace o integraci sociálních sítí jsou dostupné na adrese" TAB_PLUGINS: LEGEND_PLUGINS: "Pluginy" @@ -167,9 +170,9 @@ cs_CZ: HINT_READ_CHANGE_LOG: "Přečtěte si prosím change log předtím, než budete chtít provést aktualizaci." HINT_IS_UP_TO_DATE: "RainLoop je v aktuální verzi." HTML_NEW_VERSION: "Nová verze %VERSION% je k dispozici." - LABEL_UPDATING: "Aktualizace" - LABEL_CHECKING: "Zjistit nové aktualizace" - BUTTON_UPDATE: "Aktualizace" + LABEL_UPDATING: "Aktualizuji" + LABEL_CHECKING: "Kontroluji nové aktualizace" + BUTTON_UPDATE: "Aktualizovat" BUTTON_DOWNLOAD: "Stáhnout" BUTTON_CHANGELOG: "Seznam změn" POPUPS_ACTIVATE: @@ -179,14 +182,20 @@ cs_CZ: LABEL_SUB_KEY: "Licenční klíč" BUTTON_ACTIVATE: "Aktivovat" LABEL_ACTIVATED: "Aktivováno" - ERROR_INVALID_SUBS_KEY: "Nevalidní licenční klíč" + ERROR_INVALID_SUBS_KEY: "Neplatný licenční klíč" SUBS_KEY_ACTIVATED: "Licenční klíč byl úspěšně aktivován" HTML_DESC: | - Po aktivaci bude prémiové licence pro doménu %DOMAIN% prodloužena. + Po aktivaci bude prémiová licence pro doménu %DOMAIN% prodloužena.
      Aktivační klíč lze použít pouze pro jednu doménu.

      Jakmile začnete proces aktivace, nelze ho přerušit nebo ukončit. + POPUPS_DOMAIN_ALIAS: + TITLE_ADD_DOMAIN_ALIAS: "Přidat alias" + LABEL_ALIAS: "Alias" + LABEL_DOMAIN: "Doména" + BUTTON_CLOSE: "Zavřít" + BUTTON_ADD: "Přidat" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Přidat Doménu" TITLE_ADD_DOMAIN_WITH_NAME: "Přidat Doménu \"%NAME%\"" @@ -240,7 +249,7 @@ cs_CZ: DOMAIN_ALREADY_EXISTS: "Doména již existuje" UNKNOWN_ERROR: "Neznámá chyba" NOTIFICATIONS: - INVALID_TOKEN: "Nevalidní token" + INVALID_TOKEN: "Neplatný token" AUTH_ERROR: "Chyba authentikace" ACCESS_ERROR: "Chyba v přístupu" CONNECTION_ERROR: "Nelze se spojit se serverem" @@ -278,11 +287,11 @@ cs_CZ: CANT_RENAME_FOLDER: "Složku se nepodařilo přejmenovat" CANT_DELETE_FOLDER: "Složku se nepodařilo odstranit" CANT_DELETE_NON_EMPTY_FOLDER: "Nelze odstranit neprázdnou složku" - CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" - CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" + CANT_SUBSCRIBE_FOLDER: "Nelze přihlásit složku" + CANT_UNSUBSCRIBE_FOLDER: "Nelze odhlásit složku" CANT_SAVE_SETTINGS: "Nastavení se nepodařilo uložit" CANT_SAVE_PLUGIN_SETTINGS: "Nastavení se nepodařilo uložit" - DOMAIN_ALREADY_EXISTS: "Táto doména již existuje" + DOMAIN_ALREADY_EXISTS: "Tato doména již existuje" CANT_INSTALL_PACKAGE: "Instalace balíčku se nezdařila" CANT_DELETE_PACKAGE: "Odstranění balíčku se nezdařilo" INVALID_PLUGIN_PACKAGE: "Nevalidní balíček" @@ -291,11 +300,11 @@ cs_CZ: LICENSING_DOMAIN_EXPIRED: "Licence pro tuto doménu vypršela." LICENSING_DOMAIN_BANNED: "Licence pro tuto doménu byla zablokována." DEMO_SEND_MESSAGE_ERROR: "Z důvodu bezpečnosti tento demo účet není oprávněn posílat zprávy na externí emaily!" - DEMO_ACCOUNT_ERROR: "Z důvodu bezpečnosti tento účet nemá oprávnění toto provést!" - ACCOUNT_ALREADY_EXISTS: "Účet už existuje" + DEMO_ACCOUNT_ERROR: "Z důvodu bezpečnosti tento účet nemá oprávnění k této akci!" + ACCOUNT_ALREADY_EXISTS: "Účet již existuje" ACCOUNT_DOES_NOT_EXIST: "Účet neexistuje" MAIL_SERVER_ERROR: "Nastala chyba během přístupu na poštovní server" - INVALID_INPUT_ARGUMENT: "Nevalidní vstupní argument" + INVALID_INPUT_ARGUMENT: "Neplatný vstupní argument" UNKNOWN_ERROR: "Neznámá chyba" STATIC: BACK_LINK: "Obnovit" diff --git a/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml b/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml index fb2635965..db55fcfc4 100644 --- a/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml +++ b/rainloop/v/0.0.0/app/localization/admin/pl_PL.yml @@ -13,9 +13,9 @@ pl_PL: LABEL_CONTACTS_NAME: "Kontakty" LABEL_DOMAINS_NAME: "Domeny" LABEL_SECURITY_NAME: "Bezpieczeństwo" - LABEL_INTEGRATION_NAME: "Integracja" + LABEL_INTEGRATION_NAME: "Integracje" LABEL_PLUGINS_NAME: "Wtyczki" - LABEL_PACKAGES_NAME: "Zarządzanie wtyczkami" + LABEL_PACKAGES_NAME: "Pakiety" LABEL_LICENSING_NAME: "Licencjonowanie" LABEL_ABOUT_NAME: "O programie" TAB_GENERAL: @@ -26,7 +26,7 @@ pl_PL: LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Zezwól użytkownikowi na wybór języka" LABEL_ALLOW_THEMES_ON_SETTINGS: "Zezwól użytkownikowi na zmianę motywu" LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Zezwól użytkownikowi na użycie własnego tła" - LABEL_NEW_FOLDER_MOVE: "Nowy przycisk \"przenieś do folderu\"" + LABEL_NEW_FOLDER_MOVE: "Nowy przycisk „przenieś do folderu”" LABEL_SHOW_THUMBNAILS: "Pokaż miniatury (załączniki)" LABEL_ALLOW_GRAVATAR: "Zezwól na używanie gravatarów" LEGEND_MAIN: "Główne" @@ -52,13 +52,13 @@ pl_PL: LEGEND_BRANDING: "Personalizacja" LABEL_PAGE_TITLE: "Tytuł strony" LABEL_LOADING_DESCRIPTION: "Komunikat ładowania strony" - LABEL_FAVICON_URL: "Favicon" + LABEL_FAVICON_URL: "Favikona" LEGEND_LOGIN: "Login" LABEL_LOGIN_LOGO: "Logo" LABEL_LOGIN_DESCRIPTION: "Opis" LABEL_LOGIN_BACKGROUND: "Tło" LABEL_LOGIN_CUSTOM_CSS: "Własny arkusz styli CSS" - LABEL_LOGIN_SHOW_POWERED_LINK: "Pokaż link \"Powered by RainLoop\"" + LABEL_LOGIN_SHOW_POWERED_LINK: "Pokaż link „Powered by RainLoop”" LEGEND_USER: "Użytkownik" LABEL_USER_LOGO: "Logo" LABEL_USER_LOGO_TITLE: "Tytuł logo" @@ -122,7 +122,7 @@ pl_PL: LABEL_GOOGLE_CLIENT_ID: "Identyfikator klienta" LABEL_GOOGLE_CLIENT_SECRET: "Hasło" LABEL_GOOGLE_API_KEY: "Klucz API" - HINT_GOOGLE_API_KEY: "Wymagane dla obsługi interfejsu usługi 'Dysk Google'" + HINT_GOOGLE_API_KEY: "Wymagane dla obsługi interfejsu usługi „Dysk Google”" LEGEND_FACEBOOK: "Facebook" LABEL_ENABLE_FACEBOOK: "Włącz integrację z Facebook (autoryzacja)" LABEL_FACEBOOK_APP_ID: "Identyfikator aplikacji" @@ -142,8 +142,8 @@ pl_PL: LINK_INSTALL_NEW: "Kliknij tutaj, aby zainstalować nowe wtyczki!" HINT_CLICK_NAME: "Kliknij na nazwę, aby skonfigurować wtyczkę." TAB_PACKAGES: - LEGEND_AVAILABLE_FOR_UPDATE: "Dostępna do aktualizacji" - LEGEND_AVAILABLE_FOR_INSTALLATION: "Dostępna do zainstalowania" + LEGEND_AVAILABLE_FOR_UPDATE: "Dostępne do aktualizacji" + LEGEND_AVAILABLE_FOR_INSTALLATION: "Dostępne do zainstalowania" LEGEND_INSTALLED_PACKAGES: "Zainstalowane pakiety" ALERT_CANNOT_ACCESS_REPOSITORY: "Nie można uzyskać dostępu do repozytorium." TAB_LICENSING: @@ -197,8 +197,8 @@ pl_PL: BUTTON_ADD: "Dodaj" POPUPS_DOMAIN: TITLE_ADD_DOMAIN: "Dodawanie domeny" - TITLE_ADD_DOMAIN_WITH_NAME: "Dodawanie domeny \"%NAME%\"" - TITLE_EDIT_DOMAIN: "Edycja domeny \"%NAME%\"" + TITLE_ADD_DOMAIN_WITH_NAME: "Dodawanie domeny „%NAME%”" + TITLE_EDIT_DOMAIN: "Edycja domeny „%NAME%”" LABEL_NAME: "Nazwa" NAME_HELPER: "obsługiwany znak wieloznaczności - *" LABEL_IMAP: "IMAP" @@ -216,7 +216,7 @@ pl_PL: LABEL_USE_SHORT_LOGIN: "Użyj krótkiego loginu" LABEL_USE_AUTH: "Użyj autoryzacji" LABEL_USE_PHP_MAIL: "Użyj funkcji php 'mail()'" - BUTTON_TEST: "Test" + BUTTON_TEST: "Testuj" BUTTON_WHITE_LIST: "Biała lista" BUTTON_SIEVE_CONFIGURATION: "Konfiguracja sieve" BUTTON_BACK_TO_IMAP: "Powrót do ustawień serwera IMAP" diff --git a/rainloop/v/0.0.0/app/localization/admin/pt_BR.yml b/rainloop/v/0.0.0/app/localization/admin/pt_BR.yml index 0179fb8f1..a5b4db79a 100644 --- a/rainloop/v/0.0.0/app/localization/admin/pt_BR.yml +++ b/rainloop/v/0.0.0/app/localization/admin/pt_BR.yml @@ -34,6 +34,7 @@ pt_BR: LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Permitir contas adicionais" LABEL_ALLOW_IDENTITIES: "Permitir identidades multiplas" LABEL_ALLOW_TEMPLATES: "Permitir templates" + ALERT_DATA_ACCESS: "A pasta de dados RainLoop está acessível. Por favor configure o seu servidor web para esconder a pasta de dados do acesso externo. Leia mais aqui:" ALERT_WARNING: "Aviso!" HTML_ALERT_WEAK_PASSWORD: | Você está usando a senha administrativa padrão. diff --git a/rainloop/v/0.0.0/app/localization/admin/sk_SK.yml b/rainloop/v/0.0.0/app/localization/admin/sk_SK.yml index dfe63b1ad..abff0178a 100644 --- a/rainloop/v/0.0.0/app/localization/admin/sk_SK.yml +++ b/rainloop/v/0.0.0/app/localization/admin/sk_SK.yml @@ -1,9 +1,10 @@ sk_SK: LOGIN: - LABEL_LOGIN: "Používateľské meno" + LABEL_LOGIN: "Prihlasovanie" LABEL_PASSWORD: "Heslo" BUTTON_LOGIN: "Prihlásiť sa do admin panelu" TOP_PANEL: + LABEL_PREMIUM: "Premium" LABEL_ADMIN_PANEL: "Admin Panel" TABS_LABELS: LABEL_GENERAL_NAME: "Všeobecné" @@ -13,6 +14,7 @@ sk_SK: LABEL_DOMAINS_NAME: "Domény" LABEL_SECURITY_NAME: "Zabezpečenie" LABEL_INTEGRATION_NAME: "Integrácie" + LABEL_PLUGINS_NAME: "Doplnky" LABEL_PACKAGES_NAME: "Balíčky" LABEL_LICENSING_NAME: "Licencovanie" LABEL_ABOUT_NAME: "O programe" @@ -21,13 +23,33 @@ sk_SK: LABEL_LANGUAGE: "Jazyk" LABEL_LANGUAGE_ADMIN: "Jazyk (admin)" LABEL_THEME: "Téma" + LABEL_ALLOW_LANGUAGES_ON_SETTINGS: "Povoliť výber jazyka v nastaveniach" + LABEL_ALLOW_THEMES_ON_SETTINGS: "Povoliť výber témy v nastaveniach" + LABEL_ALLOW_BACKGROUND_ON_SETTINGS: "Povoliť výber pozadia v nastaveniach" + LABEL_SHOW_THUMBNAILS: "Zobraziť náhľady (prílohy)" + LABEL_ALLOW_GRAVATAR: "Povoliť Gravatar" LEGEND_MAIN: "Všeobecné" + LABEL_ATTACHMENT_SIZE_LIMIT: "Maximálna veľkosť prílohy" + LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Povoliť ďalšie účty" + LABEL_ALLOW_IDENTITIES: "Povoliť viaceré identity" LABEL_ALLOW_TEMPLATES: "Povoliť šablóny" + ALERT_DATA_ACCESS: "Adresár data je dostupný. Prosím skonfigurujte svoj webserver tak, aby bol adresár data nedostupný. Viac informácií:" ALERT_WARNING: "Upozornenie!" + HTML_ALERT_WEAK_PASSWORD: | + Používate predvolené administrátorské heslo. +
      + Kvôli bezpečnosti prosím + zmeňte + heslo na iné. TAB_LOGIN: LEGEND_LOGIN_SCREEN: "Prihlasovacia obrazovka" LABEL_DEFAULT_DOMAIN: "Predvolená doména" + LABEL_DETERMINE_USER_DOMAIN: "Pokúsiť sa určiť doménu používateľa" + LABEL_ALLOW_LANGUAGES_ON_LOGIN: "Povoliť výber jazyka na prihlasovacej obrazovke" + LABEL_DETERMINE_USER_LANGUAGE: "Pokúsiť sa určiť používateľov jazyk" TAB_BRANDING: + LEGEND_BRANDING: "Vlastné označenie" + LABEL_PAGE_TITLE: "Názov stránky" LABEL_FAVICON_URL: "Favicon" LEGEND_LOGIN: "Používateľské meno" LABEL_LOGIN_LOGO: "Logo" @@ -37,6 +59,8 @@ sk_SK: LABEL_LOGIN_SHOW_POWERED_LINK: "Zobraziť link \"Powered by RainLoop\"" LEGEND_USER: "Užívateľ" LABEL_USER_LOGO: "Logo" + LABEL_USER_LOGO_TITLE: "Nadpis loga" + LABEL_USER_LOGO_MESSAGE: "Logo (zobrazenie správy)" LABEL_USER_CUSTOM_CSS: "Vlastné CSS" LEGEND_WELCOME_PAGE: "Uvítacia stránka" LABEL_WELCOME_PAGE_TITLE: "Nadpis" @@ -47,12 +71,15 @@ sk_SK: OPTION_WELCOME_PAGE_DISPLAY_ALWAYS: "Vždy" TAB_CONTACTS: LEGEND_CONTACTS: "Kontakty" + LEGEND_STORAGE: "Úložisko (PDO)" LABEL_ENABLE_CONTACTS: "Zapnúť kontakty" + LABEL_ALLOW_SYNC: "Povoliť synchronizáciu kontaktov (s externým CardDAV serverom)" LABEL_STORAGE_TYPE: "Typ" LABEL_STORAGE_DSN: "Dsn" LABEL_STORAGE_USER: "Užívateľ" LABEL_STORAGE_PASSWORD: "Heslo" BUTTON_TEST: "Test" + HTML_ALERT_DO_NOT_USE_THIS_DATABASE: "Nepoužívajte tento typ databázy, ak máte veľký počet aktívnych používateľov." TAB_DOMAINS: LEGEND_DOMAINS: "Domény" BUTTON_ADD_DOMAIN: "Pridať doménu" @@ -60,20 +87,32 @@ sk_SK: DELETE_ARE_YOU_SURE: "Ste si istí?" TAB_SECURITY: LEGEND_SECURITY: "Bezpečnosť" + LABEL_ALLOW_TWO_STEP: "Povoliť 2-krokovú verifikáciu" + LABEL_FORCE_TWO_STEP: "Vyžadovať 2-krokovú verifikáciu" + LABEL_ALLOW_OPEN_PGP: "Povoliť OpenPGP" + LABEL_SHOW_PHP_INFO: "Zobraziť informácie o PHP" LABEL_CURRENT_PASSWORD: "Súčasné heslo" + LABEL_NEW_LOGIN: "Nový login" LABEL_NEW_PASSWORD: "Nové heslo" LABEL_REPEAT_PASSWORD: "Opakovať" + BUTTON_UPDATE_PASSWORD: "Zmeniť heslo" LEGEND_SSL: "SSL" TAB_INTEGRATIONS: LEGEND_GOOGLE: "Google" + LABEL_ENABLE_GOOGLE: "Povoliť integráciu s Google" LABEL_GOOGLE_AUTH: "Overenie" LABEL_GOOGLE_CLIENT_ID: "ID klienta" LABEL_GOOGLE_API_KEY: "Api kľúč" LEGEND_FACEBOOK: "Facebook" + LABEL_ENABLE_FACEBOOK: "Povoliť integráciu s Facebook (autorizácia)" LEGEND_TWITTER: "Twitter" LABEL_ENABLE_TWITTER: "Povoliť Twitter intergáciu (overenie)" LEGEND_DROPBOX: "Dropbox" + LABEL_ENABLE_DROPBOX: "Povoliť integráciu s Dropbox" LABEL_DROPBOX_API_KEY: "Api kľúč" + TAB_PLUGINS: + LEGEND_PLUGINS: "Doplnky" + LABEL_ENABLE_PLUGINS: "Povoliť doplnky" TAB_PACKAGES: LEGEND_AVAILABLE_FOR_UPDATE: "Dostupné na aktualizáciu" LEGEND_AVAILABLE_FOR_INSTALLATION: "Dostupné na inštaláciu" @@ -88,6 +127,7 @@ sk_SK: BUTTON_PURCHASE: "Kúpiť" BUTTON_TRIAL: "Skúšobná verzia" TAB_ABOUT: + LEGEND_ABOUT: "O programe" LABEL_TAG_HINT: "Jednoduchý, moderný a rýchly webmail klient" LABEL_ALL_RIGHTS_RESERVED: "Všetky práva vyhradené." HINT_READ_CHANGE_LOG: "Prosím prečítajte si zoznam zmien pred aktualizáciou." @@ -120,22 +160,27 @@ sk_SK: LABEL_SERVER: "Server" LABEL_PORT: "Port" LABEL_SECURE: "Bezpečné" + LABEL_WHITE_LIST: "Zoznam povolených" SECURE_OPTION_NONE: "Žiadne" SECURE_OPTION_SSL: "SSL/TLS" SECURE_OPTION_STARTTLS: "STARTTLS" + LABEL_ALLOW_SIEVE_SCRIPTS: "Povoliť Sieve skripty" LABEL_USE_SHORT_LOGIN: "Použiť skrátené prihlásenie" LABEL_USE_AUTH: "Použiť overenie" LABEL_USE_PHP_MAIL: "Použiť php mail() funkciu" BUTTON_TEST: "Test" - BUTTON_SIEVE_CONFIGURATION: "Uložiť nastavenia" + BUTTON_WHITE_LIST: "Zoznam povolených" + BUTTON_SIEVE_CONFIGURATION: "Nastavenia Sieve" BUTTON_BACK_TO_IMAP: "Späť do IMAP nastavení" BUTTON_BACK: "Späť" BUTTON_CLOSE: "Zatvoriť" BUTTON_ADD: "Pridať" BUTTON_UPDATE: "Aktualizovať" POPUPS_PLUGIN: + TITLE_PLUGIN: "Doplnok" BUTTON_CLOSE: "Zatvoriť" BUTTON_SAVE: "Uložiť" + TOOLTIP_ABOUT_TITLE: "O programe" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Zvoľte jazyk" HINTS: diff --git a/rainloop/v/0.0.0/app/localization/admin/sv_SE.yml b/rainloop/v/0.0.0/app/localization/admin/sv_SE.yml index fd9912cb9..a73b5b38b 100644 --- a/rainloop/v/0.0.0/app/localization/admin/sv_SE.yml +++ b/rainloop/v/0.0.0/app/localization/admin/sv_SE.yml @@ -34,7 +34,8 @@ sv_SE: LABEL_ALLOW_ADDITIONAL_ACCOUNTS: "Tillåt ytterligare konton" LABEL_ALLOW_IDENTITIES: "Tillåt multiidentiteter" LABEL_ALLOW_TEMPLATES: "Tillåt mallar" - ALERT_WARNING: "Advarsel!" + ALERT_DATA_ACCESS: "RainLoops datamapp är åtkomstbar. Var vänlig konfigurera din webb-server för att förhindra extern åtkomst och synlighet. Läs mer här: " + ALERT_WARNING: "Varning!" HTML_ALERT_WEAK_PASSWORD: | Du använder standardlösenord.
      diff --git a/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml b/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml index 5ddaee1b6..68e863481 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/cs_CZ.yml @@ -27,7 +27,7 @@ cs_CZ: LABEL_ADV_TO: "Příjemce" LABEL_ADV_SUBJECT: "Předmět" LABEL_ADV_TEXT: "Text" - LABEL_ADV_HAS_ATTACHMENT: "S přílohu" + LABEL_ADV_HAS_ATTACHMENT: "S přílohou" LABEL_ADV_HAS_ATTACHMENTS: "S přílohami" LABEL_ADV_FLAGGED: "Označené hvězdičkou" LABEL_ADV_UNSEEN: "Nepřečtené" @@ -102,13 +102,14 @@ cs_CZ: BUTTON_BACK: "Zpět" BUTTON_CLOSE: "Zavřít" BUTTON_DELETE: "Odstranit" + BUTTON_UNSUBSCRIBE: "Odhlásit se z odběru" BUTTON_ARCHIVE: "Archivovat" BUTTON_SPAM: "Je to SPAM" BUTTON_NOT_SPAM: "Není to SPAM" BUTTON_MOVE_TO: "Přesunout do" BUTTON_MORE: "Více" BUTTON_REPLY: "Odpovědět" - BUTTON_REPLY_ALL: "Odpovědaě všem" + BUTTON_REPLY_ALL: "Odpovědět všem" BUTTON_FORWARD: "Přeposlat" BUTTON_FORWARD_AS_ATTACHMENT: "Přeposlat jako přílohu" BUTTON_EDIT_AS_NEW: "Použit jako šablonu" @@ -144,6 +145,7 @@ cs_CZ: PRINT_LABEL_ATTACHMENTS: "Přílohy" MESSAGE_LOADING: "Načítám" MESSAGE_VIEW_DESC: "Vyberte zprávu ze seznamu pro její zobrazení zde." + MESSAGE_VIEW_MOVE_DESC: "Vyberte cílovou složku v levém panelu." PGP_PASSWORD_INPUT_PLACEHOLDER: "Heslo" PGP_SIGNED_MESSAGE_DESC: "Zpráva podepsaná OpenPGP (klikněte pro ověření)" PGP_ENCRYPTED_MESSAGE_DESC: "Zpráva šifrovaná OpenPGP (klikněte pro dešifraci)" @@ -232,10 +234,10 @@ cs_CZ: NO_ATTACHMENTS_HERE_DESC: "Žádné přílohy." ATTACHMENTS_ERROR_DESC: "Upozornění! Některé přílohy nebyly nahrány." ATTACHMENTS_UPLOAD_ERROR_DESC: "Některé přílohy ještě nebyly nahrány" - BUTTON_REQUEST_READ_RECEIPT: "Vyžádat si potvrzení o příjetí" + BUTTON_REQUEST_READ_RECEIPT: "Vyžádat si potvrzení o přečtení" BUTTON_MARK_AS_IMPORTANT: "Označit jako důležité" BUTTON_OPEN_PGP: "OpenPGP (jen Plain Text)" - BUTTON_REQUEST_DSN: "Request a delivery receipt" + BUTTON_REQUEST_DSN: "Vyžádat si potvrzení o přijetí" POPUPS_WELCOME_PAGE: BUTTON_CLOSE: "Zavřít" POPUPS_ASK: @@ -377,28 +379,29 @@ cs_CZ: LEGEND_TWO_FACTOR_AUTH: "Dvoufázové ověření" LABEL_ENABLE_TWO_FACTOR: "Povlit dvoufázové ověření" LABEL_TWO_FACTOR_USER: "Uživatel" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Create New Secret" + LABEL_TWO_FACTOR_STATUS: "Stav" + LABEL_TWO_FACTOR_SECRET: "Tajný klíč" + LABEL_TWO_FACTOR_BACKUP_CODES: "Záložní kódy" + BUTTON_CREATE: "Aktivovat dvoustupňové přihlašování" BUTTON_ACTIVATE: "Aktivovat" - BUTTON_CLEAR: "Clear" + BUTTON_CLEAR: "Zrušit dvoustupňové přihlašování" BUTTON_LOGOUT: "Odhlásit" BUTTON_DONE: "Hotovo" BUTTON_TEST: "Test" - LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" + LINK_TEST: "Otestovat" + BUTTON_SHOW_SECRET: "Zobrazit tajné klíče" + BUTTON_HIDE_SECRET: "Skrýt tajné klíče" TWO_FACTOR_REQUIRE_DESC: "Váš účet vyžaduje nastavení dvoufázového ověření" TWO_FACTOR_SECRET_CONFIGURED_DESC: "Nastaveno" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nenastaveno" - TWO_FACTOR_SECRET_DESC: >- - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: >- - If you can't receive codes via Google Authenticator, you can use backup codes - to sign in. After you’ve used a backup code to sign in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + TWO_FACTOR_SECRET_DESC: > + Importujte klíč do Vašeho Google Authenticatoru (nebo jiného TOTP klienta) + pomocí níže uvedeného QR kódu nebo zadáním kódu ručně. + TWO_FACTOR_BACKUP_CODES_DESC: > + Pokud nemůžete získat kódy skrze Google Authenticator (nebo jiného TOTP klienta), + můžete použít záložní kódy k přihlášení. Poté, co použijete záložní klíč, + stane se nadále neaktivním. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Toto nastavení nelze změnit před otestováním." TITLES: LOADING: "Načítám" LOGIN: "Uživatelské jméno" @@ -411,9 +414,10 @@ cs_CZ: ERROR_NO_FILE_UPLOADED: "Soubor nebyl nahrán" ERROR_MISSING_TEMP_FOLDER: "Chybí dočasný soubor" ERROR_ON_SAVING_FILE: "Nastala neznámá chyba při ukládání" - ERROR_FILE_TYPE: "Nesprávny typ souboru" + ERROR_FILE_TYPE: "Neplatný typ souboru" ERROR_UNKNOWN: "Nastala neznámá chyba při nahrávaní" EDITOR: + TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> TEXT" TEXT_SWITCHER_RICH_FORMATTING: "Formátovaný text" TEXT_SWITCHER_CONFIRM: "Formátování textu a obrázky budou odstraněné. Chcete pokračovat?" SETTINGS_LABELS: @@ -422,8 +426,8 @@ cs_CZ: LABEL_CONTACTS_NAME: "Kontakty" LABEL_FOLDERS_NAME: "Složky" LABEL_ACCOUNTS_NAME: "Účty" - LABEL_IDENTITY_NAME: "Identita" - LABEL_IDENTITIES_NAME: "Identity" + LABEL_IDENTITY_NAME: "Alias" + LABEL_IDENTITIES_NAME: "Aliasy" LABEL_FILTERS_NAME: "Filtry" LABEL_TEMPLATES_NAME: "Šablony" LABEL_SECURITY_NAME: "Zabezpečení" @@ -446,10 +450,10 @@ cs_CZ: SUBNAME_DISCARD: "Zahodit" CAPABILITY_LABEL: "Capability" LOADING_PROCESS: "Aktualizovat seznam filtrů" - DELETING_ASK: "Opravdu to chcete?" + DELETING_ASK: "Jste si jisti?" CHACHES_NEED_TO_BE_SAVED_DESC: "Změny musí být uloženy na serveru." SETTINGS_IDENTITY: - LEGEND_IDENTITY: "Identita" + LEGEND_IDENTITY: "Aliasy" LABEL_DISPLAY_NAME: "Jméno" LABEL_REPLY_TO: "Adresa pro odpovědi" LABEL_SIGNATURE: "Podpis" @@ -460,11 +464,12 @@ cs_CZ: LABEL_AUTOLOGOUT: "Automatické odhlášení" AUTOLOGIN_NEVER_OPTION_NAME: "Nikdy" AUTOLOGIN_MINUTES_OPTION_NAME: "%MINUTES% minut" + AUTOLOGIN_HOURS_OPTION_NAME: "%HOURS% hodin" SETTINGS_GENERAL: LEGEND_GENERAL: "Všeobecné" LABEL_LANGUAGE: "Jazyk" - LABEL_IDENTITY: "Identity" - LABEL_LAYOUT: "Layout" + LABEL_IDENTITY: "Uživatel" + LABEL_LAYOUT: "Rozložení" LABEL_LAYOUT_NO_SPLIT: "Nerozdělovat" LABEL_LAYOUT_VERTICAL_SPLIT: "Vertikální rozdělení" LABEL_LAYOUT_HORIZONTAL_SPLIT: "Horizontální rozdělění" @@ -472,7 +477,7 @@ cs_CZ: LABEL_EDITOR_HTML: "Html" LABEL_EDITOR_PLAIN: "Text" LABEL_EDITOR_HTML_FORCED: "Html (vynucený)" - LABEL_EDITOR_PLAIN_FORCED: "Plain (vynucený)" + LABEL_EDITOR_PLAIN_FORCED: "Text (vynucený)" LABEL_ANIMATION: "Animace prostředí" LABEL_ANIMATION_FULL: "Všechny" LABEL_ANIMATION_NORMAL: "Normální" @@ -495,7 +500,7 @@ cs_CZ: LEGEND_CONTACTS_SYNC: "Vzdálená synchronizace (CardDAV)" LABEL_CONTACTS_SYNC_ENABLE: "Povolit vzdálenou synchronizaci" LABEL_CONTACTS_SYNC_SERVER: "Server" - LABEL_CONTACTS_SYNC_AB_URL: "Addressbook URL" + LABEL_CONTACTS_SYNC_AB_URL: "URL adresáře" LABEL_CONTACTS_SYNC_USER: "Uživatel" LABEL_CONTACTS_SYNC_PASSWORD: "Heslo" SETTINGS_THEMES: @@ -525,6 +530,7 @@ cs_CZ: SETTINGS_FOLDERS: LEGEND_FOLDERS: "Seznam složek" BUTTON_CREATE: "Vytvořit složku" + BUTTON_SYSTEM: "Systémové složky" BUTTON_DELETE: "Odstranit" BUTTON_SUBSCRIBE: "Přihlásit se" BUTTON_UNSUBSCRIBE: "Odhlásit se" @@ -532,7 +538,7 @@ cs_CZ: CREATING_PROCESS: "Vytvářím složku" DELETING_PROCESS: "Odstraňuji složku" RENAMING_PROCESS: "Přejmenovávám složku" - DELETING_ASK: "Opravdu to chcete?" + DELETING_ASK: "Jste si jisti?" TO_MANY_FOLDERS_DESC_1: "Máte moc složek!" TO_MANY_FOLDERS_DESC_2: "Můžeme zobrazit jen část z nich, abychom zabránili problémům s výkonem." HELP_DELETE_FOLDER: "Smazat složku" @@ -540,25 +546,25 @@ cs_CZ: HELP_CHECK_FOR_NEW_MESSAGES: "Kontrovat/nekontrolovat nové příchozí zprávy" SETTINGS_ACCOUNTS: LEGEND_ACCOUNTS: "Seznam účtů" - LEGEND_IDENTITIES: "Identity" - LEGEND_ACCOUNTS_AND_IDENTITIES: "Účty a identity" + LEGEND_IDENTITIES: "Aliasy" + LEGEND_ACCOUNTS_AND_IDENTITIES: "Účty a aliasy" BUTTON_ADD_ACCOUNT: "Přidat účet" - BUTTON_ADD_IDENTITY: "Přidat identitu" + BUTTON_ADD_IDENTITY: "Přidat alias" BUTTON_DELETE: "Odstranit" LOADING_PROCESS: "Aktualizace seznamu účtů" DELETING_ASK: "Opravdu to chcete?" DEFAULT_IDENTITY_LABEL: "výchozí" SETTINGS_IDENTITIES: - LEGEND_IDENTITY: "Identita" - LEGEND_IDENTITIES: "Další identity" + LEGEND_IDENTITY: "Alias" + LEGEND_IDENTITIES: "Další aliasy" LABEL_DEFAULT: "Výchozí" LABEL_DISPLAY_NAME: "Jméno" LABEL_REPLY_TO: "Adresa pro odpověď" LABEL_SIGNATURE: "Podpis" LABEL_ADD_SIGNATURE_TO_ALL: "Připojit ke všem odeslaným zprávám" - BUTTON_ADD_IDENTITY: "Přidat Identitu" + BUTTON_ADD_IDENTITY: "Přidat alias" BUTTON_DELETE: "Odstranit" - LOADING_PROCESS: "Aktualizace seznamu identit" + LOADING_PROCESS: "Aktualizace seznamu aliasů" DELETING_ASK: "Opravdu to chcete?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Změnit heslo" @@ -575,6 +581,7 @@ cs_CZ: TITLE_PUBLIC: "Veřejný" DELETING_ASK: "Opravdu to chcete?" GENERATE_ONLY_HTTPS: "Pouze HTTPS" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Automaticky uložit koncept" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Klávesové zkratky" TAB_MAILBOX: "Schránka" @@ -597,37 +604,37 @@ cs_CZ: LABEL_IMPORTANT: "Označit vybrané zprávy jako důležité" LABEL_SEARCH: "Hledat" LABEL_CANCEL_SEARCH: "Zrušit hledání" - LABEL_FULLSCREEN_ENTER: "Fullscreen (Preview pane layout)" - LABEL_VIEW_MESSAGE_ENTER: "View message (No preview pane layout)" - LABEL_SWITCH_TO_MESSAGE: "Switch focus to selected message" - LABEL_SWITCH_TO_FOLDER_LIST: "Switch focus to folder list" - LABEL_FULLSCREEN_TOGGLE: "Toggle fullscreen mode" - LABEL_BLOCKQUOTES_TOGGLE: "Toggle message blockquotes" - LABEL_THREAD_NEXT: "Next message in thread" - LABEL_THREAD_PREV: "Previous message in thread" + LABEL_FULLSCREEN_ENTER: "Celoobrazovkové rozložení (náhled)" + LABEL_VIEW_MESSAGE_ENTER: "Zobrazit zprávu (bez náhledu)" + LABEL_SWITCH_TO_MESSAGE: "Zobrazit vybranou zprávu" + LABEL_SWITCH_TO_FOLDER_LIST: "Skočit do panelu adresářů" + LABEL_FULLSCREEN_TOGGLE: "Přepnout režim celé obrazovky" + LABEL_BLOCKQUOTES_TOGGLE: "Přepnout zobrazení přiložených zpráv" + LABEL_THREAD_NEXT: "Následující zpráva ve vlákně" + LABEL_THREAD_PREV: "Předchozí zpráva ve vlákně" LABEL_PRINT: "Tisk" - LABEL_EXIT_FULLSCREEN: "Exit fullscreen mode" - LABEL_CLOSE_MESSAGE: "Close message (No preview pane layout)" - LABEL_SWITCH_TO_LIST: "Switch focus back to message list" - LABEL_OPEN_COMPOSE_POPUP: "Open compose popup" - LABEL_MINIMIZE_COMPOSE_POPUP: "Minimize compose popup" - LABEL_OPEN_IDENTITIES_DROPDOWN: "Open identities dropdown" - LABEL_SAVE_MESSAGE: "Save message" - LABEL_SEND_MESSAGE: "Send message" - LABEL_CLOSE_COMPOSE: "Close compose" + LABEL_EXIT_FULLSCREEN: "Ukončit režim celé obrazovky" + LABEL_CLOSE_MESSAGE: "Zavřít zprávu (bez náhledu)" + LABEL_SWITCH_TO_LIST: "Vrátit se zpět do seznamu zpráv" + LABEL_OPEN_COMPOSE_POPUP: "Nová zpráva v okně" + LABEL_MINIMIZE_COMPOSE_POPUP: "Minimalizovat otevřené okno" + LABEL_OPEN_IDENTITIES_DROPDOWN: "Otevřít seznam aliasů" + LABEL_SAVE_MESSAGE: "Uložit zprávu" + LABEL_SEND_MESSAGE: "Odeslat zprávu" + LABEL_CLOSE_COMPOSE: "Zavřít okno se zprávou" PGP_NOTIFICATIONS: - NO_PUBLIC_KEYS_FOUND: "No public keys found" - NO_PUBLIC_KEYS_FOUND_FOR: "No public keys found for \"%EMAIL%\" email" - NO_PRIVATE_KEY_FOUND: "No private key found" - NO_PRIVATE_KEY_FOUND_FOR: "No private key found for \"%EMAIL%\" email" - ADD_A_PUBLICK_KEY: "Add a public key" + NO_PUBLIC_KEYS_FOUND: "Nenalezen žádný veřejný klíč" + NO_PUBLIC_KEYS_FOUND_FOR: "Žádný veřejný klíč pro \"%EMAIL%\" nenalezen" + NO_PRIVATE_KEY_FOUND: "Nenalezen žádný soukromý klíč" + NO_PRIVATE_KEY_FOUND_FOR: "Žádný soukromý klíč pro \"%EMAIL%\" nenalezen" + ADD_A_PUBLICK_KEY: "Přidat veřejný klíč" SELECT_A_PRIVATE_KEY: "Vyberte soukromý klíč" - UNVERIFIRED_SIGNATURE: "Unverified signature" - DECRYPTION_ERROR: "OpenPGP decryption error" - GOOD_SIGNATURE: "Good signature from %USER%" - PGP_ERROR: "OpenPGP error: %ERROR%" - SPECIFY_FROM_EMAIL: "Please specify FROM email address" - SPECIFY_AT_LEAST_ONE_RECIPIENT: "Please specify at least one recipient" + UNVERIFIRED_SIGNATURE: "Neověřený podpis" + DECRYPTION_ERROR: "OpenPGP chyba dešifrování" + GOOD_SIGNATURE: "Ověřený podpis od %USER%" + PGP_ERROR: "OpenPGP chyba: %ERROR%" + SPECIFY_FROM_EMAIL: "Zadejte emailovou adresu odesílatele" + SPECIFY_AT_LEAST_ONE_RECIPIENT: "Zadejte prosím alespoň jednoho příjemce" NOTIFICATIONS: INVALID_TOKEN: "Neplatný token" AUTH_ERROR: "Ověření selhalo" @@ -667,8 +674,8 @@ cs_CZ: CANT_RENAME_FOLDER: "Složku se nepodařilo přejmenovat" CANT_DELETE_FOLDER: "Složku se nepodařilo odstranit" CANT_DELETE_NON_EMPTY_FOLDER: "Nelze odstranit neprázdnou složku" - CANT_SUBSCRIBE_FOLDER: "Can't subscribe folder" - CANT_UNSUBSCRIBE_FOLDER: "Can't unsubscribe folder" + CANT_SUBSCRIBE_FOLDER: "Nelze přihlásit adresář" + CANT_UNSUBSCRIBE_FOLDER: "Nelze odhlásit adresář" CANT_SAVE_SETTINGS: "Nastavení se nepodařilo uložit" CANT_SAVE_PLUGIN_SETTINGS: "Nastavení se nepodařilo uložit" DOMAIN_ALREADY_EXISTS: "Táto doména již existuje" diff --git a/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml b/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml index 0592e8efb..b82e10447 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/pl_PL.yml @@ -10,7 +10,7 @@ pl_PL: TITLE_SIGN_IN_GOOGLE: "Zaloguj się przez Google" TITLE_SIGN_IN_FACEBOOK: "Zaloguj się przez Facebook" TITLE_SIGN_IN_TWITTER: "Zaloguj się przez Twitter" - LABEL_FORGOT_PASSWORD: "Zapomniałem(-am) hasło" + LABEL_FORGOT_PASSWORD: "Zapomniane hasło" LABEL_REGISTRATION: "Rejestracja" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Dodaj konto" @@ -89,20 +89,20 @@ pl_PL: EMPTY_SEARCH_LIST: "Brak wiadomości spełniających kryteria wyszukiwania." SEARCH_RESULT_FOR: "Wyniki wyszukiwania dla \"%SEARCH%\"" BACK_TO_MESSAGE_LIST: "powrót do listy wiadomości" - LIST_LOADING: "Ładowanie..." + LIST_LOADING: "Ładowanie" EMPTY_SUBJECT_TEXT: "(Brak tematu)" - PUT_MESSAGE_HERE: "Przeciągnij wiadomość tutaj, żeby zobaczyć ją na liście" + PUT_MESSAGE_HERE: "Upuść wiadomość tutaj, aby zobaczyć ją na liście" TODAY_AT: "dzisiaj o %TIME%" YESTERDAY_AT: "wczoraj o %TIME%" SEARCH_PLACEHOLDER: "Szukaj" - NEW_MESSAGE_NOTIFICATION: "Masz: %COUNT% now(-ą,-e,-ych) wiadomości!" + NEW_MESSAGE_NOTIFICATION: "Masz %COUNT% now(-ą,-e,-ych) wiadomość(-ci)!" QUOTA_SIZE: "Wykorzystano %SIZE% (%PROC%%) z %LIMIT%" MESSAGE: BUTTON_EDIT: "Edytuj" BUTTON_BACK: "Wstecz" BUTTON_CLOSE: "Zamknij" BUTTON_DELETE: "Usuń" - BUTTON_UNSUBSCRIBE: "Zrezygnuj z subskrypcji" + BUTTON_UNSUBSCRIBE: "Zrezygnuj z subskrypcji tej listy" BUTTON_ARCHIVE: "Archiwizuj" BUTTON_SPAM: "Oznacz jako niechcianą" BUTTON_NOT_SPAM: "Oznacz jako pożądaną" @@ -165,7 +165,7 @@ pl_PL: CONTACTS: LEGEND_CONTACTS: "Kontakty" SEARCH_INPUT_PLACEHOLDER: "Szukaj" - BUTTON_ADD_CONTACT: "Dodaj Kontakt" + BUTTON_ADD_CONTACT: "Dodaj kontakt" BUTTON_CREATE_CONTACT: "Utwórz" BUTTON_UPDATE_CONTACT: "Zaktualizuj" BUTTON_IMPORT: "Importuj (csv, vcf, vCard)" @@ -224,7 +224,7 @@ pl_PL: ATTACH_ITEM_CANCEL: "Anuluj" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Dysk Google" - REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL%" + REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% napisał/-a/" FORWARD_MESSAGE_TOP_TITLE: "-------- Wiadomość przekazana -------" FORWARD_MESSAGE_TOP_FROM: "Od" FORWARD_MESSAGE_TOP_TO: "Do" @@ -235,7 +235,7 @@ pl_PL: NO_ATTACHMENTS_HERE_DESC: "Brak załączników." ATTACHMENTS_ERROR_DESC: "Ostrzeżenie! Nie wszystkie załączniki zostały przesłane na serwer." ATTACHMENTS_UPLOAD_ERROR_DESC: "Jeszcze nie wszystkie załączniki zostały przesłane na serwer." - BUTTON_REQUEST_READ_RECEIPT: "Żądaj potwierdzenia wyświetlenia wiadomości" + BUTTON_REQUEST_READ_RECEIPT: "Żądaj potwierdzenia przeczytania wiadomości" BUTTON_MARK_AS_IMPORTANT: "Oznacz jako ważną" BUTTON_OPEN_PGP: "OpenPGP (tylko wiadomości tekstowe)" BUTTON_REQUEST_DSN: "Żądaj potwierdzenia dostarczenia wiadomości" @@ -244,8 +244,8 @@ pl_PL: POPUPS_ASK: BUTTON_YES: "Tak" BUTTON_NO: "Nie" - DESC_WANT_CLOSE_THIS_WINDOW: "Na pewno zamknąć to okno?" - DESC_WANT_DELETE_MESSAGES: "Na pewno usunąć wiadomość(-ci)?" + DESC_WANT_CLOSE_THIS_WINDOW: "Na pewno chcesz zamknąć to okno?" + DESC_WANT_DELETE_MESSAGES: "Na pewno chcesz usunąć wiadomość(-ci)?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Wybierz język" POPUPS_ADD_ACCOUNT: @@ -275,7 +275,7 @@ pl_PL: TITLE_CREATING_PROCESS: "Tworzenie folderu" POPUPS_CLEAR_FOLDER: TITLE_CLEAR_FOLDER: "Czy usunąć wszystkie wiadomości z folderu?" - BUTTON_CLEAR: "Usuń wszystkie" + BUTTON_CLEAR: "Wyczyść" BUTTON_CANCEL: "Anuluj" BUTTON_CLOSE: "Zamknij" DANGER_DESC_WARNING: "Ostrzeżenie!" @@ -338,8 +338,8 @@ pl_PL: SELECT_TYPE_NOT_MATCHES: "nie zawiera (*, ?)" SELECT_TYPE_REGEXP: "Wyrażenie regularne" SELECT_TYPE_NOT_REGEXP: "Niepoprawne wyrażenie regularne" - SELECT_TYPE_EQUAL_TO: "równy" - SELECT_TYPE_NOT_EQUAL_TO: "nierówny" + SELECT_TYPE_EQUAL_TO: "Równa się" + SELECT_TYPE_NOT_EQUAL_TO: "Nie równa się" SELECT_TYPE_OVER: "powyżej" SELECT_TYPE_UNDER: "poniżej" SELECT_MATCH_ANY: "Spełnia dowolny z warunków" @@ -357,7 +357,7 @@ pl_PL: POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Wybierz foldery systemowe" SELECT_CHOOSE_ONE: "Wybierz" - SELECT_UNUSE_NAME: "nie używaj" + SELECT_UNUSE_NAME: "Nie używaj" LABEL_SENT: "Wysłane" LABEL_DRAFTS: "Szkice" LABEL_SPAM: "Spam" @@ -383,15 +383,15 @@ pl_PL: LABEL_TWO_FACTOR_STATUS: "Status" LABEL_TWO_FACTOR_SECRET: "Tajna fraza" LABEL_TWO_FACTOR_BACKUP_CODES: "Kody zapasowe" - BUTTON_CREATE: "Utwórz nową frazę" + BUTTON_CREATE: "Utwórz sekretną frazę" BUTTON_ACTIVATE: "Aktywuj" BUTTON_CLEAR: "Wyczyść" BUTTON_LOGOUT: "Wyloguj" BUTTON_DONE: "Zamknij" BUTTON_TEST: "Testuj" LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Pokaż frazę" - BUTTON_HIDE_SECRET: "Ukryj frazę" + BUTTON_SHOW_SECRET: "Pokaż sekretną frazę" + BUTTON_HIDE_SECRET: "Ukryj sekretną frazę" TWO_FACTOR_REQUIRE_DESC: "Twoje konto wymaga skonfigurowania autoryzacji 2-etapowej." TWO_FACTOR_SECRET_CONFIGURED_DESC: "Skonfigurowano" TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nie skonfigurowano" @@ -419,7 +419,7 @@ pl_PL: EDITOR: TEXT_SWITCHER_PLAINT_TEXT: "HTML <-> zwykły tekst" TEXT_SWITCHER_RICH_FORMATTING: "Wzbogacony format tekstowy" - TEXT_SWITCHER_CONFIRM: "Formatowanie tekstu oraz wszystkie wstawione obrazy zostaną utracone. Czy na pewno chcesz kontynuować?" + TEXT_SWITCHER_CONFIRM: "Formatowanie tekstu oraz wstawione obrazy zostaną utracone. Czy na pewno chcesz kontynuować?" SETTINGS_LABELS: LABEL_PERSONAL_NAME: "Osobiste" LABEL_GENERAL_NAME: "Ogólne" @@ -450,7 +450,7 @@ pl_PL: SUBNAME_DISCARD: "Porzuć" CAPABILITY_LABEL: "Możliwości" LOADING_PROCESS: "Aktualizowanie listy filtrów" - DELETING_ASK: "Czy jesteś pewny(a)?" + DELETING_ASK: "Jesteś pewien/pewna?" CHACHES_NEED_TO_BE_SAVED_DESC: "Zmiany te muszą zostać zapisane na serwerze." SETTINGS_IDENTITY: LEGEND_IDENTITY: "Tożsamość" @@ -538,7 +538,7 @@ pl_PL: CREATING_PROCESS: "Tworzenie folderu" DELETING_PROCESS: "Usuwanie folderu" RENAMING_PROCESS: "Zmiana nazwy folderu" - DELETING_ASK: "Czy na pewno usunąć?" + DELETING_ASK: "Jesteś pewien/pewna?" TO_MANY_FOLDERS_DESC_1: "Masz za dużo folderów!" TO_MANY_FOLDERS_DESC_2: "Pokazaliśmy tylko część z nich aby uniknąć problemów z wydajnością." HELP_DELETE_FOLDER: "Usuń folder" @@ -552,7 +552,7 @@ pl_PL: BUTTON_ADD_IDENTITY: "Dodaj tożsamość" BUTTON_DELETE: "Usuń" LOADING_PROCESS: "Trwa aktualizowanie listy kont" - DELETING_ASK: "Czy na pewno usunąć?" + DELETING_ASK: "Jesteś pewien/pewna?" DEFAULT_IDENTITY_LABEL: "domyślna" SETTINGS_IDENTITIES: LEGEND_IDENTITY: "Tożsamość" @@ -565,7 +565,7 @@ pl_PL: BUTTON_ADD_IDENTITY: "Dodaj tożsamość" BUTTON_DELETE: "Usuń" LOADING_PROCESS: "Trwa aktualizowanie listy tożsamości" - DELETING_ASK: "Czy na pewno chcesz usunąć?" + DELETING_ASK: "Jesteś pewien/pewna?" SETTINGS_CHANGE_PASSWORD: LEGEND_CHANGE_PASSWORD: "Zmiana hasła" LABEL_CURRENT_PASSWORD: "Aktualne hasło" @@ -579,7 +579,7 @@ pl_PL: BUTTON_GENERATE_OPEN_PGP_KEYS: "Generuj klucz OpenPGP" TITLE_PRIVATE: "Prywatny" TITLE_PUBLIC: "Publiczny" - DELETING_ASK: "Czy na pewno chcesz usunąć?" + DELETING_ASK: "Jesteś pewien/pewna?" GENERATE_ONLY_HTTPS: "Tylko HTTPS" LABEL_ALLOW_DRAFT_AUTOSAVE: "Automatycznie zapisuj szkic" SHORTCUTS_HELP: @@ -642,22 +642,22 @@ pl_PL: CONNECTION_ERROR: "Błąd połączenia z serwerem" CAPTCHA_ERROR: "Nieprawidłowy kod CAPTCHA." SOCIAL_FACEBOOK_LOGIN_ACCESS_DISABLE: > - Ten identyfikator społecznościowy (Facebook) nie jest powiązany z żadnym kontem + Ten identyfikator społecznościowy Facebook nie jest powiązany z żadnym kontem pocztowym. Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: Ustawienia > Sieci społecznościowe. SOCIAL_TWITTER_LOGIN_ACCESS_DISABLE: > - Ten identyfikator społecznościowy (Twitter) nie jest powiązany z żadnym kontem + Ten identyfikator społecznościowy Twitter nie jest powiązany z żadnym kontem pocztowym. Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: Ustawienia > Sieci społecznościowe. SOCIAL_GOOGLE_LOGIN_ACCESS_DISABLE: > - Ten identyfikator społecznościowy (Konto Google) nie jest powiązany z żadnym + Ten identyfikator społecznościowy Konto Google nie jest powiązany z żadnym kontem pocztowym. Zaloguj się używając danych swojego konta e-mail i skonfiguruj tę opcję w: Ustawienia > Sieci społecznościowe. - DOMAIN_NOT_ALLOWED: "Domena niedozwolona" + DOMAIN_NOT_ALLOWED: "Domena jest niedozwolona" ACCOUNT_NOT_ALLOWED: "Konto nie jest dozwolone" ACCOUNT_TWO_FACTOR_AUTH_REQUIRED: "Wymagana autoryzacja dwuetapowa" ACCOUNT_TWO_FACTOR_AUTH_ERROR: "Błąd autoryzacji dwuetapowej" - COULD_NOT_SAVE_NEW_PASSWORD: "Nie można było zapisać nowego hasła" + COULD_NOT_SAVE_NEW_PASSWORD: "Nie można zapisać nowego hasła" CURRENT_PASSWORD_INCORRECT: "Obecne hasło jest niepoprawne" NEW_PASSWORD_SHORT: "Hasło jest za krótkie" NEW_PASSWORD_WEAK: "Hasło jest zbyt łatwe" diff --git a/rainloop/v/0.0.0/app/localization/webmail/pt_BR.yml b/rainloop/v/0.0.0/app/localization/webmail/pt_BR.yml index 0b1e144cf..e1f2ebea9 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/pt_BR.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/pt_BR.yml @@ -151,6 +151,7 @@ pt_BR: PGP_ENCRYPTED_MESSAGE_DESC: "Mensagem criptografada com OpenPGP (clique para descriptografar)" LINK_DOWNLOAD_AS_ZIP: "Baixar como zip" LINK_SAVE_TO_OWNCLOUD: "Salvar no ownCloud" + LINK_SAVE_TO_CLOUD: "Salvar para a nuvem" LINK_SAVE_TO_DROPBOX: "Salvar no Dropbox" READ_RECEIPT: SUBJECT: "Aviso de recepção (Visualizada) - %SUBJECT%" @@ -581,6 +582,7 @@ pt_BR: TITLE_PUBLIC: "Público" DELETING_ASK: "Você tem certeza?" GENERATE_ONLY_HTTPS: "HTTPS only" + LABEL_ALLOW_DRAFT_AUTOSAVE: "Salvar automaticamente rascunho" SHORTCUTS_HELP: LEGEND_SHORTCUTS_HELP: "Ajuda com os atalhos de teclado" TAB_MAILBOX: "Caixa de correio" diff --git a/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml b/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml index 77f3c97f1..0fc09a9ea 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/sk_SK.yml @@ -5,13 +5,13 @@ sk_SK: LABEL_PASSWORD: "Heslo" LABEL_SIGN_ME: "Zapamätať" LABEL_VERIFICATION_CODE: "Verifikačný kód" - LABEL_DONT_ASK_VERIFICATION_CODE: "Don't ask for the code for 2 weeks" - BUTTON_SIGN_IN: "Prihlásiť" - TITLE_SIGN_IN_GOOGLE: "Prihlásiť pomocu Google" - TITLE_SIGN_IN_FACEBOOK: "Prihlásiť pomocou Facebook" - TITLE_SIGN_IN_TWITTER: "Prihlásiť pomocou Twitter" - LABEL_FORGOT_PASSWORD: "Forgot password" - LABEL_REGISTRATION: "Registration" + LABEL_DONT_ASK_VERIFICATION_CODE: "Nevyžadovať kód 2 týždne" + BUTTON_SIGN_IN: "Prihlásiť sa" + TITLE_SIGN_IN_GOOGLE: "Prihlásiť sa pomocu Google" + TITLE_SIGN_IN_FACEBOOK: "Prihlásiť sa pomocou Facebook" + TITLE_SIGN_IN_TWITTER: "Prihlásiť sa pomocou Twitter" + LABEL_FORGOT_PASSWORD: "Zabudol som heslo" + LABEL_REGISTRATION: "Registrácia" TOP_TOOLBAR: BUTTON_ADD_ACCOUNT: "Pridať účet" BUTTON_SETTINGS: "Nastavenia" @@ -41,8 +41,8 @@ sk_SK: LABEL_ADV_DATE_YEAR: "Nie staršie ako 1 rok" BUTTON_ADV_SEARCH: "Hľadať" PREVIEW_POPUP: - FULLSCREEN: "Toggle fullscreen" - ZOOM: "Zoom in/out" + FULLSCREEN: "Prepnúť na celú obrazovku" + ZOOM: "Zoom" CLOSE: "Zatvoriť (Esc)" LOADING: "Načítavam..." GALLERY_PREV: "Predchádzajúci (šípka vľavo)" @@ -61,16 +61,16 @@ sk_SK: TRASH_NAME: "Kôš" ARCHIVE_NAME: "Archív" QUOTA: - TITLE: "Využitie kvóty" + TITLE: "Spotreba kvóty" MESSAGE_LIST: - BUTTON_RELOAD: "Obnoviť zoznam správ" + BUTTON_RELOAD: "Znovu načítať zoznam správ" BUTTON_MOVE_TO: "Presunúť do" BUTTON_DELETE: "Odstrániť" BUTTON_ARCHIVE: "Archív" BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Not Spam" + BUTTON_NOT_SPAM: "Nie je spam" BUTTON_EMPTY_FOLDER: "Vyčistiť priečinok" - BUTTON_MULTY_FORWARD: "Preposlať správy" + BUTTON_MULTY_FORWARD: "Preposlať ako prílohu" BUTTON_DELETE_WITHOUT_MOVE: "Navždy odstrániť" BUTTON_MORE: "Viac" MENU_SET_SEEN: "Označiť ako prečítané" @@ -105,7 +105,7 @@ sk_SK: BUTTON_UNSUBSCRIBE: "Odhlásiť sa z mailing listu" BUTTON_ARCHIVE: "Archív" BUTTON_SPAM: "Spam" - BUTTON_NOT_SPAM: "Not Spam" + BUTTON_NOT_SPAM: "Nie je spam" BUTTON_MOVE_TO: "Presunúť do" BUTTON_MORE: "Viac" BUTTON_REPLY: "Odpovedať" @@ -116,10 +116,10 @@ sk_SK: BUTTON_SHOW_IMAGES: "Zobraziť externé obrázky" BUTTON_NOTIFY_READ_RECEIPT: "Odosielateľ požiadal o potvrdenie prečítania tejto správy." BUTTON_IN_NEW_WINDOW: "Zobraziť v novom okne" - BUTTON_THREAD_LIST: "Thread list" - BUTTON_THREAD_PREV: "Previous" - BUTTON_THREAD_NEXT: "Next" - BUTTON_THREAD_MORE: "More messages" + BUTTON_THREAD_LIST: "Zoznam konverzácií" + BUTTON_THREAD_PREV: "Predchádzajúci" + BUTTON_THREAD_NEXT: "Nasledujúci" + BUTTON_THREAD_MORE: "Ďalšie správy" MENU_HEADERS: "Zobraziť hlavičku správy" MENU_VIEW_ORIGINAL: "Zobraziť zdroj" MENU_DOWNLOAD_ORIGINAL: "Prevziať ako súbor .eml" @@ -144,21 +144,22 @@ sk_SK: PRINT_LABEL_SUBJECT: "Predmet" PRINT_LABEL_ATTACHMENTS: "Prílohy" MESSAGE_LOADING: "Načítavam" - MESSAGE_VIEW_DESC: "Vyberte správu zo zoznamu pre jej zobrazenie tu." + MESSAGE_VIEW_DESC: "Vyberte správu zo zoznamu pre jej zobrazenie." MESSAGE_VIEW_MOVE_DESC: "Zvoľte cieľ kliknutím na názov priečinka v ľavom stĺpci." PGP_PASSWORD_INPUT_PLACEHOLDER: "Heslo" - PGP_SIGNED_MESSAGE_DESC: "OpenPGP signed message (click to verify)" - PGP_ENCRYPTED_MESSAGE_DESC: "OpenPGP encrypted message (click to decrypt)" - LINK_DOWNLOAD_AS_ZIP: "Download as zip" - LINK_SAVE_TO_OWNCLOUD: "Save to ownCloud" - LINK_SAVE_TO_DROPBOX: "Save to Dropbox" + PGP_SIGNED_MESSAGE_DESC: "Správa podpísaná s OpenPGP (kliknite pre overenie)" + PGP_ENCRYPTED_MESSAGE_DESC: "Správa šifrovaná s OpenPGP (kliknite pre dešifrovanie)" + LINK_DOWNLOAD_AS_ZIP: "Prevziať ako zip" + LINK_SAVE_TO_OWNCLOUD: "Uložiť do ownCloud" + LINK_SAVE_TO_CLOUD: "Uložiť do Cloud" + LINK_SAVE_TO_DROPBOX: "Uložiť do Dropbox" READ_RECEIPT: - SUBJECT: "Return Receipt (displayed) - %SUBJECT%" + SUBJECT: "Potvrdenie o doručení (zobrazené) - %SUBJECT%" BODY: | - This is a Return Receipt for the mail that you sent to %READ-RECEIPT%. + Toto je potvrdenie o doručení pre mail, ktorý ste poslali %READ-RECEIPT%. - Note: This Return Receipt only acknowledges that the message was displayed on the recipient's computer. - There is no guarantee that the recipient has read or understood the message contents. + Poznámka: Potvrdenie o doručení znamená, že správa bola zobrazená na počítači adresáta. + Potvrdenie nezaručuje, že adresát správu naozaj prečítal alebo porozumel jej obsahu. SUGGESTIONS: SEARCHING_DESC: "Hľadám..." CONTACTS: @@ -168,78 +169,78 @@ sk_SK: BUTTON_CREATE_CONTACT: "Vytvoriť" BUTTON_UPDATE_CONTACT: "Aktualizovať" BUTTON_IMPORT: "Importovať (csv, vcf, vCard)" - BUTTON_EXPORT_VCARD: "Export (vcf, vCard)" + BUTTON_EXPORT_VCARD: "Exportovať (vcf, vCard)" BUTTON_EXPORT_CSV: "Export (csv)" ERROR_IMPORT_FILE: "Chyba importu (nesprávny formát súboru)" LIST_LOADING: "Načítavam" EMPTY_LIST: "Nemáte žiadne kontakty" EMPTY_SEARCH: "Nenašli sa žiadne kontakty" - CLEAR_SEARCH: "Clear search" + CLEAR_SEARCH: "Zrušiť vyhľadávanie" CONTACT_VIEW_DESC: "Zvoľte kontakt zo zoznamu pre jeho zobrazenie tu." LABEL_DISPLAY_NAME: "Zobraziť ako" LABEL_EMAIL: "Email" LABEL_PHONE: "Telefón" LABEL_WEB: "Web" - LABEL_BIRTHDAY: "Birthday" + LABEL_BIRTHDAY: "Dátum narodenia" LINK_ADD_EMAIL: "Pridať emailovú adresu" LINK_ADD_PHONE: "Pridať telefón" - LINK_BIRTHDAY: "Birthday" + LINK_BIRTHDAY: "Dátum narodenia" PLACEHOLDER_ENTER_DISPLAY_NAME: "Zadajte Zobrazované meno" - PLACEHOLDER_ENTER_LAST_NAME: "Zadajte Priezvisko" - PLACEHOLDER_ENTER_FIRST_NAME: "Zadajte Meno" - PLACEHOLDER_ENTER_NICK_NAME: "Enter nickname" + PLACEHOLDER_ENTER_LAST_NAME: "Zadajte priezvisko" + PLACEHOLDER_ENTER_FIRST_NAME: "Zadajte meno" + PLACEHOLDER_ENTER_NICK_NAME: "Zadajte prezývku" LABEL_READ_ONLY: "Len pre čítanie" LABEL_SHARE: "Zdielať" - ADD_MENU_LABEL: "Add" - ADD_MENU_NICKNAME: "Nickname" - ADD_MENU_NOTES: "Notes" + ADD_MENU_LABEL: "Pridať" + ADD_MENU_NICKNAME: "Prezývka" + ADD_MENU_NOTES: "Poznámky" ADD_MENU_EMAIL: "Email" - ADD_MENU_PHONE: "Phone" + ADD_MENU_PHONE: "Telefón" ADD_MENU_URL: "URL" - ADD_MENU_ADDRESS: "Address" - ADD_MENU_BIRTHDAY: "Birthday" - ADD_MENU_TAGS: "Tags" + ADD_MENU_ADDRESS: "Adresa" + ADD_MENU_BIRTHDAY: "Dátum narodenia" + ADD_MENU_TAGS: "Značky" BUTTON_SHARE_NONE: "Žiadne" BUTTON_SHARE_ALL: "Všetko" - BUTTON_SYNC: "Synchronization (CardDAV)" + BUTTON_SYNC: "Synchronizácia (CardDAV)" COMPOSE: TITLE_FROM: "Odosielateľ" TITLE_TO: "Príjemca" TITLE_CC: "Kópia" TITLE_BCC: "Skrytá kópia" - TITLE_REPLY_TO: "Reply To" + TITLE_REPLY_TO: "Odpovedať na" TITLE_SUBJECT: "Predmet" LINK_SHOW_INPUTS: "zobraziť všetky polia" BUTTON_SEND: "Odoslať" BUTTON_SAVE: "Uložiť" BUTTON_DELETE: "Odstrániť" BUTTON_CANCEL: "Zrušiť" - BUTTON_MINIMIZE: "Minimize" + BUTTON_MINIMIZE: "Minimalizovať" SAVED_TIME: "Uložené o %TIME%" SAVED_ERROR_ON_SEND: "Správa bola odoslaná ale nebola uložená do priečinka odoslaných správ" - DISCARD_UNSAVED_DATA: "Discard unsaved data?" + DISCARD_UNSAVED_DATA: "Zahodiť neuložené dáta?" ATTACH_FILES: "Pripojiť súbory" ATTACH_DROP_FILES_DESC: "Súbory pusťte tu" ATTACH_ITEM_CANCEL: "Zrušiť" DROPBOX: "Dropbox" GOOGLE_DRIVE: "Google Drive" REPLY_MESSAGE_TITLE: "%DATETIME%, %EMAIL% wrote" - FORWARD_MESSAGE_TOP_TITLE: "-------- Forwarded message -------" + FORWARD_MESSAGE_TOP_TITLE: "-------- Preposlaná správa -------" FORWARD_MESSAGE_TOP_FROM: "Odosielateľ" FORWARD_MESSAGE_TOP_TO: "Príjemca" FORWARD_MESSAGE_TOP_CC: "Kópia" FORWARD_MESSAGE_TOP_SENT: "Odoslať" FORWARD_MESSAGE_TOP_SUBJECT: "Predmet" EMPTY_TO_ERROR_DESC: "Zadajte prosím aspoň jedného príjemcu" - NO_ATTACHMENTS_HERE_DESC: "No attachments here." - ATTACHMENTS_ERROR_DESC: "Warning! Not all attachments have been uploaded." - ATTACHMENTS_UPLOAD_ERROR_DESC: "Not all attachments have been uploaded yet" + NO_ATTACHMENTS_HERE_DESC: "Žiadne prílohy." + ATTACHMENTS_ERROR_DESC: "Pozor! Nie všetky prílohy boli nahraté." + ATTACHMENTS_UPLOAD_ERROR_DESC: "Nie všetky prílohy boli už nahraté na server." BUTTON_REQUEST_READ_RECEIPT: "Vyžiadať potvrdenie o prečítaní" - BUTTON_MARK_AS_IMPORTANT: "Mark as important" - BUTTON_OPEN_PGP: "OpenPGP (Plain Text Only)" - BUTTON_REQUEST_DSN: "Request a delivery receipt" + BUTTON_MARK_AS_IMPORTANT: "Označiť ako dôležité" + BUTTON_OPEN_PGP: "Open PGP (iba text)" + BUTTON_REQUEST_DSN: "Vyžiadať potvrdenie o doručení" POPUPS_WELCOME_PAGE: - BUTTON_CLOSE: "Close" + BUTTON_CLOSE: "Zatvoriť" POPUPS_ASK: BUTTON_YES: "Áno" BUTTON_NO: "Nie" @@ -250,20 +251,20 @@ sk_SK: POPUPS_ADD_ACCOUNT: TITLE_ADD_ACCOUNT: "Pridať účet?" BUTTON_ADD_ACCOUNT: "Pridať" - TITLE_UPDATE_ACCOUNT: "Update Account?" - BUTTON_UPDATE_ACCOUNT: "Update" + TITLE_UPDATE_ACCOUNT: "Upraviť účet?" + BUTTON_UPDATE_ACCOUNT: "Upraviť" POPUPS_IDENTITY: - TITLE_ADD_IDENTITY: "Pridať Identitu?" - TITLE_UPDATE_IDENTITY: "Upraviť Identitu?" + TITLE_ADD_IDENTITY: "Pridať identitu?" + TITLE_UPDATE_IDENTITY: "Upraviť identitu?" BUTTON_ADD_IDENTITY: "Pridať" BUTTON_UPDATE_IDENTITY: "Upraviť" LABEL_EMAIL: "Email" LABEL_NAME: "Meno" LABEL_REPLY_TO: "Adresa pre odpoveď" - LABEL_SIGNATURE: "Signature" - LABEL_CC: "Cc" + LABEL_SIGNATURE: "Podpis" + LABEL_CC: "Kópia" LABEL_BCC: "Skrytá kópia" - LABEL_SIGNATURE_INSERT_BEFORE: "Insert this signature before quoted text in replies" + LABEL_SIGNATURE_INSERT_BEFORE: "V odpovediach vložiť tento podpis nad citovaný text" POPUPS_CREATE_FOLDER: TITLE_CREATE_FOLDER: "Vytvoriť priečinok?" LABEL_NAME: "Názov priečinka" @@ -282,11 +283,11 @@ sk_SK: DANGER_DESC_HTML_2: "Tento proces nie je možné prerušiť." TITLE_CLEARING_PROCESS: "Odstraňujem priečinok..." POPUPS_IMPORT_OPEN_PGP_KEY: - TITLE_IMPORT_OPEN_PGP_KEY: "Import OpenPGP key" + TITLE_IMPORT_OPEN_PGP_KEY: "Importovať kľúč OpenPGP" BUTTON_IMPORT_OPEN_PGP_KEY: "Import" POPUPS_VIEW_OPEN_PGP_KEY: - TITLE_VIEW_OPEN_PGP_KEY: "View OpenPGP key" - BUTTON_SELECT: "Select" + TITLE_VIEW_OPEN_PGP_KEY: "Zobraziť kľúč OpenPGP" + BUTTON_SELECT: "Vybrať" BUTTON_CLOSE: "Close" POPUPS_GENERATE_OPEN_PGP_KEYS: TITLE_GENERATE_OPEN_PGP_KEYS: "Generate OpenPGP keys" @@ -329,30 +330,30 @@ sk_SK: SELECT_FIELD_FROM: "From" SELECT_FIELD_RECIPIENTS: "Recipients (To or CC)" SELECT_FIELD_SUBJECT: "Subject" - SELECT_FIELD_HEADER: "Header" - SELECT_FIELD_SIZE: "Size" - SELECT_TYPE_CONTAINS: "Contains" - SELECT_TYPE_NOT_CONTAINS: "Not Contains" - SELECT_TYPE_MATCHES: "Matches (* and ? supported)" - SELECT_TYPE_NOT_MATCHES: "Not Matches (* and ? supported)" + SELECT_FIELD_HEADER: "Záhlavie" + SELECT_FIELD_SIZE: "Veľkosť" + SELECT_TYPE_CONTAINS: "Obsahuje" + SELECT_TYPE_NOT_CONTAINS: "Neobsahuje" + SELECT_TYPE_MATCHES: "Zhoduje sa (* a ? je podporované)" + SELECT_TYPE_NOT_MATCHES: "Nezhoduje sa (* a ? je podporované)" SELECT_TYPE_REGEXP: "Regexp" - SELECT_TYPE_NOT_REGEXP: "Not Regexp" - SELECT_TYPE_EQUAL_TO: "Equal To" - SELECT_TYPE_NOT_EQUAL_TO: "Not Equal To" - SELECT_TYPE_OVER: "Over" - SELECT_TYPE_UNDER: "Under" - SELECT_MATCH_ANY: "Matching any of the following rules" - SELECT_MATCH_ALL: "Matching all of the following rules" - MARK_AS_READ_LABEL: "Mark as read" - REPLY_INTERVAL_LABEL: "Reply interval (days)" - KEEP_LABEL: "Keep" - STOP_LABEL: "Don't stop processing rules" + SELECT_TYPE_NOT_REGEXP: "Negatívny regexp" + SELECT_TYPE_EQUAL_TO: "Rovná sa" + SELECT_TYPE_NOT_EQUAL_TO: "Nerovná sa" + SELECT_TYPE_OVER: "Nad" + SELECT_TYPE_UNDER: "Pod" + SELECT_MATCH_ANY: "Vyhovuje akékoľvek z nasledujúcich pravidiel" + SELECT_MATCH_ALL: "Vyhovujú všetky nasledujúce pravidlá" + MARK_AS_READ_LABEL: "Označiť ako prečítané" + REPLY_INTERVAL_LABEL: "Interval odpovede (v dňoch)" + KEEP_LABEL: "Ponechať" + STOP_LABEL: "Pokračovať vo vykonávaní pravidiel" EMAIL_LABEL: "Email" - VACATION_SUBJECT_LABEL: "Subject (optional)" - VACATION_MESSAGE_LABEL: "Message" - VACATION_RECIPIENTS_LABEL: "Recipients (comma separated)" - REJECT_MESSAGE_LABEL: "Reject message" - ALL_INCOMING_MESSAGES_DESC: "All incoming messages" + VACATION_SUBJECT_LABEL: "Predmet (voliteľne)" + VACATION_MESSAGE_LABEL: "Správa" + VACATION_RECIPIENTS_LABEL: "Adresáti (oddelení čiarkou)" + REJECT_MESSAGE_LABEL: "Odmietnuť správu" + ALL_INCOMING_MESSAGES_DESC: "Všetky prichádzajúce správy" POPUPS_SYSTEM_FOLDERS: TITLE_SYSTEM_FOLDERS: "Spravovať Systémové priečinky" SELECT_CHOOSE_ONE: "Vybrať" @@ -361,7 +362,7 @@ sk_SK: LABEL_DRAFTS: "Koncepty" LABEL_SPAM: "Spam" LABEL_TRASH: "Kôš" - LABEL_ARCHIVE: "Archive" + LABEL_ARCHIVE: "Archív" BUTTON_CANCEL: "Zrušiť" BUTTON_CLOSE: "Zatvoriť" NOTIFICATION_SENT: | @@ -374,33 +375,33 @@ sk_SK: NOTIFICATION_TRASH: | Nepriradili ste systémový priečinok pre "Kôš" kam sú správy presunuté po ich odstránení. Ak si želáte takéto správy odstraňovať natrvalo, vyberte prosím možnosť "Nepoužívať". - NOTIFICATION_ARCHIVE: "You haven't selected \"Archive\" system folder achived messages are placed to.\n" + NOTIFICATION_ARCHIVE: "Nepriradili ste systémový priečinok pre \"Archív\" kam budú uložené archivované správy." POPUPS_TWO_FACTOR_CFG: LEGEND_TWO_FACTOR_AUTH: "2-Step Verification" LABEL_ENABLE_TWO_FACTOR: "Enable 2-Step verification" - LABEL_TWO_FACTOR_USER: "User" - LABEL_TWO_FACTOR_STATUS: "Status" - LABEL_TWO_FACTOR_SECRET: "Secret" - LABEL_TWO_FACTOR_BACKUP_CODES: "Backup codes" - BUTTON_CREATE: "Create New Secret" - BUTTON_ACTIVATE: "Activate" - BUTTON_CLEAR: "Clear" - BUTTON_LOGOUT: "Logout" - BUTTON_DONE: "Done" + LABEL_TWO_FACTOR_USER: "Používateľ" + LABEL_TWO_FACTOR_STATUS: "Stav" + LABEL_TWO_FACTOR_SECRET: "Tajný kľúč" + LABEL_TWO_FACTOR_BACKUP_CODES: "Záložné kódy" + BUTTON_CREATE: "Vygenerovať nový tajný kľúč" + BUTTON_ACTIVATE: "Aktivovať" + BUTTON_CLEAR: "Vyčistiť" + BUTTON_LOGOUT: "Odhlásiť" + BUTTON_DONE: "Dokončené" BUTTON_TEST: "Test" LINK_TEST: "test" - BUTTON_SHOW_SECRET: "Show Secret" - BUTTON_HIDE_SECRET: "Hide Secret" - TWO_FACTOR_REQUIRE_DESC: "Your account requires 2-Step verification configuration." - TWO_FACTOR_SECRET_CONFIGURED_DESC: "Configured" - TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Not configured" - TWO_FACTOR_SECRET_DESC: >- - Import this info into your Google Authenticator client (or other TOTP client) - using the provided QR code below or by entering the code manually. - TWO_FACTOR_BACKUP_CODES_DESC: >- - If you can't receive codes via Google Authenticator, you can use backup codes - to sign in. After you’ve used a backup code to sign in, it will become inactive. - TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "You can't change this setting before test." + BUTTON_SHOW_SECRET: "Zobraziť tajný kľúč" + BUTTON_HIDE_SECRET: "Skryť tajný kľúč" + TWO_FACTOR_REQUIRE_DESC: "Váš účet vyžaduje konfiguráciu 2-krokovej verifikácie." + TWO_FACTOR_SECRET_CONFIGURED_DESC: "Nakonfigurované" + TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC: "Nenakonfigurované" + TWO_FACTOR_SECRET_DESC: > + Naimportujte do vášho Google Authenticator klienta (alebo iného TOTP klienta) + s použitím QR kódu alebo manuálne zadaním kódu. + TWO_FACTOR_BACKUP_CODES_DESC: > + Ak sa nemôžete prihlásiť použitím kódu z Google Authenticator (alebo iného + TOTP klienta), použite záložné kódy. Použitý záložný kód bude deaktivovaný. + TWO_FACTOR_SECRET_TEST_BEFORE_DESC: "Toto nastavenie nemôžete zmeniť pred testom." TITLES: LOADING: "Načítavam" LOGIN: "Používateľské meno" @@ -429,19 +430,19 @@ sk_SK: LABEL_IDENTITIES_NAME: "Identity" LABEL_FILTERS_NAME: "Filters" LABEL_TEMPLATES_NAME: "Templates" - LABEL_SECURITY_NAME: "Security" + LABEL_SECURITY_NAME: "Zabezpečenie" LABEL_SOCIAL_NAME: "Social" LABEL_THEMES_NAME: "Motívy" LABEL_CHANGE_PASSWORD_NAME: "Heslo" LABEL_OPEN_PGP_NAME: "OpenPGP" BUTTON_BACK: "Späť" SETTINGS_FILTERS: - LEGEND_FILTERS: "Filters" - BUTTON_SAVE: "Save" - BUTTON_ADD_FILTER: "Add a Filter" - BUTTON_DELETE: "Delete" - BUTTON_RAW_SCRIPT: "Use Custom User Script" - SUBNAME_NONE: "None" + LEGEND_FILTERS: "Filtre" + BUTTON_SAVE: "Uložiť" + BUTTON_ADD_FILTER: "Pridať filter" + BUTTON_DELETE: "Vymazať" + BUTTON_RAW_SCRIPT: "Použiť používateľský skript" + SUBNAME_NONE: "Žiadny" SUBNAME_MOVE_TO: "Move to \"%FOLDER%\"" SUBNAME_FORWARD_TO: "Forward to \"%EMAIL%\"" SUBNAME_REJECT: "Reject" diff --git a/rainloop/v/0.0.0/app/localization/webmail/sv_SE.yml b/rainloop/v/0.0.0/app/localization/webmail/sv_SE.yml index 28ef04d18..94c218241 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/sv_SE.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/sv_SE.yml @@ -1,6 +1,6 @@ sv_SE: LOGIN: - LABEL_EMAIL: "Epost" + LABEL_EMAIL: "E-post" LABEL_LOGIN: "Användarnamn" LABEL_PASSWORD: "Lösenord" LABEL_SIGN_ME: "Kom ihåg mig" @@ -72,7 +72,7 @@ sv_SE: BUTTON_EMPTY_FOLDER: "Rensa mapp" BUTTON_MULTY_FORWARD: "Vidarebefordra som bilaga(or)" BUTTON_DELETE_WITHOUT_MOVE: "Ta bort permanent" - BUTTON_MORE: "Mera" + BUTTON_MORE: "Mer" MENU_SET_SEEN: "Markera som läst" MENU_SET_ALL_SEEN: "Markera alla som lästa" MENU_UNSET_SEEN: "Markera som oläst" @@ -134,12 +134,12 @@ sv_SE: LABEL_TO_SHORT: "till" LABEL_CC: "CC" LABEL_BCC: "BCC" - LABEL_REPLY_TO: "Svara-till" + LABEL_REPLY_TO: "Svara till" PRINT_LABEL_FROM: "Från" PRINT_LABEL_TO: "Till" PRINT_LABEL_CC: "CC" PRINT_LABEL_BCC: "BCC" - PRINT_LABEL_REPLY_TO: "Svara-till" + PRINT_LABEL_REPLY_TO: "Svara till" PRINT_LABEL_DATE: "Datum" PRINT_LABEL_SUBJECT: "Ämne" PRINT_LABEL_ATTACHMENTS: "Bilagor" From afef42ba5d8d911fd1113252ba91f0efbfeef9c5 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Fri, 1 Feb 2019 19:05:44 +0300 Subject: [PATCH 75/83] eslint fixes --- dev/External/ko.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dev/External/ko.js b/dev/External/ko.js index f9c09e6ce..19657ffef 100644 --- a/dev/External/ko.js +++ b/dev/External/ko.js @@ -158,6 +158,7 @@ ko.bindingHandlers.tooltip = { $el = $(element), fValue = fValueAccessor(), isMobile = 'on' === ($el.data('tooltip-mobile') || 'off'), + isI18N = 'on' === ($el.data('tooltip-i18n') || 'on'), Globals = require('Common/Globals'); if (!Globals.bMobileDevice || isMobile) @@ -187,7 +188,7 @@ ko.bindingHandlers.tooltip = { element.__opentip.activate(); } - if ('on' === ($el.data('tooltip-i18n') || 'on')) + if (isI18N) { const Translator = require('Common/Translator'); @@ -225,6 +226,7 @@ ko.bindingHandlers.tooltip = { $el = $(element), fValue = fValueAccessor(), isMobile = 'on' === ($el.data('tooltip-mobile') || 'off'), + isI18N = 'on' === ($el.data('tooltip-i18n') || 'on'), Globals = require('Common/Globals'); if ((!Globals.bMobileDevice || isMobile) && element.__opentip) @@ -232,9 +234,7 @@ ko.bindingHandlers.tooltip = { const sValue = !ko.isObservable(fValue) && _.isFunction(fValue) ? fValue() : ko.unwrap(fValue); if (sValue) { - element.__opentip.setContent('on' === ($el.data('tooltip-i18n') || 'on') ? - require('Common/Translator').i18n(sValue) : sValue); - + element.__opentip.setContent(isI18N ? require('Common/Translator').i18n(sValue) : sValue); element.__opentip.activate(); } else From 4890249b5a10c5854c2196949e6b6db1aff12ffe Mon Sep 17 00:00:00 2001 From: Paul Borges <10618389+TheAssailant@users.noreply.github.com> Date: Wed, 6 Feb 2019 15:06:09 -0500 Subject: [PATCH 76/83] Use `random_bytes` if available in postfix plugin The [PHP `str_shuffle()`](http://php.net/manual/en/function.str-shuffle.php) documentation states: ``` This function does not generate cryptographically secure values, and should not be used for cryptographic purposes. ``` This change makes use of [`random_bytes()`](http://php.net/manual/en/function.random-bytes.php) if it's available and falls back to the old (probably ok) `str_shuffle()` implementation. --- .../ChangePasswordPostfixAdminDriver.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/postfixadmin-change-password/ChangePasswordPostfixAdminDriver.php b/plugins/postfixadmin-change-password/ChangePasswordPostfixAdminDriver.php index fd2284b8b..00f1d78c5 100755 --- a/plugins/postfixadmin-change-password/ChangePasswordPostfixAdminDriver.php +++ b/plugins/postfixadmin-change-password/ChangePasswordPostfixAdminDriver.php @@ -286,7 +286,11 @@ class ChangePasswordPostfixAdminDriver implements \RainLoop\Providers\ChangePass private function cryptPassword($sPassword, $oPdo) { $sResult = ''; - $sSalt = substr(str_shuffle('./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'), 0, 16); + if (function_exists('random_bytes')) { + $sSalt = substr(base64_encode(random_bytes(32)), 0, 16); + } else { + $sSalt = substr(str_shuffle('./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'), 0, 16); + } switch (strtolower($this->sEncrypt)) { default: From e1768a13dc199c376186727147b9950cf2896705 Mon Sep 17 00:00:00 2001 From: Ernesto Serrano Date: Sun, 10 Mar 2019 17:15:45 +0100 Subject: [PATCH 77/83] Added generic REST plugin --- plugins/rest-change-password/LICENSE | 20 ++ plugins/rest-change-password/README | 1 + .../RestChangePasswordDriver.php | 172 ++++++++++++++++++ plugins/rest-change-password/VERSION | 1 + plugins/rest-change-password/index.php | 78 ++++++++ 5 files changed, 272 insertions(+) create mode 100644 plugins/rest-change-password/LICENSE create mode 100644 plugins/rest-change-password/README create mode 100644 plugins/rest-change-password/RestChangePasswordDriver.php create mode 100644 plugins/rest-change-password/VERSION create mode 100644 plugins/rest-change-password/index.php diff --git a/plugins/rest-change-password/LICENSE b/plugins/rest-change-password/LICENSE new file mode 100644 index 000000000..271342337 --- /dev/null +++ b/plugins/rest-change-password/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 RainLoop Team + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/plugins/rest-change-password/README b/plugins/rest-change-password/README new file mode 100644 index 000000000..f045f42e7 --- /dev/null +++ b/plugins/rest-change-password/README @@ -0,0 +1 @@ +Plugin that adds functionality to change the email account password (Generic REST). \ No newline at end of file diff --git a/plugins/rest-change-password/RestChangePasswordDriver.php b/plugins/rest-change-password/RestChangePasswordDriver.php new file mode 100644 index 000000000..72a77fefb --- /dev/null +++ b/plugins/rest-change-password/RestChangePasswordDriver.php @@ -0,0 +1,172 @@ +sUrl = $sUrl; + $this->sKey = $sKey; + + return $this; + } + + $oProvider->SetFieldNames($sFieldEmail, $sFieldOldpassword, $sFieldNewpassword); + + /** + * @param string $sFieldEmail + * @param string $sFieldOldpassword + * @param string $sFieldNewpassword + * + * @return \RestChangePasswordDriver + */ + public function SetFieldNames($sFieldEmail, $sFieldOldpassword, $sFieldNewpassword) + { + $this->sFieldEmail = $sFieldEmail; + $this->sFieldOldpassword = $sFieldOldpassword; + $this->sFieldNewpassword = $sFieldNewpassword; + return $this; + } + + /** + * @param string $sAllowedEmails + * + * @return \RestChangePasswordDriver + */ + public function SetAllowedEmails($sAllowedEmails) + { + $this->sAllowedEmails = $sAllowedEmails; + return $this; + } + + /** + * @param \MailSo\Log\Logger $oLogger + * + * @return \RestChangePasswordDriver + */ + public function SetLogger($oLogger) + { + if ($oLogger instanceof \MailSo\Log\Logger) + { + $this->oLogger = $oLogger; + } + + return $this; + } + + /** + * @param \RainLoop\Account $oAccount + * + * @return bool + */ + public function PasswordChangePossibility($oAccount) + { + return $oAccount && $oAccount->Email() && + \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); + } + + /** + * @param \RainLoop\Account $oAccount + * @param string $sPrevPassword + * @param string $sNewPassword + * + * @return bool + */ + public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) + { + if ($this->oLogger) + { + $this->oLogger->Write('Rest: Try to change password for '.$oAccount->Email()); + } + + $bResult = false; + if (!empty($this->sHost) && 0 < $this->iPort && $oAccount) + { + $sEmail = \trim(\strtolower($oAccount->Email())); + + # Adding the REST Api key to the url, try to use always https + $sUrl = str_replace('://', '://'+$this->sKey+"@", $this->sUrl); + + $iCode = 0; + $oHttp = \MailSo\Base\Http::SingletonInstance(); + + if ($this->oLogger) + { + $this->oLogger->Write('Rest[Api Request]:'.$sUrl); + } + + $mResult = $oHttp->SendPostRequest($sUrl, + array( + $this->sFieldEmail => $sEmail, + $this->sFieldOldpassword => $sPrevPassword, + $this->sFieldNewpassword => $sNewPassword, + ), 'MailSo Http User Agent (v1)', $iCode, $this->oLogger); + + if (false !== $mResult && 200 === $iCode) + { + $aRes = null; + @\parse_str($mResult, $aRes); + if (is_array($aRes) && (!isset($aRes['error']) || (int) $aRes['error'] !== 1)) + { + $bResult = true; + } + else + { + if ($this->oLogger) + { + $this->oLogger->Write('Rest[Error]: Response: '.$mResult); + } + } + } + else + { + if ($this->oLogger) + { + $this->oLogger->Write('Rest[Error]: Empty Response: Code:'.$iCode); + } + } + } + + return $bResult; + } +} diff --git a/plugins/rest-change-password/VERSION b/plugins/rest-change-password/VERSION new file mode 100644 index 000000000..9f8e9b69a --- /dev/null +++ b/plugins/rest-change-password/VERSION @@ -0,0 +1 @@ +1.0 \ No newline at end of file diff --git a/plugins/rest-change-password/index.php b/plugins/rest-change-password/index.php new file mode 100644 index 000000000..115a7303f --- /dev/null +++ b/plugins/rest-change-password/index.php @@ -0,0 +1,78 @@ +addHook('main.fabrica', 'MainFabrica'); + } + + /** + * @param string $sName + * @param mixed $oProvider + */ + public function MainFabrica($sName, &$oProvider) + { + switch ($sName) + { + case 'change-password': + + $sUrl = \trim($this->Config()->Get('plugin', 'rest_url', '')); + $sKey = \trim($this->Config()->Get('plugin', 'rest_key', '')); + + $sFieldEmail = \trim($this->Config()->Get('plugin', 'rest_field_email', '')); + $sFieldOldpassword = \trim($this->Config()->Get('plugin', 'rest_field_oldpassword', '')); + $sFieldNewpassword = \trim($this->Config()->Get('plugin', 'rest_field_newpassword', '')); + + if (!empty($sHost) && (!empty($sKey)) + { + include_once __DIR__.'/RestChangePasswordDriver.php'; + + $oProvider = new RestChangePasswordDriver(); + $oProvider->SetLogger($this->Manager()->Actions()->Logger()); + $oProvider->SetConfig($sUrl, $sKey); + $oProvider->SetFieldNames($sFieldEmail, $sFieldOldpassword, $sFieldNewpassword); + $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); + } + + break; + } + } + + /** + * @return array + */ + public function configMapping() + { + return array( + \RainLoop\Plugins\Property::NewInstance('rest_url') + ->SetLabel('REST API Url') + ->SetDefaultValue('') + ->SetDescription('Ex: http://localhost:8080/api/change_password or https://domain.com/api/user/passsword_update'), + \RainLoop\Plugins\Property::NewInstance('rest_key') + ->SetLabel('REST API key') + ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) + ->SetDescription('REST API Key for authentication, if you have "user" and "passsword" enter it as "user:password"') + ->SetDefaultValue(''), + \RainLoop\Plugins\Property::NewInstance('rest_field_email') + ->SetLabel('Field "email" name') + ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) + ->SetDescription('Enter the name of the REST field name for email') + ->SetDefaultValue('email'), + \RainLoop\Plugins\Property::NewInstance('rest_field_oldpassword') + ->SetLabel('Field "oldpassword" name') + ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) + ->SetDescription('Enter the name of the REST field name for oldpassword') + ->SetDefaultValue('oldpassword'), + \RainLoop\Plugins\Property::NewInstance('rest_field_newpassword') + ->SetLabel('Field "newpassword" name') + ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) + ->SetDescription('Enter the name of the REST field name for newpassword') + ->SetDefaultValue('newpassword'), + \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') + ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) + ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net') + ->SetDefaultValue('*') + ); + } +} From b8ad70a8e3926c7f1ac70bd25a04c341181b009d Mon Sep 17 00:00:00 2001 From: Ernesto Serrano Date: Thu, 14 Mar 2019 14:45:19 +0100 Subject: [PATCH 78/83] Update index.php --- plugins/rest-change-password/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/rest-change-password/index.php b/plugins/rest-change-password/index.php index 115a7303f..63aeaa446 100644 --- a/plugins/rest-change-password/index.php +++ b/plugins/rest-change-password/index.php @@ -24,7 +24,7 @@ class RestChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin $sFieldOldpassword = \trim($this->Config()->Get('plugin', 'rest_field_oldpassword', '')); $sFieldNewpassword = \trim($this->Config()->Get('plugin', 'rest_field_newpassword', '')); - if (!empty($sHost) && (!empty($sKey)) + if (!empty($sHost) && (!empty($sKey))) { include_once __DIR__.'/RestChangePasswordDriver.php'; From 13065dd9262527c8812d1fe8d55ada013f4b812f Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 28 Mar 2019 01:01:26 +0300 Subject: [PATCH 79/83] Update dependencies --- .docker/php/Dockerfile | 7 +- dev/Common/Booter.js | 5 +- dev/Common/Cmd.js | 14 +- dev/Common/Utils.js | 10 +- package.json | 33 +- webpack.config.builder.js | 7 +- yarn.lock | 1051 +++++++++++++++++++++++-------------- 7 files changed, 709 insertions(+), 418 deletions(-) diff --git a/.docker/php/Dockerfile b/.docker/php/Dockerfile index 600b611fa..9b0f497ea 100644 --- a/.docker/php/Dockerfile +++ b/.docker/php/Dockerfile @@ -1,4 +1,4 @@ -FROM php:7.1-fpm +FROM php:7.3-fpm RUN apt-get update @@ -10,9 +10,12 @@ RUN apt-get install -y \ libpng-dev libjpeg62-turbo-dev \ libfontconfig1 libfontconfig1-dev libzip-dev +RUN pecl install mcrypt-1.0.2 && \ + docker-php-ext-enable mcrypt + RUN docker-php-ext-configure intl && \ docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && \ - docker-php-ext-install opcache pdo_mysql mcrypt zip intl gd + docker-php-ext-install opcache pdo_mysql zip intl gd RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer diff --git a/dev/Common/Booter.js b/dev/Common/Booter.js index 179a37efe..393e3bd8c 100644 --- a/dev/Common/Booter.js +++ b/dev/Common/Booter.js @@ -85,11 +85,12 @@ function includeLayout() { const app = window.document.getElementById('rl-app'); - require('style-loader!Styles/@Boot.css'); + require('Styles/@Boot.css'); if (app) { - app.innerHTML = require('Html/Layout.html').replace(/[\r\n\t]+/g, ''); + const layout = require('Html/Layout.html'); + app.innerHTML = ((layout && layout.default ? layout.default : layout) || '').replace(/[\r\n\t]+/g, ''); return true; } diff --git a/dev/Common/Cmd.js b/dev/Common/Cmd.js index d02ae5c1d..fe0a00687 100644 --- a/dev/Common/Cmd.js +++ b/dev/Common/Cmd.js @@ -5,7 +5,7 @@ import _ from '_'; import ko from 'ko'; import {$body} from 'Common/Globals'; import {EventKeyCode, Magics} from 'Common/Enums'; -import {trim, inArray, changeTheme} from 'Common/Utils'; +import {trim, deModule, inArray, changeTheme} from 'Common/Utils'; import {reload as translatorReload} from 'Common/Translator'; import * as Settings from 'Storage/Settings'; @@ -22,7 +22,7 @@ let * @returns {string} */ function cmdError(cmd) { - return require('Html/Cmds/Error.html').replace('{{ cmd }}', cmd); + return deModule(require('Html/Cmds/Error.html')).replace('{{ cmd }}', cmd); } /** @@ -37,7 +37,7 @@ function cmdClear(dom) { * @returns {string} */ function cmdHelp(cmds) { - return require('Html/Cmds/Help.html').replace('{{ commands }}', cmds.join(' ')); + return deModule(require('Html/Cmds/Help.html')).replace('{{ commands }}', cmds.join(' ')); } /** @@ -49,7 +49,7 @@ function cmdTheme(param, themes) { changeTheme(param); return ''; } - return require('Html/Cmds/ThemeEmpty.html').replace('{{ themes }}', themes.join(', ')); + return deModule(require('Html/Cmds/ThemeEmpty.html')).replace('{{ themes }}', themes.join(', ')); } /** @@ -61,14 +61,14 @@ function cmdLang(param, isAdmin, langs) { translatorReload(isAdmin, param); return ''; } - return require('Html/Cmds/LangEmpty.html').replace('{{ langs }}', langs.join(', ')); + return deModule(require('Html/Cmds/LangEmpty.html')).replace('{{ langs }}', langs.join(', ')); } /** * @returns {string} */ function cmdVersion() { - return require('Html/Cmds/Version.html').replace('{{ version }}', + return deModule(require('Html/Cmds/Version.html')).replace('{{ version }}', Settings.appSettingsGet('version') + ' (' + Settings.appSettingsGet('appVersionType') + ')'); } @@ -231,7 +231,7 @@ class CmdContoller if (h && h[0]) { - h.append($('
      ').html(require('Html/Cmds/Main.html').replace('{{ cmd }}', cmdLine))); + h.append($('
      ').html(deModule(require('Html/Cmds/Main.html')).replace('{{ cmd }}', cmdLine))); if (result) { h.append($('
      ').html(result)); diff --git a/dev/Common/Utils.js b/dev/Common/Utils.js index 1d3203418..aa53cc4aa 100644 --- a/dev/Common/Utils.js +++ b/dev/Common/Utils.js @@ -254,6 +254,14 @@ const timeOutActionSecond = (function() { export {timeOutAction, timeOutActionSecond}; +/** + * @param {any} m + * @returns {any} + */ +export function deModule(m) { + return (m && m.default ? m.default : m) || ''; +} + /** * @returns {boolean} */ @@ -629,7 +637,7 @@ export function previewMessage({title, subject, date, fromCreds, toCreds, toLabe const html = bodyClone ? bodyClone.html() : ''; - doc.write(require('Html/PreviewMessage.html') + doc.write(deModule(require('Html/PreviewMessage.html')) .replace('{{title}}', encodeHtml(title)) .replace('{{subject}}', encodeHtml(subject)) .replace('{{date}}', encodeHtml(date)) diff --git a/package.json b/package.json index fc49b5b9a..96ff86dba 100644 --- a/package.json +++ b/package.json @@ -52,22 +52,23 @@ "firefox esr" ], "devDependencies": { - "@babel/core": "7.2.2", - "@babel/plugin-proposal-class-properties": "7.3.0", - "@babel/plugin-proposal-decorators": "7.3.0", - "@babel/plugin-transform-runtime": "7.2.0", - "@babel/preset-env": "7.3.1", - "@babel/runtime-corejs2": "7.3.1", - "autolinker": "1.7.1", + "@babel/core": "7.4.0", + "@babel/plugin-proposal-class-properties": "7.4.0", + "@babel/plugin-proposal-decorators": "7.4.0", + "@babel/plugin-transform-runtime": "7.4.0", + "@babel/preset-env": "7.4.2", + "@babel/runtime-corejs2": "7.4.2", + "autolinker": "3.0.5", "babel-eslint": "10.0.1", "babel-loader": "8.0.5", "classnames": "2.2.6", - "copy-webpack-plugin": "4.6.0", + "copy-webpack-plugin": "5.0.2", + "css-loader": "2.1.1", "element-dataset": "2.2.6", "emailjs-addressparser": "2.0.2", "es6-object-assign": "1.1.0", "es6-promise-polyfill": "1.2.0", - "eslint": "5.12.1", + "eslint": "5.15.3", "gulp": "3.9.1", "gulp-autoprefixer": "6.0.0", "gulp-cached": "1.1.1", @@ -90,7 +91,7 @@ "gulp-size": "3.0.0", "gulp-stripbom": "1.0.4", "gulp-through": "0.4.0", - "gulp-uglify": "3.0.1", + "gulp-uglify": "3.0.2", "gulp-util": "3.0.8", "gulp-zip": "4.2.0", "ifvisible.js": "1.0.6", @@ -104,25 +105,25 @@ "json-loader": "0.5.7", "json3": "3.3.2", "knockout": "3.4.2", - "knockout-sortable": "1.1.0", + "knockout-sortable": "1.1.1", "knockout-transformations": "2.1.0", - "lozad": "1.8.0", + "lozad": "1.9.0", "matchmedia-polyfill": "0.3.1", "moment": "2.24.0", "node-fs": "0.1.7", - "node-notifier": "5.3.0", + "node-notifier": "5.4.0", "normalize.css": "8.0.1", "openpgp": "2.6.2", "opentip": "2.4.3", "pikaday": "1.8.0", - "raw-loader": "1.0.0", + "raw-loader": "2.0.0", "rimraf": "2.6.3", "run-sequence": "2.2.1", "simplestatemanager": "4.1.1", "style-loader": "0.23.1", "underscore": "1.9.1", - "webpack": "4.29.0", - "webpack-cli": "3.2.1", + "webpack": "4.29.6", + "webpack-cli": "3.3.0", "webpack-notifier": "1.7.0" } } diff --git a/webpack.config.builder.js b/webpack.config.builder.js index 8f72f5bbf..b3c2c3e62 100644 --- a/webpack.config.builder.js +++ b/webpack.config.builder.js @@ -83,10 +83,15 @@ module.exports = function(publicPath, pro) { options: babelLoaderOptions() }, { - test: /\.(html|css)$/, + test: /\.html$/, loader: 'raw-loader', include: [devPath] }, + { + test: /\.css/, + loaders: ['style-loader', 'css-loader'], + include: [devPath] + }, { test: /\.json$/, loader: 'json-loader', diff --git a/yarn.lock b/yarn.lock index 09ee123aa..e036d2b30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,21 +8,21 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@7.2.2": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" +"@babel/core@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.0.tgz#248fd6874b7d755010bfe61f557461d4f446d9e9" dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.2.2" - "@babel/helpers" "^7.2.0" - "@babel/parser" "^7.2.2" - "@babel/template" "^7.2.2" - "@babel/traverse" "^7.2.2" - "@babel/types" "^7.2.2" + "@babel/generator" "^7.4.0" + "@babel/helpers" "^7.4.0" + "@babel/parser" "^7.4.0" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" convert-source-map "^1.1.0" debug "^4.1.0" json5 "^2.1.0" - lodash "^4.17.10" + lodash "^4.17.11" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" @@ -37,6 +37,16 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" + dependencies: + "@babel/types" "^7.4.0" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -50,31 +60,32 @@ "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-call-delegate@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" +"@babel/helper-call-delegate@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz#f308eabe0d44f451217853aedf4dea5f6fe3294f" dependencies: - "@babel/helper-hoist-variables" "^7.0.0" - "@babel/traverse" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/helper-hoist-variables" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" -"@babel/helper-create-class-features-plugin@^7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.0.tgz#2b01a81b3adc2b1287f9ee193688ef8dc71e718f" +"@babel/helper-create-class-features-plugin@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.0.tgz#30fd090e059d021995c1762a5b76798fa0b51d82" dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.2.3" + "@babel/helper-replace-supers" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.0" -"@babel/helper-define-map@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" +"@babel/helper-define-map@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz#cbfd8c1b2f12708e262c26f600cd16ed6a3bc6c9" dependencies: "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.0.0" - lodash "^4.17.10" + "@babel/types" "^7.4.0" + lodash "^4.17.11" "@babel/helper-explode-assignable-expression@^7.1.0": version "7.1.0" @@ -97,11 +108,11 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-hoist-variables@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" +"@babel/helper-hoist-variables@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz#25b621399ae229869329730a62015bbeb0a6fbd6" dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.4.0" "@babel/helper-member-expression-to-functions@^7.0.0": version "7.0.0" @@ -152,7 +163,7 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.2.3": +"@babel/helper-replace-supers@^7.1.0": version "7.2.3" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz#19970020cf22677d62b3a689561dbd9644d8c5e5" dependencies: @@ -161,6 +172,15 @@ "@babel/traverse" "^7.2.3" "@babel/types" "^7.0.0" +"@babel/helper-replace-supers@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz#4f56adb6aedcd449d2da9399c2dcf0545463b64c" + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" + "@babel/helper-simple-access@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" @@ -174,6 +194,12 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-split-export-declaration@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" + dependencies: + "@babel/types" "^7.4.0" + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -183,13 +209,13 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.2.0": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.3.1.tgz#949eec9ea4b45d3210feb7dc1c22db664c9e44b9" +"@babel/helpers@^7.4.0": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.2.tgz#3bdfa46a552ca77ef5a0f8551be5f0845ae989be" dependencies: - "@babel/template" "^7.1.2" - "@babel/traverse" "^7.1.5" - "@babel/types" "^7.3.0" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.0" + "@babel/types" "^7.4.0" "@babel/highlight@^7.0.0": version "7.0.0" @@ -203,6 +229,10 @@ version "7.3.1" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.1.tgz#8f4ffd45f779e6132780835ffa7a215fa0b2d181" +"@babel/parser@^7.4.0": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.2.tgz#b4521a400cb5a871eab3890787b4bc1326d38d91" + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -211,18 +241,18 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" -"@babel/plugin-proposal-class-properties@7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz#272636bc0fa19a0bc46e601ec78136a173ea36cd" +"@babel/plugin-proposal-class-properties@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz#d70db61a2f1fd79de927eea91f6411c964e084b8" dependencies: - "@babel/helper-create-class-features-plugin" "^7.3.0" + "@babel/helper-create-class-features-plugin" "^7.4.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-proposal-decorators@7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.3.0.tgz#637ba075fa780b1f75d08186e8fb4357d03a72a7" +"@babel/plugin-proposal-decorators@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz#8e1bfd83efa54a5f662033afcc2b8e701f4bb3a9" dependencies: - "@babel/helper-create-class-features-plugin" "^7.3.0" + "@babel/helper-create-class-features-plugin" "^7.4.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-decorators" "^7.2.0" @@ -233,9 +263,9 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.3.1": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.1.tgz#f69fb6a1ea6a4e1c503994a91d9cf76f3c4b36e8" +"@babel/plugin-proposal-object-rest-spread@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.0.tgz#e4960575205eadf2a1ab4e0c79f9504d5b82a97f" dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" @@ -247,13 +277,13 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" -"@babel/plugin-proposal-unicode-property-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" +"@babel/plugin-proposal-unicode-property-regex@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.0.tgz#202d91ee977d760ef83f4f416b280d568be84623" dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.2.0" + regexpu-core "^4.5.4" "@babel/plugin-syntax-async-generators@^7.2.0": version "7.2.0" @@ -291,9 +321,9 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz#68b8a438663e88519e65b776f8938f3445b1a2ff" +"@babel/plugin-transform-async-to-generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz#234fe3e458dce95865c0d152d256119b237834b0" dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -305,24 +335,24 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" +"@babel/plugin-transform-block-scoping@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.0.tgz#164df3bb41e3deb954c4ca32ffa9fcaa56d30bcb" dependencies: "@babel/helper-plugin-utils" "^7.0.0" - lodash "^4.17.10" + lodash "^4.17.11" -"@babel/plugin-transform-classes@^7.2.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" +"@babel/plugin-transform-classes@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.0.tgz#e3428d3c8a3d01f33b10c529b998ba1707043d4d" dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.1.0" + "@babel/helper-define-map" "^7.4.0" "@babel/helper-function-name" "^7.1.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.0" + "@babel/helper-split-export-declaration" "^7.4.0" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.2.0": @@ -331,9 +361,9 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz#e75269b4b7889ec3a332cd0d0c8cff8fed0dc6f3" +"@babel/plugin-transform-destructuring@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.0.tgz#acbb9b2418d290107db333f4d6cd8aa6aea00343" dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -358,9 +388,9 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-for-of@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" +"@babel/plugin-transform-for-of@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.0.tgz#56c8c36677f5d4a16b80b12f7b768de064aaeb5f" dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -384,19 +414,19 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-commonjs@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" +"@babel/plugin-transform-modules-commonjs@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.0.tgz#3b8ec61714d3b75d20c5ccfa157f2c2e087fd4ca" dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" -"@babel/plugin-transform-modules-systemjs@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" +"@babel/plugin-transform-modules-systemjs@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.0.tgz#c2495e55528135797bc816f5d50f851698c586a1" dependencies: - "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-hoist-variables" "^7.4.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-modules-umd@^7.2.0": @@ -406,15 +436,15 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0": - version "7.3.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz#140b52985b2d6ef0cb092ef3b29502b990f9cd50" +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz#800391136d6cbcc80728dbdba3c1c6e46f86c12e" dependencies: regexp-tree "^0.1.0" -"@babel/plugin-transform-new-target@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" +"@babel/plugin-transform-new-target@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.0.tgz#67658a1d944edb53c8d4fa3004473a0dd7838150" dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -425,23 +455,23 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.1.0" -"@babel/plugin-transform-parameters@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" +"@babel/plugin-transform-parameters@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.0.tgz#a1309426fac4eecd2a9439a4c8c35124a11a48a9" dependencies: - "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-call-delegate" "^7.4.0" "@babel/helper-get-function-arity" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-regenerator@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" +"@babel/plugin-transform-regenerator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.0.tgz#0780e27ee458cc3fdbad18294d703e972ae1f6d1" dependencies: - regenerator-transform "^0.13.3" + regenerator-transform "^0.13.4" -"@babel/plugin-transform-runtime@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz#566bc43f7d0aedc880eaddbd29168d0f248966ea" +"@babel/plugin-transform-runtime@7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.0.tgz#b4d8c925ed957471bc57e0b9da53408ebb1ed457" dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -488,62 +518,64 @@ "@babel/helper-regex" "^7.0.0" regexpu-core "^4.1.3" -"@babel/preset-env@7.3.1": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.1.tgz#389e8ca6b17ae67aaf9a2111665030be923515db" +"@babel/preset-env@7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.2.tgz#2f5ba1de2daefa9dcca653848f96c7ce2e406676" dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-async-generator-functions" "^7.2.0" "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.3.1" + "@babel/plugin-proposal-object-rest-spread" "^7.4.0" "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.0" "@babel/plugin-syntax-async-generators" "^7.2.0" "@babel/plugin-syntax-json-strings" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.4.0" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.2.0" - "@babel/plugin-transform-classes" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.4.0" + "@babel/plugin-transform-classes" "^7.4.0" "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.4.0" "@babel/plugin-transform-dotall-regex" "^7.2.0" "@babel/plugin-transform-duplicate-keys" "^7.2.0" "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.0" "@babel/plugin-transform-function-name" "^7.2.0" "@babel/plugin-transform-literals" "^7.2.0" "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.2.0" - "@babel/plugin-transform-modules-systemjs" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.4.0" + "@babel/plugin-transform-modules-systemjs" "^7.4.0" "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0" - "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.2" + "@babel/plugin-transform-new-target" "^7.4.0" "@babel/plugin-transform-object-super" "^7.2.0" - "@babel/plugin-transform-parameters" "^7.2.0" - "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.4.0" + "@babel/plugin-transform-regenerator" "^7.4.0" "@babel/plugin-transform-shorthand-properties" "^7.2.0" "@babel/plugin-transform-spread" "^7.2.0" "@babel/plugin-transform-sticky-regex" "^7.2.0" "@babel/plugin-transform-template-literals" "^7.2.0" "@babel/plugin-transform-typeof-symbol" "^7.2.0" "@babel/plugin-transform-unicode-regex" "^7.2.0" - browserslist "^4.3.4" + "@babel/types" "^7.4.0" + browserslist "^4.4.2" + core-js-compat "^3.0.0" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.3.0" -"@babel/runtime-corejs2@7.3.1": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.3.1.tgz#0c113242e2328f9674d42703a89bee6ebebe9a82" +"@babel/runtime-corejs2@7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.4.2.tgz#a0cec2c41717fa415e9c204f32b603d88b1796c2" dependencies: - core-js "^2.5.7" - regenerator-runtime "^0.12.0" + core-js "^2.6.5" + regenerator-runtime "^0.13.2" -"@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": +"@babel/template@^7.1.0", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" dependencies: @@ -551,7 +583,15 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": +"@babel/template@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.2.3": version "7.2.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" dependencies: @@ -565,6 +605,20 @@ globals "^11.1.0" lodash "^4.17.10" +"@babel/traverse@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.0.tgz#14006967dd1d2b3494cdd650c686db9daf0ddada" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + "@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0": version "7.3.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.0.tgz#61dc0b336a93badc02bf5f69c4cd8e1353f2ffc0" @@ -573,138 +627,149 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" -"@webassemblyjs/ast@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" +"@babel/types@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" dependencies: - "@webassemblyjs/helper-module-context" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/wast-parser" "1.7.11" + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" -"@webassemblyjs/floating-point-hex-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" - -"@webassemblyjs/helper-api-error@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" - -"@webassemblyjs/helper-buffer@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" - -"@webassemblyjs/helper-code-frame@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" dependencies: - "@webassemblyjs/wast-printer" "1.7.11" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" -"@webassemblyjs/helper-fsm@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" -"@webassemblyjs/helper-module-context@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" -"@webassemblyjs/helper-wasm-bytecode@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" -"@webassemblyjs/helper-wasm-section@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wast-printer" "1.8.5" -"@webassemblyjs/ieee754@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" dependencies: - "@xtuc/long" "4.2.1" + "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" -"@webassemblyjs/wasm-edit@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/helper-wasm-section" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - "@webassemblyjs/wasm-opt" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - "@webassemblyjs/wast-printer" "1.7.11" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" -"@webassemblyjs/wasm-gen@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/ieee754" "1.7.11" - "@webassemblyjs/leb128" "1.7.11" - "@webassemblyjs/utf8" "1.7.11" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" -"@webassemblyjs/wasm-opt@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" -"@webassemblyjs/wasm-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-api-error" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/ieee754" "1.7.11" - "@webassemblyjs/leb128" "1.7.11" - "@webassemblyjs/utf8" "1.7.11" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" -"@webassemblyjs/wast-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/floating-point-hex-parser" "1.7.11" - "@webassemblyjs/helper-api-error" "1.7.11" - "@webassemblyjs/helper-code-frame" "1.7.11" - "@webassemblyjs/helper-fsm" "1.7.11" - "@xtuc/long" "4.2.1" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/wast-parser" "1.7.11" - "@xtuc/long" "4.2.1" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" -"@xtuc/long@4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" abbrev@1: version "1.1.1" @@ -741,6 +806,10 @@ acorn@^6.0.2, acorn@^6.0.5: version "6.0.6" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.6.tgz#cd75181670d5b99bdb1b1c993941d3a239ab1f56" +acorn@^6.0.7: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -758,6 +827,15 @@ ajv@^6.1.0, ajv@^6.5.3, ajv@^6.5.5, ajv@^6.6.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.9.1: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -772,6 +850,10 @@ ansi-colors@^1.0.1: dependencies: ansi-wrap "^0.1.0" +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + ansi-colors@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" @@ -810,6 +892,10 @@ ansi-regex@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -963,9 +1049,11 @@ atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" -autolinker@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-1.7.1.tgz#36397dd0c09c369433142677b5247ed4c9d2d705" +autolinker@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-3.0.5.tgz#ea8b76631cceb485dc6467d1270dd430cbd8ea51" + dependencies: + tslib "^1.9.3" autoprefixer@^9.1.3: version "9.4.7" @@ -1059,7 +1147,7 @@ binaryextensions@2: version "2.1.2" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.2.tgz#c83c3d74233ba7674e4f313cb2a2b70f54e94b7c" -bluebird@^3.0.6, bluebird@^3.5.1, bluebird@^3.5.3: +bluebird@^3.0.6, bluebird@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" @@ -1159,7 +1247,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.3.4, browserslist@^4.4.1: +browserslist@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062" dependencies: @@ -1167,6 +1255,14 @@ browserslist@^4.3.4, browserslist@^4.4.1: electron-to-chromium "^1.3.103" node-releases "^1.1.3" +browserslist@^4.4.2, browserslist@^4.5.1: + version "4.5.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.2.tgz#36ad281f040af684555a23c780f5c2081c752df0" + dependencies: + caniuse-lite "^1.0.30000951" + electron-to-chromium "^1.3.116" + node-releases "^1.1.11" + buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -1195,25 +1291,7 @@ bytes@1: version "1.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" -cacache@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.1" - mississippi "^2.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^5.2.4" - unique-filename "^1.1.0" - y18n "^4.0.0" - -cacache@^11.0.2: +cacache@^11.0.2, cacache@^11.3.1: version "11.3.2" resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" dependencies: @@ -1258,10 +1336,18 @@ camelcase@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" +camelcase@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45" + caniuse-lite@^1.0.30000929, caniuse-lite@^1.0.30000932: version "1.0.30000933" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000933.tgz#5871ff54b3177675ae1c2a275b2aae7abf2b9222" +caniuse-lite@^1.0.30000951: + version "1.0.30000954" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000954.tgz#227c2743e40f07c71e6683b6ca9491bfd5755b8e" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1314,7 +1400,7 @@ chokidar@^2.0.2: optionalDependencies: fsevents "^1.2.2" -chownr@^1.0.1, chownr@^1.1.1: +chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" @@ -1526,23 +1612,47 @@ copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" -copy-webpack-plugin@4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz#e7f40dd8a68477d405dd1b7a854aae324b158bae" +copy-webpack-plugin@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.0.2.tgz#56186dfddbf9aa1b29c97fa4c796c1be98870da4" dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" + cacache "^11.3.1" + find-cache-dir "^2.0.0" + glob-parent "^3.1.0" globby "^7.1.1" is-glob "^4.0.0" loader-utils "^1.1.0" minimatch "^3.0.4" - p-limit "^1.0.0" + normalize-path "^3.0.0" + p-limit "^2.1.0" serialize-javascript "^1.4.0" + webpack-log "^2.0.0" -core-js@^2.4.0, core-js@^2.5.7: +core-js-compat@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.0.tgz#cd9810b8000742535a4a43773866185e310bd4f7" + dependencies: + browserslist "^4.5.1" + core-js "3.0.0" + core-js-pure "3.0.0" + semver "^5.6.0" + +core-js-pure@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.0.tgz#a5679adb4875427c8c0488afc93e6f5b7125859b" + +core-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.0.tgz#a8dbfa978d29bfc263bfb66c556d0ca924c28957" + +core-js@^2.4.0: version "2.6.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.3.tgz#4b70938bdffdaf64931e66e2db158f0892289c49" +core-js@^2.6.5: + version "2.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1601,6 +1711,26 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +css-loader@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.1.tgz#d8254f72e412bb2238bb44dd674ffbef497333ea" + dependencies: + camelcase "^5.2.0" + icss-utils "^4.1.0" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.14" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^2.0.6" + postcss-modules-scope "^2.1.0" + postcss-modules-values "^2.0.0" + postcss-value-parser "^3.3.0" + schema-utils "^1.0.0" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -1737,6 +1867,12 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + dependencies: + esutils "^2.0.2" + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -1785,6 +1921,10 @@ electron-to-chromium@^1.3.103: version "1.3.111" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.111.tgz#9bde11c953425c1756f85c66e61de2b74ced75d0" +electron-to-chromium@^1.3.116: + version "1.3.119" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.119.tgz#9a7770da667252aeb81f667853f67c2b26e00197" + element-dataset@2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/element-dataset/-/element-dataset-2.2.6.tgz#a4e46dbb3ee991e8c7d5366ec654f87670c2ef80" @@ -1807,6 +1947,10 @@ emailjs-addressparser@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/emailjs-addressparser/-/emailjs-addressparser-2.0.2.tgz#fa8e6ff989667da8ae41d7316a7dfe6abe3c9d51" +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -1895,6 +2039,13 @@ eslint-scope@^4.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint-utils@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" @@ -1903,7 +2054,48 @@ eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" -eslint@5.12.1, eslint@^5.0.1: +eslint@5.15.3: + version "5.15.3" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.15.3.tgz#c79c3909dc8a7fa3714fb340c11e30fd2526b8b5" + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.2.2" + js-yaml "^3.12.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.11" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" + +eslint@^5.0.1: version "5.12.1" resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.12.1.tgz#5ca9931fb9029d04e7be92b03ce3b58edfac7e3b" dependencies: @@ -1953,6 +2145,14 @@ espree@^5.0.0: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + dependencies: + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -2126,6 +2326,12 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + dependencies: + flat-cache "^2.0.1" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -2135,14 +2341,6 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - find-cache-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" @@ -2155,12 +2353,6 @@ find-index@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -2203,6 +2395,18 @@ flat-cache@^1.2.1: rimraf "~2.6.2" write "^0.2.1" +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + flush-write-stream@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" @@ -2388,10 +2592,6 @@ glob@~3.1.21: inherits "1" minimatch "~0.2.11" -global-modules-path@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.1.tgz#e541f4c800a1a8514a990477b267ac67525b9931" - global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -2657,13 +2857,15 @@ gulp-through@0.4.0: through2 "^2.0.0" xtend "^4.0.1" -gulp-uglify@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.1.tgz#8d3eee466521bea6b10fd75dff72adf8b7ea2d97" +gulp-uglify@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.2.tgz#5f5b2e8337f879ca9dec971feb1b82a5a87850b0" dependencies: + array-each "^1.0.1" + extend-shallow "^3.0.2" gulplog "^1.0.0" has-gulplog "^0.1.0" - lodash "^4.13.1" + isobject "^3.0.1" make-error-cause "^1.1.1" safe-buffer "^5.1.2" through2 "^2.0.0" @@ -2852,6 +3054,16 @@ iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: dependencies: safer-buffer ">= 2.1.2 < 3" +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + +icss-utils@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.0.tgz#339dbbffb9f8729a243b701e1c29d4cc58c52f0e" + dependencies: + postcss "^7.0.14" + ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" @@ -2900,6 +3112,10 @@ imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -2931,7 +3147,7 @@ ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" -inquirer@^6.1.0: +inquirer@^6.1.0, inquirer@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" dependencies: @@ -3128,6 +3344,10 @@ is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + is@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/is/-/is-3.3.0.tgz#61cff6dd3c4193db94a3d62582072b44e5645d79" @@ -3294,9 +3514,9 @@ kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" -knockout-sortable@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/knockout-sortable/-/knockout-sortable-1.1.0.tgz#fc4f8adb68613950d39fe6bb8b0ccadead9485d2" +knockout-sortable@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/knockout-sortable/-/knockout-sortable-1.1.1.tgz#5375f02c61c30dcef4622f6e57e1bafa970d6a0e" knockout-transformations@2.1.0: version "2.1.0" @@ -3351,10 +3571,6 @@ liftoff@^2.1.0: rechoir "^0.6.2" resolve "^1.1.7" -lightercollective@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/lightercollective/-/lightercollective-0.1.0.tgz#70df102c530dcb8d0ccabfe6175a8d00d5f61300" - livereload-js@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" @@ -3363,7 +3579,7 @@ loader-runner@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" -loader-utils@^1.0.2, loader-utils@^1.1.0: +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" dependencies: @@ -3371,13 +3587,6 @@ loader-utils@^1.0.2, loader-utils@^1.1.0: emojis-list "^2.0.0" json5 "^1.0.1" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -3544,7 +3753,7 @@ lodash.uniq@^4.3.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -3568,21 +3777,14 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lozad@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.8.0.tgz#852e46e6403d2aa4456dcefb38242db54ed23f6f" +lozad@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/lozad/-/lozad-1.9.0.tgz#75e71ea9e379c744c2ad7ecc37a5858a25674595" lru-cache@2: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" -lru-cache@^4.1.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -3611,6 +3813,10 @@ make-iterator@^1.0.0: dependencies: kind-of "^6.0.2" +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + map-age-cleaner@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -3759,21 +3965,6 @@ minizlib@^1.1.1: dependencies: minipass "^2.2.1" -mississippi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^2.0.1" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -3933,7 +4124,17 @@ node-localstorage@~1.3.0: dependencies: write-file-atomic "^1.1.4" -node-notifier@5.3.0, node-notifier@^5.1.2, node-notifier@^5.2.1: +node-notifier@5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-notifier@^5.1.2, node-notifier@^5.2.1: version "5.3.0" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.3.0.tgz#c77a4a7b84038733d5fb351aafd8a268bfe19a01" dependencies: @@ -3957,6 +4158,12 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-releases@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.11.tgz#9a0841a4b0d92b7d5141ed179e764f42ad22724a" + dependencies: + semver "^5.3.0" + node-releases@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.6.tgz#47d160033e24a64e79487a62de63cf691052ec54" @@ -3983,6 +4190,10 @@ normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" @@ -4185,23 +4396,17 @@ p-is-promise@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5" -p-limit@^1.0.0, p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - dependencies: - p-try "^1.0.0" - p-limit@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68" dependencies: p-try "^2.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" +p-limit@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" dependencies: - p-limit "^1.1.0" + p-try "^2.0.0" p-locate@^3.0.0: version "3.0.0" @@ -4209,10 +4414,6 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - p-try@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" @@ -4338,12 +4539,6 @@ pikaday@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/pikaday/-/pikaday-1.8.0.tgz#ce930e257042e852e6aadee1115e01554b2d71c5" -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - dependencies: - find-up "^2.1.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -4377,11 +4572,47 @@ posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" -postcss-value-parser@^3.3.1: +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz#dd9953f6dd476b5fd1ef2d8830c8929760b56e63" + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + postcss-value-parser "^3.3.1" + +postcss-modules-scope@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz#ad3f5bf7856114f6fcab901b0502e2a2bc39d4eb" + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz#479b46dc0c5ca3dc7fa5270851836b9ec7152f64" + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^7.0.6" + +postcss-selector-parser@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" -postcss@^7.0.14, postcss@^7.0.2: +postcss@^7.0.14, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: version "7.0.14" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" dependencies: @@ -4431,10 +4662,6 @@ prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - psl@^1.1.24: version "1.1.31" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" @@ -4450,7 +4677,7 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" -pump@^2.0.0, pump@^2.0.1: +pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" dependencies: @@ -4524,9 +4751,9 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" -raw-loader@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-1.0.0.tgz#3f9889e73dadbda9a424bce79809b4133ad46405" +raw-loader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-2.0.0.tgz#e2813d9e1e3f80d1bbade5ad082e809679e20c26" dependencies: loader-utils "^1.1.0" schema-utils "^1.0.0" @@ -4598,6 +4825,12 @@ regenerate-unicode-properties@^7.0.0: dependencies: regenerate "^1.4.0" +regenerate-unicode-properties@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" + dependencies: + regenerate "^1.4.0" + regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" @@ -4606,13 +4839,13 @@ regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" -regenerator-runtime@^0.12.0: - version "0.12.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" -regenerator-transform@^0.13.3: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" +regenerator-transform@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" dependencies: private "^0.1.6" @@ -4635,7 +4868,7 @@ regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" -regexpu-core@^4.1.3, regexpu-core@^4.2.0: +regexpu-core@^4.1.3: version "4.4.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" dependencies: @@ -4646,6 +4879,17 @@ regexpu-core@^4.1.3, regexpu-core@^4.2.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.0.2" +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + regjsgen@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" @@ -4830,13 +5074,6 @@ sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" -schema-utils@^0.4.4: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -4853,6 +5090,10 @@ semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" +semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + sequencify@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" @@ -4924,7 +5165,7 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" -slice-ansi@^2.0.0: +slice-ansi@^2.0.0, slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" dependencies: @@ -5030,12 +5271,6 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" - dependencies: - safe-buffer "^5.1.1" - ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -5127,6 +5362,14 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -5161,6 +5404,12 @@ strip-ansi@^5.0.0: dependencies: ansi-regex "^4.0.0" +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + dependencies: + ansi-regex "^4.1.0" + strip-bom@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" @@ -5208,6 +5457,15 @@ table@^5.0.2: slice-ansi "^2.0.0" string-width "^2.1.1" +table@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" + dependencies: + ajv "^6.9.1" + lodash "^4.17.11" + slice-ansi "^2.1.0" + string-width "^3.0.0" + tapable@^1.0.0, tapable@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" @@ -5382,7 +5640,7 @@ trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" -tslib@^1.9.0: +tslib@^1.9.0, tslib@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -5453,6 +5711,10 @@ unicode-match-property-value-ecmascript@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + unicode-property-aliases-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" @@ -5466,7 +5728,11 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" -unique-filename@^1.1.0, unique-filename@^1.1.1: +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" dependencies: @@ -5622,23 +5888,28 @@ watchpack@^1.5.0: graceful-fs "^4.1.2" neo-async "^2.5.0" -webpack-cli@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.2.1.tgz#779c696c82482491f0803907508db2e276ed3b61" +webpack-cli@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.0.tgz#55c8a74cae1e88117f9dda3a801c7272e93ca318" dependencies: chalk "^2.4.1" cross-spawn "^6.0.5" enhanced-resolve "^4.1.0" findup-sync "^2.0.0" global-modules "^1.0.0" - global-modules-path "^2.3.0" import-local "^2.0.0" interpret "^1.1.0" - lightercollective "^0.1.0" loader-utils "^1.1.0" supports-color "^5.5.0" v8-compile-cache "^2.0.2" - yargs "^12.0.4" + yargs "^12.0.5" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" webpack-notifier@1.7.0: version "1.7.0" @@ -5655,14 +5926,14 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@4.29.0: - version "4.29.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.0.tgz#f2cfef83f7ae404ba889ff5d43efd285ca26e750" +webpack@4.29.6: + version "4.29.6" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.6.tgz#66bf0ec8beee4d469f8b598d3988ff9d8d90e955" dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-module-context" "1.7.11" - "@webassemblyjs/wasm-edit" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" acorn "^6.0.5" acorn-dynamic-import "^4.0.0" ajv "^6.1.0" @@ -5678,7 +5949,7 @@ webpack@4.29.0: mkdirp "~0.5.0" neo-async "^2.5.0" node-libs-browser "^2.0.0" - schema-utils "^0.4.4" + schema-utils "^1.0.0" tapable "^1.1.0" terser-webpack-plugin "^1.1.0" watchpack "^1.5.0" @@ -5752,6 +6023,12 @@ write-file-atomic@^1.1.4: imurmurhash "^0.1.4" slide "^1.1.5" +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + dependencies: + mkdirp "^0.5.1" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" @@ -5776,10 +6053,6 @@ xtend@~3.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - yallist@^3.0.0, yallist@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" @@ -5791,7 +6064,7 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^12.0.4, yargs@^12.0.5: +yargs@^12.0.5: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" dependencies: From 8d7136d7087c3ae35c319cdf2528acb4a1a953c3 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 28 Mar 2019 01:06:55 +0300 Subject: [PATCH 80/83] Synchronize localizations from Transifex --- rainloop/v/0.0.0/app/localization/webmail/id_ID.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rainloop/v/0.0.0/app/localization/webmail/id_ID.yml b/rainloop/v/0.0.0/app/localization/webmail/id_ID.yml index dc0c23346..38b2104d9 100644 --- a/rainloop/v/0.0.0/app/localization/webmail/id_ID.yml +++ b/rainloop/v/0.0.0/app/localization/webmail/id_ID.yml @@ -245,7 +245,7 @@ id_ID: BUTTON_YES: "Ya" BUTTON_NO: "Tidak" DESC_WANT_CLOSE_THIS_WINDOW: "Anda yakin untuk menutup jendela ini?" - DESC_WANT_DELETE_MESSAGES: "Anda yakin untuk menutup semua jendela ini?" + DESC_WANT_DELETE_MESSAGES: "Anda yakin menghapus permanen semua pesan?" POPUPS_LANGUAGES: TITLE_LANGUAGES: "Pilih bahasa" POPUPS_ADD_ACCOUNT: From 860ac47f6c00aaf65af26be020023df72772ef07 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 28 Mar 2019 01:26:34 +0300 Subject: [PATCH 81/83] Small improvements --- .../ChangePasswordLdapDriver.php | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/plugins/ldap-change-password/ChangePasswordLdapDriver.php b/plugins/ldap-change-password/ChangePasswordLdapDriver.php index 562c325ff..27d735268 100644 --- a/plugins/ldap-change-password/ChangePasswordLdapDriver.php +++ b/plugins/ldap-change-password/ChangePasswordLdapDriver.php @@ -119,22 +119,24 @@ class ChangePasswordLdapDriver implements \RainLoop\Providers\ChangePassword\Cha '{imap:login}' => $oAccount->Login(), '{imap:host}' => $oAccount->DomainIncHost(), '{imap:port}' => $oAccount->DomainIncPort(), - '{gecos}' => posix_getpwnam($oAccount->Login()) + '{gecos}' => function_exists('posix_getpwnam') ? posix_getpwnam($oAccount->Login()) : '' )); $oCon = @\ldap_connect($this->sHostName, $this->iHostPort); if ($oCon) { - if (!@\ldap_set_option($oCon, LDAP_OPT_PROTOCOL_VERSION, 3)) { - $this->oLogger->Write("Failed to set LDAP Protocol version to 3, TLS not supported.", - \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); - } - else { - if (!ldap_start_tls($oCon)) { - $this->oLogger->Write("Ldap_start_tls failed: ".$oCon, - \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); - } - } + if (!@\ldap_set_option($oCon, LDAP_OPT_PROTOCOL_VERSION, 3)) + { + $this->oLogger->Write( + 'Failed to set LDAP Protocol version to 3, TLS not supported.', + \MailSo\Log\Enumerations\Type::WARNING, + 'LDAP' + ); + } + else if (@!ldap_start_tls($oCon)) + { + $this->oLogger->Write("ldap_start_tls failed: ".$oCon, \MailSo\Log\Enumerations\Type::WARNING, 'LDAP'); + } if (!@\ldap_bind($oCon, $sUserDn, $sPrevPassword)) { From 909cd45769e1d1b3ef27a3317521d3a8d9fc11c7 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 28 Mar 2019 01:44:29 +0300 Subject: [PATCH 82/83] Small fixes --- .travis.yml | 13 ------------- .../LdapContactsSuggestions.php | 12 ++++++++---- 2 files changed, 8 insertions(+), 17 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 298545297..000000000 --- a/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: php -php: - - '5.4' - - '5.5' - - '5.6' -# - '7.0' -# - '7.1' -#before_script: -# - sudo apt-get install -y build-essential libssl-dev -# - curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash -# - nvm install 4.4.5 -# - nvm use 4.4.5 -# - npm install -g eslint babel-eslint diff --git a/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php b/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php index 24f466118..f8c985709 100644 --- a/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php +++ b/plugins/ldap-contacts-suggestions/LdapContactsSuggestions.php @@ -15,12 +15,12 @@ class LdapContactsSuggestions implements \RainLoop\Providers\Suggestions\ISugges /** * @var string */ - private $sAccessDn = NULL; + private $sAccessDn = null; /** * @var string */ - private $sAccessPassword = NULL; + private $sAccessPassword = null; /** * @var string @@ -202,11 +202,15 @@ class LdapContactsSuggestions implements \RainLoop\Providers\Suggestions\ISugges if (!@\ldap_bind($oCon, $this->sAccessDn, $this->sAccessPassword)) { - if ( is_null($this->sAccessDn) ) { + if (is_null($this->sAccessDn)) + { $this->logLdapError($oCon, 'ldap_bind (anonymous)'); - } else { + } + else + { $this->logLdapError($oCon, 'ldap_bind'); } + return $aResult; } From 71ac99f517a0de3de76e7c75dfc4cac46cdb1211 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 28 Mar 2019 01:51:23 +0300 Subject: [PATCH 83/83] Update phpseclib --- .../v/0.0.0/app/libraries/RainLoop/Utils.php | 5 +- .../app/libraries/phpseclib/Crypt/AES.php | 404 +- .../app/libraries/phpseclib/Crypt/Base.php | 4671 ++++---- .../libraries/phpseclib/Crypt/Blowfish.php | 1288 +-- .../app/libraries/phpseclib/Crypt/DES.php | 3022 ++--- .../app/libraries/phpseclib/Crypt/Hash.php | 1770 +-- .../app/libraries/phpseclib/Crypt/RC2.php | 1413 +-- .../app/libraries/phpseclib/Crypt/RC4.php | 695 +- .../app/libraries/phpseclib/Crypt/RSA.php | 6152 ++++++----- .../app/libraries/phpseclib/Crypt/Random.php | 638 +- .../libraries/phpseclib/Crypt/Rijndael.php | 2398 ++-- .../libraries/phpseclib/Crypt/TripleDES.php | 945 +- .../app/libraries/phpseclib/Crypt/Twofish.php | 1784 ++- .../app/libraries/phpseclib/File/ANSI.php | 1163 +- .../app/libraries/phpseclib/File/ASN1.php | 2843 ++--- .../app/libraries/phpseclib/File/X509.php | 9731 +++++++++-------- .../libraries/phpseclib/Math/BigInteger.php | 7570 ++++++------- .../0.0.0/app/libraries/phpseclib/Net/SCP.php | 738 +- .../app/libraries/phpseclib/Net/SFTP.php | 5975 +++++----- .../libraries/phpseclib/Net/SFTP/Stream.php | 1616 +-- .../app/libraries/phpseclib/Net/SSH1.php | 3342 +++--- .../app/libraries/phpseclib/Net/SSH2.php | 8771 ++++++++------- .../libraries/phpseclib/System/SSH/Agent.php | 874 +- .../libraries/phpseclib/System/SSH_Agent.php | 78 +- .../app/libraries/phpseclib/bootstrap.php | 16 + .../0.0.0/app/libraries/phpseclib/openssl.cnf | 12 +- 26 files changed, 35671 insertions(+), 32243 deletions(-) mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/AES.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Base.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Blowfish.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/DES.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Hash.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RC2.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RC4.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RSA.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Random.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Rijndael.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/TripleDES.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Twofish.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/File/ANSI.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/File/ASN1.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/File/X509.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Math/BigInteger.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Net/SCP.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Net/SFTP.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Net/SFTP/Stream.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Net/SSH1.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/Net/SSH2.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/System/SSH/Agent.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/System/SSH_Agent.php create mode 100755 rainloop/v/0.0.0/app/libraries/phpseclib/bootstrap.php mode change 100644 => 100755 rainloop/v/0.0.0/app/libraries/phpseclib/openssl.cnf diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php index 83b20418a..547ce4df4 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php @@ -61,7 +61,10 @@ class Utils if (!\class_exists('Crypt_RSA', false)) { include_once 'Crypt/RSA.php'; - \defined('CRYPT_RSA_MODE') || \define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + if (!\defined('CRYPT_RSA_MODE') && \defined('CRYPT_RSA_MODE_INTERNAL')) + { + \define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + } } if (\class_exists('Crypt_RSA')) diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/AES.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/AES.php old mode 100644 new mode 100755 index 6b1f9daa6..93457a271 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/AES.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/AES.php @@ -1,207 +1,197 @@ - - * setKey('abcdefghijklmnop'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $aes->decrypt($aes->encrypt($plaintext)); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Crypt - * @package Crypt_AES - * @author Jim Wigginton - * @copyright 2008 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Rijndael - */ -if (!class_exists('Crypt_Rijndael')) { - include_once 'Rijndael.php'; -} - -/**#@+ - * @access public - * @see Crypt_AES::encrypt() - * @see Crypt_AES::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_AES_MODE_CTR', CRYPT_MODE_CTR); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_AES_MODE_ECB', CRYPT_MODE_ECB); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_AES_MODE_CBC', CRYPT_MODE_CBC); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_AES_MODE_CFB', CRYPT_MODE_CFB); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_AES_MODE_OFB', CRYPT_MODE_OFB); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_Base::Crypt_Base() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_AES_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_AES_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/** - * Pure-PHP implementation of AES. - * - * @package Crypt_AES - * @author Jim Wigginton - * @access public - */ -class Crypt_AES extends Crypt_Rijndael -{ - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'AES'; - - /** - * Dummy function - * - * Since Crypt_AES extends Crypt_Rijndael, this function is, technically, available, but it doesn't do anything. - * - * @see Crypt_Rijndael::setBlockLength() - * @access public - * @param Integer $length - */ - function setBlockLength($length) - { - return; - } - - /** - * Sets the key length - * - * Valid key lengths are 128, 192, and 256. If the length is less than 128, it will be rounded up to - * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. - * - * @see Crypt_Rijndael:setKeyLength() - * @access public - * @param Integer $length - */ - function setKeyLength($length) - { - switch ($length) { - case 160: - $length = 192; - break; - case 224: - $length = 256; - } - parent::setKeyLength($length); - } - - /** - * Sets the key. - * - * Rijndael supports five different key lengths, AES only supports three. - * - * @see Crypt_Rijndael:setKey() - * @see setKeyLength() - * @access public - * @param String $key - */ - function setKey($key) - { - parent::setKey($key); - - if (!$this->explicit_key_length) { - $length = strlen($key); - switch (true) { - case $length <= 16: - $this->key_size = 16; - break; - case $length <= 24: - $this->key_size = 24; - break; - default: - $this->key_size = 32; - } - $this->_setupEngine(); - } - } -} + + * setKey('abcdefghijklmnop'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $aes->decrypt($aes->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_AES + * @author Jim Wigginton + * @copyright 2008 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Rijndael + */ +if (!class_exists('Crypt_Rijndael')) { + include_once 'Rijndael.php'; +} + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_AES_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_AES_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_AES_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_AES_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_AES_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/** + * Pure-PHP implementation of AES. + * + * @package Crypt_AES + * @author Jim Wigginton + * @access public + */ +class Crypt_AES extends Crypt_Rijndael +{ + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'AES'; + + /** + * Dummy function + * + * Since Crypt_AES extends Crypt_Rijndael, this function is, technically, available, but it doesn't do anything. + * + * @see Crypt_Rijndael::setBlockLength() + * @access public + * @param int $length + */ + function setBlockLength($length) + { + return; + } + + /** + * Sets the key length + * + * Valid key lengths are 128, 192, and 256. If the length is less than 128, it will be rounded up to + * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. + * + * @see Crypt_Rijndael:setKeyLength() + * @access public + * @param int $length + */ + function setKeyLength($length) + { + switch ($length) { + case 160: + $length = 192; + break; + case 224: + $length = 256; + } + parent::setKeyLength($length); + } + + /** + * Sets the key. + * + * Rijndael supports five different key lengths, AES only supports three. + * + * @see Crypt_Rijndael:setKey() + * @see setKeyLength() + * @access public + * @param string $key + */ + function setKey($key) + { + parent::setKey($key); + + if (!$this->explicit_key_length) { + $length = strlen($key); + switch (true) { + case $length <= 16: + $this->key_length = 16; + break; + case $length <= 24: + $this->key_length = 24; + break; + default: + $this->key_length = 32; + } + $this->_setEngine(); + } + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Base.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Base.php old mode 100644 new mode 100755 index 4df2a2db0..bd9550631 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Base.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Base.php @@ -1,2011 +1,2660 @@ - - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/**#@+ - * @access public - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_MODE_CTR', -1); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_MODE_ECB', 1); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_MODE_CBC', 2); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_MODE_CFB', 3); -/** - * Encrypt / decrypt using the Output Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_MODE_OFB', 4); -/** - * Encrypt / decrypt using streaming mode. - * - */ -define('CRYPT_MODE_STREAM', 5); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_Base::Crypt_Base() - */ -/** - * Base value for the internal implementation $engine switch - */ -define('CRYPT_MODE_INTERNAL', 1); -/** - * Base value for the mcrypt implementation $engine switch - */ -define('CRYPT_MODE_MCRYPT', 2); -/**#@-*/ - -/** - * Base Class for all Crypt_* cipher classes - * - * @package Crypt_Base - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @access public - */ -class Crypt_Base -{ - /** - * The Encryption Mode - * - * @see Crypt_Base::Crypt_Base() - * @var Integer - * @access private - */ - var $mode; - - /** - * The Block Length of the block cipher - * - * @var Integer - * @access private - */ - var $block_size = 16; - - /** - * The Key - * - * @see Crypt_Base::setKey() - * @var String - * @access private - */ - var $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; - - /** - * The Initialization Vector - * - * @see Crypt_Base::setIV() - * @var String - * @access private - */ - var $iv; - - /** - * A "sliding" Initialization Vector - * - * @see Crypt_Base::enableContinuousBuffer() - * @see Crypt_Base::_clearBuffers() - * @var String - * @access private - */ - var $encryptIV; - - /** - * A "sliding" Initialization Vector - * - * @see Crypt_Base::enableContinuousBuffer() - * @see Crypt_Base::_clearBuffers() - * @var String - * @access private - */ - var $decryptIV; - - /** - * Continuous Buffer status - * - * @see Crypt_Base::enableContinuousBuffer() - * @var Boolean - * @access private - */ - var $continuousBuffer = false; - - /** - * Encryption buffer for CTR, OFB and CFB modes - * - * @see Crypt_Base::encrypt() - * @see Crypt_Base::_clearBuffers() - * @var Array - * @access private - */ - var $enbuffer; - - /** - * Decryption buffer for CTR, OFB and CFB modes - * - * @see Crypt_Base::decrypt() - * @see Crypt_Base::_clearBuffers() - * @var Array - * @access private - */ - var $debuffer; - - /** - * mcrypt resource for encryption - * - * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. - * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. - * - * @see Crypt_Base::encrypt() - * @var Resource - * @access private - */ - var $enmcrypt; - - /** - * mcrypt resource for decryption - * - * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. - * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. - * - * @see Crypt_Base::decrypt() - * @var Resource - * @access private - */ - var $demcrypt; - - /** - * Does the enmcrypt resource need to be (re)initialized? - * - * @see Crypt_Twofish::setKey() - * @see Crypt_Twofish::setIV() - * @var Boolean - * @access private - */ - var $enchanged = true; - - /** - * Does the demcrypt resource need to be (re)initialized? - * - * @see Crypt_Twofish::setKey() - * @see Crypt_Twofish::setIV() - * @var Boolean - * @access private - */ - var $dechanged = true; - - /** - * mcrypt resource for CFB mode - * - * mcrypt's CFB mode, in (and only in) buffered context, - * is broken, so phpseclib implements the CFB mode by it self, - * even when the mcrypt php extension is available. - * - * In order to do the CFB-mode work (fast) phpseclib - * use a separate ECB-mode mcrypt resource. - * - * @link http://phpseclib.sourceforge.net/cfb-demo.phps - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - * @see Crypt_Base::_setupMcrypt() - * @var Resource - * @access private - */ - var $ecb; - - /** - * Optimizing value while CFB-encrypting - * - * Only relevant if $continuousBuffer enabled - * and $engine == CRYPT_MODE_MCRYPT - * - * It's faster to re-init $enmcrypt if - * $buffer bytes > $cfb_init_len than - * using the $ecb resource furthermore. - * - * This value depends of the chosen cipher - * and the time it would be needed for it's - * initialization [by mcrypt_generic_init()] - * which, typically, depends on the complexity - * on its internaly Key-expanding algorithm. - * - * @see Crypt_Base::encrypt() - * @var Integer - * @access private - */ - var $cfb_init_len = 600; - - /** - * Does internal cipher state need to be (re)initialized? - * - * @see setKey() - * @see setIV() - * @see disableContinuousBuffer() - * @var Boolean - * @access private - */ - var $changed = true; - - /** - * Padding status - * - * @see Crypt_Base::enablePadding() - * @var Boolean - * @access private - */ - var $padding = true; - - /** - * Is the mode one that is paddable? - * - * @see Crypt_Base::Crypt_Base() - * @var Boolean - * @access private - */ - var $paddable = false; - - /** - * Holds which crypt engine internaly should be use, - * which will be determined automatically on __construct() - * - * Currently available $engines are: - * - CRYPT_MODE_MCRYPT (fast, php-extension: mcrypt, extension_loaded('mcrypt') required) - * - CRYPT_MODE_INTERNAL (slower, pure php-engine, no php-extension required) - * - * In the pipeline... maybe. But currently not available: - * - CRYPT_MODE_OPENSSL (very fast, php-extension: openssl, extension_loaded('openssl') required) - * - * If possible, CRYPT_MODE_MCRYPT will be used for each cipher. - * Otherwise CRYPT_MODE_INTERNAL - * - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - * @var Integer - * @access private - */ - var $engine; - - /** - * The mcrypt specific name of the cipher - * - * Only used if $engine == CRYPT_MODE_MCRYPT - * - * @link http://www.php.net/mcrypt_module_open - * @link http://www.php.net/mcrypt_list_algorithms - * @see Crypt_Base::_setupMcrypt() - * @var String - * @access private - */ - var $cipher_name_mcrypt; - - /** - * The default password key_size used by setPassword() - * - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 32; - - /** - * The default salt used by setPassword() - * - * @see Crypt_Base::setPassword() - * @var String - * @access private - */ - var $password_default_salt = 'phpseclib/salt'; - - /** - * The namespace used by the cipher for its constants. - * - * ie: AES.php is using CRYPT_AES_MODE_* for its constants - * so $const_namespace is AES - * - * DES.php is using CRYPT_DES_MODE_* for its constants - * so $const_namespace is DES... and so on - * - * All CRYPT_<$const_namespace>_MODE_* are aliases of - * the generic CRYPT_MODE_* constants, so both could be used - * for each cipher. - * - * Example: - * $aes = new Crypt_AES(CRYPT_AES_MODE_CFB); // $aes will operate in cfb mode - * $aes = new Crypt_AES(CRYPT_MODE_CFB); // identical - * - * @see Crypt_Base::Crypt_Base() - * @var String - * @access private - */ - var $const_namespace; - - /** - * The name of the performance-optimized callback function - * - * Used by encrypt() / decrypt() - * only if $engine == CRYPT_MODE_INTERNAL - * - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - * @see Crypt_Base::_setupInlineCrypt() - * @see Crypt_Base::$use_inline_crypt - * @var Callback - * @access private - */ - var $inline_crypt; - - /** - * Holds whether performance-optimized $inline_crypt() can/should be used. - * - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - * @see Crypt_Base::inline_crypt - * @var mixed - * @access private - */ - var $use_inline_crypt; - - /** - * Default Constructor. - * - * Determines whether or not the mcrypt extension should be used. - * - * $mode could be: - * - * - CRYPT_MODE_ECB - * - * - CRYPT_MODE_CBC - * - * - CRYPT_MODE_CTR - * - * - CRYPT_MODE_CFB - * - * - CRYPT_MODE_OFB - * - * (or the alias constants of the chosen cipher, for example for AES: CRYPT_AES_MODE_ECB or CRYPT_AES_MODE_CBC ...) - * - * If not explicitly set, CRYPT_MODE_CBC will be used. - * - * @param optional Integer $mode - * @access public - */ - function Crypt_Base($mode = CRYPT_MODE_CBC) - { - $const_crypt_mode = 'CRYPT_' . $this->const_namespace . '_MODE'; - - // Determining the availibility of mcrypt support for the cipher - if (!defined($const_crypt_mode)) { - switch (true) { - case extension_loaded('mcrypt') && in_array($this->cipher_name_mcrypt, mcrypt_list_algorithms()): - define($const_crypt_mode, CRYPT_MODE_MCRYPT); - break; - default: - define($const_crypt_mode, CRYPT_MODE_INTERNAL); - } - } - - // Determining which internal $engine should be used. - // The fastes possible first. - switch (true) { - case empty($this->cipher_name_mcrypt): // The cipher module has no mcrypt-engine support at all so we force CRYPT_MODE_INTERNAL - $this->engine = CRYPT_MODE_INTERNAL; - break; - case constant($const_crypt_mode) == CRYPT_MODE_MCRYPT: - $this->engine = CRYPT_MODE_MCRYPT; - break; - default: - $this->engine = CRYPT_MODE_INTERNAL; - } - - // $mode dependent settings - switch ($mode) { - case CRYPT_MODE_ECB: - $this->paddable = true; - $this->mode = $mode; - break; - case CRYPT_MODE_CTR: - case CRYPT_MODE_CFB: - case CRYPT_MODE_OFB: - case CRYPT_MODE_STREAM: - $this->mode = $mode; - break; - case CRYPT_MODE_CBC: - default: - $this->paddable = true; - $this->mode = CRYPT_MODE_CBC; - } - - // Determining whether inline crypting can be used by the cipher - if ($this->use_inline_crypt !== false && function_exists('create_function')) { - $this->use_inline_crypt = true; - } - } - - /** - * Sets the initialization vector. (optional) - * - * SetIV is not required when CRYPT_MODE_ECB (or ie for AES: CRYPT_AES_MODE_ECB) is being used. If not explicitly set, it'll be assumed - * to be all zero's. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @access public - * @param String $iv - */ - function setIV($iv) - { - if ($this->mode == CRYPT_MODE_ECB) { - return; - } - - $this->iv = $iv; - $this->changed = true; - } - - /** - * Sets the key. - * - * The min/max length(s) of the key depends on the cipher which is used. - * If the key not fits the length(s) of the cipher it will paded with null bytes - * up to the closest valid key length. If the key is more than max length, - * we trim the excess bits. - * - * If the key is not explicitly set, it'll be assumed to be all null bytes. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @access public - * @param String $key - */ - function setKey($key) - { - $this->key = $key; - $this->changed = true; - } - - /** - * Sets the password. - * - * Depending on what $method is set to, setPassword()'s (optional) parameters are as follows: - * {@link http://en.wikipedia.org/wiki/PBKDF2 pbkdf2} or pbkdf1: - * $hash, $salt, $count, $dkLen - * - * Where $hash (default = sha1) currently supports the following hashes: see: Crypt/Hash.php - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see Crypt/Hash.php - * @param String $password - * @param optional String $method - * @return Boolean - * @access public - */ - function setPassword($password, $method = 'pbkdf2') - { - $key = ''; - - switch ($method) { - default: // 'pbkdf2' or 'pbkdf1' - $func_args = func_get_args(); - - // Hash function - $hash = isset($func_args[2]) ? $func_args[2] : 'sha1'; - - // WPA and WPA2 use the SSID as the salt - $salt = isset($func_args[3]) ? $func_args[3] : $this->password_default_salt; - - // RFC2898#section-4.2 uses 1,000 iterations by default - // WPA and WPA2 use 4,096. - $count = isset($func_args[4]) ? $func_args[4] : 1000; - - // Keylength - if (isset($func_args[5])) { - $dkLen = $func_args[5]; - } else { - $dkLen = $method == 'pbkdf1' ? 2 * $this->password_key_size : $this->password_key_size; - } - - switch (true) { - case $method == 'pbkdf1': - if (!class_exists('Crypt_Hash')) { - include_once 'Crypt/Hash.php'; - } - $hashObj = new Crypt_Hash(); - $hashObj->setHash($hash); - if ($dkLen > $hashObj->getLength()) { - user_error('Derived key too long'); - return false; - } - $t = $password . $salt; - for ($i = 0; $i < $count; ++$i) { - $t = $hashObj->hash($t); - } - $key = substr($t, 0, $dkLen); - - $this->setKey(substr($key, 0, $dkLen >> 1)); - $this->setIV(substr($key, $dkLen >> 1)); - - return true; - // Determining if php[>=5.5.0]'s hash_pbkdf2() function avail- and useable - case !function_exists('hash_pbkdf2'): - case !function_exists('hash_algos'): - case !in_array($hash, hash_algos()): - if (!class_exists('Crypt_Hash')) { - include_once 'Crypt/Hash.php'; - } - $i = 1; - while (strlen($key) < $dkLen) { - $hmac = new Crypt_Hash(); - $hmac->setHash($hash); - $hmac->setKey($password); - $f = $u = $hmac->hash($salt . pack('N', $i++)); - for ($j = 2; $j <= $count; ++$j) { - $u = $hmac->hash($u); - $f^= $u; - } - $key.= $f; - } - $key = substr($key, 0, $dkLen); - break; - default: - $key = hash_pbkdf2($hash, $password, $salt, $count, $dkLen, true); - } - } - - $this->setKey($key); - - return true; - } - - /** - * Encrypts a message. - * - * $plaintext will be padded with additional bytes such that it's length is a multiple of the block size. Other cipher - * implementations may or may not pad in the same manner. Other common approaches to padding and the reasons why it's - * necessary are discussed in the following - * URL: - * - * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html} - * - * An alternative to padding is to, separately, send the length of the file. This is what SSH, in fact, does. - * strlen($plaintext) will still need to be a multiple of the block size, however, arbitrary values can be added to make it that - * length. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see Crypt_Base::decrypt() - * @access public - * @param String $plaintext - * @return String $cipertext - */ - function encrypt($plaintext) - { - if ($this->engine == CRYPT_MODE_MCRYPT) { - if ($this->changed) { - $this->_setupMcrypt(); - $this->changed = false; - } - if ($this->enchanged) { - mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV); - $this->enchanged = false; - } - - // re: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} - // using mcrypt's default handing of CFB the above would output two different things. using phpseclib's - // rewritten CFB implementation the above outputs the same thing twice. - if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) { - $block_size = $this->block_size; - $iv = &$this->encryptIV; - $pos = &$this->enbuffer['pos']; - $len = strlen($plaintext); - $ciphertext = ''; - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len-= $max; - $pos = 0; - } else { - $i = $len; - $pos+= $len; - $len = 0; - } - $ciphertext = substr($iv, $orig_pos) ^ $plaintext; - $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); - $this->enbuffer['enmcrypt_init'] = true; - } - if ($len >= $block_size) { - if ($this->enbuffer['enmcrypt_init'] === false || $len > $this->cfb_init_len) { - if ($this->enbuffer['enmcrypt_init'] === true) { - mcrypt_generic_init($this->enmcrypt, $this->key, $iv); - $this->enbuffer['enmcrypt_init'] = false; - } - $ciphertext.= mcrypt_generic($this->enmcrypt, substr($plaintext, $i, $len - $len % $block_size)); - $iv = substr($ciphertext, -$block_size); - $len%= $block_size; - } else { - while ($len >= $block_size) { - $iv = mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, $block_size); - $ciphertext.= $iv; - $len-= $block_size; - $i+= $block_size; - } - } - } - - if ($len) { - $iv = mcrypt_generic($this->ecb, $iv); - $block = $iv ^ substr($plaintext, -$len); - $iv = substr_replace($iv, $block, 0, $len); - $ciphertext.= $block; - $pos = $len; - } - - return $ciphertext; - } - - if ($this->paddable) { - $plaintext = $this->_pad($plaintext); - } - - $ciphertext = mcrypt_generic($this->enmcrypt, $plaintext); - - if (!$this->continuousBuffer) { - mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV); - } - - return $ciphertext; - } - - if ($this->changed) { - $this->_setup(); - $this->changed = false; - } - if ($this->use_inline_crypt) { - $inline = $this->inline_crypt; - return $inline('encrypt', $this, $plaintext); - } - if ($this->paddable) { - $plaintext = $this->_pad($plaintext); - } - - $buffer = &$this->enbuffer; - $block_size = $this->block_size; - $ciphertext = ''; - switch ($this->mode) { - case CRYPT_MODE_ECB: - for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { - $ciphertext.= $this->_encryptBlock(substr($plaintext, $i, $block_size)); - } - break; - case CRYPT_MODE_CBC: - $xor = $this->encryptIV; - for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { - $block = substr($plaintext, $i, $block_size); - $block = $this->_encryptBlock($block ^ $xor); - $xor = $block; - $ciphertext.= $block; - } - if ($this->continuousBuffer) { - $this->encryptIV = $xor; - } - break; - case CRYPT_MODE_CTR: - $xor = $this->encryptIV; - if (strlen($buffer['encrypted'])) { - for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { - $block = substr($plaintext, $i, $block_size); - if (strlen($block) > strlen($buffer['encrypted'])) { - $buffer['encrypted'].= $this->_encryptBlock($this->_generateXor($xor, $block_size)); - } - $key = $this->_stringShift($buffer['encrypted'], $block_size); - $ciphertext.= $block ^ $key; - } - } else { - for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { - $block = substr($plaintext, $i, $block_size); - $key = $this->_encryptBlock($this->_generateXor($xor, $block_size)); - $ciphertext.= $block ^ $key; - } - } - if ($this->continuousBuffer) { - $this->encryptIV = $xor; - if ($start = strlen($plaintext) % $block_size) { - $buffer['encrypted'] = substr($key, $start) . $buffer['encrypted']; - } - } - break; - case CRYPT_MODE_CFB: - // cfb loosely routines inspired by openssl's: - // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} - if ($this->continuousBuffer) { - $iv = &$this->encryptIV; - $pos = &$buffer['pos']; - } else { - $iv = $this->encryptIV; - $pos = 0; - } - $len = strlen($plaintext); - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len-= $max; - $pos = 0; - } else { - $i = $len; - $pos+= $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $ciphertext = substr($iv, $orig_pos) ^ $plaintext; - $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); - } - while ($len >= $block_size) { - $iv = $this->_encryptBlock($iv) ^ substr($plaintext, $i, $block_size); - $ciphertext.= $iv; - $len-= $block_size; - $i+= $block_size; - } - if ($len) { - $iv = $this->_encryptBlock($iv); - $block = $iv ^ substr($plaintext, $i); - $iv = substr_replace($iv, $block, 0, $len); - $ciphertext.= $block; - $pos = $len; - } - break; - case CRYPT_MODE_OFB: - $xor = $this->encryptIV; - if (strlen($buffer['xor'])) { - for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { - $block = substr($plaintext, $i, $block_size); - if (strlen($block) > strlen($buffer['xor'])) { - $xor = $this->_encryptBlock($xor); - $buffer['xor'].= $xor; - } - $key = $this->_stringShift($buffer['xor'], $block_size); - $ciphertext.= $block ^ $key; - } - } else { - for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { - $xor = $this->_encryptBlock($xor); - $ciphertext.= substr($plaintext, $i, $block_size) ^ $xor; - } - $key = $xor; - } - if ($this->continuousBuffer) { - $this->encryptIV = $xor; - if ($start = strlen($plaintext) % $block_size) { - $buffer['xor'] = substr($key, $start) . $buffer['xor']; - } - } - break; - case CRYPT_MODE_STREAM: - $ciphertext = $this->_encryptBlock($plaintext); - break; - } - - return $ciphertext; - } - - /** - * Decrypts a message. - * - * If strlen($ciphertext) is not a multiple of the block size, null bytes will be added to the end of the string until - * it is. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see Crypt_Base::encrypt() - * @access public - * @param String $ciphertext - * @return String $plaintext - */ - function decrypt($ciphertext) - { - if ($this->engine == CRYPT_MODE_MCRYPT) { - $block_size = $this->block_size; - if ($this->changed) { - $this->_setupMcrypt(); - $this->changed = false; - } - if ($this->dechanged) { - mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV); - $this->dechanged = false; - } - - if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) { - $iv = &$this->decryptIV; - $pos = &$this->debuffer['pos']; - $len = strlen($ciphertext); - $plaintext = ''; - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len-= $max; - $pos = 0; - } else { - $i = $len; - $pos+= $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $plaintext = substr($iv, $orig_pos) ^ $ciphertext; - $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); - } - if ($len >= $block_size) { - $cb = substr($ciphertext, $i, $len - $len % $block_size); - $plaintext.= mcrypt_generic($this->ecb, $iv . $cb) ^ $cb; - $iv = substr($cb, -$block_size); - $len%= $block_size; - } - if ($len) { - $iv = mcrypt_generic($this->ecb, $iv); - $plaintext.= $iv ^ substr($ciphertext, -$len); - $iv = substr_replace($iv, substr($ciphertext, -$len), 0, $len); - $pos = $len; - } - - return $plaintext; - } - - if ($this->paddable) { - // we pad with chr(0) since that's what mcrypt_generic does. to quote from {@link http://www.php.net/function.mcrypt-generic}: - // "The data is padded with "\0" to make sure the length of the data is n * blocksize." - $ciphertext = str_pad($ciphertext, strlen($ciphertext) + ($block_size - strlen($ciphertext) % $block_size) % $block_size, chr(0)); - } - - $plaintext = mdecrypt_generic($this->demcrypt, $ciphertext); - - if (!$this->continuousBuffer) { - mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV); - } - - return $this->paddable ? $this->_unpad($plaintext) : $plaintext; - } - - if ($this->changed) { - $this->_setup(); - $this->changed = false; - } - if ($this->use_inline_crypt) { - $inline = $this->inline_crypt; - return $inline('decrypt', $this, $ciphertext); - } - - $block_size = $this->block_size; - if ($this->paddable) { - // we pad with chr(0) since that's what mcrypt_generic does [...] - $ciphertext = str_pad($ciphertext, strlen($ciphertext) + ($block_size - strlen($ciphertext) % $block_size) % $block_size, chr(0)); - } - - $buffer = &$this->debuffer; - $plaintext = ''; - switch ($this->mode) { - case CRYPT_MODE_ECB: - for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { - $plaintext.= $this->_decryptBlock(substr($ciphertext, $i, $block_size)); - } - break; - case CRYPT_MODE_CBC: - $xor = $this->decryptIV; - for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { - $block = substr($ciphertext, $i, $block_size); - $plaintext.= $this->_decryptBlock($block) ^ $xor; - $xor = $block; - } - if ($this->continuousBuffer) { - $this->decryptIV = $xor; - } - break; - case CRYPT_MODE_CTR: - $xor = $this->decryptIV; - if (strlen($buffer['ciphertext'])) { - for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { - $block = substr($ciphertext, $i, $block_size); - if (strlen($block) > strlen($buffer['ciphertext'])) { - $buffer['ciphertext'].= $this->_encryptBlock($this->_generateXor($xor, $block_size)); - } - $key = $this->_stringShift($buffer['ciphertext'], $block_size); - $plaintext.= $block ^ $key; - } - } else { - for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { - $block = substr($ciphertext, $i, $block_size); - $key = $this->_encryptBlock($this->_generateXor($xor, $block_size)); - $plaintext.= $block ^ $key; - } - } - if ($this->continuousBuffer) { - $this->decryptIV = $xor; - if ($start = strlen($ciphertext) % $block_size) { - $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; - } - } - break; - case CRYPT_MODE_CFB: - if ($this->continuousBuffer) { - $iv = &$this->decryptIV; - $pos = &$buffer['pos']; - } else { - $iv = $this->decryptIV; - $pos = 0; - } - $len = strlen($ciphertext); - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len-= $max; - $pos = 0; - } else { - $i = $len; - $pos+= $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $plaintext = substr($iv, $orig_pos) ^ $ciphertext; - $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); - } - while ($len >= $block_size) { - $iv = $this->_encryptBlock($iv); - $cb = substr($ciphertext, $i, $block_size); - $plaintext.= $iv ^ $cb; - $iv = $cb; - $len-= $block_size; - $i+= $block_size; - } - if ($len) { - $iv = $this->_encryptBlock($iv); - $plaintext.= $iv ^ substr($ciphertext, $i); - $iv = substr_replace($iv, substr($ciphertext, $i), 0, $len); - $pos = $len; - } - break; - case CRYPT_MODE_OFB: - $xor = $this->decryptIV; - if (strlen($buffer['xor'])) { - for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { - $block = substr($ciphertext, $i, $block_size); - if (strlen($block) > strlen($buffer['xor'])) { - $xor = $this->_encryptBlock($xor); - $buffer['xor'].= $xor; - } - $key = $this->_stringShift($buffer['xor'], $block_size); - $plaintext.= $block ^ $key; - } - } else { - for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { - $xor = $this->_encryptBlock($xor); - $plaintext.= substr($ciphertext, $i, $block_size) ^ $xor; - } - $key = $xor; - } - if ($this->continuousBuffer) { - $this->decryptIV = $xor; - if ($start = strlen($ciphertext) % $block_size) { - $buffer['xor'] = substr($key, $start) . $buffer['xor']; - } - } - break; - case CRYPT_MODE_STREAM: - $plaintext = $this->_decryptBlock($ciphertext); - break; - } - return $this->paddable ? $this->_unpad($plaintext) : $plaintext; - } - - /** - * Pad "packets". - * - * Block ciphers working by encrypting between their specified [$this->]block_size at a time - * If you ever need to encrypt or decrypt something that isn't of the proper length, it becomes necessary to - * pad the input so that it is of the proper length. - * - * Padding is enabled by default. Sometimes, however, it is undesirable to pad strings. Such is the case in SSH, - * where "packets" are padded with random bytes before being encrypted. Unpad these packets and you risk stripping - * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is - * transmitted separately) - * - * @see Crypt_Base::disablePadding() - * @access public - */ - function enablePadding() - { - $this->padding = true; - } - - /** - * Do not pad packets. - * - * @see Crypt_Base::enablePadding() - * @access public - */ - function disablePadding() - { - $this->padding = false; - } - - /** - * Treat consecutive "packets" as if they are a continuous buffer. - * - * Say you have a 32-byte plaintext $plaintext. Using the default behavior, the two following code snippets - * will yield different outputs: - * - * - * echo $rijndael->encrypt(substr($plaintext, 0, 16)); - * echo $rijndael->encrypt(substr($plaintext, 16, 16)); - * - * - * echo $rijndael->encrypt($plaintext); - * - * - * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates - * another, as demonstrated with the following: - * - * - * $rijndael->encrypt(substr($plaintext, 0, 16)); - * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); - * - * - * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); - * - * - * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different - * outputs. The reason is due to the fact that the initialization vector's change after every encryption / - * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. - * - * Put another way, when the continuous buffer is enabled, the state of the Crypt_*() object changes after each - * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that - * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), - * however, they are also less intuitive and more likely to cause you problems. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see Crypt_Base::disableContinuousBuffer() - * @access public - */ - function enableContinuousBuffer() - { - if ($this->mode == CRYPT_MODE_ECB) { - return; - } - - $this->continuousBuffer = true; - } - - /** - * Treat consecutive packets as if they are a discontinuous buffer. - * - * The default behavior. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see Crypt_Base::enableContinuousBuffer() - * @access public - */ - function disableContinuousBuffer() - { - if ($this->mode == CRYPT_MODE_ECB) { - return; - } - if (!$this->continuousBuffer) { - return; - } - - $this->continuousBuffer = false; - $this->changed = true; - } - - /** - * Encrypts a block - * - * Note: Must extend by the child Crypt_* class - * - * @access private - * @param String $in - * @return String - */ - function _encryptBlock($in) - { - user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); - } - - /** - * Decrypts a block - * - * Note: Must extend by the child Crypt_* class - * - * @access private - * @param String $in - * @return String - */ - function _decryptBlock($in) - { - user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); - } - - /** - * Setup the key (expansion) - * - * Only used if $engine == CRYPT_MODE_INTERNAL - * - * Note: Must extend by the child Crypt_* class - * - * @see Crypt_Base::_setup() - * @access private - */ - function _setupKey() - { - user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); - } - - /** - * Setup the CRYPT_MODE_INTERNAL $engine - * - * (re)init, if necessary, the internal cipher $engine and flush all $buffers - * Used (only) if $engine == CRYPT_MODE_INTERNAL - * - * _setup() will be called each time if $changed === true - * typically this happens when using one or more of following public methods: - * - * - setKey() - * - * - setIV() - * - * - disableContinuousBuffer() - * - * - First run of encrypt() / decrypt() with no init-settings - * - * Internally: _setup() is called always before(!) en/decryption. - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see setKey() - * @see setIV() - * @see disableContinuousBuffer() - * @access private - */ - function _setup() - { - $this->_clearBuffers(); - $this->_setupKey(); - - if ($this->use_inline_crypt) { - $this->_setupInlineCrypt(); - } - } - - /** - * Setup the CRYPT_MODE_MCRYPT $engine - * - * (re)init, if necessary, the (ext)mcrypt resources and flush all $buffers - * Used (only) if $engine = CRYPT_MODE_MCRYPT - * - * _setupMcrypt() will be called each time if $changed === true - * typically this happens when using one or more of following public methods: - * - * - setKey() - * - * - setIV() - * - * - disableContinuousBuffer() - * - * - First run of encrypt() / decrypt() - * - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @see setKey() - * @see setIV() - * @see disableContinuousBuffer() - * @access private - */ - function _setupMcrypt() - { - $this->_clearBuffers(); - $this->enchanged = $this->dechanged = true; - - if (!isset($this->enmcrypt)) { - static $mcrypt_modes = array( - CRYPT_MODE_CTR => 'ctr', - CRYPT_MODE_ECB => MCRYPT_MODE_ECB, - CRYPT_MODE_CBC => MCRYPT_MODE_CBC, - CRYPT_MODE_CFB => 'ncfb', - CRYPT_MODE_OFB => MCRYPT_MODE_NOFB, - CRYPT_MODE_STREAM => MCRYPT_MODE_STREAM, - ); - - $this->demcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); - $this->enmcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); - - // we need the $ecb mcrypt resource (only) in MODE_CFB with enableContinuousBuffer() - // to workaround mcrypt's broken ncfb implementation in buffered mode - // see: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} - if ($this->mode == CRYPT_MODE_CFB) { - $this->ecb = mcrypt_module_open($this->cipher_name_mcrypt, '', MCRYPT_MODE_ECB, ''); - } - - } // else should mcrypt_generic_deinit be called? - - if ($this->mode == CRYPT_MODE_CFB) { - mcrypt_generic_init($this->ecb, $this->key, str_repeat("\0", $this->block_size)); - } - } - - /** - * Pads a string - * - * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize. - * $this->block_size - (strlen($text) % $this->block_size) bytes are added, each of which is equal to - * chr($this->block_size - (strlen($text) % $this->block_size) - * - * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless - * and padding will, hence forth, be enabled. - * - * @see Crypt_Base::_unpad() - * @param String $text - * @access private - * @return String - */ - function _pad($text) - { - $length = strlen($text); - - if (!$this->padding) { - if ($length % $this->block_size == 0) { - return $text; - } else { - user_error("The plaintext's length ($length) is not a multiple of the block size ({$this->block_size})"); - $this->padding = true; - } - } - - $pad = $this->block_size - ($length % $this->block_size); - - return str_pad($text, $length + $pad, chr($pad)); - } - - /** - * Unpads a string. - * - * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong - * and false will be returned. - * - * @see Crypt_Base::_pad() - * @param String $text - * @access private - * @return String - */ - function _unpad($text) - { - if (!$this->padding) { - return $text; - } - - $length = ord($text[strlen($text) - 1]); - - if (!$length || $length > $this->block_size) { - return false; - } - - return substr($text, 0, -$length); - } - - /** - * Clears internal buffers - * - * Clearing/resetting the internal buffers is done everytime - * after disableContinuousBuffer() or on cipher $engine (re)init - * ie after setKey() or setIV() - * - * Note: Could, but not must, extend by the child Crypt_* class - * - * @access public - */ - function _clearBuffers() - { - $this->enbuffer = array('encrypted' => '', 'xor' => '', 'pos' => 0, 'enmcrypt_init' => true); - $this->debuffer = array('ciphertext' => '', 'xor' => '', 'pos' => 0, 'demcrypt_init' => true); - - // mcrypt's handling of invalid's $iv: - // $this->encryptIV = $this->decryptIV = strlen($this->iv) == $this->block_size ? $this->iv : str_repeat("\0", $this->block_size); - $this->encryptIV = $this->decryptIV = str_pad(substr($this->iv, 0, $this->block_size), $this->block_size, "\0"); - } - - /** - * String Shift - * - * Inspired by array_shift - * - * @param String $string - * @param optional Integer $index - * @access private - * @return String - */ - function _stringShift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } - - /** - * Generate CTR XOR encryption key - * - * Encrypt the output of this and XOR it against the ciphertext / plaintext to get the - * plaintext / ciphertext in CTR mode. - * - * @see Crypt_Base::decrypt() - * @see Crypt_Base::encrypt() - * @param String $iv - * @param Integer $length - * @access private - * @return String $xor - */ - function _generateXor(&$iv, $length) - { - $xor = ''; - $block_size = $this->block_size; - $num_blocks = floor(($length + ($block_size - 1)) / $block_size); - for ($i = 0; $i < $num_blocks; $i++) { - $xor.= $iv; - for ($j = 4; $j <= $block_size; $j+= 4) { - $temp = substr($iv, -$j, 4); - switch ($temp) { - case "\xFF\xFF\xFF\xFF": - $iv = substr_replace($iv, "\x00\x00\x00\x00", -$j, 4); - break; - case "\x7F\xFF\xFF\xFF": - $iv = substr_replace($iv, "\x80\x00\x00\x00", -$j, 4); - break 2; - default: - extract(unpack('Ncount', $temp)); - $iv = substr_replace($iv, pack('N', $count + 1), -$j, 4); - break 2; - } - } - } - - return $xor; - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * Stores the created (or existing) callback function-name - * in $this->inline_crypt - * - * Internally for phpseclib developers: - * - * _setupInlineCrypt() would be called only if: - * - * - $engine == CRYPT_MODE_INTERNAL and - * - * - $use_inline_crypt === true - * - * - each time on _setup(), after(!) _setupKey() - * - * - * This ensures that _setupInlineCrypt() has always a - * full ready2go initializated internal cipher $engine state - * where, for example, the keys allready expanded, - * keys/block_size calculated and such. - * - * It is, each time if called, the responsibility of _setupInlineCrypt(): - * - * - to set $this->inline_crypt to a valid and fully working callback function - * as a (faster) replacement for encrypt() / decrypt() - * - * - NOT to create unlimited callback functions (for memory reasons!) - * no matter how often _setupInlineCrypt() would be called. At some - * point of amount they must be generic re-useable. - * - * - the code of _setupInlineCrypt() it self, - * and the generated callback code, - * must be, in following order: - * - 100% safe - * - 100% compatible to encrypt()/decrypt() - * - using only php5+ features/lang-constructs/php-extensions if - * compatibility (down to php4) or fallback is provided - * - readable/maintainable/understandable/commented and... not-cryptic-styled-code :-) - * - >= 10% faster than encrypt()/decrypt() [which is, by the way, - * the reason for the existence of _setupInlineCrypt() :-)] - * - memory-nice - * - short (as good as possible) - * - * Note: - _setupInlineCrypt() is using _createInlineCryptFunction() to create the full callback function code. - * - In case of using inline crypting, _setupInlineCrypt() must extend by the child Crypt_* class. - * - The following variable names are reserved: - * - $_* (all variable names prefixed with an underscore) - * - $self (object reference to it self. Do not use $this, but $self instead) - * - $in (the content of $in has to en/decrypt by the generated code) - * - The callback function should not use the 'return' statement, but en/decrypt'ing the content of $in only - * - * - * @see Crypt_Base::_setup() - * @see Crypt_Base::_createInlineCryptFunction() - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - * @access private - */ - function _setupInlineCrypt() - { - // If a Crypt_* class providing inline crypting it must extend _setupInlineCrypt() - - // If, for any reason, an extending Crypt_Base() Crypt_* class - // not using inline crypting then it must be ensured that: $this->use_inline_crypt = false - // ie in the class var declaration of $use_inline_crypt in general for the Crypt_* class, - // in the constructor at object instance-time - // or, if it's runtime-specific, at runtime - - $this->use_inline_crypt = false; - } - - /** - * Creates the performance-optimized function for en/decrypt() - * - * Internally for phpseclib developers: - * - * _createInlineCryptFunction(): - * - * - merge the $cipher_code [setup'ed by _setupInlineCrypt()] - * with the current [$this->]mode of operation code - * - * - create the $inline function, which called by encrypt() / decrypt() - * as its replacement to speed up the en/decryption operations. - * - * - return the name of the created $inline callback function - * - * - used to speed up en/decryption - * - * - * - * The main reason why can speed up things [up to 50%] this way are: - * - * - using variables more effective then regular. - * (ie no use of expensive arrays but integers $k_0, $k_1 ... - * or even, for example, the pure $key[] values hardcoded) - * - * - avoiding 1000's of function calls of ie _encryptBlock() - * but inlining the crypt operations. - * in the mode of operation for() loop. - * - * - full loop unroll the (sometimes key-dependent) rounds - * avoiding this way ++$i counters and runtime-if's etc... - * - * The basic code architectur of the generated $inline en/decrypt() - * lambda function, in pseudo php, is: - * - * - * +----------------------------------------------------------------------------------------------+ - * | callback $inline = create_function: | - * | lambda_function_0001_crypt_ECB($action, $text) | - * | { | - * | INSERT PHP CODE OF: | - * | $cipher_code['init_crypt']; // general init code. | - * | // ie: $sbox'es declarations used for | - * | // encrypt and decrypt'ing. | - * | | - * | switch ($action) { | - * | case 'encrypt': | - * | INSERT PHP CODE OF: | - * | $cipher_code['init_encrypt']; // encrypt sepcific init code. | - * | ie: specified $key or $box | - * | declarations for encrypt'ing. | - * | | - * | foreach ($ciphertext) { | - * | $in = $block_size of $ciphertext; | - * | | - * | INSERT PHP CODE OF: | - * | $cipher_code['encrypt_block']; // encrypt's (string) $in, which is always: | - * | // strlen($in) == $this->block_size | - * | // here comes the cipher algorithm in action | - * | // for encryption. | - * | // $cipher_code['encrypt_block'] has to | - * | // encrypt the content of the $in variable | - * | | - * | $plaintext .= $in; | - * | } | - * | return $plaintext; | - * | | - * | case 'decrypt': | - * | INSERT PHP CODE OF: | - * | $cipher_code['init_decrypt']; // decrypt sepcific init code | - * | ie: specified $key or $box | - * | declarations for decrypt'ing. | - * | foreach ($plaintext) { | - * | $in = $block_size of $plaintext; | - * | | - * | INSERT PHP CODE OF: | - * | $cipher_code['decrypt_block']; // decrypt's (string) $in, which is always | - * | // strlen($in) == $this->block_size | - * | // here comes the cipher algorithm in action | - * | // for decryption. | - * | // $cipher_code['decrypt_block'] has to | - * | // decrypt the content of the $in variable | - * | $ciphertext .= $in; | - * | } | - * | return $ciphertext; | - * | } | - * | } | - * +----------------------------------------------------------------------------------------------+ - * - * - * See also the Crypt_*::_setupInlineCrypt()'s for - * productive inline $cipher_code's how they works. - * - * Structure of: - * - * $cipher_code = array( - * 'init_crypt' => (string) '', // optional - * 'init_encrypt' => (string) '', // optional - * 'init_decrypt' => (string) '', // optional - * 'encrypt_block' => (string) '', // required - * 'decrypt_block' => (string) '' // required - * ); - * - * - * @see Crypt_Base::_setupInlineCrypt() - * @see Crypt_Base::encrypt() - * @see Crypt_Base::decrypt() - * @param Array $cipher_code - * @access private - * @return String (the name of the created callback function) - */ - function _createInlineCryptFunction($cipher_code) - { - $block_size = $this->block_size; - - // optional - $init_crypt = isset($cipher_code['init_crypt']) ? $cipher_code['init_crypt'] : ''; - $init_encrypt = isset($cipher_code['init_encrypt']) ? $cipher_code['init_encrypt'] : ''; - $init_decrypt = isset($cipher_code['init_decrypt']) ? $cipher_code['init_decrypt'] : ''; - // required - $encrypt_block = $cipher_code['encrypt_block']; - $decrypt_block = $cipher_code['decrypt_block']; - - // Generating mode of operation inline code, - // merged with the $cipher_code algorithm - // for encrypt- and decryption. - switch ($this->mode) { - case CRYPT_MODE_ECB: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_text = $self->_pad($_text); - $_plaintext_len = strlen($_text); - - for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { - $in = substr($_text, $_i, '.$block_size.'); - '.$encrypt_block.' - $_ciphertext.= $in; - } - - return $_ciphertext; - '; - - $decrypt = $init_decrypt . ' - $_plaintext = ""; - $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0)); - $_ciphertext_len = strlen($_text); - - for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { - $in = substr($_text, $_i, '.$block_size.'); - '.$decrypt_block.' - $_plaintext.= $in; - } - - return $self->_unpad($_plaintext); - '; - break; - case CRYPT_MODE_CTR: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_plaintext_len = strlen($_text); - $_xor = $self->encryptIV; - $_buffer = &$self->enbuffer; - - if (strlen($_buffer["encrypted"])) { - for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { - $_block = substr($_text, $_i, '.$block_size.'); - if (strlen($_block) > strlen($_buffer["encrypted"])) { - $in = $self->_generateXor($_xor, '.$block_size.'); - '.$encrypt_block.' - $_buffer["encrypted"].= $in; - } - $_key = $self->_stringShift($_buffer["encrypted"], '.$block_size.'); - $_ciphertext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { - $_block = substr($_text, $_i, '.$block_size.'); - $in = $self->_generateXor($_xor, '.$block_size.'); - '.$encrypt_block.' - $_key = $in; - $_ciphertext.= $_block ^ $_key; - } - } - if ($self->continuousBuffer) { - $self->encryptIV = $_xor; - if ($_start = $_plaintext_len % '.$block_size.') { - $_buffer["encrypted"] = substr($_key, $_start) . $_buffer["encrypted"]; - } - } - - return $_ciphertext; - '; - - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_ciphertext_len = strlen($_text); - $_xor = $self->decryptIV; - $_buffer = &$self->debuffer; - - if (strlen($_buffer["ciphertext"])) { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { - $_block = substr($_text, $_i, '.$block_size.'); - if (strlen($_block) > strlen($_buffer["ciphertext"])) { - $in = $self->_generateXor($_xor, '.$block_size.'); - '.$encrypt_block.' - $_buffer["ciphertext"].= $in; - } - $_key = $self->_stringShift($_buffer["ciphertext"], '.$block_size.'); - $_plaintext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { - $_block = substr($_text, $_i, '.$block_size.'); - $in = $self->_generateXor($_xor, '.$block_size.'); - '.$encrypt_block.' - $_key = $in; - $_plaintext.= $_block ^ $_key; - } - } - if ($self->continuousBuffer) { - $self->decryptIV = $_xor; - if ($_start = $_ciphertext_len % '.$block_size.') { - $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"]; - } - } - - return $_plaintext; - '; - break; - case CRYPT_MODE_CFB: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_buffer = &$self->enbuffer; - - if ($self->continuousBuffer) { - $_iv = &$self->encryptIV; - $_pos = &$_buffer["pos"]; - } else { - $_iv = $self->encryptIV; - $_pos = 0; - } - $_len = strlen($_text); - $_i = 0; - if ($_pos) { - $_orig_pos = $_pos; - $_max = '.$block_size.' - $_pos; - if ($_len >= $_max) { - $_i = $_max; - $_len-= $_max; - $_pos = 0; - } else { - $_i = $_len; - $_pos+= $_len; - $_len = 0; - } - $_ciphertext = substr($_iv, $_orig_pos) ^ $_text; - $_iv = substr_replace($_iv, $_ciphertext, $_orig_pos, $_i); - } - while ($_len >= '.$block_size.') { - $in = $_iv; - '.$encrypt_block.'; - $_iv = $in ^ substr($_text, $_i, '.$block_size.'); - $_ciphertext.= $_iv; - $_len-= '.$block_size.'; - $_i+= '.$block_size.'; - } - if ($_len) { - $in = $_iv; - '.$encrypt_block.' - $_iv = $in; - $_block = $_iv ^ substr($_text, $_i); - $_iv = substr_replace($_iv, $_block, 0, $_len); - $_ciphertext.= $_block; - $_pos = $_len; - } - return $_ciphertext; - '; - - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_buffer = &$self->debuffer; - - if ($self->continuousBuffer) { - $_iv = &$self->decryptIV; - $_pos = &$_buffer["pos"]; - } else { - $_iv = $self->decryptIV; - $_pos = 0; - } - $_len = strlen($_text); - $_i = 0; - if ($_pos) { - $_orig_pos = $_pos; - $_max = '.$block_size.' - $_pos; - if ($_len >= $_max) { - $_i = $_max; - $_len-= $_max; - $_pos = 0; - } else { - $_i = $_len; - $_pos+= $_len; - $_len = 0; - } - $_plaintext = substr($_iv, $_orig_pos) ^ $_text; - $_iv = substr_replace($_iv, substr($_text, 0, $_i), $_orig_pos, $_i); - } - while ($_len >= '.$block_size.') { - $in = $_iv; - '.$encrypt_block.' - $_iv = $in; - $cb = substr($_text, $_i, '.$block_size.'); - $_plaintext.= $_iv ^ $cb; - $_iv = $cb; - $_len-= '.$block_size.'; - $_i+= '.$block_size.'; - } - if ($_len) { - $in = $_iv; - '.$encrypt_block.' - $_iv = $in; - $_plaintext.= $_iv ^ substr($_text, $_i); - $_iv = substr_replace($_iv, substr($_text, $_i), 0, $_len); - $_pos = $_len; - } - - return $_plaintext; - '; - break; - case CRYPT_MODE_OFB: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_plaintext_len = strlen($_text); - $_xor = $self->encryptIV; - $_buffer = &$self->enbuffer; - - if (strlen($_buffer["xor"])) { - for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { - $_block = substr($_text, $_i, '.$block_size.'); - if (strlen($_block) > strlen($_buffer["xor"])) { - $in = $_xor; - '.$encrypt_block.' - $_xor = $in; - $_buffer["xor"].= $_xor; - } - $_key = $self->_stringShift($_buffer["xor"], '.$block_size.'); - $_ciphertext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { - $in = $_xor; - '.$encrypt_block.' - $_xor = $in; - $_ciphertext.= substr($_text, $_i, '.$block_size.') ^ $_xor; - } - $_key = $_xor; - } - if ($self->continuousBuffer) { - $self->encryptIV = $_xor; - if ($_start = $_plaintext_len % '.$block_size.') { - $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; - } - } - return $_ciphertext; - '; - - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_ciphertext_len = strlen($_text); - $_xor = $self->decryptIV; - $_buffer = &$self->debuffer; - - if (strlen($_buffer["xor"])) { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { - $_block = substr($_text, $_i, '.$block_size.'); - if (strlen($_block) > strlen($_buffer["xor"])) { - $in = $_xor; - '.$encrypt_block.' - $_xor = $in; - $_buffer["xor"].= $_xor; - } - $_key = $self->_stringShift($_buffer["xor"], '.$block_size.'); - $_plaintext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { - $in = $_xor; - '.$encrypt_block.' - $_xor = $in; - $_plaintext.= substr($_text, $_i, '.$block_size.') ^ $_xor; - } - $_key = $_xor; - } - if ($self->continuousBuffer) { - $self->decryptIV = $_xor; - if ($_start = $_ciphertext_len % '.$block_size.') { - $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; - } - } - return $_plaintext; - '; - break; - case CRYPT_MODE_STREAM: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - '.$encrypt_block.' - return $_ciphertext; - '; - $decrypt = $init_decrypt . ' - $_plaintext = ""; - '.$decrypt_block.' - return $_plaintext; - '; - break; - // case CRYPT_MODE_CBC: - default: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_text = $self->_pad($_text); - $_plaintext_len = strlen($_text); - - $in = $self->encryptIV; - - for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { - $in = substr($_text, $_i, '.$block_size.') ^ $in; - '.$encrypt_block.' - $_ciphertext.= $in; - } - - if ($self->continuousBuffer) { - $self->encryptIV = $in; - } - - return $_ciphertext; - '; - - $decrypt = $init_decrypt . ' - $_plaintext = ""; - $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0)); - $_ciphertext_len = strlen($_text); - - $_iv = $self->decryptIV; - - for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { - $in = $_block = substr($_text, $_i, '.$block_size.'); - '.$decrypt_block.' - $_plaintext.= $in ^ $_iv; - $_iv = $_block; - } - - if ($self->continuousBuffer) { - $self->decryptIV = $_iv; - } - - return $self->_unpad($_plaintext); - '; - break; - } - - // Create the $inline function and return its name as string. Ready to run! - return create_function('$_action, &$self, $_text', $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' }'); - } - - /** - * Holds the lambda_functions table (classwide) - * - * Each name of the lambda function, created from - * _setupInlineCrypt() && _createInlineCryptFunction() - * is stored, classwide (!), here for reusing. - * - * The string-based index of $function is a classwide - * uniqe value representing, at least, the $mode of - * operation (or more... depends of the optimizing level) - * for which $mode the lambda function was created. - * - * @access private - * @return &Array - */ - function &_getLambdaFunctions() - { - static $functions = array(); - return $functions; - } -} + + * @author Hans-Juergen Petrich + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_MODE_CTR', -1); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_MODE_ECB', 1); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_MODE_CBC', 2); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_MODE_CFB', 3); +/** + * Encrypt / decrypt using the Output Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_MODE_OFB', 4); +/** + * Encrypt / decrypt using streaming mode. + */ +define('CRYPT_MODE_STREAM', 5); +/**#@-*/ + +/**#@+ + * @access private + * @see self::Crypt_Base() + * @internal These constants are for internal use only + */ +/** + * Base value for the internal implementation $engine switch + */ +define('CRYPT_ENGINE_INTERNAL', 1); +/** + * Base value for the mcrypt implementation $engine switch + */ +define('CRYPT_ENGINE_MCRYPT', 2); +/** + * Base value for the OpenSSL implementation $engine switch + */ +define('CRYPT_ENGINE_OPENSSL', 3); +/**#@-*/ + +/** + * Base Class for all Crypt_* cipher classes + * + * @package Crypt_Base + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @access public + */ +class Crypt_Base +{ + /** + * The Encryption Mode + * + * @see self::Crypt_Base() + * @var int + * @access private + */ + var $mode; + + /** + * The Block Length of the block cipher + * + * @var int + * @access private + */ + var $block_size = 16; + + /** + * The Key + * + * @see self::setKey() + * @var string + * @access private + */ + var $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; + + /** + * The Initialization Vector + * + * @see self::setIV() + * @var string + * @access private + */ + var $iv; + + /** + * A "sliding" Initialization Vector + * + * @see self::enableContinuousBuffer() + * @see self::_clearBuffers() + * @var string + * @access private + */ + var $encryptIV; + + /** + * A "sliding" Initialization Vector + * + * @see self::enableContinuousBuffer() + * @see self::_clearBuffers() + * @var string + * @access private + */ + var $decryptIV; + + /** + * Continuous Buffer status + * + * @see self::enableContinuousBuffer() + * @var bool + * @access private + */ + var $continuousBuffer = false; + + /** + * Encryption buffer for CTR, OFB and CFB modes + * + * @see self::encrypt() + * @see self::_clearBuffers() + * @var array + * @access private + */ + var $enbuffer; + + /** + * Decryption buffer for CTR, OFB and CFB modes + * + * @see self::decrypt() + * @see self::_clearBuffers() + * @var array + * @access private + */ + var $debuffer; + + /** + * mcrypt resource for encryption + * + * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. + * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. + * + * @see self::encrypt() + * @var resource + * @access private + */ + var $enmcrypt; + + /** + * mcrypt resource for decryption + * + * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. + * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. + * + * @see self::decrypt() + * @var resource + * @access private + */ + var $demcrypt; + + /** + * Does the enmcrypt resource need to be (re)initialized? + * + * @see Crypt_Twofish::setKey() + * @see Crypt_Twofish::setIV() + * @var bool + * @access private + */ + var $enchanged = true; + + /** + * Does the demcrypt resource need to be (re)initialized? + * + * @see Crypt_Twofish::setKey() + * @see Crypt_Twofish::setIV() + * @var bool + * @access private + */ + var $dechanged = true; + + /** + * mcrypt resource for CFB mode + * + * mcrypt's CFB mode, in (and only in) buffered context, + * is broken, so phpseclib implements the CFB mode by it self, + * even when the mcrypt php extension is available. + * + * In order to do the CFB-mode work (fast) phpseclib + * use a separate ECB-mode mcrypt resource. + * + * @link http://phpseclib.sourceforge.net/cfb-demo.phps + * @see self::encrypt() + * @see self::decrypt() + * @see self::_setupMcrypt() + * @var resource + * @access private + */ + var $ecb; + + /** + * Optimizing value while CFB-encrypting + * + * Only relevant if $continuousBuffer enabled + * and $engine == CRYPT_ENGINE_MCRYPT + * + * It's faster to re-init $enmcrypt if + * $buffer bytes > $cfb_init_len than + * using the $ecb resource furthermore. + * + * This value depends of the chosen cipher + * and the time it would be needed for it's + * initialization [by mcrypt_generic_init()] + * which, typically, depends on the complexity + * on its internaly Key-expanding algorithm. + * + * @see self::encrypt() + * @var int + * @access private + */ + var $cfb_init_len = 600; + + /** + * Does internal cipher state need to be (re)initialized? + * + * @see self::setKey() + * @see self::setIV() + * @see self::disableContinuousBuffer() + * @var bool + * @access private + */ + var $changed = true; + + /** + * Padding status + * + * @see self::enablePadding() + * @var bool + * @access private + */ + var $padding = true; + + /** + * Is the mode one that is paddable? + * + * @see self::Crypt_Base() + * @var bool + * @access private + */ + var $paddable = false; + + /** + * Holds which crypt engine internaly should be use, + * which will be determined automatically on __construct() + * + * Currently available $engines are: + * - CRYPT_ENGINE_OPENSSL (very fast, php-extension: openssl, extension_loaded('openssl') required) + * - CRYPT_ENGINE_MCRYPT (fast, php-extension: mcrypt, extension_loaded('mcrypt') required) + * - CRYPT_ENGINE_INTERNAL (slower, pure php-engine, no php-extension required) + * + * @see self::_setEngine() + * @see self::encrypt() + * @see self::decrypt() + * @var int + * @access private + */ + var $engine; + + /** + * Holds the preferred crypt engine + * + * @see self::_setEngine() + * @see self::setPreferredEngine() + * @var int + * @access private + */ + var $preferredEngine; + + /** + * The mcrypt specific name of the cipher + * + * Only used if $engine == CRYPT_ENGINE_MCRYPT + * + * @link http://www.php.net/mcrypt_module_open + * @link http://www.php.net/mcrypt_list_algorithms + * @see self::_setupMcrypt() + * @var string + * @access private + */ + var $cipher_name_mcrypt; + + /** + * The openssl specific name of the cipher + * + * Only used if $engine == CRYPT_ENGINE_OPENSSL + * + * @link http://www.php.net/openssl-get-cipher-methods + * @var string + * @access private + */ + var $cipher_name_openssl; + + /** + * The openssl specific name of the cipher in ECB mode + * + * If OpenSSL does not support the mode we're trying to use (CTR) + * it can still be emulated with ECB mode. + * + * @link http://www.php.net/openssl-get-cipher-methods + * @var string + * @access private + */ + var $cipher_name_openssl_ecb; + + /** + * The default salt used by setPassword() + * + * @see self::setPassword() + * @var string + * @access private + */ + var $password_default_salt = 'phpseclib/salt'; + + /** + * The namespace used by the cipher for its constants. + * + * ie: AES.php is using CRYPT_AES_MODE_* for its constants + * so $const_namespace is AES + * + * DES.php is using CRYPT_DES_MODE_* for its constants + * so $const_namespace is DES... and so on + * + * All CRYPT_<$const_namespace>_MODE_* are aliases of + * the generic CRYPT_MODE_* constants, so both could be used + * for each cipher. + * + * Example: + * $aes = new Crypt_AES(CRYPT_AES_MODE_CFB); // $aes will operate in cfb mode + * $aes = new Crypt_AES(CRYPT_MODE_CFB); // identical + * + * @see self::Crypt_Base() + * @var string + * @access private + */ + var $const_namespace; + + /** + * The name of the performance-optimized callback function + * + * Used by encrypt() / decrypt() + * only if $engine == CRYPT_ENGINE_INTERNAL + * + * @see self::encrypt() + * @see self::decrypt() + * @see self::_setupInlineCrypt() + * @see self::$use_inline_crypt + * @var Callback + * @access private + */ + var $inline_crypt; + + /** + * Holds whether performance-optimized $inline_crypt() can/should be used. + * + * @see self::encrypt() + * @see self::decrypt() + * @see self::inline_crypt + * @var mixed + * @access private + */ + var $use_inline_crypt; + + /** + * If OpenSSL can be used in ECB but not in CTR we can emulate CTR + * + * @see self::_openssl_ctr_process() + * @var bool + * @access private + */ + var $openssl_emulate_ctr = false; + + /** + * Determines what options are passed to openssl_encrypt/decrypt + * + * @see self::isValidEngine() + * @var mixed + * @access private + */ + var $openssl_options; + + /** + * Has the key length explicitly been set or should it be derived from the key, itself? + * + * @see self::setKeyLength() + * @var bool + * @access private + */ + var $explicit_key_length = false; + + /** + * Don't truncate / null pad key + * + * @see self::_clearBuffers() + * @var bool + * @access private + */ + var $skip_key_adjustment = false; + + /** + * Default Constructor. + * + * Determines whether or not the mcrypt extension should be used. + * + * $mode could be: + * + * - CRYPT_MODE_ECB + * + * - CRYPT_MODE_CBC + * + * - CRYPT_MODE_CTR + * + * - CRYPT_MODE_CFB + * + * - CRYPT_MODE_OFB + * + * (or the alias constants of the chosen cipher, for example for AES: CRYPT_AES_MODE_ECB or CRYPT_AES_MODE_CBC ...) + * + * If not explicitly set, CRYPT_MODE_CBC will be used. + * + * @param int $mode + * @access public + */ + function __construct($mode = CRYPT_MODE_CBC) + { + // $mode dependent settings + switch ($mode) { + case CRYPT_MODE_ECB: + $this->paddable = true; + $this->mode = CRYPT_MODE_ECB; + break; + case CRYPT_MODE_CTR: + case CRYPT_MODE_CFB: + case CRYPT_MODE_OFB: + case CRYPT_MODE_STREAM: + $this->mode = $mode; + break; + case CRYPT_MODE_CBC: + default: + $this->paddable = true; + $this->mode = CRYPT_MODE_CBC; + } + + $this->_setEngine(); + + // Determining whether inline crypting can be used by the cipher + if ($this->use_inline_crypt !== false) { + $this->use_inline_crypt = version_compare(PHP_VERSION, '5.3.0') >= 0 || function_exists('create_function'); + } + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param int $mode + * @access public + */ + function Crypt_Base($mode = CRYPT_MODE_CBC) + { + $this->__construct($mode); + } + + /** + * Sets the initialization vector. (optional) + * + * SetIV is not required when CRYPT_MODE_ECB (or ie for AES: CRYPT_AES_MODE_ECB) is being used. If not explicitly set, it'll be assumed + * to be all zero's. + * + * @access public + * @param string $iv + * @internal Can be overwritten by a sub class, but does not have to be + */ + function setIV($iv) + { + if ($this->mode == CRYPT_MODE_ECB) { + return; + } + + $this->iv = $iv; + $this->changed = true; + } + + /** + * Sets the key length. + * + * Keys with explicitly set lengths need to be treated accordingly + * + * @access public + * @param int $length + */ + function setKeyLength($length) + { + $this->explicit_key_length = true; + $this->changed = true; + $this->_setEngine(); + } + + /** + * Returns the current key length in bits + * + * @access public + * @return int + */ + function getKeyLength() + { + return $this->key_length << 3; + } + + /** + * Returns the current block length in bits + * + * @access public + * @return int + */ + function getBlockLength() + { + return $this->block_size << 3; + } + + /** + * Sets the key. + * + * The min/max length(s) of the key depends on the cipher which is used. + * If the key not fits the length(s) of the cipher it will paded with null bytes + * up to the closest valid key length. If the key is more than max length, + * we trim the excess bits. + * + * If the key is not explicitly set, it'll be assumed to be all null bytes. + * + * @access public + * @param string $key + * @internal Could, but not must, extend by the child Crypt_* class + */ + function setKey($key) + { + if (!$this->explicit_key_length) { + $this->setKeyLength(strlen($key) << 3); + $this->explicit_key_length = false; + } + + $this->key = $key; + $this->changed = true; + $this->_setEngine(); + } + + /** + * Sets the password. + * + * Depending on what $method is set to, setPassword()'s (optional) parameters are as follows: + * {@link http://en.wikipedia.org/wiki/PBKDF2 pbkdf2} or pbkdf1: + * $hash, $salt, $count, $dkLen + * + * Where $hash (default = sha1) currently supports the following hashes: see: Crypt/Hash.php + * + * @see Crypt/Hash.php + * @param string $password + * @param string $method + * @return bool + * @access public + * @internal Could, but not must, extend by the child Crypt_* class + */ + function setPassword($password, $method = 'pbkdf2') + { + $key = ''; + + switch ($method) { + default: // 'pbkdf2' or 'pbkdf1' + $func_args = func_get_args(); + + // Hash function + $hash = isset($func_args[2]) ? $func_args[2] : 'sha1'; + + // WPA and WPA2 use the SSID as the salt + $salt = isset($func_args[3]) ? $func_args[3] : $this->password_default_salt; + + // RFC2898#section-4.2 uses 1,000 iterations by default + // WPA and WPA2 use 4,096. + $count = isset($func_args[4]) ? $func_args[4] : 1000; + + // Keylength + if (isset($func_args[5]) && $func_args[5] > 0) { + $dkLen = $func_args[5]; + } else { + $dkLen = $method == 'pbkdf1' ? 2 * $this->key_length : $this->key_length; + } + + switch (true) { + case $method == 'pbkdf1': + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $hashObj = new Crypt_Hash(); + $hashObj->setHash($hash); + if ($dkLen > $hashObj->getLength()) { + user_error('Derived key too long'); + return false; + } + $t = $password . $salt; + for ($i = 0; $i < $count; ++$i) { + $t = $hashObj->hash($t); + } + $key = substr($t, 0, $dkLen); + + $this->setKey(substr($key, 0, $dkLen >> 1)); + $this->setIV(substr($key, $dkLen >> 1)); + + return true; + // Determining if php[>=5.5.0]'s hash_pbkdf2() function avail- and useable + case !function_exists('hash_pbkdf2'): + case !function_exists('hash_algos'): + case !in_array($hash, hash_algos()): + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $i = 1; + $hmac = new Crypt_Hash(); + $hmac->setHash($hash); + $hmac->setKey($password); + while (strlen($key) < $dkLen) { + $f = $u = $hmac->hash($salt . pack('N', $i++)); + for ($j = 2; $j <= $count; ++$j) { + $u = $hmac->hash($u); + $f^= $u; + } + $key.= $f; + } + $key = substr($key, 0, $dkLen); + break; + default: + $key = hash_pbkdf2($hash, $password, $salt, $count, $dkLen, true); + } + } + + $this->setKey($key); + + return true; + } + + /** + * Encrypts a message. + * + * $plaintext will be padded with additional bytes such that it's length is a multiple of the block size. Other cipher + * implementations may or may not pad in the same manner. Other common approaches to padding and the reasons why it's + * necessary are discussed in the following + * URL: + * + * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html} + * + * An alternative to padding is to, separately, send the length of the file. This is what SSH, in fact, does. + * strlen($plaintext) will still need to be a multiple of the block size, however, arbitrary values can be added to make it that + * length. + * + * @see self::decrypt() + * @access public + * @param string $plaintext + * @return string $ciphertext + * @internal Could, but not must, extend by the child Crypt_* class + */ + function encrypt($plaintext) + { + if ($this->paddable) { + $plaintext = $this->_pad($plaintext); + } + + if ($this->engine === CRYPT_ENGINE_OPENSSL) { + if ($this->changed) { + $this->_clearBuffers(); + $this->changed = false; + } + switch ($this->mode) { + case CRYPT_MODE_STREAM: + return openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options); + case CRYPT_MODE_ECB: + $result = @openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options); + return !defined('OPENSSL_RAW_DATA') ? substr($result, 0, -$this->block_size) : $result; + case CRYPT_MODE_CBC: + $result = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $this->encryptIV); + if (!defined('OPENSSL_RAW_DATA')) { + $result = substr($result, 0, -$this->block_size); + } + if ($this->continuousBuffer) { + $this->encryptIV = substr($result, -$this->block_size); + } + return $result; + case CRYPT_MODE_CTR: + return $this->_openssl_ctr_process($plaintext, $this->encryptIV, $this->enbuffer); + case CRYPT_MODE_CFB: + // cfb loosely routines inspired by openssl's: + // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} + $ciphertext = ''; + if ($this->continuousBuffer) { + $iv = &$this->encryptIV; + $pos = &$this->enbuffer['pos']; + } else { + $iv = $this->encryptIV; + $pos = 0; + } + $len = strlen($plaintext); + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $this->block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize + $ciphertext = substr($iv, $orig_pos) ^ $plaintext; + $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); + $plaintext = substr($plaintext, $i); + } + + $overflow = $len % $this->block_size; + + if ($overflow) { + $ciphertext.= openssl_encrypt(substr($plaintext, 0, -$overflow) . str_repeat("\0", $this->block_size), $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv); + $iv = $this->_string_pop($ciphertext, $this->block_size); + + $size = $len - $overflow; + $block = $iv ^ substr($plaintext, -$overflow); + $iv = substr_replace($iv, $block, 0, $overflow); + $ciphertext.= $block; + $pos = $overflow; + } elseif ($len) { + $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv); + $iv = substr($ciphertext, -$this->block_size); + } + + return $ciphertext; + case CRYPT_MODE_OFB: + return $this->_openssl_ofb_process($plaintext, $this->encryptIV, $this->enbuffer); + } + } + + if ($this->engine === CRYPT_ENGINE_MCRYPT) { + if ($this->changed) { + $this->_setupMcrypt(); + $this->changed = false; + } + if ($this->enchanged) { + @mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV); + $this->enchanged = false; + } + + // re: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} + // using mcrypt's default handing of CFB the above would output two different things. using phpseclib's + // rewritten CFB implementation the above outputs the same thing twice. + if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) { + $block_size = $this->block_size; + $iv = &$this->encryptIV; + $pos = &$this->enbuffer['pos']; + $len = strlen($plaintext); + $ciphertext = ''; + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + $ciphertext = substr($iv, $orig_pos) ^ $plaintext; + $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); + $this->enbuffer['enmcrypt_init'] = true; + } + if ($len >= $block_size) { + if ($this->enbuffer['enmcrypt_init'] === false || $len > $this->cfb_init_len) { + if ($this->enbuffer['enmcrypt_init'] === true) { + @mcrypt_generic_init($this->enmcrypt, $this->key, $iv); + $this->enbuffer['enmcrypt_init'] = false; + } + $ciphertext.= @mcrypt_generic($this->enmcrypt, substr($plaintext, $i, $len - $len % $block_size)); + $iv = substr($ciphertext, -$block_size); + $len%= $block_size; + } else { + while ($len >= $block_size) { + $iv = @mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, $block_size); + $ciphertext.= $iv; + $len-= $block_size; + $i+= $block_size; + } + } + } + + if ($len) { + $iv = @mcrypt_generic($this->ecb, $iv); + $block = $iv ^ substr($plaintext, -$len); + $iv = substr_replace($iv, $block, 0, $len); + $ciphertext.= $block; + $pos = $len; + } + + return $ciphertext; + } + + $ciphertext = @mcrypt_generic($this->enmcrypt, $plaintext); + + if (!$this->continuousBuffer) { + @mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV); + } + + return $ciphertext; + } + + if ($this->changed) { + $this->_setup(); + $this->changed = false; + } + if ($this->use_inline_crypt) { + $inline = $this->inline_crypt; + return $inline('encrypt', $this, $plaintext); + } + + $buffer = &$this->enbuffer; + $block_size = $this->block_size; + $ciphertext = ''; + switch ($this->mode) { + case CRYPT_MODE_ECB: + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $ciphertext.= $this->_encryptBlock(substr($plaintext, $i, $block_size)); + } + break; + case CRYPT_MODE_CBC: + $xor = $this->encryptIV; + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + $block = $this->_encryptBlock($block ^ $xor); + $xor = $block; + $ciphertext.= $block; + } + if ($this->continuousBuffer) { + $this->encryptIV = $xor; + } + break; + case CRYPT_MODE_CTR: + $xor = $this->encryptIV; + if (strlen($buffer['ciphertext'])) { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + if (strlen($block) > strlen($buffer['ciphertext'])) { + $buffer['ciphertext'].= $this->_encryptBlock($xor); + } + $this->_increment_str($xor); + $key = $this->_string_shift($buffer['ciphertext'], $block_size); + $ciphertext.= $block ^ $key; + } + } else { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + $key = $this->_encryptBlock($xor); + $this->_increment_str($xor); + $ciphertext.= $block ^ $key; + } + } + if ($this->continuousBuffer) { + $this->encryptIV = $xor; + if ($start = strlen($plaintext) % $block_size) { + $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; + } + } + break; + case CRYPT_MODE_CFB: + // cfb loosely routines inspired by openssl's: + // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} + if ($this->continuousBuffer) { + $iv = &$this->encryptIV; + $pos = &$buffer['pos']; + } else { + $iv = $this->encryptIV; + $pos = 0; + } + $len = strlen($plaintext); + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize + $ciphertext = substr($iv, $orig_pos) ^ $plaintext; + $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); + } + while ($len >= $block_size) { + $iv = $this->_encryptBlock($iv) ^ substr($plaintext, $i, $block_size); + $ciphertext.= $iv; + $len-= $block_size; + $i+= $block_size; + } + if ($len) { + $iv = $this->_encryptBlock($iv); + $block = $iv ^ substr($plaintext, $i); + $iv = substr_replace($iv, $block, 0, $len); + $ciphertext.= $block; + $pos = $len; + } + break; + case CRYPT_MODE_OFB: + $xor = $this->encryptIV; + if (strlen($buffer['xor'])) { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + if (strlen($block) > strlen($buffer['xor'])) { + $xor = $this->_encryptBlock($xor); + $buffer['xor'].= $xor; + } + $key = $this->_string_shift($buffer['xor'], $block_size); + $ciphertext.= $block ^ $key; + } + } else { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $xor = $this->_encryptBlock($xor); + $ciphertext.= substr($plaintext, $i, $block_size) ^ $xor; + } + $key = $xor; + } + if ($this->continuousBuffer) { + $this->encryptIV = $xor; + if ($start = strlen($plaintext) % $block_size) { + $buffer['xor'] = substr($key, $start) . $buffer['xor']; + } + } + break; + case CRYPT_MODE_STREAM: + $ciphertext = $this->_encryptBlock($plaintext); + break; + } + + return $ciphertext; + } + + /** + * Decrypts a message. + * + * If strlen($ciphertext) is not a multiple of the block size, null bytes will be added to the end of the string until + * it is. + * + * @see self::encrypt() + * @access public + * @param string $ciphertext + * @return string $plaintext + * @internal Could, but not must, extend by the child Crypt_* class + */ + function decrypt($ciphertext) + { + if ($this->paddable) { + // we pad with chr(0) since that's what mcrypt_generic does. to quote from {@link http://www.php.net/function.mcrypt-generic}: + // "The data is padded with "\0" to make sure the length of the data is n * blocksize." + $ciphertext = str_pad($ciphertext, strlen($ciphertext) + ($this->block_size - strlen($ciphertext) % $this->block_size) % $this->block_size, chr(0)); + } + + if ($this->engine === CRYPT_ENGINE_OPENSSL) { + if ($this->changed) { + $this->_clearBuffers(); + $this->changed = false; + } + switch ($this->mode) { + case CRYPT_MODE_STREAM: + $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options); + break; + case CRYPT_MODE_ECB: + if (!defined('OPENSSL_RAW_DATA')) { + $ciphertext.= @openssl_encrypt('', $this->cipher_name_openssl_ecb, $this->key, true); + } + $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options); + break; + case CRYPT_MODE_CBC: + if (!defined('OPENSSL_RAW_DATA')) { + $padding = str_repeat(chr($this->block_size), $this->block_size) ^ substr($ciphertext, -$this->block_size); + $ciphertext.= substr(@openssl_encrypt($padding, $this->cipher_name_openssl_ecb, $this->key, true), 0, $this->block_size); + $offset = 2 * $this->block_size; + } else { + $offset = $this->block_size; + } + $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $this->decryptIV); + if ($this->continuousBuffer) { + $this->decryptIV = substr($ciphertext, -$offset, $this->block_size); + } + break; + case CRYPT_MODE_CTR: + $plaintext = $this->_openssl_ctr_process($ciphertext, $this->decryptIV, $this->debuffer); + break; + case CRYPT_MODE_CFB: + // cfb loosely routines inspired by openssl's: + // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} + $plaintext = ''; + if ($this->continuousBuffer) { + $iv = &$this->decryptIV; + $pos = &$this->buffer['pos']; + } else { + $iv = $this->decryptIV; + $pos = 0; + } + $len = strlen($ciphertext); + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $this->block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $this->blocksize + $plaintext = substr($iv, $orig_pos) ^ $ciphertext; + $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); + $ciphertext = substr($ciphertext, $i); + } + $overflow = $len % $this->block_size; + if ($overflow) { + $plaintext.= openssl_decrypt(substr($ciphertext, 0, -$overflow), $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv); + if ($len - $overflow) { + $iv = substr($ciphertext, -$overflow - $this->block_size, -$overflow); + } + $iv = openssl_encrypt(str_repeat("\0", $this->block_size), $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv); + $plaintext.= $iv ^ substr($ciphertext, -$overflow); + $iv = substr_replace($iv, substr($ciphertext, -$overflow), 0, $overflow); + $pos = $overflow; + } elseif ($len) { + $plaintext.= openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv); + $iv = substr($ciphertext, -$this->block_size); + } + break; + case CRYPT_MODE_OFB: + $plaintext = $this->_openssl_ofb_process($ciphertext, $this->decryptIV, $this->debuffer); + } + + return $this->paddable ? $this->_unpad($plaintext) : $plaintext; + } + + if ($this->engine === CRYPT_ENGINE_MCRYPT) { + $block_size = $this->block_size; + if ($this->changed) { + $this->_setupMcrypt(); + $this->changed = false; + } + if ($this->dechanged) { + @mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV); + $this->dechanged = false; + } + + if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) { + $iv = &$this->decryptIV; + $pos = &$this->debuffer['pos']; + $len = strlen($ciphertext); + $plaintext = ''; + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize + $plaintext = substr($iv, $orig_pos) ^ $ciphertext; + $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); + } + if ($len >= $block_size) { + $cb = substr($ciphertext, $i, $len - $len % $block_size); + $plaintext.= @mcrypt_generic($this->ecb, $iv . $cb) ^ $cb; + $iv = substr($cb, -$block_size); + $len%= $block_size; + } + if ($len) { + $iv = @mcrypt_generic($this->ecb, $iv); + $plaintext.= $iv ^ substr($ciphertext, -$len); + $iv = substr_replace($iv, substr($ciphertext, -$len), 0, $len); + $pos = $len; + } + + return $plaintext; + } + + $plaintext = @mdecrypt_generic($this->demcrypt, $ciphertext); + + if (!$this->continuousBuffer) { + @mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV); + } + + return $this->paddable ? $this->_unpad($plaintext) : $plaintext; + } + + if ($this->changed) { + $this->_setup(); + $this->changed = false; + } + if ($this->use_inline_crypt) { + $inline = $this->inline_crypt; + return $inline('decrypt', $this, $ciphertext); + } + + $block_size = $this->block_size; + + $buffer = &$this->debuffer; + $plaintext = ''; + switch ($this->mode) { + case CRYPT_MODE_ECB: + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $plaintext.= $this->_decryptBlock(substr($ciphertext, $i, $block_size)); + } + break; + case CRYPT_MODE_CBC: + $xor = $this->decryptIV; + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $block = substr($ciphertext, $i, $block_size); + $plaintext.= $this->_decryptBlock($block) ^ $xor; + $xor = $block; + } + if ($this->continuousBuffer) { + $this->decryptIV = $xor; + } + break; + case CRYPT_MODE_CTR: + $xor = $this->decryptIV; + if (strlen($buffer['ciphertext'])) { + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $block = substr($ciphertext, $i, $block_size); + if (strlen($block) > strlen($buffer['ciphertext'])) { + $buffer['ciphertext'].= $this->_encryptBlock($xor); + $this->_increment_str($xor); + } + $key = $this->_string_shift($buffer['ciphertext'], $block_size); + $plaintext.= $block ^ $key; + } + } else { + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $block = substr($ciphertext, $i, $block_size); + $key = $this->_encryptBlock($xor); + $this->_increment_str($xor); + $plaintext.= $block ^ $key; + } + } + if ($this->continuousBuffer) { + $this->decryptIV = $xor; + if ($start = strlen($ciphertext) % $block_size) { + $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; + } + } + break; + case CRYPT_MODE_CFB: + if ($this->continuousBuffer) { + $iv = &$this->decryptIV; + $pos = &$buffer['pos']; + } else { + $iv = $this->decryptIV; + $pos = 0; + } + $len = strlen($ciphertext); + $i = 0; + if ($pos) { + $orig_pos = $pos; + $max = $block_size - $pos; + if ($len >= $max) { + $i = $max; + $len-= $max; + $pos = 0; + } else { + $i = $len; + $pos+= $len; + $len = 0; + } + // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize + $plaintext = substr($iv, $orig_pos) ^ $ciphertext; + $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); + } + while ($len >= $block_size) { + $iv = $this->_encryptBlock($iv); + $cb = substr($ciphertext, $i, $block_size); + $plaintext.= $iv ^ $cb; + $iv = $cb; + $len-= $block_size; + $i+= $block_size; + } + if ($len) { + $iv = $this->_encryptBlock($iv); + $plaintext.= $iv ^ substr($ciphertext, $i); + $iv = substr_replace($iv, substr($ciphertext, $i), 0, $len); + $pos = $len; + } + break; + case CRYPT_MODE_OFB: + $xor = $this->decryptIV; + if (strlen($buffer['xor'])) { + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $block = substr($ciphertext, $i, $block_size); + if (strlen($block) > strlen($buffer['xor'])) { + $xor = $this->_encryptBlock($xor); + $buffer['xor'].= $xor; + } + $key = $this->_string_shift($buffer['xor'], $block_size); + $plaintext.= $block ^ $key; + } + } else { + for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) { + $xor = $this->_encryptBlock($xor); + $plaintext.= substr($ciphertext, $i, $block_size) ^ $xor; + } + $key = $xor; + } + if ($this->continuousBuffer) { + $this->decryptIV = $xor; + if ($start = strlen($ciphertext) % $block_size) { + $buffer['xor'] = substr($key, $start) . $buffer['xor']; + } + } + break; + case CRYPT_MODE_STREAM: + $plaintext = $this->_decryptBlock($ciphertext); + break; + } + return $this->paddable ? $this->_unpad($plaintext) : $plaintext; + } + + /** + * OpenSSL CTR Processor + * + * PHP's OpenSSL bindings do not operate in continuous mode so we'll wrap around it. Since the keystream + * for CTR is the same for both encrypting and decrypting this function is re-used by both Crypt_Base::encrypt() + * and Crypt_Base::decrypt(). Also, OpenSSL doesn't implement CTR for all of it's symmetric ciphers so this + * function will emulate CTR with ECB when necessary. + * + * @see self::encrypt() + * @see self::decrypt() + * @param string $plaintext + * @param string $encryptIV + * @param array $buffer + * @return string + * @access private + */ + function _openssl_ctr_process($plaintext, &$encryptIV, &$buffer) + { + $ciphertext = ''; + + $block_size = $this->block_size; + $key = $this->key; + + if ($this->openssl_emulate_ctr) { + $xor = $encryptIV; + if (strlen($buffer['ciphertext'])) { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + if (strlen($block) > strlen($buffer['ciphertext'])) { + $result = @openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, $this->openssl_options); + $result = !defined('OPENSSL_RAW_DATA') ? substr($result, 0, -$this->block_size) : $result; + $buffer['ciphertext'].= $result; + } + $this->_increment_str($xor); + $otp = $this->_string_shift($buffer['ciphertext'], $block_size); + $ciphertext.= $block ^ $otp; + } + } else { + for ($i = 0; $i < strlen($plaintext); $i+=$block_size) { + $block = substr($plaintext, $i, $block_size); + $otp = @openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, $this->openssl_options); + $otp = !defined('OPENSSL_RAW_DATA') ? substr($otp, 0, -$this->block_size) : $otp; + $this->_increment_str($xor); + $ciphertext.= $block ^ $otp; + } + } + if ($this->continuousBuffer) { + $encryptIV = $xor; + if ($start = strlen($plaintext) % $block_size) { + $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; + } + } + + return $ciphertext; + } + + if (strlen($buffer['ciphertext'])) { + $ciphertext = $plaintext ^ $this->_string_shift($buffer['ciphertext'], strlen($plaintext)); + $plaintext = substr($plaintext, strlen($ciphertext)); + + if (!strlen($plaintext)) { + return $ciphertext; + } + } + + $overflow = strlen($plaintext) % $block_size; + if ($overflow) { + $plaintext2 = $this->_string_pop($plaintext, $overflow); // ie. trim $plaintext to a multiple of $block_size and put rest of $plaintext in $plaintext2 + $encrypted = openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV); + $temp = $this->_string_pop($encrypted, $block_size); + $ciphertext.= $encrypted . ($plaintext2 ^ $temp); + if ($this->continuousBuffer) { + $buffer['ciphertext'] = substr($temp, $overflow); + $encryptIV = $temp; + } + } elseif (!strlen($buffer['ciphertext'])) { + $ciphertext.= openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV); + $temp = $this->_string_pop($ciphertext, $block_size); + if ($this->continuousBuffer) { + $encryptIV = $temp; + } + } + if ($this->continuousBuffer) { + if (!defined('OPENSSL_RAW_DATA')) { + $encryptIV.= @openssl_encrypt('', $this->cipher_name_openssl_ecb, $key, $this->openssl_options); + } + $encryptIV = openssl_decrypt($encryptIV, $this->cipher_name_openssl_ecb, $key, $this->openssl_options); + if ($overflow) { + $this->_increment_str($encryptIV); + } + } + + return $ciphertext; + } + + /** + * OpenSSL OFB Processor + * + * PHP's OpenSSL bindings do not operate in continuous mode so we'll wrap around it. Since the keystream + * for OFB is the same for both encrypting and decrypting this function is re-used by both Crypt_Base::encrypt() + * and Crypt_Base::decrypt(). + * + * @see self::encrypt() + * @see self::decrypt() + * @param string $plaintext + * @param string $encryptIV + * @param array $buffer + * @return string + * @access private + */ + function _openssl_ofb_process($plaintext, &$encryptIV, &$buffer) + { + if (strlen($buffer['xor'])) { + $ciphertext = $plaintext ^ $buffer['xor']; + $buffer['xor'] = substr($buffer['xor'], strlen($ciphertext)); + $plaintext = substr($plaintext, strlen($ciphertext)); + } else { + $ciphertext = ''; + } + + $block_size = $this->block_size; + + $len = strlen($plaintext); + $key = $this->key; + $overflow = $len % $block_size; + + if (strlen($plaintext)) { + if ($overflow) { + $ciphertext.= openssl_encrypt(substr($plaintext, 0, -$overflow) . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV); + $xor = $this->_string_pop($ciphertext, $block_size); + if ($this->continuousBuffer) { + $encryptIV = $xor; + } + $ciphertext.= $this->_string_shift($xor, $overflow) ^ substr($plaintext, -$overflow); + if ($this->continuousBuffer) { + $buffer['xor'] = $xor; + } + } else { + $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV); + if ($this->continuousBuffer) { + $encryptIV = substr($ciphertext, -$block_size) ^ substr($plaintext, -$block_size); + } + } + } + + return $ciphertext; + } + + /** + * phpseclib <-> OpenSSL Mode Mapper + * + * May need to be overwritten by classes extending this one in some cases + * + * @return int + * @access private + */ + function _openssl_translate_mode() + { + switch ($this->mode) { + case CRYPT_MODE_ECB: + return 'ecb'; + case CRYPT_MODE_CBC: + return 'cbc'; + case CRYPT_MODE_CTR: + return 'ctr'; + case CRYPT_MODE_CFB: + return 'cfb'; + case CRYPT_MODE_OFB: + return 'ofb'; + } + } + + /** + * Pad "packets". + * + * Block ciphers working by encrypting between their specified [$this->]block_size at a time + * If you ever need to encrypt or decrypt something that isn't of the proper length, it becomes necessary to + * pad the input so that it is of the proper length. + * + * Padding is enabled by default. Sometimes, however, it is undesirable to pad strings. Such is the case in SSH, + * where "packets" are padded with random bytes before being encrypted. Unpad these packets and you risk stripping + * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is + * transmitted separately) + * + * @see self::disablePadding() + * @access public + */ + function enablePadding() + { + $this->padding = true; + } + + /** + * Do not pad packets. + * + * @see self::enablePadding() + * @access public + */ + function disablePadding() + { + $this->padding = false; + } + + /** + * Treat consecutive "packets" as if they are a continuous buffer. + * + * Say you have a 32-byte plaintext $plaintext. Using the default behavior, the two following code snippets + * will yield different outputs: + * + * + * echo $rijndael->encrypt(substr($plaintext, 0, 16)); + * echo $rijndael->encrypt(substr($plaintext, 16, 16)); + * + * + * echo $rijndael->encrypt($plaintext); + * + * + * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates + * another, as demonstrated with the following: + * + * + * $rijndael->encrypt(substr($plaintext, 0, 16)); + * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); + * + * + * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); + * + * + * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different + * outputs. The reason is due to the fact that the initialization vector's change after every encryption / + * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. + * + * Put another way, when the continuous buffer is enabled, the state of the Crypt_*() object changes after each + * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that + * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), + * however, they are also less intuitive and more likely to cause you problems. + * + * @see self::disableContinuousBuffer() + * @access public + * @internal Could, but not must, extend by the child Crypt_* class + */ + function enableContinuousBuffer() + { + if ($this->mode == CRYPT_MODE_ECB) { + return; + } + + $this->continuousBuffer = true; + + $this->_setEngine(); + } + + /** + * Treat consecutive packets as if they are a discontinuous buffer. + * + * The default behavior. + * + * @see self::enableContinuousBuffer() + * @access public + * @internal Could, but not must, extend by the child Crypt_* class + */ + function disableContinuousBuffer() + { + if ($this->mode == CRYPT_MODE_ECB) { + return; + } + if (!$this->continuousBuffer) { + return; + } + + $this->continuousBuffer = false; + $this->changed = true; + + $this->_setEngine(); + } + + /** + * Test for engine validity + * + * @see self::Crypt_Base() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + switch ($engine) { + case CRYPT_ENGINE_OPENSSL: + if ($this->mode == CRYPT_MODE_STREAM && $this->continuousBuffer) { + return false; + } + $this->openssl_emulate_ctr = false; + $result = $this->cipher_name_openssl && + extension_loaded('openssl') && + // PHP 5.3.0 - 5.3.2 did not let you set IV's + version_compare(PHP_VERSION, '5.3.3', '>='); + if (!$result) { + return false; + } + + // prior to PHP 5.4.0 OPENSSL_RAW_DATA and OPENSSL_ZERO_PADDING were not defined. instead of expecting an integer + // $options openssl_encrypt expected a boolean $raw_data. + if (!defined('OPENSSL_RAW_DATA')) { + $this->openssl_options = true; + } else { + $this->openssl_options = OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING; + } + + $methods = openssl_get_cipher_methods(); + if (in_array($this->cipher_name_openssl, $methods)) { + return true; + } + // not all of openssl's symmetric cipher's support ctr. for those + // that don't we'll emulate it + switch ($this->mode) { + case CRYPT_MODE_CTR: + if (in_array($this->cipher_name_openssl_ecb, $methods)) { + $this->openssl_emulate_ctr = true; + return true; + } + } + return false; + case CRYPT_ENGINE_MCRYPT: + return $this->cipher_name_mcrypt && + extension_loaded('mcrypt') && + in_array($this->cipher_name_mcrypt, @mcrypt_list_algorithms()); + case CRYPT_ENGINE_INTERNAL: + return true; + } + + return false; + } + + /** + * Sets the preferred crypt engine + * + * Currently, $engine could be: + * + * - CRYPT_ENGINE_OPENSSL [very fast] + * + * - CRYPT_ENGINE_MCRYPT [fast] + * + * - CRYPT_ENGINE_INTERNAL [slow] + * + * If the preferred crypt engine is not available the fastest available one will be used + * + * @see self::Crypt_Base() + * @param int $engine + * @access public + */ + function setPreferredEngine($engine) + { + switch ($engine) { + //case CRYPT_ENGINE_OPENSSL: + case CRYPT_ENGINE_MCRYPT: + case CRYPT_ENGINE_INTERNAL: + $this->preferredEngine = $engine; + break; + default: + $this->preferredEngine = CRYPT_ENGINE_OPENSSL; + } + + $this->_setEngine(); + } + + /** + * Returns the engine currently being utilized + * + * @see self::_setEngine() + * @access public + */ + function getEngine() + { + return $this->engine; + } + + /** + * Sets the engine as appropriate + * + * @see self::Crypt_Base() + * @access private + */ + function _setEngine() + { + $this->engine = null; + + $candidateEngines = array( + $this->preferredEngine, + CRYPT_ENGINE_OPENSSL, + CRYPT_ENGINE_MCRYPT + ); + foreach ($candidateEngines as $engine) { + if ($this->isValidEngine($engine)) { + $this->engine = $engine; + break; + } + } + if (!$this->engine) { + $this->engine = CRYPT_ENGINE_INTERNAL; + } + + if ($this->engine != CRYPT_ENGINE_MCRYPT && $this->enmcrypt) { + // Closing the current mcrypt resource(s). _mcryptSetup() will, if needed, + // (re)open them with the module named in $this->cipher_name_mcrypt + @mcrypt_module_close($this->enmcrypt); + @mcrypt_module_close($this->demcrypt); + $this->enmcrypt = null; + $this->demcrypt = null; + + if ($this->ecb) { + @mcrypt_module_close($this->ecb); + $this->ecb = null; + } + } + + $this->changed = true; + } + + /** + * Encrypts a block + * + * @access private + * @param string $in + * @return string + * @internal Must be extended by the child Crypt_* class + */ + function _encryptBlock($in) + { + user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); + } + + /** + * Decrypts a block + * + * @access private + * @param string $in + * @return string + * @internal Must be extended by the child Crypt_* class + */ + function _decryptBlock($in) + { + user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); + } + + /** + * Setup the key (expansion) + * + * Only used if $engine == CRYPT_ENGINE_INTERNAL + * + * @see self::_setup() + * @access private + * @internal Must be extended by the child Crypt_* class + */ + function _setupKey() + { + user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR); + } + + /** + * Setup the CRYPT_ENGINE_INTERNAL $engine + * + * (re)init, if necessary, the internal cipher $engine and flush all $buffers + * Used (only) if $engine == CRYPT_ENGINE_INTERNAL + * + * _setup() will be called each time if $changed === true + * typically this happens when using one or more of following public methods: + * + * - setKey() + * + * - setIV() + * + * - disableContinuousBuffer() + * + * - First run of encrypt() / decrypt() with no init-settings + * + * @see self::setKey() + * @see self::setIV() + * @see self::disableContinuousBuffer() + * @access private + * @internal _setup() is always called before en/decryption. + * @internal Could, but not must, extend by the child Crypt_* class + */ + function _setup() + { + $this->_clearBuffers(); + $this->_setupKey(); + + if ($this->use_inline_crypt) { + $this->_setupInlineCrypt(); + } + } + + /** + * Setup the CRYPT_ENGINE_MCRYPT $engine + * + * (re)init, if necessary, the (ext)mcrypt resources and flush all $buffers + * Used (only) if $engine = CRYPT_ENGINE_MCRYPT + * + * _setupMcrypt() will be called each time if $changed === true + * typically this happens when using one or more of following public methods: + * + * - setKey() + * + * - setIV() + * + * - disableContinuousBuffer() + * + * - First run of encrypt() / decrypt() + * + * @see self::setKey() + * @see self::setIV() + * @see self::disableContinuousBuffer() + * @access private + * @internal Could, but not must, extend by the child Crypt_* class + */ + function _setupMcrypt() + { + $this->_clearBuffers(); + $this->enchanged = $this->dechanged = true; + + if (!isset($this->enmcrypt)) { + static $mcrypt_modes = array( + CRYPT_MODE_CTR => 'ctr', + CRYPT_MODE_ECB => MCRYPT_MODE_ECB, + CRYPT_MODE_CBC => MCRYPT_MODE_CBC, + CRYPT_MODE_CFB => 'ncfb', + CRYPT_MODE_OFB => MCRYPT_MODE_NOFB, + CRYPT_MODE_STREAM => MCRYPT_MODE_STREAM, + ); + + $this->demcrypt = @mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); + $this->enmcrypt = @mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); + + // we need the $ecb mcrypt resource (only) in MODE_CFB with enableContinuousBuffer() + // to workaround mcrypt's broken ncfb implementation in buffered mode + // see: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} + if ($this->mode == CRYPT_MODE_CFB) { + $this->ecb = @mcrypt_module_open($this->cipher_name_mcrypt, '', MCRYPT_MODE_ECB, ''); + } + } // else should mcrypt_generic_deinit be called? + + if ($this->mode == CRYPT_MODE_CFB) { + @mcrypt_generic_init($this->ecb, $this->key, str_repeat("\0", $this->block_size)); + } + } + + /** + * Pads a string + * + * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize. + * $this->block_size - (strlen($text) % $this->block_size) bytes are added, each of which is equal to + * chr($this->block_size - (strlen($text) % $this->block_size) + * + * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless + * and padding will, hence forth, be enabled. + * + * @see self::_unpad() + * @param string $text + * @access private + * @return string + */ + function _pad($text) + { + $length = strlen($text); + + if (!$this->padding) { + if ($length % $this->block_size == 0) { + return $text; + } else { + user_error("The plaintext's length ($length) is not a multiple of the block size ({$this->block_size})"); + $this->padding = true; + } + } + + $pad = $this->block_size - ($length % $this->block_size); + + return str_pad($text, $length + $pad, chr($pad)); + } + + /** + * Unpads a string. + * + * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong + * and false will be returned. + * + * @see self::_pad() + * @param string $text + * @access private + * @return string + */ + function _unpad($text) + { + if (!$this->padding) { + return $text; + } + + $length = ord($text[strlen($text) - 1]); + + if (!$length || $length > $this->block_size) { + return false; + } + + return substr($text, 0, -$length); + } + + /** + * Clears internal buffers + * + * Clearing/resetting the internal buffers is done everytime + * after disableContinuousBuffer() or on cipher $engine (re)init + * ie after setKey() or setIV() + * + * @access public + * @internal Could, but not must, extend by the child Crypt_* class + */ + function _clearBuffers() + { + $this->enbuffer = $this->debuffer = array('ciphertext' => '', 'xor' => '', 'pos' => 0, 'enmcrypt_init' => true); + + // mcrypt's handling of invalid's $iv: + // $this->encryptIV = $this->decryptIV = strlen($this->iv) == $this->block_size ? $this->iv : str_repeat("\0", $this->block_size); + $this->encryptIV = $this->decryptIV = str_pad(substr($this->iv, 0, $this->block_size), $this->block_size, "\0"); + + if (!$this->skip_key_adjustment) { + $this->key = str_pad(substr($this->key, 0, $this->key_length), $this->key_length, "\0"); + } + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param string $string + * @param int $index + * @access private + * @return string + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * String Pop + * + * Inspired by array_pop + * + * @param string $string + * @param int $index + * @access private + * @return string + */ + function _string_pop(&$string, $index = 1) + { + $substr = substr($string, -$index); + $string = substr($string, 0, -$index); + return $substr; + } + + /** + * Increment the current string + * + * @see self::decrypt() + * @see self::encrypt() + * @param string $var + * @access private + */ + function _increment_str(&$var) + { + for ($i = 4; $i <= strlen($var); $i+= 4) { + $temp = substr($var, -$i, 4); + switch ($temp) { + case "\xFF\xFF\xFF\xFF": + $var = substr_replace($var, "\x00\x00\x00\x00", -$i, 4); + break; + case "\x7F\xFF\xFF\xFF": + $var = substr_replace($var, "\x80\x00\x00\x00", -$i, 4); + return; + default: + $temp = unpack('Nnum', $temp); + $var = substr_replace($var, pack('N', $temp['num'] + 1), -$i, 4); + return; + } + } + + $remainder = strlen($var) % 4; + + if ($remainder == 0) { + return; + } + + $temp = unpack('Nnum', str_pad(substr($var, 0, $remainder), 4, "\0", STR_PAD_LEFT)); + $temp = substr(pack('N', $temp['num'] + 1), -$remainder); + $var = substr_replace($var, $temp, 0, $remainder); + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * Stores the created (or existing) callback function-name + * in $this->inline_crypt + * + * Internally for phpseclib developers: + * + * _setupInlineCrypt() would be called only if: + * + * - $engine == CRYPT_ENGINE_INTERNAL and + * + * - $use_inline_crypt === true + * + * - each time on _setup(), after(!) _setupKey() + * + * + * This ensures that _setupInlineCrypt() has always a + * full ready2go initializated internal cipher $engine state + * where, for example, the keys allready expanded, + * keys/block_size calculated and such. + * + * It is, each time if called, the responsibility of _setupInlineCrypt(): + * + * - to set $this->inline_crypt to a valid and fully working callback function + * as a (faster) replacement for encrypt() / decrypt() + * + * - NOT to create unlimited callback functions (for memory reasons!) + * no matter how often _setupInlineCrypt() would be called. At some + * point of amount they must be generic re-useable. + * + * - the code of _setupInlineCrypt() it self, + * and the generated callback code, + * must be, in following order: + * - 100% safe + * - 100% compatible to encrypt()/decrypt() + * - using only php5+ features/lang-constructs/php-extensions if + * compatibility (down to php4) or fallback is provided + * - readable/maintainable/understandable/commented and... not-cryptic-styled-code :-) + * - >= 10% faster than encrypt()/decrypt() [which is, by the way, + * the reason for the existence of _setupInlineCrypt() :-)] + * - memory-nice + * - short (as good as possible) + * + * Note: - _setupInlineCrypt() is using _createInlineCryptFunction() to create the full callback function code. + * - In case of using inline crypting, _setupInlineCrypt() must extend by the child Crypt_* class. + * - The following variable names are reserved: + * - $_* (all variable names prefixed with an underscore) + * - $self (object reference to it self. Do not use $this, but $self instead) + * - $in (the content of $in has to en/decrypt by the generated code) + * - The callback function should not use the 'return' statement, but en/decrypt'ing the content of $in only + * + * + * @see self::_setup() + * @see self::_createInlineCryptFunction() + * @see self::encrypt() + * @see self::decrypt() + * @access private + * @internal If a Crypt_* class providing inline crypting it must extend _setupInlineCrypt() + */ + function _setupInlineCrypt() + { + // If, for any reason, an extending Crypt_Base() Crypt_* class + // not using inline crypting then it must be ensured that: $this->use_inline_crypt = false + // ie in the class var declaration of $use_inline_crypt in general for the Crypt_* class, + // in the constructor at object instance-time + // or, if it's runtime-specific, at runtime + + $this->use_inline_crypt = false; + } + + /** + * Creates the performance-optimized function for en/decrypt() + * + * Internally for phpseclib developers: + * + * _createInlineCryptFunction(): + * + * - merge the $cipher_code [setup'ed by _setupInlineCrypt()] + * with the current [$this->]mode of operation code + * + * - create the $inline function, which called by encrypt() / decrypt() + * as its replacement to speed up the en/decryption operations. + * + * - return the name of the created $inline callback function + * + * - used to speed up en/decryption + * + * + * + * The main reason why can speed up things [up to 50%] this way are: + * + * - using variables more effective then regular. + * (ie no use of expensive arrays but integers $k_0, $k_1 ... + * or even, for example, the pure $key[] values hardcoded) + * + * - avoiding 1000's of function calls of ie _encryptBlock() + * but inlining the crypt operations. + * in the mode of operation for() loop. + * + * - full loop unroll the (sometimes key-dependent) rounds + * avoiding this way ++$i counters and runtime-if's etc... + * + * The basic code architectur of the generated $inline en/decrypt() + * lambda function, in pseudo php, is: + * + * + * +----------------------------------------------------------------------------------------------+ + * | callback $inline = create_function: | + * | lambda_function_0001_crypt_ECB($action, $text) | + * | { | + * | INSERT PHP CODE OF: | + * | $cipher_code['init_crypt']; // general init code. | + * | // ie: $sbox'es declarations used for | + * | // encrypt and decrypt'ing. | + * | | + * | switch ($action) { | + * | case 'encrypt': | + * | INSERT PHP CODE OF: | + * | $cipher_code['init_encrypt']; // encrypt sepcific init code. | + * | ie: specified $key or $box | + * | declarations for encrypt'ing. | + * | | + * | foreach ($ciphertext) { | + * | $in = $block_size of $ciphertext; | + * | | + * | INSERT PHP CODE OF: | + * | $cipher_code['encrypt_block']; // encrypt's (string) $in, which is always: | + * | // strlen($in) == $this->block_size | + * | // here comes the cipher algorithm in action | + * | // for encryption. | + * | // $cipher_code['encrypt_block'] has to | + * | // encrypt the content of the $in variable | + * | | + * | $plaintext .= $in; | + * | } | + * | return $plaintext; | + * | | + * | case 'decrypt': | + * | INSERT PHP CODE OF: | + * | $cipher_code['init_decrypt']; // decrypt sepcific init code | + * | ie: specified $key or $box | + * | declarations for decrypt'ing. | + * | foreach ($plaintext) { | + * | $in = $block_size of $plaintext; | + * | | + * | INSERT PHP CODE OF: | + * | $cipher_code['decrypt_block']; // decrypt's (string) $in, which is always | + * | // strlen($in) == $this->block_size | + * | // here comes the cipher algorithm in action | + * | // for decryption. | + * | // $cipher_code['decrypt_block'] has to | + * | // decrypt the content of the $in variable | + * | $ciphertext .= $in; | + * | } | + * | return $ciphertext; | + * | } | + * | } | + * +----------------------------------------------------------------------------------------------+ + * + * + * See also the Crypt_*::_setupInlineCrypt()'s for + * productive inline $cipher_code's how they works. + * + * Structure of: + * + * $cipher_code = array( + * 'init_crypt' => (string) '', // optional + * 'init_encrypt' => (string) '', // optional + * 'init_decrypt' => (string) '', // optional + * 'encrypt_block' => (string) '', // required + * 'decrypt_block' => (string) '' // required + * ); + * + * + * @see self::_setupInlineCrypt() + * @see self::encrypt() + * @see self::decrypt() + * @param array $cipher_code + * @access private + * @return string (the name of the created callback function) + */ + function _createInlineCryptFunction($cipher_code) + { + $block_size = $this->block_size; + + // optional + $init_crypt = isset($cipher_code['init_crypt']) ? $cipher_code['init_crypt'] : ''; + $init_encrypt = isset($cipher_code['init_encrypt']) ? $cipher_code['init_encrypt'] : ''; + $init_decrypt = isset($cipher_code['init_decrypt']) ? $cipher_code['init_decrypt'] : ''; + // required + $encrypt_block = $cipher_code['encrypt_block']; + $decrypt_block = $cipher_code['decrypt_block']; + + // Generating mode of operation inline code, + // merged with the $cipher_code algorithm + // for encrypt- and decryption. + switch ($this->mode) { + case CRYPT_MODE_ECB: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_plaintext_len = strlen($_text); + + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $in = substr($_text, $_i, '.$block_size.'); + '.$encrypt_block.' + $_ciphertext.= $in; + } + + return $_ciphertext; + '; + + $decrypt = $init_decrypt . ' + $_plaintext = ""; + $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0)); + $_ciphertext_len = strlen($_text); + + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $in = substr($_text, $_i, '.$block_size.'); + '.$decrypt_block.' + $_plaintext.= $in; + } + + return $self->_unpad($_plaintext); + '; + break; + case CRYPT_MODE_CTR: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_plaintext_len = strlen($_text); + $_xor = $self->encryptIV; + $_buffer = &$self->enbuffer; + if (strlen($_buffer["ciphertext"])) { + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + if (strlen($_block) > strlen($_buffer["ciphertext"])) { + $in = $_xor; + '.$encrypt_block.' + $self->_increment_str($_xor); + $_buffer["ciphertext"].= $in; + } + $_key = $self->_string_shift($_buffer["ciphertext"], '.$block_size.'); + $_ciphertext.= $_block ^ $_key; + } + } else { + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + $in = $_xor; + '.$encrypt_block.' + $self->_increment_str($_xor); + $_key = $in; + $_ciphertext.= $_block ^ $_key; + } + } + if ($self->continuousBuffer) { + $self->encryptIV = $_xor; + if ($_start = $_plaintext_len % '.$block_size.') { + $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"]; + } + } + + return $_ciphertext; + '; + + $decrypt = $init_encrypt . ' + $_plaintext = ""; + $_ciphertext_len = strlen($_text); + $_xor = $self->decryptIV; + $_buffer = &$self->debuffer; + + if (strlen($_buffer["ciphertext"])) { + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + if (strlen($_block) > strlen($_buffer["ciphertext"])) { + $in = $_xor; + '.$encrypt_block.' + $self->_increment_str($_xor); + $_buffer["ciphertext"].= $in; + } + $_key = $self->_string_shift($_buffer["ciphertext"], '.$block_size.'); + $_plaintext.= $_block ^ $_key; + } + } else { + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + $in = $_xor; + '.$encrypt_block.' + $self->_increment_str($_xor); + $_key = $in; + $_plaintext.= $_block ^ $_key; + } + } + if ($self->continuousBuffer) { + $self->decryptIV = $_xor; + if ($_start = $_ciphertext_len % '.$block_size.') { + $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"]; + } + } + + return $_plaintext; + '; + break; + case CRYPT_MODE_CFB: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_buffer = &$self->enbuffer; + + if ($self->continuousBuffer) { + $_iv = &$self->encryptIV; + $_pos = &$_buffer["pos"]; + } else { + $_iv = $self->encryptIV; + $_pos = 0; + } + $_len = strlen($_text); + $_i = 0; + if ($_pos) { + $_orig_pos = $_pos; + $_max = '.$block_size.' - $_pos; + if ($_len >= $_max) { + $_i = $_max; + $_len-= $_max; + $_pos = 0; + } else { + $_i = $_len; + $_pos+= $_len; + $_len = 0; + } + $_ciphertext = substr($_iv, $_orig_pos) ^ $_text; + $_iv = substr_replace($_iv, $_ciphertext, $_orig_pos, $_i); + } + while ($_len >= '.$block_size.') { + $in = $_iv; + '.$encrypt_block.'; + $_iv = $in ^ substr($_text, $_i, '.$block_size.'); + $_ciphertext.= $_iv; + $_len-= '.$block_size.'; + $_i+= '.$block_size.'; + } + if ($_len) { + $in = $_iv; + '.$encrypt_block.' + $_iv = $in; + $_block = $_iv ^ substr($_text, $_i); + $_iv = substr_replace($_iv, $_block, 0, $_len); + $_ciphertext.= $_block; + $_pos = $_len; + } + return $_ciphertext; + '; + + $decrypt = $init_encrypt . ' + $_plaintext = ""; + $_buffer = &$self->debuffer; + + if ($self->continuousBuffer) { + $_iv = &$self->decryptIV; + $_pos = &$_buffer["pos"]; + } else { + $_iv = $self->decryptIV; + $_pos = 0; + } + $_len = strlen($_text); + $_i = 0; + if ($_pos) { + $_orig_pos = $_pos; + $_max = '.$block_size.' - $_pos; + if ($_len >= $_max) { + $_i = $_max; + $_len-= $_max; + $_pos = 0; + } else { + $_i = $_len; + $_pos+= $_len; + $_len = 0; + } + $_plaintext = substr($_iv, $_orig_pos) ^ $_text; + $_iv = substr_replace($_iv, substr($_text, 0, $_i), $_orig_pos, $_i); + } + while ($_len >= '.$block_size.') { + $in = $_iv; + '.$encrypt_block.' + $_iv = $in; + $cb = substr($_text, $_i, '.$block_size.'); + $_plaintext.= $_iv ^ $cb; + $_iv = $cb; + $_len-= '.$block_size.'; + $_i+= '.$block_size.'; + } + if ($_len) { + $in = $_iv; + '.$encrypt_block.' + $_iv = $in; + $_plaintext.= $_iv ^ substr($_text, $_i); + $_iv = substr_replace($_iv, substr($_text, $_i), 0, $_len); + $_pos = $_len; + } + + return $_plaintext; + '; + break; + case CRYPT_MODE_OFB: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_plaintext_len = strlen($_text); + $_xor = $self->encryptIV; + $_buffer = &$self->enbuffer; + + if (strlen($_buffer["xor"])) { + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + if (strlen($_block) > strlen($_buffer["xor"])) { + $in = $_xor; + '.$encrypt_block.' + $_xor = $in; + $_buffer["xor"].= $_xor; + } + $_key = $self->_string_shift($_buffer["xor"], '.$block_size.'); + $_ciphertext.= $_block ^ $_key; + } + } else { + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $in = $_xor; + '.$encrypt_block.' + $_xor = $in; + $_ciphertext.= substr($_text, $_i, '.$block_size.') ^ $_xor; + } + $_key = $_xor; + } + if ($self->continuousBuffer) { + $self->encryptIV = $_xor; + if ($_start = $_plaintext_len % '.$block_size.') { + $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; + } + } + return $_ciphertext; + '; + + $decrypt = $init_encrypt . ' + $_plaintext = ""; + $_ciphertext_len = strlen($_text); + $_xor = $self->decryptIV; + $_buffer = &$self->debuffer; + + if (strlen($_buffer["xor"])) { + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $_block = substr($_text, $_i, '.$block_size.'); + if (strlen($_block) > strlen($_buffer["xor"])) { + $in = $_xor; + '.$encrypt_block.' + $_xor = $in; + $_buffer["xor"].= $_xor; + } + $_key = $self->_string_shift($_buffer["xor"], '.$block_size.'); + $_plaintext.= $_block ^ $_key; + } + } else { + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $in = $_xor; + '.$encrypt_block.' + $_xor = $in; + $_plaintext.= substr($_text, $_i, '.$block_size.') ^ $_xor; + } + $_key = $_xor; + } + if ($self->continuousBuffer) { + $self->decryptIV = $_xor; + if ($_start = $_ciphertext_len % '.$block_size.') { + $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; + } + } + return $_plaintext; + '; + break; + case CRYPT_MODE_STREAM: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + '.$encrypt_block.' + return $_ciphertext; + '; + $decrypt = $init_decrypt . ' + $_plaintext = ""; + '.$decrypt_block.' + return $_plaintext; + '; + break; + // case CRYPT_MODE_CBC: + default: + $encrypt = $init_encrypt . ' + $_ciphertext = ""; + $_plaintext_len = strlen($_text); + + $in = $self->encryptIV; + + for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') { + $in = substr($_text, $_i, '.$block_size.') ^ $in; + '.$encrypt_block.' + $_ciphertext.= $in; + } + + if ($self->continuousBuffer) { + $self->encryptIV = $in; + } + + return $_ciphertext; + '; + + $decrypt = $init_decrypt . ' + $_plaintext = ""; + $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0)); + $_ciphertext_len = strlen($_text); + + $_iv = $self->decryptIV; + + for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') { + $in = $_block = substr($_text, $_i, '.$block_size.'); + '.$decrypt_block.' + $_plaintext.= $in ^ $_iv; + $_iv = $_block; + } + + if ($self->continuousBuffer) { + $self->decryptIV = $_iv; + } + + return $self->_unpad($_plaintext); + '; + break; + } + + // Create the $inline function and return its name as string. Ready to run! + if (version_compare(PHP_VERSION, '5.3.0') >= 0) { + eval('$func = function ($_action, &$self, $_text) { ' . $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' } };'); + return $func; + } + + return create_function('$_action, &$self, $_text', $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' }'); + } + + /** + * Holds the lambda_functions table (classwide) + * + * Each name of the lambda function, created from + * _setupInlineCrypt() && _createInlineCryptFunction() + * is stored, classwide (!), here for reusing. + * + * The string-based index of $function is a classwide + * unique value representing, at least, the $mode of + * operation (or more... depends of the optimizing level) + * for which $mode the lambda function was created. + * + * @access private + * @return array &$functions + */ + function &_getLambdaFunctions() + { + static $functions = array(); + return $functions; + } + + /** + * Generates a digest from $bytes + * + * @see self::_setupInlineCrypt() + * @access private + * @param $bytes + * @return string + */ + function _hashInlineCryptFunction($bytes) + { + if (!defined('CRYPT_BASE_WHIRLPOOL_AVAILABLE')) { + define('CRYPT_BASE_WHIRLPOOL_AVAILABLE', (bool)(extension_loaded('hash') && in_array('whirlpool', hash_algos()))); + } + + $result = ''; + $hash = $bytes; + + switch (true) { + case CRYPT_BASE_WHIRLPOOL_AVAILABLE: + foreach (str_split($bytes, 64) as $t) { + $hash = hash('whirlpool', $hash, true); + $result .= $t ^ $hash; + } + return $result . hash('whirlpool', $hash, true); + default: + $len = strlen($bytes); + for ($i = 0; $i < $len; $i+=20) { + $t = substr($bytes, $i, 20); + $hash = pack('H*', sha1($hash)); + $result .= $t ^ $hash; + } + return $result . pack('H*', sha1($hash)); + } + } + + /** + * Convert float to int + * + * On 32-bit Linux installs running PHP < 5.3 converting floats to ints doesn't always work + * + * @access private + * @param string $x + * @return int + */ + function safe_intval($x) + { + switch (true) { + case is_int($x): + // PHP 5.3, per http://php.net/releases/5_3_0.php, introduced "more consistent float rounding" + case version_compare(PHP_VERSION, '5.3.0') >= 0 && (php_uname('m') & "\xDF\xDF\xDF") != 'ARM': + // PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster + case (PHP_OS & "\xDF\xDF\xDF") === 'WIN': + return $x; + } + return (fmod($x, 0x80000000) & 0x7FFFFFFF) | + ((fmod(floor($x / 0x80000000), 2) & 1) << 31); + } + + /** + * eval()'able string for in-line float to int + * + * @access private + * @return string + */ + function safe_intval_inline() + { + // on 32-bit linux systems with PHP < 5.3 float to integer conversion is bad + switch (true) { + case defined('PHP_INT_SIZE') && PHP_INT_SIZE == 8: + case version_compare(PHP_VERSION, '5.3.0') >= 0 && (php_uname('m') & "\xDF\xDF\xDF") != 'ARM': + case (PHP_OS & "\xDF\xDF\xDF") === 'WIN': + return '%s'; + break; + default: + $safeint = '(is_int($temp = %s) ? $temp : (fmod($temp, 0x80000000) & 0x7FFFFFFF) | '; + return $safeint . '((fmod(floor($temp / 0x80000000), 2) & 1) << 31))'; + } + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Blowfish.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Blowfish.php old mode 100644 new mode 100755 index f39f17d74..176a3e140 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Blowfish.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Blowfish.php @@ -1,644 +1,644 @@ - - * setKey('12345678901234567890123456789012'); - * - * $plaintext = str_repeat('a', 1024); - * - * echo $blowfish->decrypt($blowfish->encrypt($plaintext)); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Crypt - * @package Crypt_Blowfish - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Base - * - * Base cipher class - */ -if (!class_exists('Crypt_Base')) { - include_once 'Base.php'; -} - -/**#@+ - * @access public - * @see Crypt_Blowfish::encrypt() - * @see Crypt_Blowfish::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_BLOWFISH_MODE_CTR', CRYPT_MODE_CTR); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_BLOWFISH_MODE_ECB', CRYPT_MODE_ECB); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_BLOWFISH_MODE_CBC', CRYPT_MODE_CBC); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_BLOWFISH_MODE_CFB', CRYPT_MODE_CFB); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_BLOWFISH_MODE_OFB', CRYPT_MODE_OFB); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_Base::Crypt_Base() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_BLOWFISH_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_BLOWFISH_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/** - * Pure-PHP implementation of Blowfish. - * - * @package Crypt_Blowfish - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @access public - */ -class Crypt_Blowfish extends Crypt_Base -{ - /** - * Block Length of the cipher - * - * @see Crypt_Base::block_size - * @var Integer - * @access private - */ - var $block_size = 8; - - /** - * The default password key_size used by setPassword() - * - * @see Crypt_Base::password_key_size - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 56; - - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'BLOWFISH'; - - /** - * The mcrypt specific name of the cipher - * - * @see Crypt_Base::cipher_name_mcrypt - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'blowfish'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Crypt_Base::cfb_init_len - * @var Integer - * @access private - */ - var $cfb_init_len = 500; - - /** - * The fixed subkeys boxes ($sbox0 - $sbox3) with 256 entries each - * - * S-Box 1 - * - * @access private - * @var array - */ - var $sbox0 = array ( - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, - 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, - 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, - 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, - 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, - 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, - 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, - 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, - 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, - 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, - 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, - 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, - 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, - 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, - 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, - 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, - 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, - 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, - 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, - 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, - 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, - 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, - 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, - 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, - 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, - 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, - 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, - 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, - 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, - 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a - ); - - /** - * S-Box 1 - * - * @access private - * @var array - */ - var $sbox1 = array( - 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, - 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, - 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, - 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, - 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, - 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, - 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, - 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, - 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, - 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, - 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, - 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, - 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, - 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, - 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, - 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, - 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, - 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, - 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, - 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, - 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, - 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, - 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, - 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, - 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, - 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, - 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, - 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, - 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, - 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 - ); - - /** - * S-Box 2 - * - * @access private - * @var array - */ - var $sbox2 = array( - 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, - 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, - 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, - 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, - 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, - 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, - 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, - 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, - 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, - 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, - 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, - 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, - 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, - 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, - 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, - 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, - 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, - 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, - 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, - 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, - 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, - 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, - 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, - 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, - 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, - 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, - 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, - 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, - 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, - 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 - ); - - /** - * S-Box 3 - * - * @access private - * @var array - */ - var $sbox3 = array( - 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, - 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, - 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, - 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, - 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, - 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, - 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, - 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, - 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, - 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, - 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, - 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, - 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, - 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, - 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, - 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, - 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, - 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, - 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, - 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, - 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, - 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, - 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, - 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, - 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, - 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, - 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, - 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, - 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, - 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 - ); - - /** - * P-Array consists of 18 32-bit subkeys - * - * @var array $parray - * @access private - */ - var $parray = array( - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, - 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, - 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b - ); - - /** - * The BCTX-working Array - * - * Holds the expanded key [p] and the key-depended s-boxes [sb] - * - * @var array $bctx - * @access private - */ - var $bctx; - - /** - * Holds the last used key - * - * @var Array - * @access private - */ - var $kl; - - /** - * Sets the key. - * - * Keys can be of any length. Blowfish, itself, requires the use of a key between 32 and max. 448-bits long. - * If the key is less than 32-bits we NOT fill the key to 32bit but let the key as it is to be compatible - * with mcrypt because mcrypt act this way with blowfish key's < 32 bits. - * - * If the key is more than 448-bits, we trim the excess bits. - * - * If the key is not explicitly set, or empty, it'll be assumed a 128 bits key to be all null bytes. - * - * @access public - * @see Crypt_Base::setKey() - * @param String $key - */ - function setKey($key) - { - $keylength = strlen($key); - - if (!$keylength) { - $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; - } elseif ($keylength > 56) { - $key = substr($key, 0, 56); - } - - parent::setKey($key); - } - - /** - * Setup the key (expansion) - * - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - if (isset($this->kl['key']) && $this->key === $this->kl['key']) { - // already expanded - return; - } - $this->kl = array('key' => $this->key); - - /* key-expanding p[] and S-Box building sb[] */ - $this->bctx = array( - 'p' => array(), - 'sb' => array( - $this->sbox0, - $this->sbox1, - $this->sbox2, - $this->sbox3 - ) - ); - - // unpack binary string in unsigned chars - $key = array_values(unpack('C*', $this->key)); - $keyl = count($key); - for ($j = 0, $i = 0; $i < 18; ++$i) { - // xor P1 with the first 32-bits of the key, xor P2 with the second 32-bits ... - for ($data = 0, $k = 0; $k < 4; ++$k) { - $data = ($data << 8) | $key[$j]; - if (++$j >= $keyl) { - $j = 0; - } - } - $this->bctx['p'][] = $this->parray[$i] ^ $data; - } - - // encrypt the zero-string, replace P1 and P2 with the encrypted data, - // encrypt P3 and P4 with the new P1 and P2, do it with all P-array and subkeys - $data = "\0\0\0\0\0\0\0\0"; - for ($i = 0; $i < 18; $i += 2) { - list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data))); - $this->bctx['p'][$i ] = $l; - $this->bctx['p'][$i + 1] = $r; - } - for ($i = 0; $i < 4; ++$i) { - for ($j = 0; $j < 256; $j += 2) { - list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data))); - $this->bctx['sb'][$i][$j ] = $l; - $this->bctx['sb'][$i][$j + 1] = $r; - } - } - } - - /** - * Encrypts a block - * - * @access private - * @param String $in - * @return String - */ - function _encryptBlock($in) - { - $p = $this->bctx["p"]; - // extract($this->bctx["sb"], EXTR_PREFIX_ALL, "sb"); // slower - $sb_0 = $this->bctx["sb"][0]; - $sb_1 = $this->bctx["sb"][1]; - $sb_2 = $this->bctx["sb"][2]; - $sb_3 = $this->bctx["sb"][3]; - - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - - for ($i = 0; $i < 16; $i+= 2) { - $l^= $p[$i]; - $r^= ($sb_0[$l >> 24 & 0xff] + - $sb_1[$l >> 16 & 0xff] ^ - $sb_2[$l >> 8 & 0xff]) + - $sb_3[$l & 0xff]; - - $r^= $p[$i + 1]; - $l^= ($sb_0[$r >> 24 & 0xff] + - $sb_1[$r >> 16 & 0xff] ^ - $sb_2[$r >> 8 & 0xff]) + - $sb_3[$r & 0xff]; - } - return pack("N*", $r ^ $p[17], $l ^ $p[16]); - } - - /** - * Decrypts a block - * - * @access private - * @param String $in - * @return String - */ - function _decryptBlock($in) - { - $p = $this->bctx["p"]; - $sb_0 = $this->bctx["sb"][0]; - $sb_1 = $this->bctx["sb"][1]; - $sb_2 = $this->bctx["sb"][2]; - $sb_3 = $this->bctx["sb"][3]; - - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - - for ($i = 17; $i > 2; $i-= 2) { - $l^= $p[$i]; - $r^= ($sb_0[$l >> 24 & 0xff] + - $sb_1[$l >> 16 & 0xff] ^ - $sb_2[$l >> 8 & 0xff]) + - $sb_3[$l & 0xff]; - - $r^= $p[$i - 1]; - $l^= ($sb_0[$r >> 24 & 0xff] + - $sb_1[$r >> 16 & 0xff] ^ - $sb_2[$r >> 8 & 0xff]) + - $sb_3[$r & 0xff]; - } - - return pack("N*", $r ^ $p[0], $l ^ $p[1]); - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Crypt_Base::_setupInlineCrypt() - * @access private - */ - function _setupInlineCrypt() - { - $lambda_functions =& Crypt_Blowfish::_getLambdaFunctions(); - - // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. - // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one. - $gen_hi_opt_code = (bool)( count($lambda_functions) < 10); - - switch (true) { - case $gen_hi_opt_code: - $code_hash = md5(str_pad("Crypt_Blowfish, {$this->mode}, ", 32, "\0") . $this->key); - break; - default: - $code_hash = "Crypt_Blowfish, {$this->mode}"; - } - - if (!isset($lambda_functions[$code_hash])) { - switch (true) { - case $gen_hi_opt_code: - $p = $this->bctx['p']; - $init_crypt = ' - static $sb_0, $sb_1, $sb_2, $sb_3; - if (!$sb_0) { - $sb_0 = $self->bctx["sb"][0]; - $sb_1 = $self->bctx["sb"][1]; - $sb_2 = $self->bctx["sb"][2]; - $sb_3 = $self->bctx["sb"][3]; - } - '; - break; - default: - $p = array(); - for ($i = 0; $i < 18; ++$i) { - $p[] = '$p_' . $i; - } - $init_crypt = ' - list($sb_0, $sb_1, $sb_2, $sb_3) = $self->bctx["sb"]; - list(' . implode(',', $p) . ') = $self->bctx["p"]; - - '; - } - - // Generating encrypt code: - $encrypt_block = ' - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - '; - for ($i = 0; $i < 16; $i+= 2) { - $encrypt_block.= ' - $l^= ' . $p[$i] . '; - $r^= ($sb_0[$l >> 24 & 0xff] + - $sb_1[$l >> 16 & 0xff] ^ - $sb_2[$l >> 8 & 0xff]) + - $sb_3[$l & 0xff]; - - $r^= ' . $p[$i + 1] . '; - $l^= ($sb_0[$r >> 24 & 0xff] + - $sb_1[$r >> 16 & 0xff] ^ - $sb_2[$r >> 8 & 0xff]) + - $sb_3[$r & 0xff]; - '; - } - $encrypt_block.= ' - $in = pack("N*", - $r ^ ' . $p[17] . ', - $l ^ ' . $p[16] . ' - ); - '; - - // Generating decrypt code: - $decrypt_block = ' - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - '; - - for ($i = 17; $i > 2; $i-= 2) { - $decrypt_block.= ' - $l^= ' . $p[$i] . '; - $r^= ($sb_0[$l >> 24 & 0xff] + - $sb_1[$l >> 16 & 0xff] ^ - $sb_2[$l >> 8 & 0xff]) + - $sb_3[$l & 0xff]; - - $r^= ' . $p[$i - 1] . '; - $l^= ($sb_0[$r >> 24 & 0xff] + - $sb_1[$r >> 16 & 0xff] ^ - $sb_2[$r >> 8 & 0xff]) + - $sb_3[$r & 0xff]; - '; - } - - $decrypt_block.= ' - $in = pack("N*", - $r ^ ' . $p[0] . ', - $l ^ ' . $p[1] . ' - ); - '; - - $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( - array( - 'init_crypt' => $init_crypt, - 'init_encrypt' => '', - 'init_decrypt' => '', - 'encrypt_block' => $encrypt_block, - 'decrypt_block' => $decrypt_block - ) - ); - } - $this->inline_crypt = $lambda_functions[$code_hash]; - } -} + + * setKey('12345678901234567890123456789012'); + * + * $plaintext = str_repeat('a', 1024); + * + * echo $blowfish->decrypt($blowfish->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_Blowfish + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_BLOWFISH_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_BLOWFISH_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_BLOWFISH_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_BLOWFISH_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_BLOWFISH_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/** + * Pure-PHP implementation of Blowfish. + * + * @package Crypt_Blowfish + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @access public + */ +class Crypt_Blowfish extends Crypt_Base +{ + /** + * Block Length of the cipher + * + * @see Crypt_Base::block_size + * @var int + * @access private + */ + var $block_size = 8; + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'BLOWFISH'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'blowfish'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var int + * @access private + */ + var $cfb_init_len = 500; + + /** + * The fixed subkeys boxes ($sbox0 - $sbox3) with 256 entries each + * + * S-Box 0 + * + * @access private + * @var array + */ + var $sbox0 = array( + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a + ); + + /** + * S-Box 1 + * + * @access private + * @var array + */ + var $sbox1 = array( + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 + ); + + /** + * S-Box 2 + * + * @access private + * @var array + */ + var $sbox2 = array( + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 + ); + + /** + * S-Box 3 + * + * @access private + * @var array + */ + var $sbox3 = array( + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + ); + + /** + * P-Array consists of 18 32-bit subkeys + * + * @var array + * @access private + */ + var $parray = array( + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, + 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b + ); + + /** + * The BCTX-working Array + * + * Holds the expanded key [p] and the key-depended s-boxes [sb] + * + * @var array + * @access private + */ + var $bctx; + + /** + * Holds the last used key + * + * @var array + * @access private + */ + var $kl; + + /** + * The Key Length (in bytes) + * + * @see Crypt_Base::setKeyLength() + * @var int + * @access private + * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk + * because the encryption / decryption / key schedule creation requires this number and not $key_length. We could + * derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu + * of that, we'll just precompute it once. + */ + var $key_length = 16; + + /** + * Sets the key length. + * + * Key lengths can be between 32 and 448 bits. + * + * @access public + * @param int $length + */ + function setKeyLength($length) + { + if ($length < 32) { + $this->key_length = 4; + } elseif ($length > 448) { + $this->key_length = 56; + } else { + $this->key_length = $length >> 3; + } + + parent::setKeyLength($length); + } + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine() + * + * @see Crypt_Base::isValidEngine() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + if ($engine == CRYPT_ENGINE_OPENSSL) { + if (version_compare(PHP_VERSION, '5.3.7') < 0 && $this->key_length != 16) { + return false; + } + if ($this->key_length < 16) { + return false; + } + $this->cipher_name_openssl_ecb = 'bf-ecb'; + $this->cipher_name_openssl = 'bf-' . $this->_openssl_translate_mode(); + } + + return parent::isValidEngine($engine); + } + + /** + * Setup the key (expansion) + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + if (isset($this->kl['key']) && $this->key === $this->kl['key']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key); + + /* key-expanding p[] and S-Box building sb[] */ + $this->bctx = array( + 'p' => array(), + 'sb' => array( + $this->sbox0, + $this->sbox1, + $this->sbox2, + $this->sbox3 + ) + ); + + // unpack binary string in unsigned chars + $key = array_values(unpack('C*', $this->key)); + $keyl = count($key); + for ($j = 0, $i = 0; $i < 18; ++$i) { + // xor P1 with the first 32-bits of the key, xor P2 with the second 32-bits ... + for ($data = 0, $k = 0; $k < 4; ++$k) { + $data = ($data << 8) | $key[$j]; + if (++$j >= $keyl) { + $j = 0; + } + } + $this->bctx['p'][] = $this->parray[$i] ^ $data; + } + + // encrypt the zero-string, replace P1 and P2 with the encrypted data, + // encrypt P3 and P4 with the new P1 and P2, do it with all P-array and subkeys + $data = "\0\0\0\0\0\0\0\0"; + for ($i = 0; $i < 18; $i += 2) { + list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data))); + $this->bctx['p'][$i ] = $l; + $this->bctx['p'][$i + 1] = $r; + } + for ($i = 0; $i < 4; ++$i) { + for ($j = 0; $j < 256; $j += 2) { + list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data))); + $this->bctx['sb'][$i][$j ] = $l; + $this->bctx['sb'][$i][$j + 1] = $r; + } + } + } + + /** + * Encrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _encryptBlock($in) + { + $p = $this->bctx["p"]; + // extract($this->bctx["sb"], EXTR_PREFIX_ALL, "sb"); // slower + $sb_0 = $this->bctx["sb"][0]; + $sb_1 = $this->bctx["sb"][1]; + $sb_2 = $this->bctx["sb"][2]; + $sb_3 = $this->bctx["sb"][3]; + + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + + for ($i = 0; $i < 16; $i+= 2) { + $l^= $p[$i]; + $r^= $this->safe_intval(($this->safe_intval($sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]) ^ + $sb_2[$l >> 8 & 0xff]) + + $sb_3[$l & 0xff]); + + $r^= $p[$i + 1]; + $l^= $this->safe_intval(($this->safe_intval($sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]) ^ + $sb_2[$r >> 8 & 0xff]) + + $sb_3[$r & 0xff]); + } + return pack("N*", $r ^ $p[17], $l ^ $p[16]); + } + + /** + * Decrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _decryptBlock($in) + { + $p = $this->bctx["p"]; + $sb_0 = $this->bctx["sb"][0]; + $sb_1 = $this->bctx["sb"][1]; + $sb_2 = $this->bctx["sb"][2]; + $sb_3 = $this->bctx["sb"][3]; + + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + + for ($i = 17; $i > 2; $i-= 2) { + $l^= $p[$i]; + $r^= $this->safe_intval(($this->safe_intval($sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]) ^ + $sb_2[$l >> 8 & 0xff]) + + $sb_3[$l & 0xff]); + + $r^= $p[$i - 1]; + $l^= $this->safe_intval(($this->safe_intval($sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]) ^ + $sb_2[$r >> 8 & 0xff]) + + $sb_3[$r & 0xff]); + } + return pack("N*", $r ^ $p[0], $l ^ $p[1]); + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + $lambda_functions =& Crypt_Blowfish::_getLambdaFunctions(); + + // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. + // (Currently, for Crypt_Blowfish, one generated $lambda_function cost on php5.5@32bit ~100kb unfreeable mem and ~180kb on php5.5@64bit) + // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one. + $gen_hi_opt_code = (bool)(count($lambda_functions) < 10); + + // Generation of a unique hash for our generated code + $code_hash = "Crypt_Blowfish, {$this->mode}"; + if ($gen_hi_opt_code) { + $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key); + } + + $safeint = $this->safe_intval_inline(); + + if (!isset($lambda_functions[$code_hash])) { + switch (true) { + case $gen_hi_opt_code: + $p = $this->bctx['p']; + $init_crypt = ' + static $sb_0, $sb_1, $sb_2, $sb_3; + if (!$sb_0) { + $sb_0 = $self->bctx["sb"][0]; + $sb_1 = $self->bctx["sb"][1]; + $sb_2 = $self->bctx["sb"][2]; + $sb_3 = $self->bctx["sb"][3]; + } + '; + break; + default: + $p = array(); + for ($i = 0; $i < 18; ++$i) { + $p[] = '$p_' . $i; + } + $init_crypt = ' + list($sb_0, $sb_1, $sb_2, $sb_3) = $self->bctx["sb"]; + list(' . implode(',', $p) . ') = $self->bctx["p"]; + + '; + } + + // Generating encrypt code: + $encrypt_block = ' + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + '; + for ($i = 0; $i < 16; $i+= 2) { + $encrypt_block.= ' + $l^= ' . $p[$i] . '; + $r^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]') . ' ^ + $sb_2[$l >> 8 & 0xff]) + + $sb_3[$l & 0xff]') . '; + + $r^= ' . $p[$i + 1] . '; + $l^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]') . ' ^ + $sb_2[$r >> 8 & 0xff]) + + $sb_3[$r & 0xff]') . '; + '; + } + $encrypt_block.= ' + $in = pack("N*", + $r ^ ' . $p[17] . ', + $l ^ ' . $p[16] . ' + ); + '; + + // Generating decrypt code: + $decrypt_block = ' + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + '; + + for ($i = 17; $i > 2; $i-= 2) { + $decrypt_block.= ' + $l^= ' . $p[$i] . '; + $r^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]') . ' ^ + $sb_2[$l >> 8 & 0xff]) + + $sb_3[$l & 0xff]') . '; + + $r^= ' . $p[$i - 1] . '; + $l^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]') . ' ^ + $sb_2[$r >> 8 & 0xff]) + + $sb_3[$r & 0xff]') . '; + '; + } + + $decrypt_block.= ' + $in = pack("N*", + $r ^ ' . $p[0] . ', + $l ^ ' . $p[1] . ' + ); + '; + + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => $init_crypt, + 'init_encrypt' => '', + 'init_decrypt' => '', + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/DES.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/DES.php old mode 100644 new mode 100755 index f92f30b2d..3cec2498d --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/DES.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/DES.php @@ -1,1506 +1,1516 @@ - - * setKey('abcdefgh'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $des->decrypt($des->encrypt($plaintext)); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Crypt - * @package Crypt_DES - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Base - * - * Base cipher class - */ -if (!class_exists('Crypt_Base')) { - include_once 'Base.php'; -} - -/**#@+ - * @access private - * @see Crypt_DES::_setupKey() - * @see Crypt_DES::_processBlock() - */ -/** - * Contains $keys[CRYPT_DES_ENCRYPT] - */ -define('CRYPT_DES_ENCRYPT', 0); -/** - * Contains $keys[CRYPT_DES_DECRYPT] - */ -define('CRYPT_DES_DECRYPT', 1); -/**#@-*/ - -/**#@+ - * @access public - * @see Crypt_DES::encrypt() - * @see Crypt_DES::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_DES_MODE_CTR', CRYPT_MODE_CTR); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_DES_MODE_ECB', CRYPT_MODE_ECB); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_DES_MODE_CBC', CRYPT_MODE_CBC); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_DES_MODE_CFB', CRYPT_MODE_CFB); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_DES_MODE_OFB', CRYPT_MODE_OFB); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_Base::Crypt_Base() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_DES_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_DES_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/** - * Pure-PHP implementation of DES. - * - * @package Crypt_DES - * @author Jim Wigginton - * @access public - */ -class Crypt_DES extends Crypt_Base -{ - /** - * Block Length of the cipher - * - * @see Crypt_Base::block_size - * @var Integer - * @access private - */ - var $block_size = 8; - - /** - * The Key - * - * @see Crypt_Base::key - * @see setKey() - * @var String - * @access private - */ - var $key = "\0\0\0\0\0\0\0\0"; - - /** - * The default password key_size used by setPassword() - * - * @see Crypt_Base::password_key_size - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 8; - - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'DES'; - - /** - * The mcrypt specific name of the cipher - * - * @see Crypt_Base::cipher_name_mcrypt - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'des'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Crypt_Base::cfb_init_len - * @var Integer - * @access private - */ - var $cfb_init_len = 500; - - /** - * Switch for DES/3DES encryption - * - * Used only if $engine == CRYPT_DES_MODE_INTERNAL - * - * @see Crypt_DES::_setupKey() - * @see Crypt_DES::_processBlock() - * @var Integer - * @access private - */ - var $des_rounds = 1; - - /** - * max possible size of $key - * - * @see Crypt_DES::setKey() - * @var String - * @access private - */ - var $key_size_max = 8; - - /** - * The Key Schedule - * - * @see Crypt_DES::_setupKey() - * @var Array - * @access private - */ - var $keys; - - /** - * Shuffle table. - * - * For each byte value index, the entry holds an 8-byte string - * with each byte containing all bits in the same state as the - * corresponding bit in the index value. - * - * @see Crypt_DES::_processBlock() - * @see Crypt_DES::_setupKey() - * @var Array - * @access private - */ - var $shuffle = array( - "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xFF", - "\x00\x00\x00\x00\x00\x00\xFF\x00", "\x00\x00\x00\x00\x00\x00\xFF\xFF", - "\x00\x00\x00\x00\x00\xFF\x00\x00", "\x00\x00\x00\x00\x00\xFF\x00\xFF", - "\x00\x00\x00\x00\x00\xFF\xFF\x00", "\x00\x00\x00\x00\x00\xFF\xFF\xFF", - "\x00\x00\x00\x00\xFF\x00\x00\x00", "\x00\x00\x00\x00\xFF\x00\x00\xFF", - "\x00\x00\x00\x00\xFF\x00\xFF\x00", "\x00\x00\x00\x00\xFF\x00\xFF\xFF", - "\x00\x00\x00\x00\xFF\xFF\x00\x00", "\x00\x00\x00\x00\xFF\xFF\x00\xFF", - "\x00\x00\x00\x00\xFF\xFF\xFF\x00", "\x00\x00\x00\x00\xFF\xFF\xFF\xFF", - "\x00\x00\x00\xFF\x00\x00\x00\x00", "\x00\x00\x00\xFF\x00\x00\x00\xFF", - "\x00\x00\x00\xFF\x00\x00\xFF\x00", "\x00\x00\x00\xFF\x00\x00\xFF\xFF", - "\x00\x00\x00\xFF\x00\xFF\x00\x00", "\x00\x00\x00\xFF\x00\xFF\x00\xFF", - "\x00\x00\x00\xFF\x00\xFF\xFF\x00", "\x00\x00\x00\xFF\x00\xFF\xFF\xFF", - "\x00\x00\x00\xFF\xFF\x00\x00\x00", "\x00\x00\x00\xFF\xFF\x00\x00\xFF", - "\x00\x00\x00\xFF\xFF\x00\xFF\x00", "\x00\x00\x00\xFF\xFF\x00\xFF\xFF", - "\x00\x00\x00\xFF\xFF\xFF\x00\x00", "\x00\x00\x00\xFF\xFF\xFF\x00\xFF", - "\x00\x00\x00\xFF\xFF\xFF\xFF\x00", "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF", - "\x00\x00\xFF\x00\x00\x00\x00\x00", "\x00\x00\xFF\x00\x00\x00\x00\xFF", - "\x00\x00\xFF\x00\x00\x00\xFF\x00", "\x00\x00\xFF\x00\x00\x00\xFF\xFF", - "\x00\x00\xFF\x00\x00\xFF\x00\x00", "\x00\x00\xFF\x00\x00\xFF\x00\xFF", - "\x00\x00\xFF\x00\x00\xFF\xFF\x00", "\x00\x00\xFF\x00\x00\xFF\xFF\xFF", - "\x00\x00\xFF\x00\xFF\x00\x00\x00", "\x00\x00\xFF\x00\xFF\x00\x00\xFF", - "\x00\x00\xFF\x00\xFF\x00\xFF\x00", "\x00\x00\xFF\x00\xFF\x00\xFF\xFF", - "\x00\x00\xFF\x00\xFF\xFF\x00\x00", "\x00\x00\xFF\x00\xFF\xFF\x00\xFF", - "\x00\x00\xFF\x00\xFF\xFF\xFF\x00", "\x00\x00\xFF\x00\xFF\xFF\xFF\xFF", - "\x00\x00\xFF\xFF\x00\x00\x00\x00", "\x00\x00\xFF\xFF\x00\x00\x00\xFF", - "\x00\x00\xFF\xFF\x00\x00\xFF\x00", "\x00\x00\xFF\xFF\x00\x00\xFF\xFF", - "\x00\x00\xFF\xFF\x00\xFF\x00\x00", "\x00\x00\xFF\xFF\x00\xFF\x00\xFF", - "\x00\x00\xFF\xFF\x00\xFF\xFF\x00", "\x00\x00\xFF\xFF\x00\xFF\xFF\xFF", - "\x00\x00\xFF\xFF\xFF\x00\x00\x00", "\x00\x00\xFF\xFF\xFF\x00\x00\xFF", - "\x00\x00\xFF\xFF\xFF\x00\xFF\x00", "\x00\x00\xFF\xFF\xFF\x00\xFF\xFF", - "\x00\x00\xFF\xFF\xFF\xFF\x00\x00", "\x00\x00\xFF\xFF\xFF\xFF\x00\xFF", - "\x00\x00\xFF\xFF\xFF\xFF\xFF\x00", "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF", - "\x00\xFF\x00\x00\x00\x00\x00\x00", "\x00\xFF\x00\x00\x00\x00\x00\xFF", - "\x00\xFF\x00\x00\x00\x00\xFF\x00", "\x00\xFF\x00\x00\x00\x00\xFF\xFF", - "\x00\xFF\x00\x00\x00\xFF\x00\x00", "\x00\xFF\x00\x00\x00\xFF\x00\xFF", - "\x00\xFF\x00\x00\x00\xFF\xFF\x00", "\x00\xFF\x00\x00\x00\xFF\xFF\xFF", - "\x00\xFF\x00\x00\xFF\x00\x00\x00", "\x00\xFF\x00\x00\xFF\x00\x00\xFF", - "\x00\xFF\x00\x00\xFF\x00\xFF\x00", "\x00\xFF\x00\x00\xFF\x00\xFF\xFF", - "\x00\xFF\x00\x00\xFF\xFF\x00\x00", "\x00\xFF\x00\x00\xFF\xFF\x00\xFF", - "\x00\xFF\x00\x00\xFF\xFF\xFF\x00", "\x00\xFF\x00\x00\xFF\xFF\xFF\xFF", - "\x00\xFF\x00\xFF\x00\x00\x00\x00", "\x00\xFF\x00\xFF\x00\x00\x00\xFF", - "\x00\xFF\x00\xFF\x00\x00\xFF\x00", "\x00\xFF\x00\xFF\x00\x00\xFF\xFF", - "\x00\xFF\x00\xFF\x00\xFF\x00\x00", "\x00\xFF\x00\xFF\x00\xFF\x00\xFF", - "\x00\xFF\x00\xFF\x00\xFF\xFF\x00", "\x00\xFF\x00\xFF\x00\xFF\xFF\xFF", - "\x00\xFF\x00\xFF\xFF\x00\x00\x00", "\x00\xFF\x00\xFF\xFF\x00\x00\xFF", - "\x00\xFF\x00\xFF\xFF\x00\xFF\x00", "\x00\xFF\x00\xFF\xFF\x00\xFF\xFF", - "\x00\xFF\x00\xFF\xFF\xFF\x00\x00", "\x00\xFF\x00\xFF\xFF\xFF\x00\xFF", - "\x00\xFF\x00\xFF\xFF\xFF\xFF\x00", "\x00\xFF\x00\xFF\xFF\xFF\xFF\xFF", - "\x00\xFF\xFF\x00\x00\x00\x00\x00", "\x00\xFF\xFF\x00\x00\x00\x00\xFF", - "\x00\xFF\xFF\x00\x00\x00\xFF\x00", "\x00\xFF\xFF\x00\x00\x00\xFF\xFF", - "\x00\xFF\xFF\x00\x00\xFF\x00\x00", "\x00\xFF\xFF\x00\x00\xFF\x00\xFF", - "\x00\xFF\xFF\x00\x00\xFF\xFF\x00", "\x00\xFF\xFF\x00\x00\xFF\xFF\xFF", - "\x00\xFF\xFF\x00\xFF\x00\x00\x00", "\x00\xFF\xFF\x00\xFF\x00\x00\xFF", - "\x00\xFF\xFF\x00\xFF\x00\xFF\x00", "\x00\xFF\xFF\x00\xFF\x00\xFF\xFF", - "\x00\xFF\xFF\x00\xFF\xFF\x00\x00", "\x00\xFF\xFF\x00\xFF\xFF\x00\xFF", - "\x00\xFF\xFF\x00\xFF\xFF\xFF\x00", "\x00\xFF\xFF\x00\xFF\xFF\xFF\xFF", - "\x00\xFF\xFF\xFF\x00\x00\x00\x00", "\x00\xFF\xFF\xFF\x00\x00\x00\xFF", - "\x00\xFF\xFF\xFF\x00\x00\xFF\x00", "\x00\xFF\xFF\xFF\x00\x00\xFF\xFF", - "\x00\xFF\xFF\xFF\x00\xFF\x00\x00", "\x00\xFF\xFF\xFF\x00\xFF\x00\xFF", - "\x00\xFF\xFF\xFF\x00\xFF\xFF\x00", "\x00\xFF\xFF\xFF\x00\xFF\xFF\xFF", - "\x00\xFF\xFF\xFF\xFF\x00\x00\x00", "\x00\xFF\xFF\xFF\xFF\x00\x00\xFF", - "\x00\xFF\xFF\xFF\xFF\x00\xFF\x00", "\x00\xFF\xFF\xFF\xFF\x00\xFF\xFF", - "\x00\xFF\xFF\xFF\xFF\xFF\x00\x00", "\x00\xFF\xFF\xFF\xFF\xFF\x00\xFF", - "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF", - "\xFF\x00\x00\x00\x00\x00\x00\x00", "\xFF\x00\x00\x00\x00\x00\x00\xFF", - "\xFF\x00\x00\x00\x00\x00\xFF\x00", "\xFF\x00\x00\x00\x00\x00\xFF\xFF", - "\xFF\x00\x00\x00\x00\xFF\x00\x00", "\xFF\x00\x00\x00\x00\xFF\x00\xFF", - "\xFF\x00\x00\x00\x00\xFF\xFF\x00", "\xFF\x00\x00\x00\x00\xFF\xFF\xFF", - "\xFF\x00\x00\x00\xFF\x00\x00\x00", "\xFF\x00\x00\x00\xFF\x00\x00\xFF", - "\xFF\x00\x00\x00\xFF\x00\xFF\x00", "\xFF\x00\x00\x00\xFF\x00\xFF\xFF", - "\xFF\x00\x00\x00\xFF\xFF\x00\x00", "\xFF\x00\x00\x00\xFF\xFF\x00\xFF", - "\xFF\x00\x00\x00\xFF\xFF\xFF\x00", "\xFF\x00\x00\x00\xFF\xFF\xFF\xFF", - "\xFF\x00\x00\xFF\x00\x00\x00\x00", "\xFF\x00\x00\xFF\x00\x00\x00\xFF", - "\xFF\x00\x00\xFF\x00\x00\xFF\x00", "\xFF\x00\x00\xFF\x00\x00\xFF\xFF", - "\xFF\x00\x00\xFF\x00\xFF\x00\x00", "\xFF\x00\x00\xFF\x00\xFF\x00\xFF", - "\xFF\x00\x00\xFF\x00\xFF\xFF\x00", "\xFF\x00\x00\xFF\x00\xFF\xFF\xFF", - "\xFF\x00\x00\xFF\xFF\x00\x00\x00", "\xFF\x00\x00\xFF\xFF\x00\x00\xFF", - "\xFF\x00\x00\xFF\xFF\x00\xFF\x00", "\xFF\x00\x00\xFF\xFF\x00\xFF\xFF", - "\xFF\x00\x00\xFF\xFF\xFF\x00\x00", "\xFF\x00\x00\xFF\xFF\xFF\x00\xFF", - "\xFF\x00\x00\xFF\xFF\xFF\xFF\x00", "\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF", - "\xFF\x00\xFF\x00\x00\x00\x00\x00", "\xFF\x00\xFF\x00\x00\x00\x00\xFF", - "\xFF\x00\xFF\x00\x00\x00\xFF\x00", "\xFF\x00\xFF\x00\x00\x00\xFF\xFF", - "\xFF\x00\xFF\x00\x00\xFF\x00\x00", "\xFF\x00\xFF\x00\x00\xFF\x00\xFF", - "\xFF\x00\xFF\x00\x00\xFF\xFF\x00", "\xFF\x00\xFF\x00\x00\xFF\xFF\xFF", - "\xFF\x00\xFF\x00\xFF\x00\x00\x00", "\xFF\x00\xFF\x00\xFF\x00\x00\xFF", - "\xFF\x00\xFF\x00\xFF\x00\xFF\x00", "\xFF\x00\xFF\x00\xFF\x00\xFF\xFF", - "\xFF\x00\xFF\x00\xFF\xFF\x00\x00", "\xFF\x00\xFF\x00\xFF\xFF\x00\xFF", - "\xFF\x00\xFF\x00\xFF\xFF\xFF\x00", "\xFF\x00\xFF\x00\xFF\xFF\xFF\xFF", - "\xFF\x00\xFF\xFF\x00\x00\x00\x00", "\xFF\x00\xFF\xFF\x00\x00\x00\xFF", - "\xFF\x00\xFF\xFF\x00\x00\xFF\x00", "\xFF\x00\xFF\xFF\x00\x00\xFF\xFF", - "\xFF\x00\xFF\xFF\x00\xFF\x00\x00", "\xFF\x00\xFF\xFF\x00\xFF\x00\xFF", - "\xFF\x00\xFF\xFF\x00\xFF\xFF\x00", "\xFF\x00\xFF\xFF\x00\xFF\xFF\xFF", - "\xFF\x00\xFF\xFF\xFF\x00\x00\x00", "\xFF\x00\xFF\xFF\xFF\x00\x00\xFF", - "\xFF\x00\xFF\xFF\xFF\x00\xFF\x00", "\xFF\x00\xFF\xFF\xFF\x00\xFF\xFF", - "\xFF\x00\xFF\xFF\xFF\xFF\x00\x00", "\xFF\x00\xFF\xFF\xFF\xFF\x00\xFF", - "\xFF\x00\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF", - "\xFF\xFF\x00\x00\x00\x00\x00\x00", "\xFF\xFF\x00\x00\x00\x00\x00\xFF", - "\xFF\xFF\x00\x00\x00\x00\xFF\x00", "\xFF\xFF\x00\x00\x00\x00\xFF\xFF", - "\xFF\xFF\x00\x00\x00\xFF\x00\x00", "\xFF\xFF\x00\x00\x00\xFF\x00\xFF", - "\xFF\xFF\x00\x00\x00\xFF\xFF\x00", "\xFF\xFF\x00\x00\x00\xFF\xFF\xFF", - "\xFF\xFF\x00\x00\xFF\x00\x00\x00", "\xFF\xFF\x00\x00\xFF\x00\x00\xFF", - "\xFF\xFF\x00\x00\xFF\x00\xFF\x00", "\xFF\xFF\x00\x00\xFF\x00\xFF\xFF", - "\xFF\xFF\x00\x00\xFF\xFF\x00\x00", "\xFF\xFF\x00\x00\xFF\xFF\x00\xFF", - "\xFF\xFF\x00\x00\xFF\xFF\xFF\x00", "\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF", - "\xFF\xFF\x00\xFF\x00\x00\x00\x00", "\xFF\xFF\x00\xFF\x00\x00\x00\xFF", - "\xFF\xFF\x00\xFF\x00\x00\xFF\x00", "\xFF\xFF\x00\xFF\x00\x00\xFF\xFF", - "\xFF\xFF\x00\xFF\x00\xFF\x00\x00", "\xFF\xFF\x00\xFF\x00\xFF\x00\xFF", - "\xFF\xFF\x00\xFF\x00\xFF\xFF\x00", "\xFF\xFF\x00\xFF\x00\xFF\xFF\xFF", - "\xFF\xFF\x00\xFF\xFF\x00\x00\x00", "\xFF\xFF\x00\xFF\xFF\x00\x00\xFF", - "\xFF\xFF\x00\xFF\xFF\x00\xFF\x00", "\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF", - "\xFF\xFF\x00\xFF\xFF\xFF\x00\x00", "\xFF\xFF\x00\xFF\xFF\xFF\x00\xFF", - "\xFF\xFF\x00\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF", - "\xFF\xFF\xFF\x00\x00\x00\x00\x00", "\xFF\xFF\xFF\x00\x00\x00\x00\xFF", - "\xFF\xFF\xFF\x00\x00\x00\xFF\x00", "\xFF\xFF\xFF\x00\x00\x00\xFF\xFF", - "\xFF\xFF\xFF\x00\x00\xFF\x00\x00", "\xFF\xFF\xFF\x00\x00\xFF\x00\xFF", - "\xFF\xFF\xFF\x00\x00\xFF\xFF\x00", "\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF", - "\xFF\xFF\xFF\x00\xFF\x00\x00\x00", "\xFF\xFF\xFF\x00\xFF\x00\x00\xFF", - "\xFF\xFF\xFF\x00\xFF\x00\xFF\x00", "\xFF\xFF\xFF\x00\xFF\x00\xFF\xFF", - "\xFF\xFF\xFF\x00\xFF\xFF\x00\x00", "\xFF\xFF\xFF\x00\xFF\xFF\x00\xFF", - "\xFF\xFF\xFF\x00\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF", - "\xFF\xFF\xFF\xFF\x00\x00\x00\x00", "\xFF\xFF\xFF\xFF\x00\x00\x00\xFF", - "\xFF\xFF\xFF\xFF\x00\x00\xFF\x00", "\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF", - "\xFF\xFF\xFF\xFF\x00\xFF\x00\x00", "\xFF\xFF\xFF\xFF\x00\xFF\x00\xFF", - "\xFF\xFF\xFF\xFF\x00\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF", - "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00", "\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF", - "\xFF\xFF\xFF\xFF\xFF\x00\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF", - "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF", - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" - ); - - /** - * IP mapping helper table. - * - * Indexing this table with each source byte performs the initial bit permutation. - * - * @var Array - * @access private - */ - var $ipmap = array( - 0x00, 0x10, 0x01, 0x11, 0x20, 0x30, 0x21, 0x31, - 0x02, 0x12, 0x03, 0x13, 0x22, 0x32, 0x23, 0x33, - 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71, - 0x42, 0x52, 0x43, 0x53, 0x62, 0x72, 0x63, 0x73, - 0x04, 0x14, 0x05, 0x15, 0x24, 0x34, 0x25, 0x35, - 0x06, 0x16, 0x07, 0x17, 0x26, 0x36, 0x27, 0x37, - 0x44, 0x54, 0x45, 0x55, 0x64, 0x74, 0x65, 0x75, - 0x46, 0x56, 0x47, 0x57, 0x66, 0x76, 0x67, 0x77, - 0x80, 0x90, 0x81, 0x91, 0xA0, 0xB0, 0xA1, 0xB1, - 0x82, 0x92, 0x83, 0x93, 0xA2, 0xB2, 0xA3, 0xB3, - 0xC0, 0xD0, 0xC1, 0xD1, 0xE0, 0xF0, 0xE1, 0xF1, - 0xC2, 0xD2, 0xC3, 0xD3, 0xE2, 0xF2, 0xE3, 0xF3, - 0x84, 0x94, 0x85, 0x95, 0xA4, 0xB4, 0xA5, 0xB5, - 0x86, 0x96, 0x87, 0x97, 0xA6, 0xB6, 0xA7, 0xB7, - 0xC4, 0xD4, 0xC5, 0xD5, 0xE4, 0xF4, 0xE5, 0xF5, - 0xC6, 0xD6, 0xC7, 0xD7, 0xE6, 0xF6, 0xE7, 0xF7, - 0x08, 0x18, 0x09, 0x19, 0x28, 0x38, 0x29, 0x39, - 0x0A, 0x1A, 0x0B, 0x1B, 0x2A, 0x3A, 0x2B, 0x3B, - 0x48, 0x58, 0x49, 0x59, 0x68, 0x78, 0x69, 0x79, - 0x4A, 0x5A, 0x4B, 0x5B, 0x6A, 0x7A, 0x6B, 0x7B, - 0x0C, 0x1C, 0x0D, 0x1D, 0x2C, 0x3C, 0x2D, 0x3D, - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4C, 0x5C, 0x4D, 0x5D, 0x6C, 0x7C, 0x6D, 0x7D, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x88, 0x98, 0x89, 0x99, 0xA8, 0xB8, 0xA9, 0xB9, - 0x8A, 0x9A, 0x8B, 0x9B, 0xAA, 0xBA, 0xAB, 0xBB, - 0xC8, 0xD8, 0xC9, 0xD9, 0xE8, 0xF8, 0xE9, 0xF9, - 0xCA, 0xDA, 0xCB, 0xDB, 0xEA, 0xFA, 0xEB, 0xFB, - 0x8C, 0x9C, 0x8D, 0x9D, 0xAC, 0xBC, 0xAD, 0xBD, - 0x8E, 0x9E, 0x8F, 0x9F, 0xAE, 0xBE, 0xAF, 0xBF, - 0xCC, 0xDC, 0xCD, 0xDD, 0xEC, 0xFC, 0xED, 0xFD, - 0xCE, 0xDE, 0xCF, 0xDF, 0xEE, 0xFE, 0xEF, 0xFF - ); - - /** - * Inverse IP mapping helper table. - * Indexing this table with a byte value reverses the bit order. - * - * @var Array - * @access private - */ - var $invipmap = array( - 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, - 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, - 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, - 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, - 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, - 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, - 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, - 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, - 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, - 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, - 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, - 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, - 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, - 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, - 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, - 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, - 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, - 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, - 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, - 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, - 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, - 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, - 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, - 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, - 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, - 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, - 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, - 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, - 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, - 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, - 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, - 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF - ); - - /** - * Pre-permuted S-box1 - * - * Each box ($sbox1-$sbox8) has been vectorized, then each value pre-permuted using the - * P table: concatenation can then be replaced by exclusive ORs. - * - * @var Array - * @access private - */ - var $sbox1 = array( - 0x00808200, 0x00000000, 0x00008000, 0x00808202, - 0x00808002, 0x00008202, 0x00000002, 0x00008000, - 0x00000200, 0x00808200, 0x00808202, 0x00000200, - 0x00800202, 0x00808002, 0x00800000, 0x00000002, - 0x00000202, 0x00800200, 0x00800200, 0x00008200, - 0x00008200, 0x00808000, 0x00808000, 0x00800202, - 0x00008002, 0x00800002, 0x00800002, 0x00008002, - 0x00000000, 0x00000202, 0x00008202, 0x00800000, - 0x00008000, 0x00808202, 0x00000002, 0x00808000, - 0x00808200, 0x00800000, 0x00800000, 0x00000200, - 0x00808002, 0x00008000, 0x00008200, 0x00800002, - 0x00000200, 0x00000002, 0x00800202, 0x00008202, - 0x00808202, 0x00008002, 0x00808000, 0x00800202, - 0x00800002, 0x00000202, 0x00008202, 0x00808200, - 0x00000202, 0x00800200, 0x00800200, 0x00000000, - 0x00008002, 0x00008200, 0x00000000, 0x00808002 - ); - - /** - * Pre-permuted S-box2 - * - * @var Array - * @access private - */ - var $sbox2 = array( - 0x40084010, 0x40004000, 0x00004000, 0x00084010, - 0x00080000, 0x00000010, 0x40080010, 0x40004010, - 0x40000010, 0x40084010, 0x40084000, 0x40000000, - 0x40004000, 0x00080000, 0x00000010, 0x40080010, - 0x00084000, 0x00080010, 0x40004010, 0x00000000, - 0x40000000, 0x00004000, 0x00084010, 0x40080000, - 0x00080010, 0x40000010, 0x00000000, 0x00084000, - 0x00004010, 0x40084000, 0x40080000, 0x00004010, - 0x00000000, 0x00084010, 0x40080010, 0x00080000, - 0x40004010, 0x40080000, 0x40084000, 0x00004000, - 0x40080000, 0x40004000, 0x00000010, 0x40084010, - 0x00084010, 0x00000010, 0x00004000, 0x40000000, - 0x00004010, 0x40084000, 0x00080000, 0x40000010, - 0x00080010, 0x40004010, 0x40000010, 0x00080010, - 0x00084000, 0x00000000, 0x40004000, 0x00004010, - 0x40000000, 0x40080010, 0x40084010, 0x00084000 - ); - - /** - * Pre-permuted S-box3 - * - * @var Array - * @access private - */ - var $sbox3 = array( - 0x00000104, 0x04010100, 0x00000000, 0x04010004, - 0x04000100, 0x00000000, 0x00010104, 0x04000100, - 0x00010004, 0x04000004, 0x04000004, 0x00010000, - 0x04010104, 0x00010004, 0x04010000, 0x00000104, - 0x04000000, 0x00000004, 0x04010100, 0x00000100, - 0x00010100, 0x04010000, 0x04010004, 0x00010104, - 0x04000104, 0x00010100, 0x00010000, 0x04000104, - 0x00000004, 0x04010104, 0x00000100, 0x04000000, - 0x04010100, 0x04000000, 0x00010004, 0x00000104, - 0x00010000, 0x04010100, 0x04000100, 0x00000000, - 0x00000100, 0x00010004, 0x04010104, 0x04000100, - 0x04000004, 0x00000100, 0x00000000, 0x04010004, - 0x04000104, 0x00010000, 0x04000000, 0x04010104, - 0x00000004, 0x00010104, 0x00010100, 0x04000004, - 0x04010000, 0x04000104, 0x00000104, 0x04010000, - 0x00010104, 0x00000004, 0x04010004, 0x00010100 - ); - - /** - * Pre-permuted S-box4 - * - * @var Array - * @access private - */ - var $sbox4 = array( - 0x80401000, 0x80001040, 0x80001040, 0x00000040, - 0x00401040, 0x80400040, 0x80400000, 0x80001000, - 0x00000000, 0x00401000, 0x00401000, 0x80401040, - 0x80000040, 0x00000000, 0x00400040, 0x80400000, - 0x80000000, 0x00001000, 0x00400000, 0x80401000, - 0x00000040, 0x00400000, 0x80001000, 0x00001040, - 0x80400040, 0x80000000, 0x00001040, 0x00400040, - 0x00001000, 0x00401040, 0x80401040, 0x80000040, - 0x00400040, 0x80400000, 0x00401000, 0x80401040, - 0x80000040, 0x00000000, 0x00000000, 0x00401000, - 0x00001040, 0x00400040, 0x80400040, 0x80000000, - 0x80401000, 0x80001040, 0x80001040, 0x00000040, - 0x80401040, 0x80000040, 0x80000000, 0x00001000, - 0x80400000, 0x80001000, 0x00401040, 0x80400040, - 0x80001000, 0x00001040, 0x00400000, 0x80401000, - 0x00000040, 0x00400000, 0x00001000, 0x00401040 - ); - - /** - * Pre-permuted S-box5 - * - * @var Array - * @access private - */ - var $sbox5 = array( - 0x00000080, 0x01040080, 0x01040000, 0x21000080, - 0x00040000, 0x00000080, 0x20000000, 0x01040000, - 0x20040080, 0x00040000, 0x01000080, 0x20040080, - 0x21000080, 0x21040000, 0x00040080, 0x20000000, - 0x01000000, 0x20040000, 0x20040000, 0x00000000, - 0x20000080, 0x21040080, 0x21040080, 0x01000080, - 0x21040000, 0x20000080, 0x00000000, 0x21000000, - 0x01040080, 0x01000000, 0x21000000, 0x00040080, - 0x00040000, 0x21000080, 0x00000080, 0x01000000, - 0x20000000, 0x01040000, 0x21000080, 0x20040080, - 0x01000080, 0x20000000, 0x21040000, 0x01040080, - 0x20040080, 0x00000080, 0x01000000, 0x21040000, - 0x21040080, 0x00040080, 0x21000000, 0x21040080, - 0x01040000, 0x00000000, 0x20040000, 0x21000000, - 0x00040080, 0x01000080, 0x20000080, 0x00040000, - 0x00000000, 0x20040000, 0x01040080, 0x20000080 - ); - - /** - * Pre-permuted S-box6 - * - * @var Array - * @access private - */ - var $sbox6 = array( - 0x10000008, 0x10200000, 0x00002000, 0x10202008, - 0x10200000, 0x00000008, 0x10202008, 0x00200000, - 0x10002000, 0x00202008, 0x00200000, 0x10000008, - 0x00200008, 0x10002000, 0x10000000, 0x00002008, - 0x00000000, 0x00200008, 0x10002008, 0x00002000, - 0x00202000, 0x10002008, 0x00000008, 0x10200008, - 0x10200008, 0x00000000, 0x00202008, 0x10202000, - 0x00002008, 0x00202000, 0x10202000, 0x10000000, - 0x10002000, 0x00000008, 0x10200008, 0x00202000, - 0x10202008, 0x00200000, 0x00002008, 0x10000008, - 0x00200000, 0x10002000, 0x10000000, 0x00002008, - 0x10000008, 0x10202008, 0x00202000, 0x10200000, - 0x00202008, 0x10202000, 0x00000000, 0x10200008, - 0x00000008, 0x00002000, 0x10200000, 0x00202008, - 0x00002000, 0x00200008, 0x10002008, 0x00000000, - 0x10202000, 0x10000000, 0x00200008, 0x10002008 - ); - - /** - * Pre-permuted S-box7 - * - * @var Array - * @access private - */ - var $sbox7 = array( - 0x00100000, 0x02100001, 0x02000401, 0x00000000, - 0x00000400, 0x02000401, 0x00100401, 0x02100400, - 0x02100401, 0x00100000, 0x00000000, 0x02000001, - 0x00000001, 0x02000000, 0x02100001, 0x00000401, - 0x02000400, 0x00100401, 0x00100001, 0x02000400, - 0x02000001, 0x02100000, 0x02100400, 0x00100001, - 0x02100000, 0x00000400, 0x00000401, 0x02100401, - 0x00100400, 0x00000001, 0x02000000, 0x00100400, - 0x02000000, 0x00100400, 0x00100000, 0x02000401, - 0x02000401, 0x02100001, 0x02100001, 0x00000001, - 0x00100001, 0x02000000, 0x02000400, 0x00100000, - 0x02100400, 0x00000401, 0x00100401, 0x02100400, - 0x00000401, 0x02000001, 0x02100401, 0x02100000, - 0x00100400, 0x00000000, 0x00000001, 0x02100401, - 0x00000000, 0x00100401, 0x02100000, 0x00000400, - 0x02000001, 0x02000400, 0x00000400, 0x00100001 - ); - - /** - * Pre-permuted S-box8 - * - * @var Array - * @access private - */ - var $sbox8 = array( - 0x08000820, 0x00000800, 0x00020000, 0x08020820, - 0x08000000, 0x08000820, 0x00000020, 0x08000000, - 0x00020020, 0x08020000, 0x08020820, 0x00020800, - 0x08020800, 0x00020820, 0x00000800, 0x00000020, - 0x08020000, 0x08000020, 0x08000800, 0x00000820, - 0x00020800, 0x00020020, 0x08020020, 0x08020800, - 0x00000820, 0x00000000, 0x00000000, 0x08020020, - 0x08000020, 0x08000800, 0x00020820, 0x00020000, - 0x00020820, 0x00020000, 0x08020800, 0x00000800, - 0x00000020, 0x08020020, 0x00000800, 0x00020820, - 0x08000800, 0x00000020, 0x08000020, 0x08020000, - 0x08020020, 0x08000000, 0x00020000, 0x08000820, - 0x00000000, 0x08020820, 0x00020020, 0x08000020, - 0x08020000, 0x08000800, 0x08000820, 0x00000000, - 0x08020820, 0x00020800, 0x00020800, 0x00000820, - 0x00000820, 0x00020020, 0x08000000, 0x08020800 - ); - - /** - * Sets the key. - * - * Keys can be of any length. DES, itself, uses 64-bit keys (eg. strlen($key) == 8), however, we - * only use the first eight, if $key has more then eight characters in it, and pad $key with the - * null byte if it is less then eight characters long. - * - * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. - * - * If the key is not explicitly set, it'll be assumed to be all zero's. - * - * @see Crypt_Base::setKey() - * @access public - * @param String $key - */ - function setKey($key) - { - // We check/cut here only up to max length of the key. - // Key padding to the proper length will be done in _setupKey() - if (strlen($key) > $this->key_size_max) { - $key = substr($key, 0, $this->key_size_max); - } - - // Sets the key - parent::setKey($key); - } - - /** - * Encrypts a block - * - * @see Crypt_Base::_encryptBlock() - * @see Crypt_Base::encrypt() - * @see Crypt_DES::encrypt() - * @access private - * @param String $in - * @return String - */ - function _encryptBlock($in) - { - return $this->_processBlock($in, CRYPT_DES_ENCRYPT); - } - - /** - * Decrypts a block - * - * @see Crypt_Base::_decryptBlock() - * @see Crypt_Base::decrypt() - * @see Crypt_DES::decrypt() - * @access private - * @param String $in - * @return String - */ - function _decryptBlock($in) - { - return $this->_processBlock($in, CRYPT_DES_DECRYPT); - } - - /** - * Encrypts or decrypts a 64-bit block - * - * $mode should be either CRYPT_DES_ENCRYPT or CRYPT_DES_DECRYPT. See - * {@link http://en.wikipedia.org/wiki/Image:Feistel.png Feistel.png} to get a general - * idea of what this function does. - * - * @see Crypt_DES::_encryptBlock() - * @see Crypt_DES::_decryptBlock() - * @access private - * @param String $block - * @param Integer $mode - * @return String - */ - function _processBlock($block, $mode) - { - static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; - if (!$sbox1) { - $sbox1 = array_map("intval", $this->sbox1); - $sbox2 = array_map("intval", $this->sbox2); - $sbox3 = array_map("intval", $this->sbox3); - $sbox4 = array_map("intval", $this->sbox4); - $sbox5 = array_map("intval", $this->sbox5); - $sbox6 = array_map("intval", $this->sbox6); - $sbox7 = array_map("intval", $this->sbox7); - $sbox8 = array_map("intval", $this->sbox8); - /* Merge $shuffle with $[inv]ipmap */ - for ($i = 0; $i < 256; ++$i) { - $shuffleip[] = $this->shuffle[$this->ipmap[$i]]; - $shuffleinvip[] = $this->shuffle[$this->invipmap[$i]]; - } - } - - $keys = $this->keys[$mode]; - $ki = -1; - - // Do the initial IP permutation. - $t = unpack('Nl/Nr', $block); - list($l, $r) = array($t['l'], $t['r']); - $block = ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | - ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | - ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | - ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | - ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | - ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | - ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | - ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); - - // Extract L0 and R0. - $t = unpack('Nl/Nr', $block); - list($l, $r) = array($t['l'], $t['r']); - - for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { - // Perform the 16 steps. - for ($i = 0; $i < 16; $i++) { - // start of "the Feistel (F) function" - see the following URL: - // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png - // Merge key schedule. - $b1 = (($r >> 3) & 0x1FFFFFFF) ^ ($r << 29) ^ $keys[++$ki]; - $b2 = (($r >> 31) & 0x00000001) ^ ($r << 1) ^ $keys[++$ki]; - - // S-box indexing. - $t = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ - $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ - $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ - $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ $l; - // end of "the Feistel (F) function" - - $l = $r; - $r = $t; - } - - // Last step should not permute L & R. - $t = $l; - $l = $r; - $r = $t; - } - - // Perform the inverse IP permutation. - return ($shuffleinvip[($r >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | - ($shuffleinvip[($l >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | - ($shuffleinvip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | - ($shuffleinvip[($l >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | - ($shuffleinvip[($r >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | - ($shuffleinvip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | - ($shuffleinvip[ $r & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | - ($shuffleinvip[ $l & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); - } - - /** - * Creates the key schedule - * - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->des_rounds === $this->kl['des_rounds']) { - // already expanded - return; - } - $this->kl = array('key' => $this->key, 'des_rounds' => $this->des_rounds); - - static $shifts = array( // number of key bits shifted per round - 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 - ); - - static $pc1map = array( - 0x00, 0x00, 0x08, 0x08, 0x04, 0x04, 0x0C, 0x0C, - 0x02, 0x02, 0x0A, 0x0A, 0x06, 0x06, 0x0E, 0x0E, - 0x10, 0x10, 0x18, 0x18, 0x14, 0x14, 0x1C, 0x1C, - 0x12, 0x12, 0x1A, 0x1A, 0x16, 0x16, 0x1E, 0x1E, - 0x20, 0x20, 0x28, 0x28, 0x24, 0x24, 0x2C, 0x2C, - 0x22, 0x22, 0x2A, 0x2A, 0x26, 0x26, 0x2E, 0x2E, - 0x30, 0x30, 0x38, 0x38, 0x34, 0x34, 0x3C, 0x3C, - 0x32, 0x32, 0x3A, 0x3A, 0x36, 0x36, 0x3E, 0x3E, - 0x40, 0x40, 0x48, 0x48, 0x44, 0x44, 0x4C, 0x4C, - 0x42, 0x42, 0x4A, 0x4A, 0x46, 0x46, 0x4E, 0x4E, - 0x50, 0x50, 0x58, 0x58, 0x54, 0x54, 0x5C, 0x5C, - 0x52, 0x52, 0x5A, 0x5A, 0x56, 0x56, 0x5E, 0x5E, - 0x60, 0x60, 0x68, 0x68, 0x64, 0x64, 0x6C, 0x6C, - 0x62, 0x62, 0x6A, 0x6A, 0x66, 0x66, 0x6E, 0x6E, - 0x70, 0x70, 0x78, 0x78, 0x74, 0x74, 0x7C, 0x7C, - 0x72, 0x72, 0x7A, 0x7A, 0x76, 0x76, 0x7E, 0x7E, - 0x80, 0x80, 0x88, 0x88, 0x84, 0x84, 0x8C, 0x8C, - 0x82, 0x82, 0x8A, 0x8A, 0x86, 0x86, 0x8E, 0x8E, - 0x90, 0x90, 0x98, 0x98, 0x94, 0x94, 0x9C, 0x9C, - 0x92, 0x92, 0x9A, 0x9A, 0x96, 0x96, 0x9E, 0x9E, - 0xA0, 0xA0, 0xA8, 0xA8, 0xA4, 0xA4, 0xAC, 0xAC, - 0xA2, 0xA2, 0xAA, 0xAA, 0xA6, 0xA6, 0xAE, 0xAE, - 0xB0, 0xB0, 0xB8, 0xB8, 0xB4, 0xB4, 0xBC, 0xBC, - 0xB2, 0xB2, 0xBA, 0xBA, 0xB6, 0xB6, 0xBE, 0xBE, - 0xC0, 0xC0, 0xC8, 0xC8, 0xC4, 0xC4, 0xCC, 0xCC, - 0xC2, 0xC2, 0xCA, 0xCA, 0xC6, 0xC6, 0xCE, 0xCE, - 0xD0, 0xD0, 0xD8, 0xD8, 0xD4, 0xD4, 0xDC, 0xDC, - 0xD2, 0xD2, 0xDA, 0xDA, 0xD6, 0xD6, 0xDE, 0xDE, - 0xE0, 0xE0, 0xE8, 0xE8, 0xE4, 0xE4, 0xEC, 0xEC, - 0xE2, 0xE2, 0xEA, 0xEA, 0xE6, 0xE6, 0xEE, 0xEE, - 0xF0, 0xF0, 0xF8, 0xF8, 0xF4, 0xF4, 0xFC, 0xFC, - 0xF2, 0xF2, 0xFA, 0xFA, 0xF6, 0xF6, 0xFE, 0xFE - ); - - // Mapping tables for the PC-2 transformation. - static $pc2mapc1 = array( - 0x00000000, 0x00000400, 0x00200000, 0x00200400, - 0x00000001, 0x00000401, 0x00200001, 0x00200401, - 0x02000000, 0x02000400, 0x02200000, 0x02200400, - 0x02000001, 0x02000401, 0x02200001, 0x02200401 - ); - static $pc2mapc2 = array( - 0x00000000, 0x00000800, 0x08000000, 0x08000800, - 0x00010000, 0x00010800, 0x08010000, 0x08010800, - 0x00000000, 0x00000800, 0x08000000, 0x08000800, - 0x00010000, 0x00010800, 0x08010000, 0x08010800, - 0x00000100, 0x00000900, 0x08000100, 0x08000900, - 0x00010100, 0x00010900, 0x08010100, 0x08010900, - 0x00000100, 0x00000900, 0x08000100, 0x08000900, - 0x00010100, 0x00010900, 0x08010100, 0x08010900, - 0x00000010, 0x00000810, 0x08000010, 0x08000810, - 0x00010010, 0x00010810, 0x08010010, 0x08010810, - 0x00000010, 0x00000810, 0x08000010, 0x08000810, - 0x00010010, 0x00010810, 0x08010010, 0x08010810, - 0x00000110, 0x00000910, 0x08000110, 0x08000910, - 0x00010110, 0x00010910, 0x08010110, 0x08010910, - 0x00000110, 0x00000910, 0x08000110, 0x08000910, - 0x00010110, 0x00010910, 0x08010110, 0x08010910, - 0x00040000, 0x00040800, 0x08040000, 0x08040800, - 0x00050000, 0x00050800, 0x08050000, 0x08050800, - 0x00040000, 0x00040800, 0x08040000, 0x08040800, - 0x00050000, 0x00050800, 0x08050000, 0x08050800, - 0x00040100, 0x00040900, 0x08040100, 0x08040900, - 0x00050100, 0x00050900, 0x08050100, 0x08050900, - 0x00040100, 0x00040900, 0x08040100, 0x08040900, - 0x00050100, 0x00050900, 0x08050100, 0x08050900, - 0x00040010, 0x00040810, 0x08040010, 0x08040810, - 0x00050010, 0x00050810, 0x08050010, 0x08050810, - 0x00040010, 0x00040810, 0x08040010, 0x08040810, - 0x00050010, 0x00050810, 0x08050010, 0x08050810, - 0x00040110, 0x00040910, 0x08040110, 0x08040910, - 0x00050110, 0x00050910, 0x08050110, 0x08050910, - 0x00040110, 0x00040910, 0x08040110, 0x08040910, - 0x00050110, 0x00050910, 0x08050110, 0x08050910, - 0x01000000, 0x01000800, 0x09000000, 0x09000800, - 0x01010000, 0x01010800, 0x09010000, 0x09010800, - 0x01000000, 0x01000800, 0x09000000, 0x09000800, - 0x01010000, 0x01010800, 0x09010000, 0x09010800, - 0x01000100, 0x01000900, 0x09000100, 0x09000900, - 0x01010100, 0x01010900, 0x09010100, 0x09010900, - 0x01000100, 0x01000900, 0x09000100, 0x09000900, - 0x01010100, 0x01010900, 0x09010100, 0x09010900, - 0x01000010, 0x01000810, 0x09000010, 0x09000810, - 0x01010010, 0x01010810, 0x09010010, 0x09010810, - 0x01000010, 0x01000810, 0x09000010, 0x09000810, - 0x01010010, 0x01010810, 0x09010010, 0x09010810, - 0x01000110, 0x01000910, 0x09000110, 0x09000910, - 0x01010110, 0x01010910, 0x09010110, 0x09010910, - 0x01000110, 0x01000910, 0x09000110, 0x09000910, - 0x01010110, 0x01010910, 0x09010110, 0x09010910, - 0x01040000, 0x01040800, 0x09040000, 0x09040800, - 0x01050000, 0x01050800, 0x09050000, 0x09050800, - 0x01040000, 0x01040800, 0x09040000, 0x09040800, - 0x01050000, 0x01050800, 0x09050000, 0x09050800, - 0x01040100, 0x01040900, 0x09040100, 0x09040900, - 0x01050100, 0x01050900, 0x09050100, 0x09050900, - 0x01040100, 0x01040900, 0x09040100, 0x09040900, - 0x01050100, 0x01050900, 0x09050100, 0x09050900, - 0x01040010, 0x01040810, 0x09040010, 0x09040810, - 0x01050010, 0x01050810, 0x09050010, 0x09050810, - 0x01040010, 0x01040810, 0x09040010, 0x09040810, - 0x01050010, 0x01050810, 0x09050010, 0x09050810, - 0x01040110, 0x01040910, 0x09040110, 0x09040910, - 0x01050110, 0x01050910, 0x09050110, 0x09050910, - 0x01040110, 0x01040910, 0x09040110, 0x09040910, - 0x01050110, 0x01050910, 0x09050110, 0x09050910 - ); - static $pc2mapc3 = array( - 0x00000000, 0x00000004, 0x00001000, 0x00001004, - 0x00000000, 0x00000004, 0x00001000, 0x00001004, - 0x10000000, 0x10000004, 0x10001000, 0x10001004, - 0x10000000, 0x10000004, 0x10001000, 0x10001004, - 0x00000020, 0x00000024, 0x00001020, 0x00001024, - 0x00000020, 0x00000024, 0x00001020, 0x00001024, - 0x10000020, 0x10000024, 0x10001020, 0x10001024, - 0x10000020, 0x10000024, 0x10001020, 0x10001024, - 0x00080000, 0x00080004, 0x00081000, 0x00081004, - 0x00080000, 0x00080004, 0x00081000, 0x00081004, - 0x10080000, 0x10080004, 0x10081000, 0x10081004, - 0x10080000, 0x10080004, 0x10081000, 0x10081004, - 0x00080020, 0x00080024, 0x00081020, 0x00081024, - 0x00080020, 0x00080024, 0x00081020, 0x00081024, - 0x10080020, 0x10080024, 0x10081020, 0x10081024, - 0x10080020, 0x10080024, 0x10081020, 0x10081024, - 0x20000000, 0x20000004, 0x20001000, 0x20001004, - 0x20000000, 0x20000004, 0x20001000, 0x20001004, - 0x30000000, 0x30000004, 0x30001000, 0x30001004, - 0x30000000, 0x30000004, 0x30001000, 0x30001004, - 0x20000020, 0x20000024, 0x20001020, 0x20001024, - 0x20000020, 0x20000024, 0x20001020, 0x20001024, - 0x30000020, 0x30000024, 0x30001020, 0x30001024, - 0x30000020, 0x30000024, 0x30001020, 0x30001024, - 0x20080000, 0x20080004, 0x20081000, 0x20081004, - 0x20080000, 0x20080004, 0x20081000, 0x20081004, - 0x30080000, 0x30080004, 0x30081000, 0x30081004, - 0x30080000, 0x30080004, 0x30081000, 0x30081004, - 0x20080020, 0x20080024, 0x20081020, 0x20081024, - 0x20080020, 0x20080024, 0x20081020, 0x20081024, - 0x30080020, 0x30080024, 0x30081020, 0x30081024, - 0x30080020, 0x30080024, 0x30081020, 0x30081024, - 0x00000002, 0x00000006, 0x00001002, 0x00001006, - 0x00000002, 0x00000006, 0x00001002, 0x00001006, - 0x10000002, 0x10000006, 0x10001002, 0x10001006, - 0x10000002, 0x10000006, 0x10001002, 0x10001006, - 0x00000022, 0x00000026, 0x00001022, 0x00001026, - 0x00000022, 0x00000026, 0x00001022, 0x00001026, - 0x10000022, 0x10000026, 0x10001022, 0x10001026, - 0x10000022, 0x10000026, 0x10001022, 0x10001026, - 0x00080002, 0x00080006, 0x00081002, 0x00081006, - 0x00080002, 0x00080006, 0x00081002, 0x00081006, - 0x10080002, 0x10080006, 0x10081002, 0x10081006, - 0x10080002, 0x10080006, 0x10081002, 0x10081006, - 0x00080022, 0x00080026, 0x00081022, 0x00081026, - 0x00080022, 0x00080026, 0x00081022, 0x00081026, - 0x10080022, 0x10080026, 0x10081022, 0x10081026, - 0x10080022, 0x10080026, 0x10081022, 0x10081026, - 0x20000002, 0x20000006, 0x20001002, 0x20001006, - 0x20000002, 0x20000006, 0x20001002, 0x20001006, - 0x30000002, 0x30000006, 0x30001002, 0x30001006, - 0x30000002, 0x30000006, 0x30001002, 0x30001006, - 0x20000022, 0x20000026, 0x20001022, 0x20001026, - 0x20000022, 0x20000026, 0x20001022, 0x20001026, - 0x30000022, 0x30000026, 0x30001022, 0x30001026, - 0x30000022, 0x30000026, 0x30001022, 0x30001026, - 0x20080002, 0x20080006, 0x20081002, 0x20081006, - 0x20080002, 0x20080006, 0x20081002, 0x20081006, - 0x30080002, 0x30080006, 0x30081002, 0x30081006, - 0x30080002, 0x30080006, 0x30081002, 0x30081006, - 0x20080022, 0x20080026, 0x20081022, 0x20081026, - 0x20080022, 0x20080026, 0x20081022, 0x20081026, - 0x30080022, 0x30080026, 0x30081022, 0x30081026, - 0x30080022, 0x30080026, 0x30081022, 0x30081026 - ); - static $pc2mapc4 = array( - 0x00000000, 0x00100000, 0x00000008, 0x00100008, - 0x00000200, 0x00100200, 0x00000208, 0x00100208, - 0x00000000, 0x00100000, 0x00000008, 0x00100008, - 0x00000200, 0x00100200, 0x00000208, 0x00100208, - 0x04000000, 0x04100000, 0x04000008, 0x04100008, - 0x04000200, 0x04100200, 0x04000208, 0x04100208, - 0x04000000, 0x04100000, 0x04000008, 0x04100008, - 0x04000200, 0x04100200, 0x04000208, 0x04100208, - 0x00002000, 0x00102000, 0x00002008, 0x00102008, - 0x00002200, 0x00102200, 0x00002208, 0x00102208, - 0x00002000, 0x00102000, 0x00002008, 0x00102008, - 0x00002200, 0x00102200, 0x00002208, 0x00102208, - 0x04002000, 0x04102000, 0x04002008, 0x04102008, - 0x04002200, 0x04102200, 0x04002208, 0x04102208, - 0x04002000, 0x04102000, 0x04002008, 0x04102008, - 0x04002200, 0x04102200, 0x04002208, 0x04102208, - 0x00000000, 0x00100000, 0x00000008, 0x00100008, - 0x00000200, 0x00100200, 0x00000208, 0x00100208, - 0x00000000, 0x00100000, 0x00000008, 0x00100008, - 0x00000200, 0x00100200, 0x00000208, 0x00100208, - 0x04000000, 0x04100000, 0x04000008, 0x04100008, - 0x04000200, 0x04100200, 0x04000208, 0x04100208, - 0x04000000, 0x04100000, 0x04000008, 0x04100008, - 0x04000200, 0x04100200, 0x04000208, 0x04100208, - 0x00002000, 0x00102000, 0x00002008, 0x00102008, - 0x00002200, 0x00102200, 0x00002208, 0x00102208, - 0x00002000, 0x00102000, 0x00002008, 0x00102008, - 0x00002200, 0x00102200, 0x00002208, 0x00102208, - 0x04002000, 0x04102000, 0x04002008, 0x04102008, - 0x04002200, 0x04102200, 0x04002208, 0x04102208, - 0x04002000, 0x04102000, 0x04002008, 0x04102008, - 0x04002200, 0x04102200, 0x04002208, 0x04102208, - 0x00020000, 0x00120000, 0x00020008, 0x00120008, - 0x00020200, 0x00120200, 0x00020208, 0x00120208, - 0x00020000, 0x00120000, 0x00020008, 0x00120008, - 0x00020200, 0x00120200, 0x00020208, 0x00120208, - 0x04020000, 0x04120000, 0x04020008, 0x04120008, - 0x04020200, 0x04120200, 0x04020208, 0x04120208, - 0x04020000, 0x04120000, 0x04020008, 0x04120008, - 0x04020200, 0x04120200, 0x04020208, 0x04120208, - 0x00022000, 0x00122000, 0x00022008, 0x00122008, - 0x00022200, 0x00122200, 0x00022208, 0x00122208, - 0x00022000, 0x00122000, 0x00022008, 0x00122008, - 0x00022200, 0x00122200, 0x00022208, 0x00122208, - 0x04022000, 0x04122000, 0x04022008, 0x04122008, - 0x04022200, 0x04122200, 0x04022208, 0x04122208, - 0x04022000, 0x04122000, 0x04022008, 0x04122008, - 0x04022200, 0x04122200, 0x04022208, 0x04122208, - 0x00020000, 0x00120000, 0x00020008, 0x00120008, - 0x00020200, 0x00120200, 0x00020208, 0x00120208, - 0x00020000, 0x00120000, 0x00020008, 0x00120008, - 0x00020200, 0x00120200, 0x00020208, 0x00120208, - 0x04020000, 0x04120000, 0x04020008, 0x04120008, - 0x04020200, 0x04120200, 0x04020208, 0x04120208, - 0x04020000, 0x04120000, 0x04020008, 0x04120008, - 0x04020200, 0x04120200, 0x04020208, 0x04120208, - 0x00022000, 0x00122000, 0x00022008, 0x00122008, - 0x00022200, 0x00122200, 0x00022208, 0x00122208, - 0x00022000, 0x00122000, 0x00022008, 0x00122008, - 0x00022200, 0x00122200, 0x00022208, 0x00122208, - 0x04022000, 0x04122000, 0x04022008, 0x04122008, - 0x04022200, 0x04122200, 0x04022208, 0x04122208, - 0x04022000, 0x04122000, 0x04022008, 0x04122008, - 0x04022200, 0x04122200, 0x04022208, 0x04122208 - ); - static $pc2mapd1 = array( - 0x00000000, 0x00000001, 0x08000000, 0x08000001, - 0x00200000, 0x00200001, 0x08200000, 0x08200001, - 0x00000002, 0x00000003, 0x08000002, 0x08000003, - 0x00200002, 0x00200003, 0x08200002, 0x08200003 - ); - static $pc2mapd2 = array( - 0x00000000, 0x00100000, 0x00000800, 0x00100800, - 0x00000000, 0x00100000, 0x00000800, 0x00100800, - 0x04000000, 0x04100000, 0x04000800, 0x04100800, - 0x04000000, 0x04100000, 0x04000800, 0x04100800, - 0x00000004, 0x00100004, 0x00000804, 0x00100804, - 0x00000004, 0x00100004, 0x00000804, 0x00100804, - 0x04000004, 0x04100004, 0x04000804, 0x04100804, - 0x04000004, 0x04100004, 0x04000804, 0x04100804, - 0x00000000, 0x00100000, 0x00000800, 0x00100800, - 0x00000000, 0x00100000, 0x00000800, 0x00100800, - 0x04000000, 0x04100000, 0x04000800, 0x04100800, - 0x04000000, 0x04100000, 0x04000800, 0x04100800, - 0x00000004, 0x00100004, 0x00000804, 0x00100804, - 0x00000004, 0x00100004, 0x00000804, 0x00100804, - 0x04000004, 0x04100004, 0x04000804, 0x04100804, - 0x04000004, 0x04100004, 0x04000804, 0x04100804, - 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, - 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, - 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, - 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, - 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, - 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, - 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, - 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, - 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, - 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, - 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, - 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, - 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, - 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, - 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, - 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, - 0x00020000, 0x00120000, 0x00020800, 0x00120800, - 0x00020000, 0x00120000, 0x00020800, 0x00120800, - 0x04020000, 0x04120000, 0x04020800, 0x04120800, - 0x04020000, 0x04120000, 0x04020800, 0x04120800, - 0x00020004, 0x00120004, 0x00020804, 0x00120804, - 0x00020004, 0x00120004, 0x00020804, 0x00120804, - 0x04020004, 0x04120004, 0x04020804, 0x04120804, - 0x04020004, 0x04120004, 0x04020804, 0x04120804, - 0x00020000, 0x00120000, 0x00020800, 0x00120800, - 0x00020000, 0x00120000, 0x00020800, 0x00120800, - 0x04020000, 0x04120000, 0x04020800, 0x04120800, - 0x04020000, 0x04120000, 0x04020800, 0x04120800, - 0x00020004, 0x00120004, 0x00020804, 0x00120804, - 0x00020004, 0x00120004, 0x00020804, 0x00120804, - 0x04020004, 0x04120004, 0x04020804, 0x04120804, - 0x04020004, 0x04120004, 0x04020804, 0x04120804, - 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, - 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, - 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, - 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, - 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, - 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, - 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, - 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, - 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, - 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, - 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, - 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, - 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, - 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, - 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, - 0x04020204, 0x04120204, 0x04020A04, 0x04120A04 - ); - static $pc2mapd3 = array( - 0x00000000, 0x00010000, 0x02000000, 0x02010000, - 0x00000020, 0x00010020, 0x02000020, 0x02010020, - 0x00040000, 0x00050000, 0x02040000, 0x02050000, - 0x00040020, 0x00050020, 0x02040020, 0x02050020, - 0x00002000, 0x00012000, 0x02002000, 0x02012000, - 0x00002020, 0x00012020, 0x02002020, 0x02012020, - 0x00042000, 0x00052000, 0x02042000, 0x02052000, - 0x00042020, 0x00052020, 0x02042020, 0x02052020, - 0x00000000, 0x00010000, 0x02000000, 0x02010000, - 0x00000020, 0x00010020, 0x02000020, 0x02010020, - 0x00040000, 0x00050000, 0x02040000, 0x02050000, - 0x00040020, 0x00050020, 0x02040020, 0x02050020, - 0x00002000, 0x00012000, 0x02002000, 0x02012000, - 0x00002020, 0x00012020, 0x02002020, 0x02012020, - 0x00042000, 0x00052000, 0x02042000, 0x02052000, - 0x00042020, 0x00052020, 0x02042020, 0x02052020, - 0x00000010, 0x00010010, 0x02000010, 0x02010010, - 0x00000030, 0x00010030, 0x02000030, 0x02010030, - 0x00040010, 0x00050010, 0x02040010, 0x02050010, - 0x00040030, 0x00050030, 0x02040030, 0x02050030, - 0x00002010, 0x00012010, 0x02002010, 0x02012010, - 0x00002030, 0x00012030, 0x02002030, 0x02012030, - 0x00042010, 0x00052010, 0x02042010, 0x02052010, - 0x00042030, 0x00052030, 0x02042030, 0x02052030, - 0x00000010, 0x00010010, 0x02000010, 0x02010010, - 0x00000030, 0x00010030, 0x02000030, 0x02010030, - 0x00040010, 0x00050010, 0x02040010, 0x02050010, - 0x00040030, 0x00050030, 0x02040030, 0x02050030, - 0x00002010, 0x00012010, 0x02002010, 0x02012010, - 0x00002030, 0x00012030, 0x02002030, 0x02012030, - 0x00042010, 0x00052010, 0x02042010, 0x02052010, - 0x00042030, 0x00052030, 0x02042030, 0x02052030, - 0x20000000, 0x20010000, 0x22000000, 0x22010000, - 0x20000020, 0x20010020, 0x22000020, 0x22010020, - 0x20040000, 0x20050000, 0x22040000, 0x22050000, - 0x20040020, 0x20050020, 0x22040020, 0x22050020, - 0x20002000, 0x20012000, 0x22002000, 0x22012000, - 0x20002020, 0x20012020, 0x22002020, 0x22012020, - 0x20042000, 0x20052000, 0x22042000, 0x22052000, - 0x20042020, 0x20052020, 0x22042020, 0x22052020, - 0x20000000, 0x20010000, 0x22000000, 0x22010000, - 0x20000020, 0x20010020, 0x22000020, 0x22010020, - 0x20040000, 0x20050000, 0x22040000, 0x22050000, - 0x20040020, 0x20050020, 0x22040020, 0x22050020, - 0x20002000, 0x20012000, 0x22002000, 0x22012000, - 0x20002020, 0x20012020, 0x22002020, 0x22012020, - 0x20042000, 0x20052000, 0x22042000, 0x22052000, - 0x20042020, 0x20052020, 0x22042020, 0x22052020, - 0x20000010, 0x20010010, 0x22000010, 0x22010010, - 0x20000030, 0x20010030, 0x22000030, 0x22010030, - 0x20040010, 0x20050010, 0x22040010, 0x22050010, - 0x20040030, 0x20050030, 0x22040030, 0x22050030, - 0x20002010, 0x20012010, 0x22002010, 0x22012010, - 0x20002030, 0x20012030, 0x22002030, 0x22012030, - 0x20042010, 0x20052010, 0x22042010, 0x22052010, - 0x20042030, 0x20052030, 0x22042030, 0x22052030, - 0x20000010, 0x20010010, 0x22000010, 0x22010010, - 0x20000030, 0x20010030, 0x22000030, 0x22010030, - 0x20040010, 0x20050010, 0x22040010, 0x22050010, - 0x20040030, 0x20050030, 0x22040030, 0x22050030, - 0x20002010, 0x20012010, 0x22002010, 0x22012010, - 0x20002030, 0x20012030, 0x22002030, 0x22012030, - 0x20042010, 0x20052010, 0x22042010, 0x22052010, - 0x20042030, 0x20052030, 0x22042030, 0x22052030 - ); - static $pc2mapd4 = array( - 0x00000000, 0x00000400, 0x01000000, 0x01000400, - 0x00000000, 0x00000400, 0x01000000, 0x01000400, - 0x00000100, 0x00000500, 0x01000100, 0x01000500, - 0x00000100, 0x00000500, 0x01000100, 0x01000500, - 0x10000000, 0x10000400, 0x11000000, 0x11000400, - 0x10000000, 0x10000400, 0x11000000, 0x11000400, - 0x10000100, 0x10000500, 0x11000100, 0x11000500, - 0x10000100, 0x10000500, 0x11000100, 0x11000500, - 0x00080000, 0x00080400, 0x01080000, 0x01080400, - 0x00080000, 0x00080400, 0x01080000, 0x01080400, - 0x00080100, 0x00080500, 0x01080100, 0x01080500, - 0x00080100, 0x00080500, 0x01080100, 0x01080500, - 0x10080000, 0x10080400, 0x11080000, 0x11080400, - 0x10080000, 0x10080400, 0x11080000, 0x11080400, - 0x10080100, 0x10080500, 0x11080100, 0x11080500, - 0x10080100, 0x10080500, 0x11080100, 0x11080500, - 0x00000008, 0x00000408, 0x01000008, 0x01000408, - 0x00000008, 0x00000408, 0x01000008, 0x01000408, - 0x00000108, 0x00000508, 0x01000108, 0x01000508, - 0x00000108, 0x00000508, 0x01000108, 0x01000508, - 0x10000008, 0x10000408, 0x11000008, 0x11000408, - 0x10000008, 0x10000408, 0x11000008, 0x11000408, - 0x10000108, 0x10000508, 0x11000108, 0x11000508, - 0x10000108, 0x10000508, 0x11000108, 0x11000508, - 0x00080008, 0x00080408, 0x01080008, 0x01080408, - 0x00080008, 0x00080408, 0x01080008, 0x01080408, - 0x00080108, 0x00080508, 0x01080108, 0x01080508, - 0x00080108, 0x00080508, 0x01080108, 0x01080508, - 0x10080008, 0x10080408, 0x11080008, 0x11080408, - 0x10080008, 0x10080408, 0x11080008, 0x11080408, - 0x10080108, 0x10080508, 0x11080108, 0x11080508, - 0x10080108, 0x10080508, 0x11080108, 0x11080508, - 0x00001000, 0x00001400, 0x01001000, 0x01001400, - 0x00001000, 0x00001400, 0x01001000, 0x01001400, - 0x00001100, 0x00001500, 0x01001100, 0x01001500, - 0x00001100, 0x00001500, 0x01001100, 0x01001500, - 0x10001000, 0x10001400, 0x11001000, 0x11001400, - 0x10001000, 0x10001400, 0x11001000, 0x11001400, - 0x10001100, 0x10001500, 0x11001100, 0x11001500, - 0x10001100, 0x10001500, 0x11001100, 0x11001500, - 0x00081000, 0x00081400, 0x01081000, 0x01081400, - 0x00081000, 0x00081400, 0x01081000, 0x01081400, - 0x00081100, 0x00081500, 0x01081100, 0x01081500, - 0x00081100, 0x00081500, 0x01081100, 0x01081500, - 0x10081000, 0x10081400, 0x11081000, 0x11081400, - 0x10081000, 0x10081400, 0x11081000, 0x11081400, - 0x10081100, 0x10081500, 0x11081100, 0x11081500, - 0x10081100, 0x10081500, 0x11081100, 0x11081500, - 0x00001008, 0x00001408, 0x01001008, 0x01001408, - 0x00001008, 0x00001408, 0x01001008, 0x01001408, - 0x00001108, 0x00001508, 0x01001108, 0x01001508, - 0x00001108, 0x00001508, 0x01001108, 0x01001508, - 0x10001008, 0x10001408, 0x11001008, 0x11001408, - 0x10001008, 0x10001408, 0x11001008, 0x11001408, - 0x10001108, 0x10001508, 0x11001108, 0x11001508, - 0x10001108, 0x10001508, 0x11001108, 0x11001508, - 0x00081008, 0x00081408, 0x01081008, 0x01081408, - 0x00081008, 0x00081408, 0x01081008, 0x01081408, - 0x00081108, 0x00081508, 0x01081108, 0x01081508, - 0x00081108, 0x00081508, 0x01081108, 0x01081508, - 0x10081008, 0x10081408, 0x11081008, 0x11081408, - 0x10081008, 0x10081408, 0x11081008, 0x11081408, - 0x10081108, 0x10081508, 0x11081108, 0x11081508, - 0x10081108, 0x10081508, 0x11081108, 0x11081508 - ); - - $keys = array(); - for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { - // pad the key and remove extra characters as appropriate. - $key = str_pad(substr($this->key, $des_round * 8, 8), 8, "\0"); - - // Perform the PC/1 transformation and compute C and D. - $t = unpack('Nl/Nr', $key); - list($l, $r) = array($t['l'], $t['r']); - $key = ($this->shuffle[$pc1map[ $r & 0xFF]] & "\x80\x80\x80\x80\x80\x80\x80\x00") | - ($this->shuffle[$pc1map[($r >> 8) & 0xFF]] & "\x40\x40\x40\x40\x40\x40\x40\x00") | - ($this->shuffle[$pc1map[($r >> 16) & 0xFF]] & "\x20\x20\x20\x20\x20\x20\x20\x00") | - ($this->shuffle[$pc1map[($r >> 24) & 0xFF]] & "\x10\x10\x10\x10\x10\x10\x10\x00") | - ($this->shuffle[$pc1map[ $l & 0xFF]] & "\x08\x08\x08\x08\x08\x08\x08\x00") | - ($this->shuffle[$pc1map[($l >> 8) & 0xFF]] & "\x04\x04\x04\x04\x04\x04\x04\x00") | - ($this->shuffle[$pc1map[($l >> 16) & 0xFF]] & "\x02\x02\x02\x02\x02\x02\x02\x00") | - ($this->shuffle[$pc1map[($l >> 24) & 0xFF]] & "\x01\x01\x01\x01\x01\x01\x01\x00"); - $key = unpack('Nc/Nd', $key); - $c = ( $key['c'] >> 4) & 0x0FFFFFFF; - $d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F); - - $keys[$des_round] = array( - CRYPT_DES_ENCRYPT => array(), - CRYPT_DES_DECRYPT => array_fill(0, 32, 0) - ); - for ($i = 0, $ki = 31; $i < 16; ++$i, $ki-= 2) { - $c <<= $shifts[$i]; - $c = ($c | ($c >> 28)) & 0x0FFFFFFF; - $d <<= $shifts[$i]; - $d = ($d | ($d >> 28)) & 0x0FFFFFFF; - - // Perform the PC-2 transformation. - $cp = $pc2mapc1[ $c >> 24 ] | $pc2mapc2[($c >> 16) & 0xFF] | - $pc2mapc3[($c >> 8) & 0xFF] | $pc2mapc4[ $c & 0xFF]; - $dp = $pc2mapd1[ $d >> 24 ] | $pc2mapd2[($d >> 16) & 0xFF] | - $pc2mapd3[($d >> 8) & 0xFF] | $pc2mapd4[ $d & 0xFF]; - - // Reorder: odd bytes/even bytes. Push the result in key schedule. - $val1 = ( $cp & 0xFF000000) | (($cp << 8) & 0x00FF0000) | - (($dp >> 16) & 0x0000FF00) | (($dp >> 8) & 0x000000FF); - $val2 = (($cp << 8) & 0xFF000000) | (($cp << 16) & 0x00FF0000) | - (($dp >> 8) & 0x0000FF00) | ( $dp & 0x000000FF); - $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val1; - $keys[$des_round][CRYPT_DES_DECRYPT][$ki - 1] = $val1; - $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val2; - $keys[$des_round][CRYPT_DES_DECRYPT][$ki ] = $val2; - } - } - - switch ($this->des_rounds) { - case 3: // 3DES keys - $this->keys = array( - CRYPT_DES_ENCRYPT => array_merge( - $keys[0][CRYPT_DES_ENCRYPT], - $keys[1][CRYPT_DES_DECRYPT], - $keys[2][CRYPT_DES_ENCRYPT] - ), - CRYPT_DES_DECRYPT => array_merge( - $keys[2][CRYPT_DES_DECRYPT], - $keys[1][CRYPT_DES_ENCRYPT], - $keys[0][CRYPT_DES_DECRYPT] - ) - ); - break; - // case 1: // DES keys - default: - $this->keys = array( - CRYPT_DES_ENCRYPT => $keys[0][CRYPT_DES_ENCRYPT], - CRYPT_DES_DECRYPT => $keys[0][CRYPT_DES_DECRYPT] - ); - } - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Crypt_Base::_setupInlineCrypt() - * @access private - */ - function _setupInlineCrypt() - { - $lambda_functions =& Crypt_DES::_getLambdaFunctions(); - - // Engine configuration for: - // - DES ($des_rounds == 1) or - // - 3DES ($des_rounds == 3) - $des_rounds = $this->des_rounds; - - // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. - // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one - $gen_hi_opt_code = (bool)( count($lambda_functions) < 10 ); - - // Generation of a uniqe hash for our generated code - switch (true) { - case $gen_hi_opt_code: - // For hi-optimized code, we create for each combination of - // $mode, $des_rounds and $this->key its own encrypt/decrypt function. - $code_hash = md5(str_pad("Crypt_DES, $des_rounds, {$this->mode}, ", 32, "\0") . $this->key); - break; - default: - // After max 10 hi-optimized functions, we create generic - // (still very fast.. but not ultra) functions for each $mode/$des_rounds - // Currently 2 * 5 generic functions will be then max. possible. - $code_hash = "Crypt_DES, $des_rounds, {$this->mode}"; - } - - // Is there a re-usable $lambda_functions in there? If not, we have to create it. - if (!isset($lambda_functions[$code_hash])) { - // Init code for both, encrypt and decrypt. - $init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; - if (!$sbox1) { - $sbox1 = array_map("intval", $self->sbox1); - $sbox2 = array_map("intval", $self->sbox2); - $sbox3 = array_map("intval", $self->sbox3); - $sbox4 = array_map("intval", $self->sbox4); - $sbox5 = array_map("intval", $self->sbox5); - $sbox6 = array_map("intval", $self->sbox6); - $sbox7 = array_map("intval", $self->sbox7); - $sbox8 = array_map("intval", $self->sbox8);' - /* Merge $shuffle with $[inv]ipmap */ . ' - for ($i = 0; $i < 256; ++$i) { - $shuffleip[] = $self->shuffle[$self->ipmap[$i]]; - $shuffleinvip[] = $self->shuffle[$self->invipmap[$i]]; - } - } - '; - - switch (true) { - case $gen_hi_opt_code: - // In Hi-optimized code mode, we use our [3]DES key schedule as hardcoded integers. - // No futher initialisation of the $keys schedule is necessary. - // That is the extra performance boost. - $k = array( - CRYPT_DES_ENCRYPT => $this->keys[CRYPT_DES_ENCRYPT], - CRYPT_DES_DECRYPT => $this->keys[CRYPT_DES_DECRYPT] - ); - $init_encrypt = ''; - $init_decrypt = ''; - break; - default: - // In generic optimized code mode, we have to use, as the best compromise [currently], - // our key schedule as $ke/$kd arrays. (with hardcoded indexes...) - $k = array( - CRYPT_DES_ENCRYPT => array(), - CRYPT_DES_DECRYPT => array() - ); - for ($i = 0, $c = count($this->keys[CRYPT_DES_ENCRYPT]); $i < $c; ++$i) { - $k[CRYPT_DES_ENCRYPT][$i] = '$ke[' . $i . ']'; - $k[CRYPT_DES_DECRYPT][$i] = '$kd[' . $i . ']'; - } - $init_encrypt = '$ke = $self->keys[CRYPT_DES_ENCRYPT];'; - $init_decrypt = '$kd = $self->keys[CRYPT_DES_DECRYPT];'; - break; - } - - // Creating code for en- and decryption. - $crypt_block = array(); - foreach (array(CRYPT_DES_ENCRYPT, CRYPT_DES_DECRYPT) as $c) { - - /* Do the initial IP permutation. */ - $crypt_block[$c] = ' - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - $in = unpack("N*", - ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | - ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | - ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | - ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | - ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | - ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | - ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | - ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01") - ); - ' . /* Extract L0 and R0 */ ' - $l = $in[1]; - $r = $in[2]; - '; - - $l = '$l'; - $r = '$r'; - - // Perform DES or 3DES. - for ($ki = -1, $des_round = 0; $des_round < $des_rounds; ++$des_round) { - // Perform the 16 steps. - for ($i = 0; $i < 16; ++$i) { - // start of "the Feistel (F) function" - see the following URL: - // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png - // Merge key schedule. - $crypt_block[$c].= ' - $b1 = ((' . $r . ' >> 3) & 0x1FFFFFFF) ^ (' . $r . ' << 29) ^ ' . $k[$c][++$ki] . '; - $b2 = ((' . $r . ' >> 31) & 0x00000001) ^ (' . $r . ' << 1) ^ ' . $k[$c][++$ki] . ';' . - /* S-box indexing. */ - $l . ' = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ - $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ - $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ - $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ ' . $l . '; - '; - // end of "the Feistel (F) function" - - // swap L & R - list($l, $r) = array($r, $l); - } - list($l, $r) = array($r, $l); - } - - // Perform the inverse IP permutation. - $crypt_block[$c].= '$in = - ($shuffleinvip[($l >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | - ($shuffleinvip[($r >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | - ($shuffleinvip[($l >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | - ($shuffleinvip[($r >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | - ($shuffleinvip[($l >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | - ($shuffleinvip[($r >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | - ($shuffleinvip[ $l & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | - ($shuffleinvip[ $r & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); - '; - } - - // Creates the inline-crypt function - $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( - array( - 'init_crypt' => $init_crypt, - 'init_encrypt' => $init_encrypt, - 'init_decrypt' => $init_decrypt, - 'encrypt_block' => $crypt_block[CRYPT_DES_ENCRYPT], - 'decrypt_block' => $crypt_block[CRYPT_DES_DECRYPT] - ) - ); - } - - // Set the inline-crypt function as callback in: $this->inline_crypt - $this->inline_crypt = $lambda_functions[$code_hash]; - } -} + + * setKey('abcdefgh'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $des->decrypt($des->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_DES + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access private + * @see self::_setupKey() + * @see self::_processBlock() + */ +/** + * Contains $keys[CRYPT_DES_ENCRYPT] + */ +define('CRYPT_DES_ENCRYPT', 0); +/** + * Contains $keys[CRYPT_DES_DECRYPT] + */ +define('CRYPT_DES_DECRYPT', 1); +/**#@-*/ + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_DES_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_DES_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_DES_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_DES_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_DES_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/** + * Pure-PHP implementation of DES. + * + * @package Crypt_DES + * @author Jim Wigginton + * @access public + */ +class Crypt_DES extends Crypt_Base +{ + /** + * Block Length of the cipher + * + * @see Crypt_Base::block_size + * @var int + * @access private + */ + var $block_size = 8; + + /** + * Key Length (in bytes) + * + * @see Crypt_Base::setKeyLength() + * @var int + * @access private + */ + var $key_length = 8; + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'DES'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'des'; + + /** + * The OpenSSL names of the cipher / modes + * + * @see Crypt_Base::openssl_mode_names + * @var array + * @access private + */ + var $openssl_mode_names = array( + CRYPT_MODE_ECB => 'des-ecb', + CRYPT_MODE_CBC => 'des-cbc', + CRYPT_MODE_CFB => 'des-cfb', + CRYPT_MODE_OFB => 'des-ofb' + // CRYPT_MODE_CTR is undefined for DES + ); + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var int + * @access private + */ + var $cfb_init_len = 500; + + /** + * Switch for DES/3DES encryption + * + * Used only if $engine == CRYPT_DES_MODE_INTERNAL + * + * @see self::_setupKey() + * @see self::_processBlock() + * @var int + * @access private + */ + var $des_rounds = 1; + + /** + * max possible size of $key + * + * @see self::setKey() + * @var string + * @access private + */ + var $key_length_max = 8; + + /** + * The Key Schedule + * + * @see self::_setupKey() + * @var array + * @access private + */ + var $keys; + + /** + * Shuffle table. + * + * For each byte value index, the entry holds an 8-byte string + * with each byte containing all bits in the same state as the + * corresponding bit in the index value. + * + * @see self::_processBlock() + * @see self::_setupKey() + * @var array + * @access private + */ + var $shuffle = array( + "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xFF", + "\x00\x00\x00\x00\x00\x00\xFF\x00", "\x00\x00\x00\x00\x00\x00\xFF\xFF", + "\x00\x00\x00\x00\x00\xFF\x00\x00", "\x00\x00\x00\x00\x00\xFF\x00\xFF", + "\x00\x00\x00\x00\x00\xFF\xFF\x00", "\x00\x00\x00\x00\x00\xFF\xFF\xFF", + "\x00\x00\x00\x00\xFF\x00\x00\x00", "\x00\x00\x00\x00\xFF\x00\x00\xFF", + "\x00\x00\x00\x00\xFF\x00\xFF\x00", "\x00\x00\x00\x00\xFF\x00\xFF\xFF", + "\x00\x00\x00\x00\xFF\xFF\x00\x00", "\x00\x00\x00\x00\xFF\xFF\x00\xFF", + "\x00\x00\x00\x00\xFF\xFF\xFF\x00", "\x00\x00\x00\x00\xFF\xFF\xFF\xFF", + "\x00\x00\x00\xFF\x00\x00\x00\x00", "\x00\x00\x00\xFF\x00\x00\x00\xFF", + "\x00\x00\x00\xFF\x00\x00\xFF\x00", "\x00\x00\x00\xFF\x00\x00\xFF\xFF", + "\x00\x00\x00\xFF\x00\xFF\x00\x00", "\x00\x00\x00\xFF\x00\xFF\x00\xFF", + "\x00\x00\x00\xFF\x00\xFF\xFF\x00", "\x00\x00\x00\xFF\x00\xFF\xFF\xFF", + "\x00\x00\x00\xFF\xFF\x00\x00\x00", "\x00\x00\x00\xFF\xFF\x00\x00\xFF", + "\x00\x00\x00\xFF\xFF\x00\xFF\x00", "\x00\x00\x00\xFF\xFF\x00\xFF\xFF", + "\x00\x00\x00\xFF\xFF\xFF\x00\x00", "\x00\x00\x00\xFF\xFF\xFF\x00\xFF", + "\x00\x00\x00\xFF\xFF\xFF\xFF\x00", "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF", + "\x00\x00\xFF\x00\x00\x00\x00\x00", "\x00\x00\xFF\x00\x00\x00\x00\xFF", + "\x00\x00\xFF\x00\x00\x00\xFF\x00", "\x00\x00\xFF\x00\x00\x00\xFF\xFF", + "\x00\x00\xFF\x00\x00\xFF\x00\x00", "\x00\x00\xFF\x00\x00\xFF\x00\xFF", + "\x00\x00\xFF\x00\x00\xFF\xFF\x00", "\x00\x00\xFF\x00\x00\xFF\xFF\xFF", + "\x00\x00\xFF\x00\xFF\x00\x00\x00", "\x00\x00\xFF\x00\xFF\x00\x00\xFF", + "\x00\x00\xFF\x00\xFF\x00\xFF\x00", "\x00\x00\xFF\x00\xFF\x00\xFF\xFF", + "\x00\x00\xFF\x00\xFF\xFF\x00\x00", "\x00\x00\xFF\x00\xFF\xFF\x00\xFF", + "\x00\x00\xFF\x00\xFF\xFF\xFF\x00", "\x00\x00\xFF\x00\xFF\xFF\xFF\xFF", + "\x00\x00\xFF\xFF\x00\x00\x00\x00", "\x00\x00\xFF\xFF\x00\x00\x00\xFF", + "\x00\x00\xFF\xFF\x00\x00\xFF\x00", "\x00\x00\xFF\xFF\x00\x00\xFF\xFF", + "\x00\x00\xFF\xFF\x00\xFF\x00\x00", "\x00\x00\xFF\xFF\x00\xFF\x00\xFF", + "\x00\x00\xFF\xFF\x00\xFF\xFF\x00", "\x00\x00\xFF\xFF\x00\xFF\xFF\xFF", + "\x00\x00\xFF\xFF\xFF\x00\x00\x00", "\x00\x00\xFF\xFF\xFF\x00\x00\xFF", + "\x00\x00\xFF\xFF\xFF\x00\xFF\x00", "\x00\x00\xFF\xFF\xFF\x00\xFF\xFF", + "\x00\x00\xFF\xFF\xFF\xFF\x00\x00", "\x00\x00\xFF\xFF\xFF\xFF\x00\xFF", + "\x00\x00\xFF\xFF\xFF\xFF\xFF\x00", "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF", + "\x00\xFF\x00\x00\x00\x00\x00\x00", "\x00\xFF\x00\x00\x00\x00\x00\xFF", + "\x00\xFF\x00\x00\x00\x00\xFF\x00", "\x00\xFF\x00\x00\x00\x00\xFF\xFF", + "\x00\xFF\x00\x00\x00\xFF\x00\x00", "\x00\xFF\x00\x00\x00\xFF\x00\xFF", + "\x00\xFF\x00\x00\x00\xFF\xFF\x00", "\x00\xFF\x00\x00\x00\xFF\xFF\xFF", + "\x00\xFF\x00\x00\xFF\x00\x00\x00", "\x00\xFF\x00\x00\xFF\x00\x00\xFF", + "\x00\xFF\x00\x00\xFF\x00\xFF\x00", "\x00\xFF\x00\x00\xFF\x00\xFF\xFF", + "\x00\xFF\x00\x00\xFF\xFF\x00\x00", "\x00\xFF\x00\x00\xFF\xFF\x00\xFF", + "\x00\xFF\x00\x00\xFF\xFF\xFF\x00", "\x00\xFF\x00\x00\xFF\xFF\xFF\xFF", + "\x00\xFF\x00\xFF\x00\x00\x00\x00", "\x00\xFF\x00\xFF\x00\x00\x00\xFF", + "\x00\xFF\x00\xFF\x00\x00\xFF\x00", "\x00\xFF\x00\xFF\x00\x00\xFF\xFF", + "\x00\xFF\x00\xFF\x00\xFF\x00\x00", "\x00\xFF\x00\xFF\x00\xFF\x00\xFF", + "\x00\xFF\x00\xFF\x00\xFF\xFF\x00", "\x00\xFF\x00\xFF\x00\xFF\xFF\xFF", + "\x00\xFF\x00\xFF\xFF\x00\x00\x00", "\x00\xFF\x00\xFF\xFF\x00\x00\xFF", + "\x00\xFF\x00\xFF\xFF\x00\xFF\x00", "\x00\xFF\x00\xFF\xFF\x00\xFF\xFF", + "\x00\xFF\x00\xFF\xFF\xFF\x00\x00", "\x00\xFF\x00\xFF\xFF\xFF\x00\xFF", + "\x00\xFF\x00\xFF\xFF\xFF\xFF\x00", "\x00\xFF\x00\xFF\xFF\xFF\xFF\xFF", + "\x00\xFF\xFF\x00\x00\x00\x00\x00", "\x00\xFF\xFF\x00\x00\x00\x00\xFF", + "\x00\xFF\xFF\x00\x00\x00\xFF\x00", "\x00\xFF\xFF\x00\x00\x00\xFF\xFF", + "\x00\xFF\xFF\x00\x00\xFF\x00\x00", "\x00\xFF\xFF\x00\x00\xFF\x00\xFF", + "\x00\xFF\xFF\x00\x00\xFF\xFF\x00", "\x00\xFF\xFF\x00\x00\xFF\xFF\xFF", + "\x00\xFF\xFF\x00\xFF\x00\x00\x00", "\x00\xFF\xFF\x00\xFF\x00\x00\xFF", + "\x00\xFF\xFF\x00\xFF\x00\xFF\x00", "\x00\xFF\xFF\x00\xFF\x00\xFF\xFF", + "\x00\xFF\xFF\x00\xFF\xFF\x00\x00", "\x00\xFF\xFF\x00\xFF\xFF\x00\xFF", + "\x00\xFF\xFF\x00\xFF\xFF\xFF\x00", "\x00\xFF\xFF\x00\xFF\xFF\xFF\xFF", + "\x00\xFF\xFF\xFF\x00\x00\x00\x00", "\x00\xFF\xFF\xFF\x00\x00\x00\xFF", + "\x00\xFF\xFF\xFF\x00\x00\xFF\x00", "\x00\xFF\xFF\xFF\x00\x00\xFF\xFF", + "\x00\xFF\xFF\xFF\x00\xFF\x00\x00", "\x00\xFF\xFF\xFF\x00\xFF\x00\xFF", + "\x00\xFF\xFF\xFF\x00\xFF\xFF\x00", "\x00\xFF\xFF\xFF\x00\xFF\xFF\xFF", + "\x00\xFF\xFF\xFF\xFF\x00\x00\x00", "\x00\xFF\xFF\xFF\xFF\x00\x00\xFF", + "\x00\xFF\xFF\xFF\xFF\x00\xFF\x00", "\x00\xFF\xFF\xFF\xFF\x00\xFF\xFF", + "\x00\xFF\xFF\xFF\xFF\xFF\x00\x00", "\x00\xFF\xFF\xFF\xFF\xFF\x00\xFF", + "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF", + "\xFF\x00\x00\x00\x00\x00\x00\x00", "\xFF\x00\x00\x00\x00\x00\x00\xFF", + "\xFF\x00\x00\x00\x00\x00\xFF\x00", "\xFF\x00\x00\x00\x00\x00\xFF\xFF", + "\xFF\x00\x00\x00\x00\xFF\x00\x00", "\xFF\x00\x00\x00\x00\xFF\x00\xFF", + "\xFF\x00\x00\x00\x00\xFF\xFF\x00", "\xFF\x00\x00\x00\x00\xFF\xFF\xFF", + "\xFF\x00\x00\x00\xFF\x00\x00\x00", "\xFF\x00\x00\x00\xFF\x00\x00\xFF", + "\xFF\x00\x00\x00\xFF\x00\xFF\x00", "\xFF\x00\x00\x00\xFF\x00\xFF\xFF", + "\xFF\x00\x00\x00\xFF\xFF\x00\x00", "\xFF\x00\x00\x00\xFF\xFF\x00\xFF", + "\xFF\x00\x00\x00\xFF\xFF\xFF\x00", "\xFF\x00\x00\x00\xFF\xFF\xFF\xFF", + "\xFF\x00\x00\xFF\x00\x00\x00\x00", "\xFF\x00\x00\xFF\x00\x00\x00\xFF", + "\xFF\x00\x00\xFF\x00\x00\xFF\x00", "\xFF\x00\x00\xFF\x00\x00\xFF\xFF", + "\xFF\x00\x00\xFF\x00\xFF\x00\x00", "\xFF\x00\x00\xFF\x00\xFF\x00\xFF", + "\xFF\x00\x00\xFF\x00\xFF\xFF\x00", "\xFF\x00\x00\xFF\x00\xFF\xFF\xFF", + "\xFF\x00\x00\xFF\xFF\x00\x00\x00", "\xFF\x00\x00\xFF\xFF\x00\x00\xFF", + "\xFF\x00\x00\xFF\xFF\x00\xFF\x00", "\xFF\x00\x00\xFF\xFF\x00\xFF\xFF", + "\xFF\x00\x00\xFF\xFF\xFF\x00\x00", "\xFF\x00\x00\xFF\xFF\xFF\x00\xFF", + "\xFF\x00\x00\xFF\xFF\xFF\xFF\x00", "\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF", + "\xFF\x00\xFF\x00\x00\x00\x00\x00", "\xFF\x00\xFF\x00\x00\x00\x00\xFF", + "\xFF\x00\xFF\x00\x00\x00\xFF\x00", "\xFF\x00\xFF\x00\x00\x00\xFF\xFF", + "\xFF\x00\xFF\x00\x00\xFF\x00\x00", "\xFF\x00\xFF\x00\x00\xFF\x00\xFF", + "\xFF\x00\xFF\x00\x00\xFF\xFF\x00", "\xFF\x00\xFF\x00\x00\xFF\xFF\xFF", + "\xFF\x00\xFF\x00\xFF\x00\x00\x00", "\xFF\x00\xFF\x00\xFF\x00\x00\xFF", + "\xFF\x00\xFF\x00\xFF\x00\xFF\x00", "\xFF\x00\xFF\x00\xFF\x00\xFF\xFF", + "\xFF\x00\xFF\x00\xFF\xFF\x00\x00", "\xFF\x00\xFF\x00\xFF\xFF\x00\xFF", + "\xFF\x00\xFF\x00\xFF\xFF\xFF\x00", "\xFF\x00\xFF\x00\xFF\xFF\xFF\xFF", + "\xFF\x00\xFF\xFF\x00\x00\x00\x00", "\xFF\x00\xFF\xFF\x00\x00\x00\xFF", + "\xFF\x00\xFF\xFF\x00\x00\xFF\x00", "\xFF\x00\xFF\xFF\x00\x00\xFF\xFF", + "\xFF\x00\xFF\xFF\x00\xFF\x00\x00", "\xFF\x00\xFF\xFF\x00\xFF\x00\xFF", + "\xFF\x00\xFF\xFF\x00\xFF\xFF\x00", "\xFF\x00\xFF\xFF\x00\xFF\xFF\xFF", + "\xFF\x00\xFF\xFF\xFF\x00\x00\x00", "\xFF\x00\xFF\xFF\xFF\x00\x00\xFF", + "\xFF\x00\xFF\xFF\xFF\x00\xFF\x00", "\xFF\x00\xFF\xFF\xFF\x00\xFF\xFF", + "\xFF\x00\xFF\xFF\xFF\xFF\x00\x00", "\xFF\x00\xFF\xFF\xFF\xFF\x00\xFF", + "\xFF\x00\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF", + "\xFF\xFF\x00\x00\x00\x00\x00\x00", "\xFF\xFF\x00\x00\x00\x00\x00\xFF", + "\xFF\xFF\x00\x00\x00\x00\xFF\x00", "\xFF\xFF\x00\x00\x00\x00\xFF\xFF", + "\xFF\xFF\x00\x00\x00\xFF\x00\x00", "\xFF\xFF\x00\x00\x00\xFF\x00\xFF", + "\xFF\xFF\x00\x00\x00\xFF\xFF\x00", "\xFF\xFF\x00\x00\x00\xFF\xFF\xFF", + "\xFF\xFF\x00\x00\xFF\x00\x00\x00", "\xFF\xFF\x00\x00\xFF\x00\x00\xFF", + "\xFF\xFF\x00\x00\xFF\x00\xFF\x00", "\xFF\xFF\x00\x00\xFF\x00\xFF\xFF", + "\xFF\xFF\x00\x00\xFF\xFF\x00\x00", "\xFF\xFF\x00\x00\xFF\xFF\x00\xFF", + "\xFF\xFF\x00\x00\xFF\xFF\xFF\x00", "\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF", + "\xFF\xFF\x00\xFF\x00\x00\x00\x00", "\xFF\xFF\x00\xFF\x00\x00\x00\xFF", + "\xFF\xFF\x00\xFF\x00\x00\xFF\x00", "\xFF\xFF\x00\xFF\x00\x00\xFF\xFF", + "\xFF\xFF\x00\xFF\x00\xFF\x00\x00", "\xFF\xFF\x00\xFF\x00\xFF\x00\xFF", + "\xFF\xFF\x00\xFF\x00\xFF\xFF\x00", "\xFF\xFF\x00\xFF\x00\xFF\xFF\xFF", + "\xFF\xFF\x00\xFF\xFF\x00\x00\x00", "\xFF\xFF\x00\xFF\xFF\x00\x00\xFF", + "\xFF\xFF\x00\xFF\xFF\x00\xFF\x00", "\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF", + "\xFF\xFF\x00\xFF\xFF\xFF\x00\x00", "\xFF\xFF\x00\xFF\xFF\xFF\x00\xFF", + "\xFF\xFF\x00\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF", + "\xFF\xFF\xFF\x00\x00\x00\x00\x00", "\xFF\xFF\xFF\x00\x00\x00\x00\xFF", + "\xFF\xFF\xFF\x00\x00\x00\xFF\x00", "\xFF\xFF\xFF\x00\x00\x00\xFF\xFF", + "\xFF\xFF\xFF\x00\x00\xFF\x00\x00", "\xFF\xFF\xFF\x00\x00\xFF\x00\xFF", + "\xFF\xFF\xFF\x00\x00\xFF\xFF\x00", "\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF", + "\xFF\xFF\xFF\x00\xFF\x00\x00\x00", "\xFF\xFF\xFF\x00\xFF\x00\x00\xFF", + "\xFF\xFF\xFF\x00\xFF\x00\xFF\x00", "\xFF\xFF\xFF\x00\xFF\x00\xFF\xFF", + "\xFF\xFF\xFF\x00\xFF\xFF\x00\x00", "\xFF\xFF\xFF\x00\xFF\xFF\x00\xFF", + "\xFF\xFF\xFF\x00\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF", + "\xFF\xFF\xFF\xFF\x00\x00\x00\x00", "\xFF\xFF\xFF\xFF\x00\x00\x00\xFF", + "\xFF\xFF\xFF\xFF\x00\x00\xFF\x00", "\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF", + "\xFF\xFF\xFF\xFF\x00\xFF\x00\x00", "\xFF\xFF\xFF\xFF\x00\xFF\x00\xFF", + "\xFF\xFF\xFF\xFF\x00\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF", + "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00", "\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF", + "\xFF\xFF\xFF\xFF\xFF\x00\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF", + "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF", + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + ); + + /** + * IP mapping helper table. + * + * Indexing this table with each source byte performs the initial bit permutation. + * + * @var array + * @access private + */ + var $ipmap = array( + 0x00, 0x10, 0x01, 0x11, 0x20, 0x30, 0x21, 0x31, + 0x02, 0x12, 0x03, 0x13, 0x22, 0x32, 0x23, 0x33, + 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71, + 0x42, 0x52, 0x43, 0x53, 0x62, 0x72, 0x63, 0x73, + 0x04, 0x14, 0x05, 0x15, 0x24, 0x34, 0x25, 0x35, + 0x06, 0x16, 0x07, 0x17, 0x26, 0x36, 0x27, 0x37, + 0x44, 0x54, 0x45, 0x55, 0x64, 0x74, 0x65, 0x75, + 0x46, 0x56, 0x47, 0x57, 0x66, 0x76, 0x67, 0x77, + 0x80, 0x90, 0x81, 0x91, 0xA0, 0xB0, 0xA1, 0xB1, + 0x82, 0x92, 0x83, 0x93, 0xA2, 0xB2, 0xA3, 0xB3, + 0xC0, 0xD0, 0xC1, 0xD1, 0xE0, 0xF0, 0xE1, 0xF1, + 0xC2, 0xD2, 0xC3, 0xD3, 0xE2, 0xF2, 0xE3, 0xF3, + 0x84, 0x94, 0x85, 0x95, 0xA4, 0xB4, 0xA5, 0xB5, + 0x86, 0x96, 0x87, 0x97, 0xA6, 0xB6, 0xA7, 0xB7, + 0xC4, 0xD4, 0xC5, 0xD5, 0xE4, 0xF4, 0xE5, 0xF5, + 0xC6, 0xD6, 0xC7, 0xD7, 0xE6, 0xF6, 0xE7, 0xF7, + 0x08, 0x18, 0x09, 0x19, 0x28, 0x38, 0x29, 0x39, + 0x0A, 0x1A, 0x0B, 0x1B, 0x2A, 0x3A, 0x2B, 0x3B, + 0x48, 0x58, 0x49, 0x59, 0x68, 0x78, 0x69, 0x79, + 0x4A, 0x5A, 0x4B, 0x5B, 0x6A, 0x7A, 0x6B, 0x7B, + 0x0C, 0x1C, 0x0D, 0x1D, 0x2C, 0x3C, 0x2D, 0x3D, + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4C, 0x5C, 0x4D, 0x5D, 0x6C, 0x7C, 0x6D, 0x7D, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x88, 0x98, 0x89, 0x99, 0xA8, 0xB8, 0xA9, 0xB9, + 0x8A, 0x9A, 0x8B, 0x9B, 0xAA, 0xBA, 0xAB, 0xBB, + 0xC8, 0xD8, 0xC9, 0xD9, 0xE8, 0xF8, 0xE9, 0xF9, + 0xCA, 0xDA, 0xCB, 0xDB, 0xEA, 0xFA, 0xEB, 0xFB, + 0x8C, 0x9C, 0x8D, 0x9D, 0xAC, 0xBC, 0xAD, 0xBD, + 0x8E, 0x9E, 0x8F, 0x9F, 0xAE, 0xBE, 0xAF, 0xBF, + 0xCC, 0xDC, 0xCD, 0xDD, 0xEC, 0xFC, 0xED, 0xFD, + 0xCE, 0xDE, 0xCF, 0xDF, 0xEE, 0xFE, 0xEF, 0xFF + ); + + /** + * Inverse IP mapping helper table. + * Indexing this table with a byte value reverses the bit order. + * + * @var array + * @access private + */ + var $invipmap = array( + 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, + 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, + 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, + 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, + 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, + 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, + 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, + 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, + 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, + 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, + 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, + 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, + 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, + 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, + 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, + 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, + 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, + 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, + 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, + 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, + 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, + 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, + 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, + 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, + 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, + 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, + 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, + 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, + 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, + 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, + 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, + 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF + ); + + /** + * Pre-permuted S-box1 + * + * Each box ($sbox1-$sbox8) has been vectorized, then each value pre-permuted using the + * P table: concatenation can then be replaced by exclusive ORs. + * + * @var array + * @access private + */ + var $sbox1 = array( + 0x00808200, 0x00000000, 0x00008000, 0x00808202, + 0x00808002, 0x00008202, 0x00000002, 0x00008000, + 0x00000200, 0x00808200, 0x00808202, 0x00000200, + 0x00800202, 0x00808002, 0x00800000, 0x00000002, + 0x00000202, 0x00800200, 0x00800200, 0x00008200, + 0x00008200, 0x00808000, 0x00808000, 0x00800202, + 0x00008002, 0x00800002, 0x00800002, 0x00008002, + 0x00000000, 0x00000202, 0x00008202, 0x00800000, + 0x00008000, 0x00808202, 0x00000002, 0x00808000, + 0x00808200, 0x00800000, 0x00800000, 0x00000200, + 0x00808002, 0x00008000, 0x00008200, 0x00800002, + 0x00000200, 0x00000002, 0x00800202, 0x00008202, + 0x00808202, 0x00008002, 0x00808000, 0x00800202, + 0x00800002, 0x00000202, 0x00008202, 0x00808200, + 0x00000202, 0x00800200, 0x00800200, 0x00000000, + 0x00008002, 0x00008200, 0x00000000, 0x00808002 + ); + + /** + * Pre-permuted S-box2 + * + * @var array + * @access private + */ + var $sbox2 = array( + 0x40084010, 0x40004000, 0x00004000, 0x00084010, + 0x00080000, 0x00000010, 0x40080010, 0x40004010, + 0x40000010, 0x40084010, 0x40084000, 0x40000000, + 0x40004000, 0x00080000, 0x00000010, 0x40080010, + 0x00084000, 0x00080010, 0x40004010, 0x00000000, + 0x40000000, 0x00004000, 0x00084010, 0x40080000, + 0x00080010, 0x40000010, 0x00000000, 0x00084000, + 0x00004010, 0x40084000, 0x40080000, 0x00004010, + 0x00000000, 0x00084010, 0x40080010, 0x00080000, + 0x40004010, 0x40080000, 0x40084000, 0x00004000, + 0x40080000, 0x40004000, 0x00000010, 0x40084010, + 0x00084010, 0x00000010, 0x00004000, 0x40000000, + 0x00004010, 0x40084000, 0x00080000, 0x40000010, + 0x00080010, 0x40004010, 0x40000010, 0x00080010, + 0x00084000, 0x00000000, 0x40004000, 0x00004010, + 0x40000000, 0x40080010, 0x40084010, 0x00084000 + ); + + /** + * Pre-permuted S-box3 + * + * @var array + * @access private + */ + var $sbox3 = array( + 0x00000104, 0x04010100, 0x00000000, 0x04010004, + 0x04000100, 0x00000000, 0x00010104, 0x04000100, + 0x00010004, 0x04000004, 0x04000004, 0x00010000, + 0x04010104, 0x00010004, 0x04010000, 0x00000104, + 0x04000000, 0x00000004, 0x04010100, 0x00000100, + 0x00010100, 0x04010000, 0x04010004, 0x00010104, + 0x04000104, 0x00010100, 0x00010000, 0x04000104, + 0x00000004, 0x04010104, 0x00000100, 0x04000000, + 0x04010100, 0x04000000, 0x00010004, 0x00000104, + 0x00010000, 0x04010100, 0x04000100, 0x00000000, + 0x00000100, 0x00010004, 0x04010104, 0x04000100, + 0x04000004, 0x00000100, 0x00000000, 0x04010004, + 0x04000104, 0x00010000, 0x04000000, 0x04010104, + 0x00000004, 0x00010104, 0x00010100, 0x04000004, + 0x04010000, 0x04000104, 0x00000104, 0x04010000, + 0x00010104, 0x00000004, 0x04010004, 0x00010100 + ); + + /** + * Pre-permuted S-box4 + * + * @var array + * @access private + */ + var $sbox4 = array( + 0x80401000, 0x80001040, 0x80001040, 0x00000040, + 0x00401040, 0x80400040, 0x80400000, 0x80001000, + 0x00000000, 0x00401000, 0x00401000, 0x80401040, + 0x80000040, 0x00000000, 0x00400040, 0x80400000, + 0x80000000, 0x00001000, 0x00400000, 0x80401000, + 0x00000040, 0x00400000, 0x80001000, 0x00001040, + 0x80400040, 0x80000000, 0x00001040, 0x00400040, + 0x00001000, 0x00401040, 0x80401040, 0x80000040, + 0x00400040, 0x80400000, 0x00401000, 0x80401040, + 0x80000040, 0x00000000, 0x00000000, 0x00401000, + 0x00001040, 0x00400040, 0x80400040, 0x80000000, + 0x80401000, 0x80001040, 0x80001040, 0x00000040, + 0x80401040, 0x80000040, 0x80000000, 0x00001000, + 0x80400000, 0x80001000, 0x00401040, 0x80400040, + 0x80001000, 0x00001040, 0x00400000, 0x80401000, + 0x00000040, 0x00400000, 0x00001000, 0x00401040 + ); + + /** + * Pre-permuted S-box5 + * + * @var array + * @access private + */ + var $sbox5 = array( + 0x00000080, 0x01040080, 0x01040000, 0x21000080, + 0x00040000, 0x00000080, 0x20000000, 0x01040000, + 0x20040080, 0x00040000, 0x01000080, 0x20040080, + 0x21000080, 0x21040000, 0x00040080, 0x20000000, + 0x01000000, 0x20040000, 0x20040000, 0x00000000, + 0x20000080, 0x21040080, 0x21040080, 0x01000080, + 0x21040000, 0x20000080, 0x00000000, 0x21000000, + 0x01040080, 0x01000000, 0x21000000, 0x00040080, + 0x00040000, 0x21000080, 0x00000080, 0x01000000, + 0x20000000, 0x01040000, 0x21000080, 0x20040080, + 0x01000080, 0x20000000, 0x21040000, 0x01040080, + 0x20040080, 0x00000080, 0x01000000, 0x21040000, + 0x21040080, 0x00040080, 0x21000000, 0x21040080, + 0x01040000, 0x00000000, 0x20040000, 0x21000000, + 0x00040080, 0x01000080, 0x20000080, 0x00040000, + 0x00000000, 0x20040000, 0x01040080, 0x20000080 + ); + + /** + * Pre-permuted S-box6 + * + * @var array + * @access private + */ + var $sbox6 = array( + 0x10000008, 0x10200000, 0x00002000, 0x10202008, + 0x10200000, 0x00000008, 0x10202008, 0x00200000, + 0x10002000, 0x00202008, 0x00200000, 0x10000008, + 0x00200008, 0x10002000, 0x10000000, 0x00002008, + 0x00000000, 0x00200008, 0x10002008, 0x00002000, + 0x00202000, 0x10002008, 0x00000008, 0x10200008, + 0x10200008, 0x00000000, 0x00202008, 0x10202000, + 0x00002008, 0x00202000, 0x10202000, 0x10000000, + 0x10002000, 0x00000008, 0x10200008, 0x00202000, + 0x10202008, 0x00200000, 0x00002008, 0x10000008, + 0x00200000, 0x10002000, 0x10000000, 0x00002008, + 0x10000008, 0x10202008, 0x00202000, 0x10200000, + 0x00202008, 0x10202000, 0x00000000, 0x10200008, + 0x00000008, 0x00002000, 0x10200000, 0x00202008, + 0x00002000, 0x00200008, 0x10002008, 0x00000000, + 0x10202000, 0x10000000, 0x00200008, 0x10002008 + ); + + /** + * Pre-permuted S-box7 + * + * @var array + * @access private + */ + var $sbox7 = array( + 0x00100000, 0x02100001, 0x02000401, 0x00000000, + 0x00000400, 0x02000401, 0x00100401, 0x02100400, + 0x02100401, 0x00100000, 0x00000000, 0x02000001, + 0x00000001, 0x02000000, 0x02100001, 0x00000401, + 0x02000400, 0x00100401, 0x00100001, 0x02000400, + 0x02000001, 0x02100000, 0x02100400, 0x00100001, + 0x02100000, 0x00000400, 0x00000401, 0x02100401, + 0x00100400, 0x00000001, 0x02000000, 0x00100400, + 0x02000000, 0x00100400, 0x00100000, 0x02000401, + 0x02000401, 0x02100001, 0x02100001, 0x00000001, + 0x00100001, 0x02000000, 0x02000400, 0x00100000, + 0x02100400, 0x00000401, 0x00100401, 0x02100400, + 0x00000401, 0x02000001, 0x02100401, 0x02100000, + 0x00100400, 0x00000000, 0x00000001, 0x02100401, + 0x00000000, 0x00100401, 0x02100000, 0x00000400, + 0x02000001, 0x02000400, 0x00000400, 0x00100001 + ); + + /** + * Pre-permuted S-box8 + * + * @var array + * @access private + */ + var $sbox8 = array( + 0x08000820, 0x00000800, 0x00020000, 0x08020820, + 0x08000000, 0x08000820, 0x00000020, 0x08000000, + 0x00020020, 0x08020000, 0x08020820, 0x00020800, + 0x08020800, 0x00020820, 0x00000800, 0x00000020, + 0x08020000, 0x08000020, 0x08000800, 0x00000820, + 0x00020800, 0x00020020, 0x08020020, 0x08020800, + 0x00000820, 0x00000000, 0x00000000, 0x08020020, + 0x08000020, 0x08000800, 0x00020820, 0x00020000, + 0x00020820, 0x00020000, 0x08020800, 0x00000800, + 0x00000020, 0x08020020, 0x00000800, 0x00020820, + 0x08000800, 0x00000020, 0x08000020, 0x08020000, + 0x08020020, 0x08000000, 0x00020000, 0x08000820, + 0x00000000, 0x08020820, 0x00020020, 0x08000020, + 0x08020000, 0x08000800, 0x08000820, 0x00000000, + 0x08020820, 0x00020800, 0x00020800, 0x00000820, + 0x00000820, 0x00020020, 0x08000000, 0x08020800 + ); + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine() + * + * @see Crypt_Base::isValidEngine() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + if ($this->key_length_max == 8) { + if ($engine == CRYPT_ENGINE_OPENSSL) { + $this->cipher_name_openssl_ecb = 'des-ecb'; + $this->cipher_name_openssl = 'des-' . $this->_openssl_translate_mode(); + } + } + + return parent::isValidEngine($engine); + } + + /** + * Sets the key. + * + * Keys can be of any length. DES, itself, uses 64-bit keys (eg. strlen($key) == 8), however, we + * only use the first eight, if $key has more then eight characters in it, and pad $key with the + * null byte if it is less then eight characters long. + * + * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. + * + * If the key is not explicitly set, it'll be assumed to be all zero's. + * + * @see Crypt_Base::setKey() + * @access public + * @param string $key + */ + function setKey($key) + { + // We check/cut here only up to max length of the key. + // Key padding to the proper length will be done in _setupKey() + if (strlen($key) > $this->key_length_max) { + $key = substr($key, 0, $this->key_length_max); + } + + // Sets the key + parent::setKey($key); + } + + /** + * Encrypts a block + * + * @see Crypt_Base::_encryptBlock() + * @see Crypt_Base::encrypt() + * @see self::encrypt() + * @access private + * @param string $in + * @return string + */ + function _encryptBlock($in) + { + return $this->_processBlock($in, CRYPT_DES_ENCRYPT); + } + + /** + * Decrypts a block + * + * @see Crypt_Base::_decryptBlock() + * @see Crypt_Base::decrypt() + * @see self::decrypt() + * @access private + * @param string $in + * @return string + */ + function _decryptBlock($in) + { + return $this->_processBlock($in, CRYPT_DES_DECRYPT); + } + + /** + * Encrypts or decrypts a 64-bit block + * + * $mode should be either CRYPT_DES_ENCRYPT or CRYPT_DES_DECRYPT. See + * {@link http://en.wikipedia.org/wiki/Image:Feistel.png Feistel.png} to get a general + * idea of what this function does. + * + * @see self::_encryptBlock() + * @see self::_decryptBlock() + * @access private + * @param string $block + * @param int $mode + * @return string + */ + function _processBlock($block, $mode) + { + static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; + if (!$sbox1) { + $sbox1 = array_map("intval", $this->sbox1); + $sbox2 = array_map("intval", $this->sbox2); + $sbox3 = array_map("intval", $this->sbox3); + $sbox4 = array_map("intval", $this->sbox4); + $sbox5 = array_map("intval", $this->sbox5); + $sbox6 = array_map("intval", $this->sbox6); + $sbox7 = array_map("intval", $this->sbox7); + $sbox8 = array_map("intval", $this->sbox8); + /* Merge $shuffle with $[inv]ipmap */ + for ($i = 0; $i < 256; ++$i) { + $shuffleip[] = $this->shuffle[$this->ipmap[$i]]; + $shuffleinvip[] = $this->shuffle[$this->invipmap[$i]]; + } + } + + $keys = $this->keys[$mode]; + $ki = -1; + + // Do the initial IP permutation. + $t = unpack('Nl/Nr', $block); + list($l, $r) = array($t['l'], $t['r']); + $block = ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); + + // Extract L0 and R0. + $t = unpack('Nl/Nr', $block); + list($l, $r) = array($t['l'], $t['r']); + + for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { + // Perform the 16 steps. + for ($i = 0; $i < 16; $i++) { + // start of "the Feistel (F) function" - see the following URL: + // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png + // Merge key schedule. + $b1 = (($r >> 3) & 0x1FFFFFFF) ^ ($r << 29) ^ $keys[++$ki]; + $b2 = (($r >> 31) & 0x00000001) ^ ($r << 1) ^ $keys[++$ki]; + + // S-box indexing. + $t = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ + $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ + $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ + $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ $l; + // end of "the Feistel (F) function" + + $l = $r; + $r = $t; + } + + // Last step should not permute L & R. + $t = $l; + $l = $r; + $r = $t; + } + + // Perform the inverse IP permutation. + return ($shuffleinvip[($r >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleinvip[($l >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleinvip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleinvip[($l >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleinvip[($r >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleinvip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleinvip[ $r & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleinvip[ $l & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); + } + + /** + * Creates the key schedule + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->des_rounds === $this->kl['des_rounds']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key, 'des_rounds' => $this->des_rounds); + + static $shifts = array( // number of key bits shifted per round + 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 + ); + + static $pc1map = array( + 0x00, 0x00, 0x08, 0x08, 0x04, 0x04, 0x0C, 0x0C, + 0x02, 0x02, 0x0A, 0x0A, 0x06, 0x06, 0x0E, 0x0E, + 0x10, 0x10, 0x18, 0x18, 0x14, 0x14, 0x1C, 0x1C, + 0x12, 0x12, 0x1A, 0x1A, 0x16, 0x16, 0x1E, 0x1E, + 0x20, 0x20, 0x28, 0x28, 0x24, 0x24, 0x2C, 0x2C, + 0x22, 0x22, 0x2A, 0x2A, 0x26, 0x26, 0x2E, 0x2E, + 0x30, 0x30, 0x38, 0x38, 0x34, 0x34, 0x3C, 0x3C, + 0x32, 0x32, 0x3A, 0x3A, 0x36, 0x36, 0x3E, 0x3E, + 0x40, 0x40, 0x48, 0x48, 0x44, 0x44, 0x4C, 0x4C, + 0x42, 0x42, 0x4A, 0x4A, 0x46, 0x46, 0x4E, 0x4E, + 0x50, 0x50, 0x58, 0x58, 0x54, 0x54, 0x5C, 0x5C, + 0x52, 0x52, 0x5A, 0x5A, 0x56, 0x56, 0x5E, 0x5E, + 0x60, 0x60, 0x68, 0x68, 0x64, 0x64, 0x6C, 0x6C, + 0x62, 0x62, 0x6A, 0x6A, 0x66, 0x66, 0x6E, 0x6E, + 0x70, 0x70, 0x78, 0x78, 0x74, 0x74, 0x7C, 0x7C, + 0x72, 0x72, 0x7A, 0x7A, 0x76, 0x76, 0x7E, 0x7E, + 0x80, 0x80, 0x88, 0x88, 0x84, 0x84, 0x8C, 0x8C, + 0x82, 0x82, 0x8A, 0x8A, 0x86, 0x86, 0x8E, 0x8E, + 0x90, 0x90, 0x98, 0x98, 0x94, 0x94, 0x9C, 0x9C, + 0x92, 0x92, 0x9A, 0x9A, 0x96, 0x96, 0x9E, 0x9E, + 0xA0, 0xA0, 0xA8, 0xA8, 0xA4, 0xA4, 0xAC, 0xAC, + 0xA2, 0xA2, 0xAA, 0xAA, 0xA6, 0xA6, 0xAE, 0xAE, + 0xB0, 0xB0, 0xB8, 0xB8, 0xB4, 0xB4, 0xBC, 0xBC, + 0xB2, 0xB2, 0xBA, 0xBA, 0xB6, 0xB6, 0xBE, 0xBE, + 0xC0, 0xC0, 0xC8, 0xC8, 0xC4, 0xC4, 0xCC, 0xCC, + 0xC2, 0xC2, 0xCA, 0xCA, 0xC6, 0xC6, 0xCE, 0xCE, + 0xD0, 0xD0, 0xD8, 0xD8, 0xD4, 0xD4, 0xDC, 0xDC, + 0xD2, 0xD2, 0xDA, 0xDA, 0xD6, 0xD6, 0xDE, 0xDE, + 0xE0, 0xE0, 0xE8, 0xE8, 0xE4, 0xE4, 0xEC, 0xEC, + 0xE2, 0xE2, 0xEA, 0xEA, 0xE6, 0xE6, 0xEE, 0xEE, + 0xF0, 0xF0, 0xF8, 0xF8, 0xF4, 0xF4, 0xFC, 0xFC, + 0xF2, 0xF2, 0xFA, 0xFA, 0xF6, 0xF6, 0xFE, 0xFE + ); + + // Mapping tables for the PC-2 transformation. + static $pc2mapc1 = array( + 0x00000000, 0x00000400, 0x00200000, 0x00200400, + 0x00000001, 0x00000401, 0x00200001, 0x00200401, + 0x02000000, 0x02000400, 0x02200000, 0x02200400, + 0x02000001, 0x02000401, 0x02200001, 0x02200401 + ); + static $pc2mapc2 = array( + 0x00000000, 0x00000800, 0x08000000, 0x08000800, + 0x00010000, 0x00010800, 0x08010000, 0x08010800, + 0x00000000, 0x00000800, 0x08000000, 0x08000800, + 0x00010000, 0x00010800, 0x08010000, 0x08010800, + 0x00000100, 0x00000900, 0x08000100, 0x08000900, + 0x00010100, 0x00010900, 0x08010100, 0x08010900, + 0x00000100, 0x00000900, 0x08000100, 0x08000900, + 0x00010100, 0x00010900, 0x08010100, 0x08010900, + 0x00000010, 0x00000810, 0x08000010, 0x08000810, + 0x00010010, 0x00010810, 0x08010010, 0x08010810, + 0x00000010, 0x00000810, 0x08000010, 0x08000810, + 0x00010010, 0x00010810, 0x08010010, 0x08010810, + 0x00000110, 0x00000910, 0x08000110, 0x08000910, + 0x00010110, 0x00010910, 0x08010110, 0x08010910, + 0x00000110, 0x00000910, 0x08000110, 0x08000910, + 0x00010110, 0x00010910, 0x08010110, 0x08010910, + 0x00040000, 0x00040800, 0x08040000, 0x08040800, + 0x00050000, 0x00050800, 0x08050000, 0x08050800, + 0x00040000, 0x00040800, 0x08040000, 0x08040800, + 0x00050000, 0x00050800, 0x08050000, 0x08050800, + 0x00040100, 0x00040900, 0x08040100, 0x08040900, + 0x00050100, 0x00050900, 0x08050100, 0x08050900, + 0x00040100, 0x00040900, 0x08040100, 0x08040900, + 0x00050100, 0x00050900, 0x08050100, 0x08050900, + 0x00040010, 0x00040810, 0x08040010, 0x08040810, + 0x00050010, 0x00050810, 0x08050010, 0x08050810, + 0x00040010, 0x00040810, 0x08040010, 0x08040810, + 0x00050010, 0x00050810, 0x08050010, 0x08050810, + 0x00040110, 0x00040910, 0x08040110, 0x08040910, + 0x00050110, 0x00050910, 0x08050110, 0x08050910, + 0x00040110, 0x00040910, 0x08040110, 0x08040910, + 0x00050110, 0x00050910, 0x08050110, 0x08050910, + 0x01000000, 0x01000800, 0x09000000, 0x09000800, + 0x01010000, 0x01010800, 0x09010000, 0x09010800, + 0x01000000, 0x01000800, 0x09000000, 0x09000800, + 0x01010000, 0x01010800, 0x09010000, 0x09010800, + 0x01000100, 0x01000900, 0x09000100, 0x09000900, + 0x01010100, 0x01010900, 0x09010100, 0x09010900, + 0x01000100, 0x01000900, 0x09000100, 0x09000900, + 0x01010100, 0x01010900, 0x09010100, 0x09010900, + 0x01000010, 0x01000810, 0x09000010, 0x09000810, + 0x01010010, 0x01010810, 0x09010010, 0x09010810, + 0x01000010, 0x01000810, 0x09000010, 0x09000810, + 0x01010010, 0x01010810, 0x09010010, 0x09010810, + 0x01000110, 0x01000910, 0x09000110, 0x09000910, + 0x01010110, 0x01010910, 0x09010110, 0x09010910, + 0x01000110, 0x01000910, 0x09000110, 0x09000910, + 0x01010110, 0x01010910, 0x09010110, 0x09010910, + 0x01040000, 0x01040800, 0x09040000, 0x09040800, + 0x01050000, 0x01050800, 0x09050000, 0x09050800, + 0x01040000, 0x01040800, 0x09040000, 0x09040800, + 0x01050000, 0x01050800, 0x09050000, 0x09050800, + 0x01040100, 0x01040900, 0x09040100, 0x09040900, + 0x01050100, 0x01050900, 0x09050100, 0x09050900, + 0x01040100, 0x01040900, 0x09040100, 0x09040900, + 0x01050100, 0x01050900, 0x09050100, 0x09050900, + 0x01040010, 0x01040810, 0x09040010, 0x09040810, + 0x01050010, 0x01050810, 0x09050010, 0x09050810, + 0x01040010, 0x01040810, 0x09040010, 0x09040810, + 0x01050010, 0x01050810, 0x09050010, 0x09050810, + 0x01040110, 0x01040910, 0x09040110, 0x09040910, + 0x01050110, 0x01050910, 0x09050110, 0x09050910, + 0x01040110, 0x01040910, 0x09040110, 0x09040910, + 0x01050110, 0x01050910, 0x09050110, 0x09050910 + ); + static $pc2mapc3 = array( + 0x00000000, 0x00000004, 0x00001000, 0x00001004, + 0x00000000, 0x00000004, 0x00001000, 0x00001004, + 0x10000000, 0x10000004, 0x10001000, 0x10001004, + 0x10000000, 0x10000004, 0x10001000, 0x10001004, + 0x00000020, 0x00000024, 0x00001020, 0x00001024, + 0x00000020, 0x00000024, 0x00001020, 0x00001024, + 0x10000020, 0x10000024, 0x10001020, 0x10001024, + 0x10000020, 0x10000024, 0x10001020, 0x10001024, + 0x00080000, 0x00080004, 0x00081000, 0x00081004, + 0x00080000, 0x00080004, 0x00081000, 0x00081004, + 0x10080000, 0x10080004, 0x10081000, 0x10081004, + 0x10080000, 0x10080004, 0x10081000, 0x10081004, + 0x00080020, 0x00080024, 0x00081020, 0x00081024, + 0x00080020, 0x00080024, 0x00081020, 0x00081024, + 0x10080020, 0x10080024, 0x10081020, 0x10081024, + 0x10080020, 0x10080024, 0x10081020, 0x10081024, + 0x20000000, 0x20000004, 0x20001000, 0x20001004, + 0x20000000, 0x20000004, 0x20001000, 0x20001004, + 0x30000000, 0x30000004, 0x30001000, 0x30001004, + 0x30000000, 0x30000004, 0x30001000, 0x30001004, + 0x20000020, 0x20000024, 0x20001020, 0x20001024, + 0x20000020, 0x20000024, 0x20001020, 0x20001024, + 0x30000020, 0x30000024, 0x30001020, 0x30001024, + 0x30000020, 0x30000024, 0x30001020, 0x30001024, + 0x20080000, 0x20080004, 0x20081000, 0x20081004, + 0x20080000, 0x20080004, 0x20081000, 0x20081004, + 0x30080000, 0x30080004, 0x30081000, 0x30081004, + 0x30080000, 0x30080004, 0x30081000, 0x30081004, + 0x20080020, 0x20080024, 0x20081020, 0x20081024, + 0x20080020, 0x20080024, 0x20081020, 0x20081024, + 0x30080020, 0x30080024, 0x30081020, 0x30081024, + 0x30080020, 0x30080024, 0x30081020, 0x30081024, + 0x00000002, 0x00000006, 0x00001002, 0x00001006, + 0x00000002, 0x00000006, 0x00001002, 0x00001006, + 0x10000002, 0x10000006, 0x10001002, 0x10001006, + 0x10000002, 0x10000006, 0x10001002, 0x10001006, + 0x00000022, 0x00000026, 0x00001022, 0x00001026, + 0x00000022, 0x00000026, 0x00001022, 0x00001026, + 0x10000022, 0x10000026, 0x10001022, 0x10001026, + 0x10000022, 0x10000026, 0x10001022, 0x10001026, + 0x00080002, 0x00080006, 0x00081002, 0x00081006, + 0x00080002, 0x00080006, 0x00081002, 0x00081006, + 0x10080002, 0x10080006, 0x10081002, 0x10081006, + 0x10080002, 0x10080006, 0x10081002, 0x10081006, + 0x00080022, 0x00080026, 0x00081022, 0x00081026, + 0x00080022, 0x00080026, 0x00081022, 0x00081026, + 0x10080022, 0x10080026, 0x10081022, 0x10081026, + 0x10080022, 0x10080026, 0x10081022, 0x10081026, + 0x20000002, 0x20000006, 0x20001002, 0x20001006, + 0x20000002, 0x20000006, 0x20001002, 0x20001006, + 0x30000002, 0x30000006, 0x30001002, 0x30001006, + 0x30000002, 0x30000006, 0x30001002, 0x30001006, + 0x20000022, 0x20000026, 0x20001022, 0x20001026, + 0x20000022, 0x20000026, 0x20001022, 0x20001026, + 0x30000022, 0x30000026, 0x30001022, 0x30001026, + 0x30000022, 0x30000026, 0x30001022, 0x30001026, + 0x20080002, 0x20080006, 0x20081002, 0x20081006, + 0x20080002, 0x20080006, 0x20081002, 0x20081006, + 0x30080002, 0x30080006, 0x30081002, 0x30081006, + 0x30080002, 0x30080006, 0x30081002, 0x30081006, + 0x20080022, 0x20080026, 0x20081022, 0x20081026, + 0x20080022, 0x20080026, 0x20081022, 0x20081026, + 0x30080022, 0x30080026, 0x30081022, 0x30081026, + 0x30080022, 0x30080026, 0x30081022, 0x30081026 + ); + static $pc2mapc4 = array( + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208 + ); + static $pc2mapd1 = array( + 0x00000000, 0x00000001, 0x08000000, 0x08000001, + 0x00200000, 0x00200001, 0x08200000, 0x08200001, + 0x00000002, 0x00000003, 0x08000002, 0x08000003, + 0x00200002, 0x00200003, 0x08200002, 0x08200003 + ); + static $pc2mapd2 = array( + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04 + ); + static $pc2mapd3 = array( + 0x00000000, 0x00010000, 0x02000000, 0x02010000, + 0x00000020, 0x00010020, 0x02000020, 0x02010020, + 0x00040000, 0x00050000, 0x02040000, 0x02050000, + 0x00040020, 0x00050020, 0x02040020, 0x02050020, + 0x00002000, 0x00012000, 0x02002000, 0x02012000, + 0x00002020, 0x00012020, 0x02002020, 0x02012020, + 0x00042000, 0x00052000, 0x02042000, 0x02052000, + 0x00042020, 0x00052020, 0x02042020, 0x02052020, + 0x00000000, 0x00010000, 0x02000000, 0x02010000, + 0x00000020, 0x00010020, 0x02000020, 0x02010020, + 0x00040000, 0x00050000, 0x02040000, 0x02050000, + 0x00040020, 0x00050020, 0x02040020, 0x02050020, + 0x00002000, 0x00012000, 0x02002000, 0x02012000, + 0x00002020, 0x00012020, 0x02002020, 0x02012020, + 0x00042000, 0x00052000, 0x02042000, 0x02052000, + 0x00042020, 0x00052020, 0x02042020, 0x02052020, + 0x00000010, 0x00010010, 0x02000010, 0x02010010, + 0x00000030, 0x00010030, 0x02000030, 0x02010030, + 0x00040010, 0x00050010, 0x02040010, 0x02050010, + 0x00040030, 0x00050030, 0x02040030, 0x02050030, + 0x00002010, 0x00012010, 0x02002010, 0x02012010, + 0x00002030, 0x00012030, 0x02002030, 0x02012030, + 0x00042010, 0x00052010, 0x02042010, 0x02052010, + 0x00042030, 0x00052030, 0x02042030, 0x02052030, + 0x00000010, 0x00010010, 0x02000010, 0x02010010, + 0x00000030, 0x00010030, 0x02000030, 0x02010030, + 0x00040010, 0x00050010, 0x02040010, 0x02050010, + 0x00040030, 0x00050030, 0x02040030, 0x02050030, + 0x00002010, 0x00012010, 0x02002010, 0x02012010, + 0x00002030, 0x00012030, 0x02002030, 0x02012030, + 0x00042010, 0x00052010, 0x02042010, 0x02052010, + 0x00042030, 0x00052030, 0x02042030, 0x02052030, + 0x20000000, 0x20010000, 0x22000000, 0x22010000, + 0x20000020, 0x20010020, 0x22000020, 0x22010020, + 0x20040000, 0x20050000, 0x22040000, 0x22050000, + 0x20040020, 0x20050020, 0x22040020, 0x22050020, + 0x20002000, 0x20012000, 0x22002000, 0x22012000, + 0x20002020, 0x20012020, 0x22002020, 0x22012020, + 0x20042000, 0x20052000, 0x22042000, 0x22052000, + 0x20042020, 0x20052020, 0x22042020, 0x22052020, + 0x20000000, 0x20010000, 0x22000000, 0x22010000, + 0x20000020, 0x20010020, 0x22000020, 0x22010020, + 0x20040000, 0x20050000, 0x22040000, 0x22050000, + 0x20040020, 0x20050020, 0x22040020, 0x22050020, + 0x20002000, 0x20012000, 0x22002000, 0x22012000, + 0x20002020, 0x20012020, 0x22002020, 0x22012020, + 0x20042000, 0x20052000, 0x22042000, 0x22052000, + 0x20042020, 0x20052020, 0x22042020, 0x22052020, + 0x20000010, 0x20010010, 0x22000010, 0x22010010, + 0x20000030, 0x20010030, 0x22000030, 0x22010030, + 0x20040010, 0x20050010, 0x22040010, 0x22050010, + 0x20040030, 0x20050030, 0x22040030, 0x22050030, + 0x20002010, 0x20012010, 0x22002010, 0x22012010, + 0x20002030, 0x20012030, 0x22002030, 0x22012030, + 0x20042010, 0x20052010, 0x22042010, 0x22052010, + 0x20042030, 0x20052030, 0x22042030, 0x22052030, + 0x20000010, 0x20010010, 0x22000010, 0x22010010, + 0x20000030, 0x20010030, 0x22000030, 0x22010030, + 0x20040010, 0x20050010, 0x22040010, 0x22050010, + 0x20040030, 0x20050030, 0x22040030, 0x22050030, + 0x20002010, 0x20012010, 0x22002010, 0x22012010, + 0x20002030, 0x20012030, 0x22002030, 0x22012030, + 0x20042010, 0x20052010, 0x22042010, 0x22052010, + 0x20042030, 0x20052030, 0x22042030, 0x22052030 + ); + static $pc2mapd4 = array( + 0x00000000, 0x00000400, 0x01000000, 0x01000400, + 0x00000000, 0x00000400, 0x01000000, 0x01000400, + 0x00000100, 0x00000500, 0x01000100, 0x01000500, + 0x00000100, 0x00000500, 0x01000100, 0x01000500, + 0x10000000, 0x10000400, 0x11000000, 0x11000400, + 0x10000000, 0x10000400, 0x11000000, 0x11000400, + 0x10000100, 0x10000500, 0x11000100, 0x11000500, + 0x10000100, 0x10000500, 0x11000100, 0x11000500, + 0x00080000, 0x00080400, 0x01080000, 0x01080400, + 0x00080000, 0x00080400, 0x01080000, 0x01080400, + 0x00080100, 0x00080500, 0x01080100, 0x01080500, + 0x00080100, 0x00080500, 0x01080100, 0x01080500, + 0x10080000, 0x10080400, 0x11080000, 0x11080400, + 0x10080000, 0x10080400, 0x11080000, 0x11080400, + 0x10080100, 0x10080500, 0x11080100, 0x11080500, + 0x10080100, 0x10080500, 0x11080100, 0x11080500, + 0x00000008, 0x00000408, 0x01000008, 0x01000408, + 0x00000008, 0x00000408, 0x01000008, 0x01000408, + 0x00000108, 0x00000508, 0x01000108, 0x01000508, + 0x00000108, 0x00000508, 0x01000108, 0x01000508, + 0x10000008, 0x10000408, 0x11000008, 0x11000408, + 0x10000008, 0x10000408, 0x11000008, 0x11000408, + 0x10000108, 0x10000508, 0x11000108, 0x11000508, + 0x10000108, 0x10000508, 0x11000108, 0x11000508, + 0x00080008, 0x00080408, 0x01080008, 0x01080408, + 0x00080008, 0x00080408, 0x01080008, 0x01080408, + 0x00080108, 0x00080508, 0x01080108, 0x01080508, + 0x00080108, 0x00080508, 0x01080108, 0x01080508, + 0x10080008, 0x10080408, 0x11080008, 0x11080408, + 0x10080008, 0x10080408, 0x11080008, 0x11080408, + 0x10080108, 0x10080508, 0x11080108, 0x11080508, + 0x10080108, 0x10080508, 0x11080108, 0x11080508, + 0x00001000, 0x00001400, 0x01001000, 0x01001400, + 0x00001000, 0x00001400, 0x01001000, 0x01001400, + 0x00001100, 0x00001500, 0x01001100, 0x01001500, + 0x00001100, 0x00001500, 0x01001100, 0x01001500, + 0x10001000, 0x10001400, 0x11001000, 0x11001400, + 0x10001000, 0x10001400, 0x11001000, 0x11001400, + 0x10001100, 0x10001500, 0x11001100, 0x11001500, + 0x10001100, 0x10001500, 0x11001100, 0x11001500, + 0x00081000, 0x00081400, 0x01081000, 0x01081400, + 0x00081000, 0x00081400, 0x01081000, 0x01081400, + 0x00081100, 0x00081500, 0x01081100, 0x01081500, + 0x00081100, 0x00081500, 0x01081100, 0x01081500, + 0x10081000, 0x10081400, 0x11081000, 0x11081400, + 0x10081000, 0x10081400, 0x11081000, 0x11081400, + 0x10081100, 0x10081500, 0x11081100, 0x11081500, + 0x10081100, 0x10081500, 0x11081100, 0x11081500, + 0x00001008, 0x00001408, 0x01001008, 0x01001408, + 0x00001008, 0x00001408, 0x01001008, 0x01001408, + 0x00001108, 0x00001508, 0x01001108, 0x01001508, + 0x00001108, 0x00001508, 0x01001108, 0x01001508, + 0x10001008, 0x10001408, 0x11001008, 0x11001408, + 0x10001008, 0x10001408, 0x11001008, 0x11001408, + 0x10001108, 0x10001508, 0x11001108, 0x11001508, + 0x10001108, 0x10001508, 0x11001108, 0x11001508, + 0x00081008, 0x00081408, 0x01081008, 0x01081408, + 0x00081008, 0x00081408, 0x01081008, 0x01081408, + 0x00081108, 0x00081508, 0x01081108, 0x01081508, + 0x00081108, 0x00081508, 0x01081108, 0x01081508, + 0x10081008, 0x10081408, 0x11081008, 0x11081408, + 0x10081008, 0x10081408, 0x11081008, 0x11081408, + 0x10081108, 0x10081508, 0x11081108, 0x11081508, + 0x10081108, 0x10081508, 0x11081108, 0x11081508 + ); + + $keys = array(); + for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { + // pad the key and remove extra characters as appropriate. + $key = str_pad(substr($this->key, $des_round * 8, 8), 8, "\0"); + + // Perform the PC/1 transformation and compute C and D. + $t = unpack('Nl/Nr', $key); + list($l, $r) = array($t['l'], $t['r']); + $key = ($this->shuffle[$pc1map[ $r & 0xFF]] & "\x80\x80\x80\x80\x80\x80\x80\x00") | + ($this->shuffle[$pc1map[($r >> 8) & 0xFF]] & "\x40\x40\x40\x40\x40\x40\x40\x00") | + ($this->shuffle[$pc1map[($r >> 16) & 0xFF]] & "\x20\x20\x20\x20\x20\x20\x20\x00") | + ($this->shuffle[$pc1map[($r >> 24) & 0xFF]] & "\x10\x10\x10\x10\x10\x10\x10\x00") | + ($this->shuffle[$pc1map[ $l & 0xFF]] & "\x08\x08\x08\x08\x08\x08\x08\x00") | + ($this->shuffle[$pc1map[($l >> 8) & 0xFF]] & "\x04\x04\x04\x04\x04\x04\x04\x00") | + ($this->shuffle[$pc1map[($l >> 16) & 0xFF]] & "\x02\x02\x02\x02\x02\x02\x02\x00") | + ($this->shuffle[$pc1map[($l >> 24) & 0xFF]] & "\x01\x01\x01\x01\x01\x01\x01\x00"); + $key = unpack('Nc/Nd', $key); + $c = ( $key['c'] >> 4) & 0x0FFFFFFF; + $d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F); + + $keys[$des_round] = array( + CRYPT_DES_ENCRYPT => array(), + CRYPT_DES_DECRYPT => array_fill(0, 32, 0) + ); + for ($i = 0, $ki = 31; $i < 16; ++$i, $ki-= 2) { + $c <<= $shifts[$i]; + $c = ($c | ($c >> 28)) & 0x0FFFFFFF; + $d <<= $shifts[$i]; + $d = ($d | ($d >> 28)) & 0x0FFFFFFF; + + // Perform the PC-2 transformation. + $cp = $pc2mapc1[ $c >> 24 ] | $pc2mapc2[($c >> 16) & 0xFF] | + $pc2mapc3[($c >> 8) & 0xFF] | $pc2mapc4[ $c & 0xFF]; + $dp = $pc2mapd1[ $d >> 24 ] | $pc2mapd2[($d >> 16) & 0xFF] | + $pc2mapd3[($d >> 8) & 0xFF] | $pc2mapd4[ $d & 0xFF]; + + // Reorder: odd bytes/even bytes. Push the result in key schedule. + $val1 = ( $cp & 0xFF000000) | (($cp << 8) & 0x00FF0000) | + (($dp >> 16) & 0x0000FF00) | (($dp >> 8) & 0x000000FF); + $val2 = (($cp << 8) & 0xFF000000) | (($cp << 16) & 0x00FF0000) | + (($dp >> 8) & 0x0000FF00) | ( $dp & 0x000000FF); + $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val1; + $keys[$des_round][CRYPT_DES_DECRYPT][$ki - 1] = $val1; + $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val2; + $keys[$des_round][CRYPT_DES_DECRYPT][$ki ] = $val2; + } + } + + switch ($this->des_rounds) { + case 3: // 3DES keys + $this->keys = array( + CRYPT_DES_ENCRYPT => array_merge( + $keys[0][CRYPT_DES_ENCRYPT], + $keys[1][CRYPT_DES_DECRYPT], + $keys[2][CRYPT_DES_ENCRYPT] + ), + CRYPT_DES_DECRYPT => array_merge( + $keys[2][CRYPT_DES_DECRYPT], + $keys[1][CRYPT_DES_ENCRYPT], + $keys[0][CRYPT_DES_DECRYPT] + ) + ); + break; + // case 1: // DES keys + default: + $this->keys = array( + CRYPT_DES_ENCRYPT => $keys[0][CRYPT_DES_ENCRYPT], + CRYPT_DES_DECRYPT => $keys[0][CRYPT_DES_DECRYPT] + ); + } + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + $lambda_functions =& Crypt_DES::_getLambdaFunctions(); + + // Engine configuration for: + // - DES ($des_rounds == 1) or + // - 3DES ($des_rounds == 3) + $des_rounds = $this->des_rounds; + + // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. + // (Currently, for Crypt_DES, one generated $lambda_function cost on php5.5@32bit ~135kb unfreeable mem and ~230kb on php5.5@64bit) + // (Currently, for Crypt_TripleDES, one generated $lambda_function cost on php5.5@32bit ~240kb unfreeable mem and ~340kb on php5.5@64bit) + // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one + $gen_hi_opt_code = (bool)( count($lambda_functions) < 10 ); + + // Generation of a unique hash for our generated code + $code_hash = "Crypt_DES, $des_rounds, {$this->mode}"; + if ($gen_hi_opt_code) { + // For hi-optimized code, we create for each combination of + // $mode, $des_rounds and $this->key its own encrypt/decrypt function. + // After max 10 hi-optimized functions, we create generic + // (still very fast.. but not ultra) functions for each $mode/$des_rounds + // Currently 2 * 5 generic functions will be then max. possible. + $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key); + } + + // Is there a re-usable $lambda_functions in there? If not, we have to create it. + if (!isset($lambda_functions[$code_hash])) { + // Init code for both, encrypt and decrypt. + $init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; + if (!$sbox1) { + $sbox1 = array_map("intval", $self->sbox1); + $sbox2 = array_map("intval", $self->sbox2); + $sbox3 = array_map("intval", $self->sbox3); + $sbox4 = array_map("intval", $self->sbox4); + $sbox5 = array_map("intval", $self->sbox5); + $sbox6 = array_map("intval", $self->sbox6); + $sbox7 = array_map("intval", $self->sbox7); + $sbox8 = array_map("intval", $self->sbox8);' + /* Merge $shuffle with $[inv]ipmap */ . ' + for ($i = 0; $i < 256; ++$i) { + $shuffleip[] = $self->shuffle[$self->ipmap[$i]]; + $shuffleinvip[] = $self->shuffle[$self->invipmap[$i]]; + } + } + '; + + switch (true) { + case $gen_hi_opt_code: + // In Hi-optimized code mode, we use our [3]DES key schedule as hardcoded integers. + // No futher initialisation of the $keys schedule is necessary. + // That is the extra performance boost. + $k = array( + CRYPT_DES_ENCRYPT => $this->keys[CRYPT_DES_ENCRYPT], + CRYPT_DES_DECRYPT => $this->keys[CRYPT_DES_DECRYPT] + ); + $init_encrypt = ''; + $init_decrypt = ''; + break; + default: + // In generic optimized code mode, we have to use, as the best compromise [currently], + // our key schedule as $ke/$kd arrays. (with hardcoded indexes...) + $k = array( + CRYPT_DES_ENCRYPT => array(), + CRYPT_DES_DECRYPT => array() + ); + for ($i = 0, $c = count($this->keys[CRYPT_DES_ENCRYPT]); $i < $c; ++$i) { + $k[CRYPT_DES_ENCRYPT][$i] = '$ke[' . $i . ']'; + $k[CRYPT_DES_DECRYPT][$i] = '$kd[' . $i . ']'; + } + $init_encrypt = '$ke = $self->keys[CRYPT_DES_ENCRYPT];'; + $init_decrypt = '$kd = $self->keys[CRYPT_DES_DECRYPT];'; + break; + } + + // Creating code for en- and decryption. + $crypt_block = array(); + foreach (array(CRYPT_DES_ENCRYPT, CRYPT_DES_DECRYPT) as $c) { + /* Do the initial IP permutation. */ + $crypt_block[$c] = ' + $in = unpack("N*", $in); + $l = $in[1]; + $r = $in[2]; + $in = unpack("N*", + ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01") + ); + ' . /* Extract L0 and R0 */ ' + $l = $in[1]; + $r = $in[2]; + '; + + $l = '$l'; + $r = '$r'; + + // Perform DES or 3DES. + for ($ki = -1, $des_round = 0; $des_round < $des_rounds; ++$des_round) { + // Perform the 16 steps. + for ($i = 0; $i < 16; ++$i) { + // start of "the Feistel (F) function" - see the following URL: + // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png + // Merge key schedule. + $crypt_block[$c].= ' + $b1 = ((' . $r . ' >> 3) & 0x1FFFFFFF) ^ (' . $r . ' << 29) ^ ' . $k[$c][++$ki] . '; + $b2 = ((' . $r . ' >> 31) & 0x00000001) ^ (' . $r . ' << 1) ^ ' . $k[$c][++$ki] . ';' . + /* S-box indexing. */ + $l . ' = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ + $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ + $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ + $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ ' . $l . '; + '; + // end of "the Feistel (F) function" + + // swap L & R + list($l, $r) = array($r, $l); + } + list($l, $r) = array($r, $l); + } + + // Perform the inverse IP permutation. + $crypt_block[$c].= '$in = + ($shuffleinvip[($l >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleinvip[($r >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleinvip[($l >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleinvip[($r >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleinvip[($l >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleinvip[($r >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleinvip[ $l & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleinvip[ $r & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); + '; + } + + // Creates the inline-crypt function + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => $init_crypt, + 'init_encrypt' => $init_encrypt, + 'init_decrypt' => $init_decrypt, + 'encrypt_block' => $crypt_block[CRYPT_DES_ENCRYPT], + 'decrypt_block' => $crypt_block[CRYPT_DES_DECRYPT] + ) + ); + } + + // Set the inline-crypt function as callback in: $this->inline_crypt + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Hash.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Hash.php old mode 100644 new mode 100755 index 4ab75b2db..a7a4dd98c --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Hash.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Hash.php @@ -1,841 +1,929 @@ - - * setKey('abcdefg'); - * - * echo base64_encode($hash->hash('abcdefg')); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Crypt - * @package Crypt_Hash - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/**#@+ - * @access private - * @see Crypt_Hash::Crypt_Hash() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_HASH_MODE_INTERNAL', 1); -/** - * Toggles the mhash() implementation, which has been deprecated on PHP 5.3.0+. - */ -define('CRYPT_HASH_MODE_MHASH', 2); -/** - * Toggles the hash() implementation, which works on PHP 5.1.2+. - */ -define('CRYPT_HASH_MODE_HASH', 3); -/**#@-*/ - -/** - * Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions. - * - * @package Crypt_Hash - * @author Jim Wigginton - * @access public - */ -class Crypt_Hash -{ - /** - * Hash Parameter - * - * @see Crypt_Hash::setHash() - * @var Integer - * @access private - */ - var $hashParam; - - /** - * Byte-length of compression blocks / key (Internal HMAC) - * - * @see Crypt_Hash::setAlgorithm() - * @var Integer - * @access private - */ - var $b; - - /** - * Byte-length of hash output (Internal HMAC) - * - * @see Crypt_Hash::setHash() - * @var Integer - * @access private - */ - var $l = false; - - /** - * Hash Algorithm - * - * @see Crypt_Hash::setHash() - * @var String - * @access private - */ - var $hash; - - /** - * Key - * - * @see Crypt_Hash::setKey() - * @var String - * @access private - */ - var $key = false; - - /** - * Outer XOR (Internal HMAC) - * - * @see Crypt_Hash::setKey() - * @var String - * @access private - */ - var $opad; - - /** - * Inner XOR (Internal HMAC) - * - * @see Crypt_Hash::setKey() - * @var String - * @access private - */ - var $ipad; - - /** - * Default Constructor. - * - * @param optional String $hash - * @return Crypt_Hash - * @access public - */ - function Crypt_Hash($hash = 'sha1') - { - if ( !defined('CRYPT_HASH_MODE') ) { - switch (true) { - case extension_loaded('hash'): - define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_HASH); - break; - case extension_loaded('mhash'): - define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_MHASH); - break; - default: - define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_INTERNAL); - } - } - - $this->setHash($hash); - } - - /** - * Sets the key for HMACs - * - * Keys can be of any length. - * - * @access public - * @param optional String $key - */ - function setKey($key = false) - { - $this->key = $key; - } - - /** - * Gets the hash function. - * - * As set by the constructor or by the setHash() method. - * - * @access public - * @return String - */ - function getHash() - { - return $this->hashParam; - } - - /** - * Sets the hash function. - * - * @access public - * @param String $hash - */ - function setHash($hash) - { - $this->hashParam = $hash = strtolower($hash); - switch ($hash) { - case 'md5-96': - case 'sha1-96': - case 'sha256-96': - case 'sha512-96': - $hash = substr($hash, 0, -3); - $this->l = 12; // 96 / 8 = 12 - break; - case 'md2': - case 'md5': - $this->l = 16; - break; - case 'sha1': - $this->l = 20; - break; - case 'sha256': - $this->l = 32; - break; - case 'sha384': - $this->l = 48; - break; - case 'sha512': - $this->l = 64; - } - - switch ($hash) { - case 'md2': - $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ? - CRYPT_HASH_MODE_HASH : CRYPT_HASH_MODE_INTERNAL; - break; - case 'sha384': - case 'sha512': - $mode = CRYPT_HASH_MODE == CRYPT_HASH_MODE_MHASH ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE; - break; - default: - $mode = CRYPT_HASH_MODE; - } - - switch ( $mode ) { - case CRYPT_HASH_MODE_MHASH: - switch ($hash) { - case 'md5': - $this->hash = MHASH_MD5; - break; - case 'sha256': - $this->hash = MHASH_SHA256; - break; - case 'sha1': - default: - $this->hash = MHASH_SHA1; - } - return; - case CRYPT_HASH_MODE_HASH: - switch ($hash) { - case 'md5': - $this->hash = 'md5'; - return; - case 'md2': - case 'sha256': - case 'sha384': - case 'sha512': - $this->hash = $hash; - return; - case 'sha1': - default: - $this->hash = 'sha1'; - } - return; - } - - switch ($hash) { - case 'md2': - $this->b = 16; - $this->hash = array($this, '_md2'); - break; - case 'md5': - $this->b = 64; - $this->hash = array($this, '_md5'); - break; - case 'sha256': - $this->b = 64; - $this->hash = array($this, '_sha256'); - break; - case 'sha384': - case 'sha512': - $this->b = 128; - $this->hash = array($this, '_sha512'); - break; - case 'sha1': - default: - $this->b = 64; - $this->hash = array($this, '_sha1'); - } - - $this->ipad = str_repeat(chr(0x36), $this->b); - $this->opad = str_repeat(chr(0x5C), $this->b); - } - - /** - * Compute the HMAC. - * - * @access public - * @param String $text - * @return String - */ - function hash($text) - { - $mode = is_array($this->hash) ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE; - - if (!empty($this->key) || is_string($this->key)) { - switch ( $mode ) { - case CRYPT_HASH_MODE_MHASH: - $output = mhash($this->hash, $text, $this->key); - break; - case CRYPT_HASH_MODE_HASH: - $output = hash_hmac($this->hash, $text, $this->key, true); - break; - case CRYPT_HASH_MODE_INTERNAL: - /* "Applications that use keys longer than B bytes will first hash the key using H and then use the - resultant L byte string as the actual key to HMAC." - - -- http://tools.ietf.org/html/rfc2104#section-2 */ - $key = strlen($this->key) > $this->b ? call_user_func($this->hash, $this->key) : $this->key; - - $key = str_pad($key, $this->b, chr(0)); // step 1 - $temp = $this->ipad ^ $key; // step 2 - $temp .= $text; // step 3 - $temp = call_user_func($this->hash, $temp); // step 4 - $output = $this->opad ^ $key; // step 5 - $output.= $temp; // step 6 - $output = call_user_func($this->hash, $output); // step 7 - } - } else { - switch ( $mode ) { - case CRYPT_HASH_MODE_MHASH: - $output = mhash($this->hash, $text); - break; - case CRYPT_HASH_MODE_HASH: - $output = hash($this->hash, $text, true); - break; - case CRYPT_HASH_MODE_INTERNAL: - $output = call_user_func($this->hash, $text); - } - } - - return substr($output, 0, $this->l); - } - - /** - * Returns the hash length (in bytes) - * - * @access public - * @return Integer - */ - function getLength() - { - return $this->l; - } - - /** - * Wrapper for MD5 - * - * @access private - * @param String $m - */ - function _md5($m) - { - return pack('H*', md5($m)); - } - - /** - * Wrapper for SHA1 - * - * @access private - * @param String $m - */ - function _sha1($m) - { - return pack('H*', sha1($m)); - } - - /** - * Pure-PHP implementation of MD2 - * - * See {@link http://tools.ietf.org/html/rfc1319 RFC1319}. - * - * @access private - * @param String $m - */ - function _md2($m) - { - static $s = array( - 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, - 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, - 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, - 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, - 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, - 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, - 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, - 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, - 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, - 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, - 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, - 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, - 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, - 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, - 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, - 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, - 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, - 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 - ); - - // Step 1. Append Padding Bytes - $pad = 16 - (strlen($m) & 0xF); - $m.= str_repeat(chr($pad), $pad); - - $length = strlen($m); - - // Step 2. Append Checksum - $c = str_repeat(chr(0), 16); - $l = chr(0); - for ($i = 0; $i < $length; $i+= 16) { - for ($j = 0; $j < 16; $j++) { - // RFC1319 incorrectly states that C[j] should be set to S[c xor L] - //$c[$j] = chr($s[ord($m[$i + $j] ^ $l)]); - // per , however, C[j] should be set to S[c xor L] xor C[j] - $c[$j] = chr($s[ord($m[$i + $j] ^ $l)] ^ ord($c[$j])); - $l = $c[$j]; - } - } - $m.= $c; - - $length+= 16; - - // Step 3. Initialize MD Buffer - $x = str_repeat(chr(0), 48); - - // Step 4. Process Message in 16-Byte Blocks - for ($i = 0; $i < $length; $i+= 16) { - for ($j = 0; $j < 16; $j++) { - $x[$j + 16] = $m[$i + $j]; - $x[$j + 32] = $x[$j + 16] ^ $x[$j]; - } - $t = chr(0); - for ($j = 0; $j < 18; $j++) { - for ($k = 0; $k < 48; $k++) { - $x[$k] = $t = $x[$k] ^ chr($s[ord($t)]); - //$t = $x[$k] = $x[$k] ^ chr($s[ord($t)]); - } - $t = chr(ord($t) + $j); - } - } - - // Step 5. Output - return substr($x, 0, 16); - } - - /** - * Pure-PHP implementation of SHA256 - * - * See {@link http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-256_.28a_SHA-2_variant.29_pseudocode SHA-256 (a SHA-2 variant) pseudocode - Wikipedia}. - * - * @access private - * @param String $m - */ - function _sha256($m) - { - if (extension_loaded('suhosin')) { - return pack('H*', sha256($m)); - } - - // Initialize variables - $hash = array( - 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 - ); - // Initialize table of round constants - // (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311) - static $k = array( - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 - ); - - // Pre-processing - $length = strlen($m); - // to round to nearest 56 mod 64, we'll add 64 - (length + (64 - 56)) % 64 - $m.= str_repeat(chr(0), 64 - (($length + 8) & 0x3F)); - $m[$length] = chr(0x80); - // we don't support hashing strings 512MB long - $m.= pack('N2', 0, $length << 3); - - // Process the message in successive 512-bit chunks - $chunks = str_split($m, 64); - foreach ($chunks as $chunk) { - $w = array(); - for ($i = 0; $i < 16; $i++) { - extract(unpack('Ntemp', $this->_string_shift($chunk, 4))); - $w[] = $temp; - } - - // Extend the sixteen 32-bit words into sixty-four 32-bit words - for ($i = 16; $i < 64; $i++) { - $s0 = $this->_rightRotate($w[$i - 15], 7) ^ - $this->_rightRotate($w[$i - 15], 18) ^ - $this->_rightShift( $w[$i - 15], 3); - $s1 = $this->_rightRotate($w[$i - 2], 17) ^ - $this->_rightRotate($w[$i - 2], 19) ^ - $this->_rightShift( $w[$i - 2], 10); - $w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1); - - } - - // Initialize hash value for this chunk - list($a, $b, $c, $d, $e, $f, $g, $h) = $hash; - - // Main loop - for ($i = 0; $i < 64; $i++) { - $s0 = $this->_rightRotate($a, 2) ^ - $this->_rightRotate($a, 13) ^ - $this->_rightRotate($a, 22); - $maj = ($a & $b) ^ - ($a & $c) ^ - ($b & $c); - $t2 = $this->_add($s0, $maj); - - $s1 = $this->_rightRotate($e, 6) ^ - $this->_rightRotate($e, 11) ^ - $this->_rightRotate($e, 25); - $ch = ($e & $f) ^ - ($this->_not($e) & $g); - $t1 = $this->_add($h, $s1, $ch, $k[$i], $w[$i]); - - $h = $g; - $g = $f; - $f = $e; - $e = $this->_add($d, $t1); - $d = $c; - $c = $b; - $b = $a; - $a = $this->_add($t1, $t2); - } - - // Add this chunk's hash to result so far - $hash = array( - $this->_add($hash[0], $a), - $this->_add($hash[1], $b), - $this->_add($hash[2], $c), - $this->_add($hash[3], $d), - $this->_add($hash[4], $e), - $this->_add($hash[5], $f), - $this->_add($hash[6], $g), - $this->_add($hash[7], $h) - ); - } - - // Produce the final hash value (big-endian) - return pack('N8', $hash[0], $hash[1], $hash[2], $hash[3], $hash[4], $hash[5], $hash[6], $hash[7]); - } - - /** - * Pure-PHP implementation of SHA384 and SHA512 - * - * @access private - * @param String $m - */ - function _sha512($m) - { - if (!class_exists('Math_BigInteger')) { - include_once 'Math/BigInteger.php'; - } - - static $init384, $init512, $k; - - if (!isset($k)) { - // Initialize variables - $init384 = array( // initial values for SHA384 - 'cbbb9d5dc1059ed8', '629a292a367cd507', '9159015a3070dd17', '152fecd8f70e5939', - '67332667ffc00b31', '8eb44a8768581511', 'db0c2e0d64f98fa7', '47b5481dbefa4fa4' - ); - $init512 = array( // initial values for SHA512 - '6a09e667f3bcc908', 'bb67ae8584caa73b', '3c6ef372fe94f82b', 'a54ff53a5f1d36f1', - '510e527fade682d1', '9b05688c2b3e6c1f', '1f83d9abfb41bd6b', '5be0cd19137e2179' - ); - - for ($i = 0; $i < 8; $i++) { - $init384[$i] = new Math_BigInteger($init384[$i], 16); - $init384[$i]->setPrecision(64); - $init512[$i] = new Math_BigInteger($init512[$i], 16); - $init512[$i]->setPrecision(64); - } - - // Initialize table of round constants - // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409) - $k = array( - '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', - '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', - 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', - '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', - 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', - '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', - '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', - 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', - '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', - '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', - 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', - 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', - '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', - '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', - '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', - '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', - 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', - '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', - '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', - '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817' - ); - - for ($i = 0; $i < 80; $i++) { - $k[$i] = new Math_BigInteger($k[$i], 16); - } - } - - $hash = $this->l == 48 ? $init384 : $init512; - - // Pre-processing - $length = strlen($m); - // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128 - $m.= str_repeat(chr(0), 128 - (($length + 16) & 0x7F)); - $m[$length] = chr(0x80); - // we don't support hashing strings 512MB long - $m.= pack('N4', 0, 0, 0, $length << 3); - - // Process the message in successive 1024-bit chunks - $chunks = str_split($m, 128); - foreach ($chunks as $chunk) { - $w = array(); - for ($i = 0; $i < 16; $i++) { - $temp = new Math_BigInteger($this->_string_shift($chunk, 8), 256); - $temp->setPrecision(64); - $w[] = $temp; - } - - // Extend the sixteen 32-bit words into eighty 32-bit words - for ($i = 16; $i < 80; $i++) { - $temp = array( - $w[$i - 15]->bitwise_rightRotate(1), - $w[$i - 15]->bitwise_rightRotate(8), - $w[$i - 15]->bitwise_rightShift(7) - ); - $s0 = $temp[0]->bitwise_xor($temp[1]); - $s0 = $s0->bitwise_xor($temp[2]); - $temp = array( - $w[$i - 2]->bitwise_rightRotate(19), - $w[$i - 2]->bitwise_rightRotate(61), - $w[$i - 2]->bitwise_rightShift(6) - ); - $s1 = $temp[0]->bitwise_xor($temp[1]); - $s1 = $s1->bitwise_xor($temp[2]); - $w[$i] = $w[$i - 16]->copy(); - $w[$i] = $w[$i]->add($s0); - $w[$i] = $w[$i]->add($w[$i - 7]); - $w[$i] = $w[$i]->add($s1); - } - - // Initialize hash value for this chunk - $a = $hash[0]->copy(); - $b = $hash[1]->copy(); - $c = $hash[2]->copy(); - $d = $hash[3]->copy(); - $e = $hash[4]->copy(); - $f = $hash[5]->copy(); - $g = $hash[6]->copy(); - $h = $hash[7]->copy(); - - // Main loop - for ($i = 0; $i < 80; $i++) { - $temp = array( - $a->bitwise_rightRotate(28), - $a->bitwise_rightRotate(34), - $a->bitwise_rightRotate(39) - ); - $s0 = $temp[0]->bitwise_xor($temp[1]); - $s0 = $s0->bitwise_xor($temp[2]); - $temp = array( - $a->bitwise_and($b), - $a->bitwise_and($c), - $b->bitwise_and($c) - ); - $maj = $temp[0]->bitwise_xor($temp[1]); - $maj = $maj->bitwise_xor($temp[2]); - $t2 = $s0->add($maj); - - $temp = array( - $e->bitwise_rightRotate(14), - $e->bitwise_rightRotate(18), - $e->bitwise_rightRotate(41) - ); - $s1 = $temp[0]->bitwise_xor($temp[1]); - $s1 = $s1->bitwise_xor($temp[2]); - $temp = array( - $e->bitwise_and($f), - $g->bitwise_and($e->bitwise_not()) - ); - $ch = $temp[0]->bitwise_xor($temp[1]); - $t1 = $h->add($s1); - $t1 = $t1->add($ch); - $t1 = $t1->add($k[$i]); - $t1 = $t1->add($w[$i]); - - $h = $g->copy(); - $g = $f->copy(); - $f = $e->copy(); - $e = $d->add($t1); - $d = $c->copy(); - $c = $b->copy(); - $b = $a->copy(); - $a = $t1->add($t2); - } - - // Add this chunk's hash to result so far - $hash = array( - $hash[0]->add($a), - $hash[1]->add($b), - $hash[2]->add($c), - $hash[3]->add($d), - $hash[4]->add($e), - $hash[5]->add($f), - $hash[6]->add($g), - $hash[7]->add($h) - ); - } - - // Produce the final hash value (big-endian) - // (Crypt_Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here) - $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() . - $hash[4]->toBytes() . $hash[5]->toBytes(); - if ($this->l != 48) { - $temp.= $hash[6]->toBytes() . $hash[7]->toBytes(); - } - - return $temp; - } - - /** - * Right Rotate - * - * @access private - * @param Integer $int - * @param Integer $amt - * @see _sha256() - * @return Integer - */ - function _rightRotate($int, $amt) - { - $invamt = 32 - $amt; - $mask = (1 << $invamt) - 1; - return (($int << $invamt) & 0xFFFFFFFF) | (($int >> $amt) & $mask); - } - - /** - * Right Shift - * - * @access private - * @param Integer $int - * @param Integer $amt - * @see _sha256() - * @return Integer - */ - function _rightShift($int, $amt) - { - $mask = (1 << (32 - $amt)) - 1; - return ($int >> $amt) & $mask; - } - - /** - * Not - * - * @access private - * @param Integer $int - * @see _sha256() - * @return Integer - */ - function _not($int) - { - return ~$int & 0xFFFFFFFF; - } - - /** - * Add - * - * _sha256() adds multiple unsigned 32-bit integers. Since PHP doesn't support unsigned integers and since the - * possibility of overflow exists, care has to be taken. Math_BigInteger() could be used but this should be faster. - * - * @param Integer $... - * @return Integer - * @see _sha256() - * @access private - */ - function _add() - { - static $mod; - if (!isset($mod)) { - $mod = pow(2, 32); - } - - $result = 0; - $arguments = func_get_args(); - foreach ($arguments as $argument) { - $result+= $argument < 0 ? ($argument & 0x7FFFFFFF) + 0x80000000 : $argument; - } - - return fmod($result, $mod); - } - - /** - * String Shift - * - * Inspired by array_shift - * - * @param String $string - * @param optional Integer $index - * @return String - * @access private - */ - function _string_shift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } -} + + * setKey('abcdefg'); + * + * echo base64_encode($hash->hash('abcdefg')); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_Hash + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * @access private + * @see self::Crypt_Hash() + */ +/** + * Toggles the internal implementation + */ +define('CRYPT_HASH_MODE_INTERNAL', 1); +/** + * Toggles the mhash() implementation, which has been deprecated on PHP 5.3.0+. + */ +define('CRYPT_HASH_MODE_MHASH', 2); +/** + * Toggles the hash() implementation, which works on PHP 5.1.2+. + */ +define('CRYPT_HASH_MODE_HASH', 3); +/**#@-*/ + +/** + * Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions. + * + * @package Crypt_Hash + * @author Jim Wigginton + * @access public + */ +class Crypt_Hash +{ + /** + * Hash Parameter + * + * @see self::setHash() + * @var int + * @access private + */ + var $hashParam; + + /** + * Byte-length of compression blocks / key (Internal HMAC) + * + * @see self::setAlgorithm() + * @var int + * @access private + */ + var $b; + + /** + * Byte-length of hash output (Internal HMAC) + * + * @see self::setHash() + * @var int + * @access private + */ + var $l = false; + + /** + * Hash Algorithm + * + * @see self::setHash() + * @var string + * @access private + */ + var $hash; + + /** + * Key + * + * @see self::setKey() + * @var string + * @access private + */ + var $key = false; + + /** + * Computed Key + * + * @see self::_computeKey() + * @var string + * @access private + */ + var $computedKey = false; + + /** + * Outer XOR (Internal HMAC) + * + * @see self::setKey() + * @var string + * @access private + */ + var $opad; + + /** + * Inner XOR (Internal HMAC) + * + * @see self::setKey() + * @var string + * @access private + */ + var $ipad; + + /** + * Engine + * + * @see self::setHash() + * @var string + * @access private + */ + var $engine; + + /** + * Default Constructor. + * + * @param string $hash + * @return Crypt_Hash + * @access public + */ + function __construct($hash = 'sha1') + { + if (!defined('CRYPT_HASH_MODE')) { + switch (true) { + case extension_loaded('hash'): + define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_HASH); + break; + case extension_loaded('mhash'): + define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_MHASH); + break; + default: + define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_INTERNAL); + } + } + + $this->setHash($hash); + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param int $mode + * @access public + */ + function Crypt_Hash($hash = 'sha1') + { + $this->__construct($hash); + } + + /** + * Sets the key for HMACs + * + * Keys can be of any length. + * + * @access public + * @param string $key + */ + function setKey($key = false) + { + $this->key = $key; + $this->_computeKey(); + } + + /** + * Pre-compute the key used by the HMAC + * + * Quoting http://tools.ietf.org/html/rfc2104#section-2, "Applications that use keys longer than B bytes + * will first hash the key using H and then use the resultant L byte string as the actual key to HMAC." + * + * As documented in https://www.reddit.com/r/PHP/comments/9nct2l/symfonypolyfill_hash_pbkdf2_correct_fix_for/ + * when doing an HMAC multiple times it's faster to compute the hash once instead of computing it during + * every call + * + * @access private + */ + function _computeKey() + { + if ($this->key === false) { + $this->computedKey = false; + return; + } + + if (strlen($this->key) <= $this->b) { + $this->computedKey = $this->key; + return; + } + + switch ($this->engine) { + case CRYPT_HASH_MODE_MHASH: + $this->computedKey = mhash($this->hash, $this->key); + break; + case CRYPT_HASH_MODE_HASH: + $this->computedKey = hash($this->hash, $this->key, true); + break; + case CRYPT_HASH_MODE_INTERNAL: + $this->computedKey = call_user_func($this->hash, $this->key); + } + } + + /** + * Gets the hash function. + * + * As set by the constructor or by the setHash() method. + * + * @access public + * @return string + */ + function getHash() + { + return $this->hashParam; + } + + /** + * Sets the hash function. + * + * @access public + * @param string $hash + */ + function setHash($hash) + { + $this->hashParam = $hash = strtolower($hash); + switch ($hash) { + case 'md5-96': + case 'sha1-96': + case 'sha256-96': + case 'sha512-96': + $hash = substr($hash, 0, -3); + $this->l = 12; // 96 / 8 = 12 + break; + case 'md2': + case 'md5': + $this->l = 16; + break; + case 'sha1': + $this->l = 20; + break; + case 'sha256': + $this->l = 32; + break; + case 'sha384': + $this->l = 48; + break; + case 'sha512': + $this->l = 64; + } + + switch ($hash) { + case 'md2-96': + case 'md2': + $this->b = 16; + case 'md5-96': + case 'sha1-96': + case 'sha224-96': + case 'sha256-96': + case 'md2': + case 'md5': + case 'sha1': + case 'sha224': + case 'sha256': + $this->b = 64; + break; + default: + $this->b = 128; + } + + switch ($hash) { + case 'md2': + $this->engine = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ? + CRYPT_HASH_MODE_HASH : CRYPT_HASH_MODE_INTERNAL; + break; + case 'sha384': + case 'sha512': + $this->engine = CRYPT_HASH_MODE == CRYPT_HASH_MODE_MHASH ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE; + break; + default: + $this->engine = CRYPT_HASH_MODE; + } + + switch ($this->engine) { + case CRYPT_HASH_MODE_MHASH: + switch ($hash) { + case 'md5': + $this->hash = MHASH_MD5; + break; + case 'sha256': + $this->hash = MHASH_SHA256; + break; + case 'sha1': + default: + $this->hash = MHASH_SHA1; + } + $this->_computeKey(); + return; + case CRYPT_HASH_MODE_HASH: + switch ($hash) { + case 'md5': + $this->hash = 'md5'; + return; + case 'md2': + case 'sha256': + case 'sha384': + case 'sha512': + $this->hash = $hash; + return; + case 'sha1': + default: + $this->hash = 'sha1'; + } + $this->_computeKey(); + return; + } + + switch ($hash) { + case 'md2': + $this->hash = array($this, '_md2'); + break; + case 'md5': + $this->hash = array($this, '_md5'); + break; + case 'sha256': + $this->hash = array($this, '_sha256'); + break; + case 'sha384': + case 'sha512': + $this->hash = array($this, '_sha512'); + break; + case 'sha1': + default: + $this->hash = array($this, '_sha1'); + } + + $this->ipad = str_repeat(chr(0x36), $this->b); + $this->opad = str_repeat(chr(0x5C), $this->b); + + $this->_computeKey(); + } + + /** + * Compute the HMAC. + * + * @access public + * @param string $text + * @return string + */ + function hash($text) + { + if (!empty($this->key) || is_string($this->key)) { + switch ($this->engine) { + case CRYPT_HASH_MODE_MHASH: + $output = mhash($this->hash, $text, $this->computedKey); + break; + case CRYPT_HASH_MODE_HASH: + $output = hash_hmac($this->hash, $text, $this->computedKey, true); + break; + case CRYPT_HASH_MODE_INTERNAL: + $key = str_pad($this->computedKey, $this->b, chr(0)); // step 1 + $temp = $this->ipad ^ $key; // step 2 + $temp .= $text; // step 3 + $temp = call_user_func($this->hash, $temp); // step 4 + $output = $this->opad ^ $key; // step 5 + $output.= $temp; // step 6 + $output = call_user_func($this->hash, $output); // step 7 + } + } else { + switch ($this->engine) { + case CRYPT_HASH_MODE_MHASH: + $output = mhash($this->hash, $text); + break; + case CRYPT_HASH_MODE_HASH: + $output = hash($this->hash, $text, true); + break; + case CRYPT_HASH_MODE_INTERNAL: + $output = call_user_func($this->hash, $text); + } + } + + return substr($output, 0, $this->l); + } + + /** + * Returns the hash length (in bytes) + * + * @access public + * @return int + */ + function getLength() + { + return $this->l; + } + + /** + * Wrapper for MD5 + * + * @access private + * @param string $m + */ + function _md5($m) + { + return pack('H*', md5($m)); + } + + /** + * Wrapper for SHA1 + * + * @access private + * @param string $m + */ + function _sha1($m) + { + return pack('H*', sha1($m)); + } + + /** + * Pure-PHP implementation of MD2 + * + * See {@link http://tools.ietf.org/html/rfc1319 RFC1319}. + * + * @access private + * @param string $m + */ + function _md2($m) + { + static $s = array( + 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, + 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, + 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, + 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, + 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, + 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, + 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, + 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, + 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, + 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, + 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, + 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, + 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, + 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, + 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, + 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, + 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, + 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 + ); + + // Step 1. Append Padding Bytes + $pad = 16 - (strlen($m) & 0xF); + $m.= str_repeat(chr($pad), $pad); + + $length = strlen($m); + + // Step 2. Append Checksum + $c = str_repeat(chr(0), 16); + $l = chr(0); + for ($i = 0; $i < $length; $i+= 16) { + for ($j = 0; $j < 16; $j++) { + // RFC1319 incorrectly states that C[j] should be set to S[c xor L] + //$c[$j] = chr($s[ord($m[$i + $j] ^ $l)]); + // per , however, C[j] should be set to S[c xor L] xor C[j] + $c[$j] = chr($s[ord($m[$i + $j] ^ $l)] ^ ord($c[$j])); + $l = $c[$j]; + } + } + $m.= $c; + + $length+= 16; + + // Step 3. Initialize MD Buffer + $x = str_repeat(chr(0), 48); + + // Step 4. Process Message in 16-Byte Blocks + for ($i = 0; $i < $length; $i+= 16) { + for ($j = 0; $j < 16; $j++) { + $x[$j + 16] = $m[$i + $j]; + $x[$j + 32] = $x[$j + 16] ^ $x[$j]; + } + $t = chr(0); + for ($j = 0; $j < 18; $j++) { + for ($k = 0; $k < 48; $k++) { + $x[$k] = $t = $x[$k] ^ chr($s[ord($t)]); + //$t = $x[$k] = $x[$k] ^ chr($s[ord($t)]); + } + $t = chr(ord($t) + $j); + } + } + + // Step 5. Output + return substr($x, 0, 16); + } + + /** + * Pure-PHP implementation of SHA256 + * + * See {@link http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-256_.28a_SHA-2_variant.29_pseudocode SHA-256 (a SHA-2 variant) pseudocode - Wikipedia}. + * + * @access private + * @param string $m + */ + function _sha256($m) + { + if (extension_loaded('suhosin')) { + return pack('H*', sha256($m)); + } + + // Initialize variables + $hash = array( + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 + ); + // Initialize table of round constants + // (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311) + static $k = array( + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 + ); + + // Pre-processing + $length = strlen($m); + // to round to nearest 56 mod 64, we'll add 64 - (length + (64 - 56)) % 64 + $m.= str_repeat(chr(0), 64 - (($length + 8) & 0x3F)); + $m[$length] = chr(0x80); + // we don't support hashing strings 512MB long + $m.= pack('N2', 0, $length << 3); + + // Process the message in successive 512-bit chunks + $chunks = str_split($m, 64); + foreach ($chunks as $chunk) { + $w = array(); + for ($i = 0; $i < 16; $i++) { + extract(unpack('Ntemp', $this->_string_shift($chunk, 4))); + $w[] = $temp; + } + + // Extend the sixteen 32-bit words into sixty-four 32-bit words + for ($i = 16; $i < 64; $i++) { + // @codingStandardsIgnoreStart + $s0 = $this->_rightRotate($w[$i - 15], 7) ^ + $this->_rightRotate($w[$i - 15], 18) ^ + $this->_rightShift( $w[$i - 15], 3); + $s1 = $this->_rightRotate($w[$i - 2], 17) ^ + $this->_rightRotate($w[$i - 2], 19) ^ + $this->_rightShift( $w[$i - 2], 10); + // @codingStandardsIgnoreEnd + $w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1); + } + + // Initialize hash value for this chunk + list($a, $b, $c, $d, $e, $f, $g, $h) = $hash; + + // Main loop + for ($i = 0; $i < 64; $i++) { + $s0 = $this->_rightRotate($a, 2) ^ + $this->_rightRotate($a, 13) ^ + $this->_rightRotate($a, 22); + $maj = ($a & $b) ^ + ($a & $c) ^ + ($b & $c); + $t2 = $this->_add($s0, $maj); + + $s1 = $this->_rightRotate($e, 6) ^ + $this->_rightRotate($e, 11) ^ + $this->_rightRotate($e, 25); + $ch = ($e & $f) ^ + ($this->_not($e) & $g); + $t1 = $this->_add($h, $s1, $ch, $k[$i], $w[$i]); + + $h = $g; + $g = $f; + $f = $e; + $e = $this->_add($d, $t1); + $d = $c; + $c = $b; + $b = $a; + $a = $this->_add($t1, $t2); + } + + // Add this chunk's hash to result so far + $hash = array( + $this->_add($hash[0], $a), + $this->_add($hash[1], $b), + $this->_add($hash[2], $c), + $this->_add($hash[3], $d), + $this->_add($hash[4], $e), + $this->_add($hash[5], $f), + $this->_add($hash[6], $g), + $this->_add($hash[7], $h) + ); + } + + // Produce the final hash value (big-endian) + return pack('N8', $hash[0], $hash[1], $hash[2], $hash[3], $hash[4], $hash[5], $hash[6], $hash[7]); + } + + /** + * Pure-PHP implementation of SHA384 and SHA512 + * + * @access private + * @param string $m + */ + function _sha512($m) + { + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + + static $init384, $init512, $k; + + if (!isset($k)) { + // Initialize variables + $init384 = array( // initial values for SHA384 + 'cbbb9d5dc1059ed8', '629a292a367cd507', '9159015a3070dd17', '152fecd8f70e5939', + '67332667ffc00b31', '8eb44a8768581511', 'db0c2e0d64f98fa7', '47b5481dbefa4fa4' + ); + $init512 = array( // initial values for SHA512 + '6a09e667f3bcc908', 'bb67ae8584caa73b', '3c6ef372fe94f82b', 'a54ff53a5f1d36f1', + '510e527fade682d1', '9b05688c2b3e6c1f', '1f83d9abfb41bd6b', '5be0cd19137e2179' + ); + + for ($i = 0; $i < 8; $i++) { + $init384[$i] = new Math_BigInteger($init384[$i], 16); + $init384[$i]->setPrecision(64); + $init512[$i] = new Math_BigInteger($init512[$i], 16); + $init512[$i]->setPrecision(64); + } + + // Initialize table of round constants + // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409) + $k = array( + '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', + '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', + 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', + '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', + 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', + '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', + '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', + 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', + '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', + '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', + 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', + 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', + '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', + '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', + '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', + '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', + 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', + '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', + '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', + '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817' + ); + + for ($i = 0; $i < 80; $i++) { + $k[$i] = new Math_BigInteger($k[$i], 16); + } + } + + $hash = $this->l == 48 ? $init384 : $init512; + + // Pre-processing + $length = strlen($m); + // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128 + $m.= str_repeat(chr(0), 128 - (($length + 16) & 0x7F)); + $m[$length] = chr(0x80); + // we don't support hashing strings 512MB long + $m.= pack('N4', 0, 0, 0, $length << 3); + + // Process the message in successive 1024-bit chunks + $chunks = str_split($m, 128); + foreach ($chunks as $chunk) { + $w = array(); + for ($i = 0; $i < 16; $i++) { + $temp = new Math_BigInteger($this->_string_shift($chunk, 8), 256); + $temp->setPrecision(64); + $w[] = $temp; + } + + // Extend the sixteen 32-bit words into eighty 32-bit words + for ($i = 16; $i < 80; $i++) { + $temp = array( + $w[$i - 15]->bitwise_rightRotate(1), + $w[$i - 15]->bitwise_rightRotate(8), + $w[$i - 15]->bitwise_rightShift(7) + ); + $s0 = $temp[0]->bitwise_xor($temp[1]); + $s0 = $s0->bitwise_xor($temp[2]); + $temp = array( + $w[$i - 2]->bitwise_rightRotate(19), + $w[$i - 2]->bitwise_rightRotate(61), + $w[$i - 2]->bitwise_rightShift(6) + ); + $s1 = $temp[0]->bitwise_xor($temp[1]); + $s1 = $s1->bitwise_xor($temp[2]); + $w[$i] = $w[$i - 16]->copy(); + $w[$i] = $w[$i]->add($s0); + $w[$i] = $w[$i]->add($w[$i - 7]); + $w[$i] = $w[$i]->add($s1); + } + + // Initialize hash value for this chunk + $a = $hash[0]->copy(); + $b = $hash[1]->copy(); + $c = $hash[2]->copy(); + $d = $hash[3]->copy(); + $e = $hash[4]->copy(); + $f = $hash[5]->copy(); + $g = $hash[6]->copy(); + $h = $hash[7]->copy(); + + // Main loop + for ($i = 0; $i < 80; $i++) { + $temp = array( + $a->bitwise_rightRotate(28), + $a->bitwise_rightRotate(34), + $a->bitwise_rightRotate(39) + ); + $s0 = $temp[0]->bitwise_xor($temp[1]); + $s0 = $s0->bitwise_xor($temp[2]); + $temp = array( + $a->bitwise_and($b), + $a->bitwise_and($c), + $b->bitwise_and($c) + ); + $maj = $temp[0]->bitwise_xor($temp[1]); + $maj = $maj->bitwise_xor($temp[2]); + $t2 = $s0->add($maj); + + $temp = array( + $e->bitwise_rightRotate(14), + $e->bitwise_rightRotate(18), + $e->bitwise_rightRotate(41) + ); + $s1 = $temp[0]->bitwise_xor($temp[1]); + $s1 = $s1->bitwise_xor($temp[2]); + $temp = array( + $e->bitwise_and($f), + $g->bitwise_and($e->bitwise_not()) + ); + $ch = $temp[0]->bitwise_xor($temp[1]); + $t1 = $h->add($s1); + $t1 = $t1->add($ch); + $t1 = $t1->add($k[$i]); + $t1 = $t1->add($w[$i]); + + $h = $g->copy(); + $g = $f->copy(); + $f = $e->copy(); + $e = $d->add($t1); + $d = $c->copy(); + $c = $b->copy(); + $b = $a->copy(); + $a = $t1->add($t2); + } + + // Add this chunk's hash to result so far + $hash = array( + $hash[0]->add($a), + $hash[1]->add($b), + $hash[2]->add($c), + $hash[3]->add($d), + $hash[4]->add($e), + $hash[5]->add($f), + $hash[6]->add($g), + $hash[7]->add($h) + ); + } + + // Produce the final hash value (big-endian) + // (Crypt_Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here) + $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() . + $hash[4]->toBytes() . $hash[5]->toBytes(); + if ($this->l != 48) { + $temp.= $hash[6]->toBytes() . $hash[7]->toBytes(); + } + + return $temp; + } + + /** + * Right Rotate + * + * @access private + * @param int $int + * @param int $amt + * @see self::_sha256() + * @return int + */ + function _rightRotate($int, $amt) + { + $invamt = 32 - $amt; + $mask = (1 << $invamt) - 1; + return (($int << $invamt) & 0xFFFFFFFF) | (($int >> $amt) & $mask); + } + + /** + * Right Shift + * + * @access private + * @param int $int + * @param int $amt + * @see self::_sha256() + * @return int + */ + function _rightShift($int, $amt) + { + $mask = (1 << (32 - $amt)) - 1; + return ($int >> $amt) & $mask; + } + + /** + * Not + * + * @access private + * @param int $int + * @see self::_sha256() + * @return int + */ + function _not($int) + { + return ~$int & 0xFFFFFFFF; + } + + /** + * Add + * + * _sha256() adds multiple unsigned 32-bit integers. Since PHP doesn't support unsigned integers and since the + * possibility of overflow exists, care has to be taken. Math_BigInteger() could be used but this should be faster. + * + * @param int $... + * @return int + * @see self::_sha256() + * @access private + */ + function _add() + { + static $mod; + if (!isset($mod)) { + $mod = pow(2, 32); + } + + $result = 0; + $arguments = func_get_args(); + foreach ($arguments as $argument) { + $result+= $argument < 0 ? ($argument & 0x7FFFFFFF) + 0x80000000 : $argument; + } + + switch (true) { + case is_int($result): + // PHP 5.3, per http://php.net/releases/5_3_0.php, introduced "more consistent float rounding" + case version_compare(PHP_VERSION, '5.3.0') >= 0 && (php_uname('m') & "\xDF\xDF\xDF") != 'ARM': + // PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster + case (PHP_OS & "\xDF\xDF\xDF") === 'WIN': + return fmod($result, $mod); + } + + return (fmod($result, 0x80000000) & 0x7FFFFFFF) | + ((fmod(floor($result / 0x80000000), 2) & 1) << 31); + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param string $string + * @param int $index + * @return string + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RC2.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RC2.php old mode 100644 new mode 100755 index 96c9f18c1..3d10547f8 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RC2.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RC2.php @@ -1,652 +1,761 @@ - - * setKey('abcdefgh'); - * - * $plaintext = str_repeat('a', 1024); - * - * echo $rc2->decrypt($rc2->encrypt($plaintext)); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Crypt - * @package Crypt_RC2 - * @author Patrick Monnerat - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Base - * - * Base cipher class - */ -if (!class_exists('Crypt_Base')) { - include_once 'Base.php'; -} - -/**#@+ - * @access public - * @see Crypt_RC2::encrypt() - * @see Crypt_RC2::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_RC2_MODE_CTR', CRYPT_MODE_CTR); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_RC2_MODE_ECB', CRYPT_MODE_ECB); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_RC2_MODE_CBC', CRYPT_MODE_CBC); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_RC2_MODE_CFB', CRYPT_MODE_CFB); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_RC2_MODE_OFB', CRYPT_MODE_OFB); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_RC2::Crypt_RC2() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_RC2_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_RC2_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/** - * Pure-PHP implementation of RC2. - * - * @package Crypt_RC2 - * @access public - */ -class Crypt_RC2 extends Crypt_Base -{ - /** - * Block Length of the cipher - * - * @see Crypt_Base::block_size - * @var Integer - * @access private - */ - var $block_size = 8; - - /** - * The Key - * - * @see Crypt_Base::key - * @see setKey() - * @var String - * @access private - */ - var $key = "\0"; - - /** - * The default password key_size used by setPassword() - * - * @see Crypt_Base::password_key_size - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 16; // = 128 bits - - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'RC2'; - - /** - * The mcrypt specific name of the cipher - * - * @see Crypt_Base::cipher_name_mcrypt - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'rc2'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Crypt_Base::cfb_init_len - * @var Integer - * @access private - */ - var $cfb_init_len = 500; - - /** - * The key length in bits. - * - * @see Crypt_RC2::setKeyLength() - * @see Crypt_RC2::setKey() - * @var Integer - * @access private - * @internal Should be in range [1..1024]. - * @internal Changing this value after setting the key has no effect. - */ - var $default_key_length = 1024; - - /** - * The Key Schedule - * - * @see Crypt_RC2::_setupKey() - * @var Array - * @access private - */ - var $keys; - - /** - * Key expansion randomization table. - * Twice the same 256-value sequence to save a modulus in key expansion. - * - * @see Crypt_RC2::setKey() - * @var Array - * @access private - */ - var $pitable = array( - 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, - 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, - 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, - 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, - 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, - 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, - 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, - 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, - 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, - 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, - 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, - 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, - 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, - 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, - 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, - 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, - 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, - 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, - 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, - 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, - 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, - 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, - 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, - 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, - 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, - 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, - 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, - 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, - 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, - 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, - 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, - 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD, - 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, - 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, - 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, - 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, - 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, - 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, - 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, - 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, - 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, - 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, - 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, - 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, - 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, - 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, - 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, - 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, - 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, - 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, - 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, - 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, - 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, - 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, - 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, - 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, - 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, - 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, - 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, - 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, - 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, - 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, - 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, - 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD - ); - - /** - * Inverse key expansion randomization table. - * - * @see Crypt_RC2::setKey() - * @var Array - * @access private - */ - var $invpitable = array( - 0xD1, 0xDA, 0xB9, 0x6F, 0x9C, 0xC8, 0x78, 0x66, - 0x80, 0x2C, 0xF8, 0x37, 0xEA, 0xE0, 0x62, 0xA4, - 0xCB, 0x71, 0x50, 0x27, 0x4B, 0x95, 0xD9, 0x20, - 0x9D, 0x04, 0x91, 0xE3, 0x47, 0x6A, 0x7E, 0x53, - 0xFA, 0x3A, 0x3B, 0xB4, 0xA8, 0xBC, 0x5F, 0x68, - 0x08, 0xCA, 0x8F, 0x14, 0xD7, 0xC0, 0xEF, 0x7B, - 0x5B, 0xBF, 0x2F, 0xE5, 0xE2, 0x8C, 0xBA, 0x12, - 0xE1, 0xAF, 0xB2, 0x54, 0x5D, 0x59, 0x76, 0xDB, - 0x32, 0xA2, 0x58, 0x6E, 0x1C, 0x29, 0x64, 0xF3, - 0xE9, 0x96, 0x0C, 0x98, 0x19, 0x8D, 0x3E, 0x26, - 0xAB, 0xA5, 0x85, 0x16, 0x40, 0xBD, 0x49, 0x67, - 0xDC, 0x22, 0x94, 0xBB, 0x3C, 0xC1, 0x9B, 0xEB, - 0x45, 0x28, 0x18, 0xD8, 0x1A, 0x42, 0x7D, 0xCC, - 0xFB, 0x65, 0x8E, 0x3D, 0xCD, 0x2A, 0xA3, 0x60, - 0xAE, 0x93, 0x8A, 0x48, 0x97, 0x51, 0x15, 0xF7, - 0x01, 0x0B, 0xB7, 0x36, 0xB1, 0x2E, 0x11, 0xFD, - 0x84, 0x2D, 0x3F, 0x13, 0x88, 0xB3, 0x34, 0x24, - 0x1B, 0xDE, 0xC5, 0x1D, 0x4D, 0x2B, 0x17, 0x31, - 0x74, 0xA9, 0xC6, 0x43, 0x6D, 0x39, 0x90, 0xBE, - 0xC3, 0xB0, 0x21, 0x6B, 0xF6, 0x0F, 0xD5, 0x99, - 0x0D, 0xAC, 0x1F, 0x5C, 0x9E, 0xF5, 0xF9, 0x4C, - 0xD6, 0xDF, 0x89, 0xE4, 0x8B, 0xFF, 0xC7, 0xAA, - 0xE7, 0xED, 0x46, 0x25, 0xB6, 0x06, 0x5E, 0x35, - 0xB5, 0xEC, 0xCE, 0xE8, 0x6C, 0x30, 0x55, 0x61, - 0x4A, 0xFE, 0xA0, 0x79, 0x03, 0xF0, 0x10, 0x72, - 0x7C, 0xCF, 0x52, 0xA6, 0xA7, 0xEE, 0x44, 0xD3, - 0x9A, 0x57, 0x92, 0xD0, 0x5A, 0x7A, 0x41, 0x7F, - 0x0E, 0x00, 0x63, 0xF2, 0x4F, 0x05, 0x83, 0xC9, - 0xA1, 0xD4, 0xDD, 0xC4, 0x56, 0xF4, 0xD2, 0x77, - 0x81, 0x09, 0x82, 0x33, 0x9F, 0x07, 0x86, 0x75, - 0x38, 0x4E, 0x69, 0xF1, 0xAD, 0x23, 0x73, 0x87, - 0x70, 0x02, 0xC2, 0x1E, 0xB8, 0x0A, 0xFC, 0xE6 - ); - - /** - * Default Constructor. - * - * Determines whether or not the mcrypt extension should be used. - * - * $mode could be: - * - * - CRYPT_RC2_MODE_ECB - * - * - CRYPT_RC2_MODE_CBC - * - * - CRYPT_RC2_MODE_CTR - * - * - CRYPT_RC2_MODE_CFB - * - * - CRYPT_RC2_MODE_OFB - * - * If not explicitly set, CRYPT_RC2_MODE_CBC will be used. - * - * @see Crypt_Base::Crypt_Base() - * @param optional Integer $mode - * @access public - */ - function Crypt_RC2($mode = CRYPT_RC2_MODE_CBC) - { - parent::Crypt_Base($mode); - $this->setKey(''); - } - - /** - * Sets the key length - * - * Valid key lengths are 1 to 1024. - * Calling this function after setting the key has no effect until the next - * Crypt_RC2::setKey() call. - * - * @access public - * @param Integer $length in bits - */ - function setKeyLength($length) - { - if ($length >= 1 && $length <= 1024) { - $this->default_key_length = $length; - } - } - - /** - * Sets the key. - * - * Keys can be of any length. RC2, itself, uses 1 to 1024 bit keys (eg. - * strlen($key) <= 128), however, we only use the first 128 bytes if $key - * has more then 128 bytes in it, and set $key to a single null byte if - * it is empty. - * - * If the key is not explicitly set, it'll be assumed to be a single - * null byte. - * - * @see Crypt_Base::setKey() - * @access public - * @param String $key - * @param Integer $t1 optional Effective key length in bits. - */ - function setKey($key, $t1 = 0) - { - if ($t1 <= 0) { - $t1 = $this->default_key_length; - } else if ($t1 > 1024) { - $t1 = 1024; - } - // Key byte count should be 1..128. - $key = strlen($key) ? substr($key, 0, 128) : "\x00"; - $t = strlen($key); - - // The mcrypt RC2 implementation only supports effective key length - // of 1024 bits. It is however possible to handle effective key - // lengths in range 1..1024 by expanding the key and applying - // inverse pitable mapping to the first byte before submitting it - // to mcrypt. - - // Key expansion. - $l = array_values(unpack('C*', $key)); - $t8 = ($t1 + 7) >> 3; - $tm = 0xFF >> (8 * $t8 - $t1); - - // Expand key. - $pitable = $this->pitable; - for ($i = $t; $i < 128; $i++) { - $l[$i] = $pitable[$l[$i - 1] + $l[$i - $t]]; - } - $i = 128 - $t8; - $l[$i] = $pitable[$l[$i] & $tm]; - while ($i--) { - $l[$i] = $pitable[$l[$i + 1] ^ $l[$i + $t8]]; - } - - // Prepare the key for mcrypt. - $l[0] = $this->invpitable[$l[0]]; - array_unshift($l, 'C*'); - parent::setKey(call_user_func_array('pack', $l)); - } - - /** - * Encrypts a block - * - * @see Crypt_Base::_encryptBlock() - * @see Crypt_Base::encrypt() - * @access private - * @param String $in - * @return String - */ - function _encryptBlock($in) - { - list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); - $keys = $this->keys; - $limit = 20; - $actions = array($limit => 44, 44 => 64); - $j = 0; - - for (;;) { - // Mixing round. - $r0 = (($r0 + $keys[$j++] + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; - $r0 |= $r0 >> 16; - $r1 = (($r1 + $keys[$j++] + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; - $r1 |= $r1 >> 16; - $r2 = (($r2 + $keys[$j++] + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; - $r2 |= $r2 >> 16; - $r3 = (($r3 + $keys[$j++] + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; - $r3 |= $r3 >> 16; - - if ($j === $limit) { - if ($limit === 64) { - break; - } - - // Mashing round. - $r0 += $keys[$r3 & 0x3F]; - $r1 += $keys[$r0 & 0x3F]; - $r2 += $keys[$r1 & 0x3F]; - $r3 += $keys[$r2 & 0x3F]; - $limit = $actions[$limit]; - } - } - - return pack('vvvv', $r0, $r1, $r2, $r3); - } - - /** - * Decrypts a block - * - * @see Crypt_Base::_decryptBlock() - * @see Crypt_Base::decrypt() - * @access private - * @param String $in - * @return String - */ - function _decryptBlock($in) - { - list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); - $keys = $this->keys; - $limit = 44; - $actions = array($limit => 20, 20 => 0); - $j = 64; - - for (;;) { - // R-mixing round. - $r3 = ($r3 | ($r3 << 16)) >> 5; - $r3 = ($r3 - $keys[--$j] - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; - $r2 = ($r2 | ($r2 << 16)) >> 3; - $r2 = ($r2 - $keys[--$j] - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; - $r1 = ($r1 | ($r1 << 16)) >> 2; - $r1 = ($r1 - $keys[--$j] - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; - $r0 = ($r0 | ($r0 << 16)) >> 1; - $r0 = ($r0 - $keys[--$j] - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF; - - if ($j === $limit) { - if ($limit === 0) { - break; - } - - // R-mashing round. - $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; - $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; - $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; - $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF; - $limit = $actions[$limit]; - } - } - - return pack('vvvv', $r0, $r1, $r2, $r3); - } - - /** - * Creates the key schedule - * - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - // Key has already been expanded in Crypt_RC2::setKey(): - // Only the first value must be altered. - $l = unpack('Ca/Cb/v*', $this->key); - array_unshift($l, $this->pitable[$l['a']] | ($l['b'] << 8)); - unset($l['a']); - unset($l['b']); - $this->keys = $l; - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Crypt_Base::_setupInlineCrypt() - * @access private - */ - function _setupInlineCrypt() - { - $lambda_functions = &Crypt_RC2::_getLambdaFunctions(); - - // The first 10 generated $lambda_functions will use the $keys hardcoded as integers - // for the mixing rounds, for better inline crypt performance [~20% faster]. - // But for memory reason we have to limit those ultra-optimized $lambda_functions to an amount of 10. - $keys = $this->keys; - if (count($lambda_functions) >= 10) { - foreach ($this->keys as $k => $v) { - $keys[$k] = '$keys[' . $k . ']'; - } - } - - $code_hash = md5(str_pad("Crypt_RC2, {$this->mode}, ", 32, "\0") . implode(',', $keys)); - - // Is there a re-usable $lambda_functions in there? - // If not, we have to create it. - if (!isset($lambda_functions[$code_hash])) { - // Init code for both, encrypt and decrypt. - $init_crypt = '$keys = $self->keys;'; - - // $in is the current 8 bytes block which has to be en/decrypt - $encrypt_block = $decrypt_block = ' - $in = unpack("v4", $in); - $r0 = $in[1]; - $r1 = $in[2]; - $r2 = $in[3]; - $r3 = $in[4]; - '; - - // Create code for encryption. - $limit = 20; - $actions = array($limit => 44, 44 => 64); - $j = 0; - - for (;;) { - // Mixing round. - $encrypt_block .= ' - $r0 = (($r0 + ' . $keys[$j++] . ' + - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; - $r0 |= $r0 >> 16; - $r1 = (($r1 + ' . $keys[$j++] . ' + - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; - $r1 |= $r1 >> 16; - $r2 = (($r2 + ' . $keys[$j++] . ' + - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; - $r2 |= $r2 >> 16; - $r3 = (($r3 + ' . $keys[$j++] . ' + - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; - $r3 |= $r3 >> 16;'; - - if ($j === $limit) { - if ($limit === 64) { - break; - } - - // Mashing round. - $encrypt_block .= ' - $r0 += $keys[$r3 & 0x3F]; - $r1 += $keys[$r0 & 0x3F]; - $r2 += $keys[$r1 & 0x3F]; - $r3 += $keys[$r2 & 0x3F];'; - $limit = $actions[$limit]; - } - } - - $encrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; - - // Create code for decryption. - $limit = 44; - $actions = array($limit => 20, 20 => 0); - $j = 64; - - for (;;) { - // R-mixing round. - $decrypt_block .= ' - $r3 = ($r3 | ($r3 << 16)) >> 5; - $r3 = ($r3 - ' . $keys[--$j] . ' - - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; - $r2 = ($r2 | ($r2 << 16)) >> 3; - $r2 = ($r2 - ' . $keys[--$j] . ' - - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; - $r1 = ($r1 | ($r1 << 16)) >> 2; - $r1 = ($r1 - ' . $keys[--$j] . ' - - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; - $r0 = ($r0 | ($r0 << 16)) >> 1; - $r0 = ($r0 - ' . $keys[--$j] . ' - - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF;'; - - if ($j === $limit) { - if ($limit === 0) { - break; - } - - // R-mashing round. - $decrypt_block .= ' - $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; - $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; - $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; - $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF;'; - $limit = $actions[$limit]; - } - } - - $decrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; - - // Creates the inline-crypt function - $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( - array( - 'init_crypt' => $init_crypt, - 'encrypt_block' => $encrypt_block, - 'decrypt_block' => $decrypt_block - ) - ); - } - - // Set the inline-crypt function as callback in: $this->inline_crypt - $this->inline_crypt = $lambda_functions[$code_hash]; - } -} + + * setKey('abcdefgh'); + * + * $plaintext = str_repeat('a', 1024); + * + * echo $rc2->decrypt($rc2->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_RC2 + * @author Patrick Monnerat + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_RC2_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_RC2_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_RC2_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_RC2_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_RC2_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/** + * Pure-PHP implementation of RC2. + * + * @package Crypt_RC2 + * @access public + */ +class Crypt_RC2 extends Crypt_Base +{ + /** + * Block Length of the cipher + * + * @see Crypt_Base::block_size + * @var int + * @access private + */ + var $block_size = 8; + + /** + * The Key + * + * @see Crypt_Base::key + * @see self::setKey() + * @var string + * @access private + */ + var $key; + + /** + * The Original (unpadded) Key + * + * @see Crypt_Base::key + * @see self::setKey() + * @see self::encrypt() + * @see self::decrypt() + * @var string + * @access private + */ + var $orig_key; + + /** + * Don't truncate / null pad key + * + * @see Crypt_Base::_clearBuffers() + * @var bool + * @access private + */ + var $skip_key_adjustment = true; + + /** + * Key Length (in bytes) + * + * @see Crypt_RC2::setKeyLength() + * @var int + * @access private + */ + var $key_length = 16; // = 128 bits + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'RC2'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'rc2'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var int + * @access private + */ + var $cfb_init_len = 500; + + /** + * The key length in bits. + * + * @see self::setKeyLength() + * @see self::setKey() + * @var int + * @access private + * @internal Should be in range [1..1024]. + * @internal Changing this value after setting the key has no effect. + */ + var $default_key_length = 1024; + + /** + * The key length in bits. + * + * @see self::isValidEnine() + * @see self::setKey() + * @var int + * @access private + * @internal Should be in range [1..1024]. + */ + var $current_key_length; + + /** + * The Key Schedule + * + * @see self::_setupKey() + * @var array + * @access private + */ + var $keys; + + /** + * Key expansion randomization table. + * Twice the same 256-value sequence to save a modulus in key expansion. + * + * @see self::setKey() + * @var array + * @access private + */ + var $pitable = array( + 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, + 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, + 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, + 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, + 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, + 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, + 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, + 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, + 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, + 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, + 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, + 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, + 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, + 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, + 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, + 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, + 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, + 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, + 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, + 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, + 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, + 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, + 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, + 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, + 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, + 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, + 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, + 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, + 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, + 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, + 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, + 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD, + 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, + 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, + 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, + 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, + 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, + 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, + 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, + 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, + 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, + 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, + 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, + 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, + 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, + 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, + 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, + 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, + 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, + 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, + 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, + 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, + 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, + 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, + 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, + 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, + 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, + 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, + 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, + 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, + 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, + 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, + 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, + 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD + ); + + /** + * Inverse key expansion randomization table. + * + * @see self::setKey() + * @var array + * @access private + */ + var $invpitable = array( + 0xD1, 0xDA, 0xB9, 0x6F, 0x9C, 0xC8, 0x78, 0x66, + 0x80, 0x2C, 0xF8, 0x37, 0xEA, 0xE0, 0x62, 0xA4, + 0xCB, 0x71, 0x50, 0x27, 0x4B, 0x95, 0xD9, 0x20, + 0x9D, 0x04, 0x91, 0xE3, 0x47, 0x6A, 0x7E, 0x53, + 0xFA, 0x3A, 0x3B, 0xB4, 0xA8, 0xBC, 0x5F, 0x68, + 0x08, 0xCA, 0x8F, 0x14, 0xD7, 0xC0, 0xEF, 0x7B, + 0x5B, 0xBF, 0x2F, 0xE5, 0xE2, 0x8C, 0xBA, 0x12, + 0xE1, 0xAF, 0xB2, 0x54, 0x5D, 0x59, 0x76, 0xDB, + 0x32, 0xA2, 0x58, 0x6E, 0x1C, 0x29, 0x64, 0xF3, + 0xE9, 0x96, 0x0C, 0x98, 0x19, 0x8D, 0x3E, 0x26, + 0xAB, 0xA5, 0x85, 0x16, 0x40, 0xBD, 0x49, 0x67, + 0xDC, 0x22, 0x94, 0xBB, 0x3C, 0xC1, 0x9B, 0xEB, + 0x45, 0x28, 0x18, 0xD8, 0x1A, 0x42, 0x7D, 0xCC, + 0xFB, 0x65, 0x8E, 0x3D, 0xCD, 0x2A, 0xA3, 0x60, + 0xAE, 0x93, 0x8A, 0x48, 0x97, 0x51, 0x15, 0xF7, + 0x01, 0x0B, 0xB7, 0x36, 0xB1, 0x2E, 0x11, 0xFD, + 0x84, 0x2D, 0x3F, 0x13, 0x88, 0xB3, 0x34, 0x24, + 0x1B, 0xDE, 0xC5, 0x1D, 0x4D, 0x2B, 0x17, 0x31, + 0x74, 0xA9, 0xC6, 0x43, 0x6D, 0x39, 0x90, 0xBE, + 0xC3, 0xB0, 0x21, 0x6B, 0xF6, 0x0F, 0xD5, 0x99, + 0x0D, 0xAC, 0x1F, 0x5C, 0x9E, 0xF5, 0xF9, 0x4C, + 0xD6, 0xDF, 0x89, 0xE4, 0x8B, 0xFF, 0xC7, 0xAA, + 0xE7, 0xED, 0x46, 0x25, 0xB6, 0x06, 0x5E, 0x35, + 0xB5, 0xEC, 0xCE, 0xE8, 0x6C, 0x30, 0x55, 0x61, + 0x4A, 0xFE, 0xA0, 0x79, 0x03, 0xF0, 0x10, 0x72, + 0x7C, 0xCF, 0x52, 0xA6, 0xA7, 0xEE, 0x44, 0xD3, + 0x9A, 0x57, 0x92, 0xD0, 0x5A, 0x7A, 0x41, 0x7F, + 0x0E, 0x00, 0x63, 0xF2, 0x4F, 0x05, 0x83, 0xC9, + 0xA1, 0xD4, 0xDD, 0xC4, 0x56, 0xF4, 0xD2, 0x77, + 0x81, 0x09, 0x82, 0x33, 0x9F, 0x07, 0x86, 0x75, + 0x38, 0x4E, 0x69, 0xF1, 0xAD, 0x23, 0x73, 0x87, + 0x70, 0x02, 0xC2, 0x1E, 0xB8, 0x0A, 0xFC, 0xE6 + ); + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine() + * + * @see Crypt_Base::Crypt_Base() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + switch ($engine) { + case CRYPT_ENGINE_OPENSSL: + if ($this->current_key_length != 128 || strlen($this->orig_key) < 16) { + return false; + } + $this->cipher_name_openssl_ecb = 'rc2-ecb'; + $this->cipher_name_openssl = 'rc2-' . $this->_openssl_translate_mode(); + } + + return parent::isValidEngine($engine); + } + + /** + * Sets the key length. + * + * Valid key lengths are 8 to 1024. + * Calling this function after setting the key has no effect until the next + * Crypt_RC2::setKey() call. + * + * @access public + * @param int $length in bits + */ + function setKeyLength($length) + { + if ($length < 8) { + $this->default_key_length = 1; + } elseif ($length > 1024) { + $this->default_key_length = 128; + } else { + $this->default_key_length = $length; + } + $this->current_key_length = $this->default_key_length; + + parent::setKeyLength($length); + } + + /** + * Returns the current key length + * + * @access public + * @return int + */ + function getKeyLength() + { + return $this->current_key_length; + } + + /** + * Sets the key. + * + * Keys can be of any length. RC2, itself, uses 8 to 1024 bit keys (eg. + * strlen($key) <= 128), however, we only use the first 128 bytes if $key + * has more then 128 bytes in it, and set $key to a single null byte if + * it is empty. + * + * If the key is not explicitly set, it'll be assumed to be a single + * null byte. + * + * @see Crypt_Base::setKey() + * @access public + * @param string $key + * @param int $t1 optional Effective key length in bits. + */ + function setKey($key, $t1 = 0) + { + $this->orig_key = $key; + + if ($t1 <= 0) { + $t1 = $this->default_key_length; + } elseif ($t1 > 1024) { + $t1 = 1024; + } + $this->current_key_length = $t1; + // Key byte count should be 1..128. + $key = strlen($key) ? substr($key, 0, 128) : "\x00"; + $t = strlen($key); + + // The mcrypt RC2 implementation only supports effective key length + // of 1024 bits. It is however possible to handle effective key + // lengths in range 1..1024 by expanding the key and applying + // inverse pitable mapping to the first byte before submitting it + // to mcrypt. + + // Key expansion. + $l = array_values(unpack('C*', $key)); + $t8 = ($t1 + 7) >> 3; + $tm = 0xFF >> (8 * $t8 - $t1); + + // Expand key. + $pitable = $this->pitable; + for ($i = $t; $i < 128; $i++) { + $l[$i] = $pitable[$l[$i - 1] + $l[$i - $t]]; + } + $i = 128 - $t8; + $l[$i] = $pitable[$l[$i] & $tm]; + while ($i--) { + $l[$i] = $pitable[$l[$i + 1] ^ $l[$i + $t8]]; + } + + // Prepare the key for mcrypt. + $l[0] = $this->invpitable[$l[0]]; + array_unshift($l, 'C*'); + + parent::setKey(call_user_func_array('pack', $l)); + } + + /** + * Encrypts a message. + * + * Mostly a wrapper for Crypt_Base::encrypt, with some additional OpenSSL handling code + * + * @see self::decrypt() + * @access public + * @param string $plaintext + * @return string $ciphertext + */ + function encrypt($plaintext) + { + if ($this->engine == CRYPT_ENGINE_OPENSSL) { + $temp = $this->key; + $this->key = $this->orig_key; + $result = parent::encrypt($plaintext); + $this->key = $temp; + return $result; + } + + return parent::encrypt($plaintext); + } + + /** + * Decrypts a message. + * + * Mostly a wrapper for Crypt_Base::decrypt, with some additional OpenSSL handling code + * + * @see self::encrypt() + * @access public + * @param string $ciphertext + * @return string $plaintext + */ + function decrypt($ciphertext) + { + if ($this->engine == CRYPT_ENGINE_OPENSSL) { + $temp = $this->key; + $this->key = $this->orig_key; + $result = parent::decrypt($ciphertext); + $this->key = $temp; + return $result; + } + + return parent::decrypt($ciphertext); + } + + /** + * Encrypts a block + * + * @see Crypt_Base::_encryptBlock() + * @see Crypt_Base::encrypt() + * @access private + * @param string $in + * @return string + */ + function _encryptBlock($in) + { + list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); + $keys = $this->keys; + $limit = 20; + $actions = array($limit => 44, 44 => 64); + $j = 0; + + for (;;) { + // Mixing round. + $r0 = (($r0 + $keys[$j++] + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; + $r0 |= $r0 >> 16; + $r1 = (($r1 + $keys[$j++] + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; + $r1 |= $r1 >> 16; + $r2 = (($r2 + $keys[$j++] + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; + $r2 |= $r2 >> 16; + $r3 = (($r3 + $keys[$j++] + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; + $r3 |= $r3 >> 16; + + if ($j === $limit) { + if ($limit === 64) { + break; + } + + // Mashing round. + $r0 += $keys[$r3 & 0x3F]; + $r1 += $keys[$r0 & 0x3F]; + $r2 += $keys[$r1 & 0x3F]; + $r3 += $keys[$r2 & 0x3F]; + $limit = $actions[$limit]; + } + } + + return pack('vvvv', $r0, $r1, $r2, $r3); + } + + /** + * Decrypts a block + * + * @see Crypt_Base::_decryptBlock() + * @see Crypt_Base::decrypt() + * @access private + * @param string $in + * @return string + */ + function _decryptBlock($in) + { + list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); + $keys = $this->keys; + $limit = 44; + $actions = array($limit => 20, 20 => 0); + $j = 64; + + for (;;) { + // R-mixing round. + $r3 = ($r3 | ($r3 << 16)) >> 5; + $r3 = ($r3 - $keys[--$j] - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; + $r2 = ($r2 | ($r2 << 16)) >> 3; + $r2 = ($r2 - $keys[--$j] - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; + $r1 = ($r1 | ($r1 << 16)) >> 2; + $r1 = ($r1 - $keys[--$j] - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; + $r0 = ($r0 | ($r0 << 16)) >> 1; + $r0 = ($r0 - $keys[--$j] - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF; + + if ($j === $limit) { + if ($limit === 0) { + break; + } + + // R-mashing round. + $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; + $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; + $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; + $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF; + $limit = $actions[$limit]; + } + } + + return pack('vvvv', $r0, $r1, $r2, $r3); + } + + /** + * Setup the CRYPT_ENGINE_MCRYPT $engine + * + * @see Crypt_Base::_setupMcrypt() + * @access private + */ + function _setupMcrypt() + { + if (!isset($this->key)) { + $this->setKey(''); + } + + parent::_setupMcrypt(); + } + + /** + * Creates the key schedule + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + if (!isset($this->key)) { + $this->setKey(''); + } + + // Key has already been expanded in Crypt_RC2::setKey(): + // Only the first value must be altered. + $l = unpack('Ca/Cb/v*', $this->key); + array_unshift($l, $this->pitable[$l['a']] | ($l['b'] << 8)); + unset($l['a']); + unset($l['b']); + $this->keys = $l; + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + $lambda_functions = &Crypt_RC2::_getLambdaFunctions(); + + // The first 10 generated $lambda_functions will use the $keys hardcoded as integers + // for the mixing rounds, for better inline crypt performance [~20% faster]. + // But for memory reason we have to limit those ultra-optimized $lambda_functions to an amount of 10. + // (Currently, for Crypt_RC2, one generated $lambda_function cost on php5.5@32bit ~60kb unfreeable mem and ~100kb on php5.5@64bit) + $gen_hi_opt_code = (bool)(count($lambda_functions) < 10); + + // Generation of a unique hash for our generated code + $code_hash = "Crypt_RC2, {$this->mode}"; + if ($gen_hi_opt_code) { + $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key); + } + + // Is there a re-usable $lambda_functions in there? + // If not, we have to create it. + if (!isset($lambda_functions[$code_hash])) { + // Init code for both, encrypt and decrypt. + $init_crypt = '$keys = $self->keys;'; + + switch (true) { + case $gen_hi_opt_code: + $keys = $this->keys; + default: + $keys = array(); + foreach ($this->keys as $k => $v) { + $keys[$k] = '$keys[' . $k . ']'; + } + } + + // $in is the current 8 bytes block which has to be en/decrypt + $encrypt_block = $decrypt_block = ' + $in = unpack("v4", $in); + $r0 = $in[1]; + $r1 = $in[2]; + $r2 = $in[3]; + $r3 = $in[4]; + '; + + // Create code for encryption. + $limit = 20; + $actions = array($limit => 44, 44 => 64); + $j = 0; + + for (;;) { + // Mixing round. + $encrypt_block .= ' + $r0 = (($r0 + ' . $keys[$j++] . ' + + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; + $r0 |= $r0 >> 16; + $r1 = (($r1 + ' . $keys[$j++] . ' + + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; + $r1 |= $r1 >> 16; + $r2 = (($r2 + ' . $keys[$j++] . ' + + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; + $r2 |= $r2 >> 16; + $r3 = (($r3 + ' . $keys[$j++] . ' + + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; + $r3 |= $r3 >> 16;'; + + if ($j === $limit) { + if ($limit === 64) { + break; + } + + // Mashing round. + $encrypt_block .= ' + $r0 += $keys[$r3 & 0x3F]; + $r1 += $keys[$r0 & 0x3F]; + $r2 += $keys[$r1 & 0x3F]; + $r3 += $keys[$r2 & 0x3F];'; + $limit = $actions[$limit]; + } + } + + $encrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; + + // Create code for decryption. + $limit = 44; + $actions = array($limit => 20, 20 => 0); + $j = 64; + + for (;;) { + // R-mixing round. + $decrypt_block .= ' + $r3 = ($r3 | ($r3 << 16)) >> 5; + $r3 = ($r3 - ' . $keys[--$j] . ' - + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; + $r2 = ($r2 | ($r2 << 16)) >> 3; + $r2 = ($r2 - ' . $keys[--$j] . ' - + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; + $r1 = ($r1 | ($r1 << 16)) >> 2; + $r1 = ($r1 - ' . $keys[--$j] . ' - + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; + $r0 = ($r0 | ($r0 << 16)) >> 1; + $r0 = ($r0 - ' . $keys[--$j] . ' - + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF;'; + + if ($j === $limit) { + if ($limit === 0) { + break; + } + + // R-mashing round. + $decrypt_block .= ' + $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; + $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; + $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; + $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF;'; + $limit = $actions[$limit]; + } + } + + $decrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; + + // Creates the inline-crypt function + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => $init_crypt, + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + + // Set the inline-crypt function as callback in: $this->inline_crypt + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RC4.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RC4.php old mode 100644 new mode 100755 index d5eda8c34..51d5d44ec --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RC4.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RC4.php @@ -1,329 +1,366 @@ - - * setKey('abcdefgh'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $rc4->decrypt($rc4->encrypt($plaintext)); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Crypt - * @package Crypt_RC4 - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Base - * - * Base cipher class - */ -if (!class_exists('Crypt_Base')) { - include_once 'Base.php'; -} - -/**#@+ - * @access private - * @see Crypt_RC4::Crypt_RC4() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_RC4_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_RC4_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_RC4::_crypt() - */ -define('CRYPT_RC4_ENCRYPT', 0); -define('CRYPT_RC4_DECRYPT', 1); -/**#@-*/ - -/** - * Pure-PHP implementation of RC4. - * - * @package Crypt_RC4 - * @author Jim Wigginton - * @access public - */ -class Crypt_RC4 extends Crypt_Base -{ - /** - * Block Length of the cipher - * - * RC4 is a stream cipher - * so we the block_size to 0 - * - * @see Crypt_Base::block_size - * @var Integer - * @access private - */ - var $block_size = 0; - - /** - * The default password key_size used by setPassword() - * - * @see Crypt_Base::password_key_size - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 128; // = 1024 bits - - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'RC4'; - - /** - * The mcrypt specific name of the cipher - * - * @see Crypt_Base::cipher_name_mcrypt - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'arcfour'; - - /** - * Holds whether performance-optimized $inline_crypt() can/should be used. - * - * @see Crypt_Base::inline_crypt - * @var mixed - * @access private - */ - var $use_inline_crypt = false; // currently not available - - /** - * The Key - * - * @see Crypt_RC4::setKey() - * @var String - * @access private - */ - var $key = "\0"; - - /** - * The Key Stream for decryption and encryption - * - * @see Crypt_RC4::setKey() - * @var Array - * @access private - */ - var $stream; - - /** - * Default Constructor. - * - * Determines whether or not the mcrypt extension should be used. - * - * @see Crypt_Base::Crypt_Base() - * @return Crypt_RC4 - * @access public - */ - function Crypt_RC4() - { - parent::Crypt_Base(CRYPT_MODE_STREAM); - } - - /** - * Dummy function. - * - * Some protocols, such as WEP, prepend an "initialization vector" to the key, effectively creating a new key [1]. - * If you need to use an initialization vector in this manner, feel free to prepend it to the key, yourself, before - * calling setKey(). - * - * [1] WEP's initialization vectors (IV's) are used in a somewhat insecure way. Since, in that protocol, - * the IV's are relatively easy to predict, an attack described by - * {@link http://www.drizzle.com/~aboba/IEEE/rc4_ksaproc.pdf Scott Fluhrer, Itsik Mantin, and Adi Shamir} - * can be used to quickly guess at the rest of the key. The following links elaborate: - * - * {@link http://www.rsa.com/rsalabs/node.asp?id=2009 http://www.rsa.com/rsalabs/node.asp?id=2009} - * {@link http://en.wikipedia.org/wiki/Related_key_attack http://en.wikipedia.org/wiki/Related_key_attack} - * - * @param String $iv - * @see Crypt_RC4::setKey() - * @access public - */ - function setIV($iv) - { - } - - /** - * Sets the key. - * - * Keys can be between 1 and 256 bytes long. If they are longer then 256 bytes, the first 256 bytes will - * be used. If no key is explicitly set, it'll be assumed to be a single null byte. - * - * @access public - * @see Crypt_Base::setKey() - * @param String $key - */ - function setKey($key) - { - parent::setKey(substr($key, 0, 256)); - } - - /** - * Encrypts a message. - * - * @see Crypt_Base::decrypt() - * @see Crypt_RC4::_crypt() - * @access public - * @param String $plaintext - * @return String $ciphertext - */ - function encrypt($plaintext) - { - if ($this->engine == CRYPT_MODE_MCRYPT) { - return parent::encrypt($plaintext); - } - return $this->_crypt($plaintext, CRYPT_RC4_ENCRYPT); - } - - /** - * Decrypts a message. - * - * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)). - * At least if the continuous buffer is disabled. - * - * @see Crypt_Base::encrypt() - * @see Crypt_RC4::_crypt() - * @access public - * @param String $ciphertext - * @return String $plaintext - */ - function decrypt($ciphertext) - { - if ($this->engine == CRYPT_MODE_MCRYPT) { - return parent::decrypt($ciphertext); - } - return $this->_crypt($ciphertext, CRYPT_RC4_DECRYPT); - } - - - /** - * Setup the key (expansion) - * - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - $key = $this->key; - $keyLength = strlen($key); - $keyStream = range(0, 255); - $j = 0; - for ($i = 0; $i < 256; $i++) { - $j = ($j + $keyStream[$i] + ord($key[$i % $keyLength])) & 255; - $temp = $keyStream[$i]; - $keyStream[$i] = $keyStream[$j]; - $keyStream[$j] = $temp; - } - - $this->stream = array(); - $this->stream[CRYPT_RC4_DECRYPT] = $this->stream[CRYPT_RC4_ENCRYPT] = array( - 0, // index $i - 0, // index $j - $keyStream - ); - } - - /** - * Encrypts or decrypts a message. - * - * @see Crypt_RC4::encrypt() - * @see Crypt_RC4::decrypt() - * @access private - * @param String $text - * @param Integer $mode - * @return String $text - */ - function _crypt($text, $mode) - { - if ($this->changed) { - $this->_setup(); - $this->changed = false; - } - - $stream = &$this->stream[$mode]; - if ($this->continuousBuffer) { - $i = &$stream[0]; - $j = &$stream[1]; - $keyStream = &$stream[2]; - } else { - $i = $stream[0]; - $j = $stream[1]; - $keyStream = $stream[2]; - } - - $len = strlen($text); - for ($k = 0; $k < $len; ++$k) { - $i = ($i + 1) & 255; - $ksi = $keyStream[$i]; - $j = ($j + $ksi) & 255; - $ksj = $keyStream[$j]; - - $keyStream[$i] = $ksj; - $keyStream[$j] = $ksi; - $text[$k] = $text[$k] ^ chr($keyStream[($ksj + $ksi) & 255]); - } - - return $text; - } -} + + * setKey('abcdefgh'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $rc4->decrypt($rc4->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_RC4 + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access private + * @see self::_crypt() + */ +define('CRYPT_RC4_ENCRYPT', 0); +define('CRYPT_RC4_DECRYPT', 1); +/**#@-*/ + +/** + * Pure-PHP implementation of RC4. + * + * @package Crypt_RC4 + * @author Jim Wigginton + * @access public + */ +class Crypt_RC4 extends Crypt_Base +{ + /** + * Block Length of the cipher + * + * RC4 is a stream cipher + * so we the block_size to 0 + * + * @see Crypt_Base::block_size + * @var int + * @access private + */ + var $block_size = 0; + + /** + * Key Length (in bytes) + * + * @see Crypt_RC4::setKeyLength() + * @var int + * @access private + */ + var $key_length = 128; // = 1024 bits + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'RC4'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'arcfour'; + + /** + * Holds whether performance-optimized $inline_crypt() can/should be used. + * + * @see Crypt_Base::inline_crypt + * @var mixed + * @access private + */ + var $use_inline_crypt = false; // currently not available + + /** + * The Key + * + * @see self::setKey() + * @var string + * @access private + */ + var $key; + + /** + * The Key Stream for decryption and encryption + * + * @see self::setKey() + * @var array + * @access private + */ + var $stream; + + /** + * Default Constructor. + * + * Determines whether or not the mcrypt extension should be used. + * + * @see Crypt_Base::Crypt_Base() + * @return Crypt_RC4 + * @access public + */ + function __construct() + { + parent::__construct(CRYPT_MODE_STREAM); + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @access public + */ + function Crypt_RC4() + { + $this->__construct(); + } + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine() + * + * @see Crypt_Base::Crypt_Base() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + if ($engine == CRYPT_ENGINE_OPENSSL) { + if (version_compare(PHP_VERSION, '5.3.7') >= 0) { + $this->cipher_name_openssl = 'rc4-40'; + } else { + switch (strlen($this->key)) { + case 5: + $this->cipher_name_openssl = 'rc4-40'; + break; + case 8: + $this->cipher_name_openssl = 'rc4-64'; + break; + case 16: + $this->cipher_name_openssl = 'rc4'; + break; + default: + return false; + } + } + } + + return parent::isValidEngine($engine); + } + + /** + * Dummy function. + * + * Some protocols, such as WEP, prepend an "initialization vector" to the key, effectively creating a new key [1]. + * If you need to use an initialization vector in this manner, feel free to prepend it to the key, yourself, before + * calling setKey(). + * + * [1] WEP's initialization vectors (IV's) are used in a somewhat insecure way. Since, in that protocol, + * the IV's are relatively easy to predict, an attack described by + * {@link http://www.drizzle.com/~aboba/IEEE/rc4_ksaproc.pdf Scott Fluhrer, Itsik Mantin, and Adi Shamir} + * can be used to quickly guess at the rest of the key. The following links elaborate: + * + * {@link http://www.rsa.com/rsalabs/node.asp?id=2009 http://www.rsa.com/rsalabs/node.asp?id=2009} + * {@link http://en.wikipedia.org/wiki/Related_key_attack http://en.wikipedia.org/wiki/Related_key_attack} + * + * @param string $iv + * @see self::setKey() + * @access public + */ + function setIV($iv) + { + } + + /** + * Sets the key length + * + * Keys can be between 1 and 256 bytes long. + * + * @access public + * @param int $length + */ + function setKeyLength($length) + { + if ($length < 8) { + $this->key_length = 1; + } elseif ($length > 2048) { + $this->key_length = 256; + } else { + $this->key_length = $length >> 3; + } + + parent::setKeyLength($length); + } + + /** + * Encrypts a message. + * + * @see Crypt_Base::decrypt() + * @see self::_crypt() + * @access public + * @param string $plaintext + * @return string $ciphertext + */ + function encrypt($plaintext) + { + if ($this->engine != CRYPT_ENGINE_INTERNAL) { + return parent::encrypt($plaintext); + } + return $this->_crypt($plaintext, CRYPT_RC4_ENCRYPT); + } + + /** + * Decrypts a message. + * + * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)). + * At least if the continuous buffer is disabled. + * + * @see Crypt_Base::encrypt() + * @see self::_crypt() + * @access public + * @param string $ciphertext + * @return string $plaintext + */ + function decrypt($ciphertext) + { + if ($this->engine != CRYPT_ENGINE_INTERNAL) { + return parent::decrypt($ciphertext); + } + return $this->_crypt($ciphertext, CRYPT_RC4_DECRYPT); + } + + + /** + * Setup the key (expansion) + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + $key = $this->key; + $keyLength = strlen($key); + $keyStream = range(0, 255); + $j = 0; + for ($i = 0; $i < 256; $i++) { + $j = ($j + $keyStream[$i] + ord($key[$i % $keyLength])) & 255; + $temp = $keyStream[$i]; + $keyStream[$i] = $keyStream[$j]; + $keyStream[$j] = $temp; + } + + $this->stream = array(); + $this->stream[CRYPT_RC4_DECRYPT] = $this->stream[CRYPT_RC4_ENCRYPT] = array( + 0, // index $i + 0, // index $j + $keyStream + ); + } + + /** + * Encrypts or decrypts a message. + * + * @see self::encrypt() + * @see self::decrypt() + * @access private + * @param string $text + * @param int $mode + * @return string $text + */ + function _crypt($text, $mode) + { + if ($this->changed) { + $this->_setup(); + $this->changed = false; + } + + $stream = &$this->stream[$mode]; + if ($this->continuousBuffer) { + $i = &$stream[0]; + $j = &$stream[1]; + $keyStream = &$stream[2]; + } else { + $i = $stream[0]; + $j = $stream[1]; + $keyStream = $stream[2]; + } + + $len = strlen($text); + for ($k = 0; $k < $len; ++$k) { + $i = ($i + 1) & 255; + $ksi = $keyStream[$i]; + $j = ($j + $ksi) & 255; + $ksj = $keyStream[$j]; + + $keyStream[$i] = $ksj; + $keyStream[$j] = $ksi; + $text[$k] = $text[$k] ^ chr($keyStream[($ksj + $ksi) & 255]); + } + + return $text; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RSA.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RSA.php old mode 100644 new mode 100755 index 53f94354f..e89826d95 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RSA.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/RSA.php @@ -1,2997 +1,3155 @@ - - * createKey()); - * - * $plaintext = 'terrafrost'; - * - * $rsa->loadKey($privatekey); - * $ciphertext = $rsa->encrypt($plaintext); - * - * $rsa->loadKey($publickey); - * echo $rsa->decrypt($ciphertext); - * ?> - * - * - * Here's an example of how to create signatures and verify signatures with this library: - * - * createKey()); - * - * $plaintext = 'terrafrost'; - * - * $rsa->loadKey($privatekey); - * $signature = $rsa->sign($plaintext); - * - * $rsa->loadKey($publickey); - * echo $rsa->verify($plaintext, $signature) ? 'verified' : 'unverified'; - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Crypt - * @package Crypt_RSA - * @author Jim Wigginton - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Random - */ -// the class_exists() will only be called if the crypt_random_string function hasn't been defined and -// will trigger a call to __autoload() if you're wanting to auto-load classes -// call function_exists() a second time to stop the include_once from being called outside -// of the auto loader -if (!function_exists('crypt_random_string')) { - include_once 'Random.php'; -} - -/** - * Include Crypt_Hash - */ -if (!class_exists('Crypt_Hash')) { - include_once 'Hash.php'; -} - -/**#@+ - * @access public - * @see Crypt_RSA::encrypt() - * @see Crypt_RSA::decrypt() - */ -/** - * Use {@link http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding Optimal Asymmetric Encryption Padding} - * (OAEP) for encryption / decryption. - * - * Uses sha1 by default. - * - * @see Crypt_RSA::setHash() - * @see Crypt_RSA::setMGFHash() - */ -define('CRYPT_RSA_ENCRYPTION_OAEP', 1); -/** - * Use PKCS#1 padding. - * - * Although CRYPT_RSA_ENCRYPTION_OAEP offers more security, including PKCS#1 padding is necessary for purposes of backwards - * compatibility with protocols (like SSH-1) written before OAEP's introduction. - */ -define('CRYPT_RSA_ENCRYPTION_PKCS1', 2); -/**#@-*/ - -/**#@+ - * @access public - * @see Crypt_RSA::sign() - * @see Crypt_RSA::verify() - * @see Crypt_RSA::setHash() - */ -/** - * Use the Probabilistic Signature Scheme for signing - * - * Uses sha1 by default. - * - * @see Crypt_RSA::setSaltLength() - * @see Crypt_RSA::setMGFHash() - */ -define('CRYPT_RSA_SIGNATURE_PSS', 1); -/** - * Use the PKCS#1 scheme by default. - * - * Although CRYPT_RSA_SIGNATURE_PSS offers more security, including PKCS#1 signing is necessary for purposes of backwards - * compatibility with protocols (like SSH-2) written before PSS's introduction. - */ -define('CRYPT_RSA_SIGNATURE_PKCS1', 2); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_RSA::createKey() - */ -/** - * ASN1 Integer - */ -define('CRYPT_RSA_ASN1_INTEGER', 2); -/** - * ASN1 Bit String - */ -define('CRYPT_RSA_ASN1_BITSTRING', 3); -/** - * ASN1 Octet String - */ -define('CRYPT_RSA_ASN1_OCTETSTRING', 4); -/** - * ASN1 Object Identifier - */ -define('CRYPT_RSA_ASN1_OBJECT', 6); -/** - * ASN1 Sequence (with the constucted bit set) - */ -define('CRYPT_RSA_ASN1_SEQUENCE', 48); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_RSA::Crypt_RSA() - */ -/** - * To use the pure-PHP implementation - */ -define('CRYPT_RSA_MODE_INTERNAL', 1); -/** - * To use the OpenSSL library - * - * (if enabled; otherwise, the internal implementation will be used) - */ -define('CRYPT_RSA_MODE_OPENSSL', 2); -/**#@-*/ - -/** - * Default openSSL configuration file. - */ -define('CRYPT_RSA_OPENSSL_CONFIG', dirname(__FILE__) . '/../openssl.cnf'); - -/**#@+ - * @access public - * @see Crypt_RSA::createKey() - * @see Crypt_RSA::setPrivateKeyFormat() - */ -/** - * PKCS#1 formatted private key - * - * Used by OpenSSH - */ -define('CRYPT_RSA_PRIVATE_FORMAT_PKCS1', 0); -/** - * PuTTY formatted private key - */ -define('CRYPT_RSA_PRIVATE_FORMAT_PUTTY', 1); -/** - * XML formatted private key - */ -define('CRYPT_RSA_PRIVATE_FORMAT_XML', 2); -/** - * PKCS#8 formatted private key - */ -define('CRYPT_RSA_PRIVATE_FORMAT_PKCS8', 3); -/**#@-*/ - -/**#@+ - * @access public - * @see Crypt_RSA::createKey() - * @see Crypt_RSA::setPublicKeyFormat() - */ -/** - * Raw public key - * - * An array containing two Math_BigInteger objects. - * - * The exponent can be indexed with any of the following: - * - * 0, e, exponent, publicExponent - * - * The modulus can be indexed with any of the following: - * - * 1, n, modulo, modulus - */ -define('CRYPT_RSA_PUBLIC_FORMAT_RAW', 3); -/** - * PKCS#1 formatted public key (raw) - * - * Used by File/X509.php - * - * Has the following header: - * - * -----BEGIN RSA PUBLIC KEY----- - * - * Analogous to ssh-keygen's pem format (as specified by -m) - */ -define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1', 4); -define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW', 4); -/** - * XML formatted public key - */ -define('CRYPT_RSA_PUBLIC_FORMAT_XML', 5); -/** - * OpenSSH formatted public key - * - * Place in $HOME/.ssh/authorized_keys - */ -define('CRYPT_RSA_PUBLIC_FORMAT_OPENSSH', 6); -/** - * PKCS#1 formatted public key (encapsulated) - * - * Used by PHP's openssl_public_encrypt() and openssl's rsautl (when -pubin is set) - * - * Has the following header: - * - * -----BEGIN PUBLIC KEY----- - * - * Analogous to ssh-keygen's pkcs8 format (as specified by -m). Although PKCS8 - * is specific to private keys it's basically creating a DER-encoded wrapper - * for keys. This just extends that same concept to public keys (much like ssh-keygen) - */ -define('CRYPT_RSA_PUBLIC_FORMAT_PKCS8', 7); -/**#@-*/ - -/** - * Pure-PHP PKCS#1 compliant implementation of RSA. - * - * @package Crypt_RSA - * @author Jim Wigginton - * @access public - */ -class Crypt_RSA -{ - /** - * Precomputed Zero - * - * @var Array - * @access private - */ - var $zero; - - /** - * Precomputed One - * - * @var Array - * @access private - */ - var $one; - - /** - * Private Key Format - * - * @var Integer - * @access private - */ - var $privateKeyFormat = CRYPT_RSA_PRIVATE_FORMAT_PKCS1; - - /** - * Public Key Format - * - * @var Integer - * @access public - */ - var $publicKeyFormat = CRYPT_RSA_PUBLIC_FORMAT_PKCS8; - - /** - * Modulus (ie. n) - * - * @var Math_BigInteger - * @access private - */ - var $modulus; - - /** - * Modulus length - * - * @var Math_BigInteger - * @access private - */ - var $k; - - /** - * Exponent (ie. e or d) - * - * @var Math_BigInteger - * @access private - */ - var $exponent; - - /** - * Primes for Chinese Remainder Theorem (ie. p and q) - * - * @var Array - * @access private - */ - var $primes; - - /** - * Exponents for Chinese Remainder Theorem (ie. dP and dQ) - * - * @var Array - * @access private - */ - var $exponents; - - /** - * Coefficients for Chinese Remainder Theorem (ie. qInv) - * - * @var Array - * @access private - */ - var $coefficients; - - /** - * Hash name - * - * @var String - * @access private - */ - var $hashName; - - /** - * Hash function - * - * @var Crypt_Hash - * @access private - */ - var $hash; - - /** - * Length of hash function output - * - * @var Integer - * @access private - */ - var $hLen; - - /** - * Length of salt - * - * @var Integer - * @access private - */ - var $sLen; - - /** - * Hash function for the Mask Generation Function - * - * @var Crypt_Hash - * @access private - */ - var $mgfHash; - - /** - * Length of MGF hash function output - * - * @var Integer - * @access private - */ - var $mgfHLen; - - /** - * Encryption mode - * - * @var Integer - * @access private - */ - var $encryptionMode = CRYPT_RSA_ENCRYPTION_OAEP; - - /** - * Signature mode - * - * @var Integer - * @access private - */ - var $signatureMode = CRYPT_RSA_SIGNATURE_PSS; - - /** - * Public Exponent - * - * @var Mixed - * @access private - */ - var $publicExponent = false; - - /** - * Password - * - * @var String - * @access private - */ - var $password = false; - - /** - * Components - * - * For use with parsing XML formatted keys. PHP's XML Parser functions use utilized - instead of PHP's DOM functions - - * because PHP's XML Parser functions work on PHP4 whereas PHP's DOM functions - although surperior - don't. - * - * @see Crypt_RSA::_start_element_handler() - * @var Array - * @access private - */ - var $components = array(); - - /** - * Current String - * - * For use with parsing XML formatted keys. - * - * @see Crypt_RSA::_character_handler() - * @see Crypt_RSA::_stop_element_handler() - * @var Mixed - * @access private - */ - var $current; - - /** - * OpenSSL configuration file name. - * - * Set to null to use system configuration file. - * @see Crypt_RSA::createKey() - * @var Mixed - * @Access public - */ - var $configFile; - - /** - * Public key comment field. - * - * @var String - * @access private - */ - var $comment = 'phpseclib-generated-key'; - - /** - * The constructor - * - * If you want to make use of the openssl extension, you'll need to set the mode manually, yourself. The reason - * Crypt_RSA doesn't do it is because OpenSSL doesn't fail gracefully. openssl_pkey_new(), in particular, requires - * openssl.cnf be present somewhere and, unfortunately, the only real way to find out is too late. - * - * @return Crypt_RSA - * @access public - */ - function Crypt_RSA() - { - if (!class_exists('Math_BigInteger')) { - include_once 'Math/BigInteger.php'; - } - - $this->configFile = CRYPT_RSA_OPENSSL_CONFIG; - - if ( !defined('CRYPT_RSA_MODE') ) { - switch (true) { - // Math/BigInteger's openssl requirements are a little less stringent than Crypt/RSA's. in particular, - // Math/BigInteger doesn't require an openssl.cfg file whereas Crypt/RSA does. so if Math/BigInteger - // can't use OpenSSL it can be pretty trivially assumed, then, that Crypt/RSA can't either. - case defined('MATH_BIGINTEGER_OPENSSL_DISABLE'): - define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); - break; - // openssl_pkey_get_details - which is used in the only place Crypt/RSA.php uses OpenSSL - was introduced in PHP 5.2.0 - case !function_exists('openssl_pkey_get_details'): - define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); - break; - case extension_loaded('openssl') && version_compare(PHP_VERSION, '4.2.0', '>=') && file_exists($this->configFile): - // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work - ob_start(); - @phpinfo(); - $content = ob_get_contents(); - ob_end_clean(); - - preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches); - - $versions = array(); - if (!empty($matches[1])) { - for ($i = 0; $i < count($matches[1]); $i++) { - $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i]))); - - // Remove letter part in OpenSSL version - if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) { - $versions[$matches[1][$i]] = $fullVersion; - } else { - $versions[$matches[1][$i]] = $m[0]; - } - } - } - - // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+ - switch (true) { - case !isset($versions['Header']): - case !isset($versions['Library']): - case $versions['Header'] == $versions['Library']: - define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_OPENSSL); - break; - default: - define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); - define('MATH_BIGINTEGER_OPENSSL_DISABLE', true); - } - break; - default: - define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); - } - } - - $this->zero = new Math_BigInteger(); - $this->one = new Math_BigInteger(1); - - $this->hash = new Crypt_Hash('sha1'); - $this->hLen = $this->hash->getLength(); - $this->hashName = 'sha1'; - $this->mgfHash = new Crypt_Hash('sha1'); - $this->mgfHLen = $this->mgfHash->getLength(); - } - - /** - * Create public / private key pair - * - * Returns an array with the following three elements: - * - 'privatekey': The private key. - * - 'publickey': The public key. - * - 'partialkey': A partially computed key (if the execution time exceeded $timeout). - * Will need to be passed back to Crypt_RSA::createKey() as the third parameter for further processing. - * - * @access public - * @param optional Integer $bits - * @param optional Integer $timeout - * @param optional Math_BigInteger $p - */ - function createKey($bits = 1024, $timeout = false, $partial = array()) - { - if (!defined('CRYPT_RSA_EXPONENT')) { - // http://en.wikipedia.org/wiki/65537_%28number%29 - define('CRYPT_RSA_EXPONENT', '65537'); - } - // per , this number ought not result in primes smaller - // than 256 bits. as a consequence if the key you're trying to create is 1024 bits and you've set CRYPT_RSA_SMALLEST_PRIME - // to 384 bits then you're going to get a 384 bit prime and a 640 bit prime (384 + 1024 % 384). at least if - // CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_INTERNAL. if CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_OPENSSL then - // CRYPT_RSA_SMALLEST_PRIME is ignored (ie. multi-prime RSA support is more intended as a way to speed up RSA key - // generation when there's a chance neither gmp nor OpenSSL are installed) - if (!defined('CRYPT_RSA_SMALLEST_PRIME')) { - define('CRYPT_RSA_SMALLEST_PRIME', 4096); - } - - // OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum - if ( CRYPT_RSA_MODE == CRYPT_RSA_MODE_OPENSSL && $bits >= 384 && CRYPT_RSA_EXPONENT == 65537) { - $config = array(); - if (isset($this->configFile)) { - $config['config'] = $this->configFile; - } - $rsa = openssl_pkey_new(array('private_key_bits' => $bits) + $config); - openssl_pkey_export($rsa, $privatekey, null, $config); - $publickey = openssl_pkey_get_details($rsa); - $publickey = $publickey['key']; - - $privatekey = call_user_func_array(array($this, '_convertPrivateKey'), array_values($this->_parseKey($privatekey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1))); - $publickey = call_user_func_array(array($this, '_convertPublicKey'), array_values($this->_parseKey($publickey, CRYPT_RSA_PUBLIC_FORMAT_PKCS1))); - - // clear the buffer of error strings stemming from a minimalistic openssl.cnf - while (openssl_error_string() !== false); - - return array( - 'privatekey' => $privatekey, - 'publickey' => $publickey, - 'partialkey' => false - ); - } - - static $e; - if (!isset($e)) { - $e = new Math_BigInteger(CRYPT_RSA_EXPONENT); - } - - extract($this->_generateMinMax($bits)); - $absoluteMin = $min; - $temp = $bits >> 1; // divide by two to see how many bits P and Q would be - if ($temp > CRYPT_RSA_SMALLEST_PRIME) { - $num_primes = floor($bits / CRYPT_RSA_SMALLEST_PRIME); - $temp = CRYPT_RSA_SMALLEST_PRIME; - } else { - $num_primes = 2; - } - extract($this->_generateMinMax($temp + $bits % $temp)); - $finalMax = $max; - extract($this->_generateMinMax($temp)); - - $generator = new Math_BigInteger(); - - $n = $this->one->copy(); - if (!empty($partial)) { - extract(unserialize($partial)); - } else { - $exponents = $coefficients = $primes = array(); - $lcm = array( - 'top' => $this->one->copy(), - 'bottom' => false - ); - } - - $start = time(); - $i0 = count($primes) + 1; - - do { - for ($i = $i0; $i <= $num_primes; $i++) { - if ($timeout !== false) { - $timeout-= time() - $start; - $start = time(); - if ($timeout <= 0) { - return array( - 'privatekey' => '', - 'publickey' => '', - 'partialkey' => serialize(array( - 'primes' => $primes, - 'coefficients' => $coefficients, - 'lcm' => $lcm, - 'exponents' => $exponents - )) - ); - } - } - - if ($i == $num_primes) { - list($min, $temp) = $absoluteMin->divide($n); - if (!$temp->equals($this->zero)) { - $min = $min->add($this->one); // ie. ceil() - } - $primes[$i] = $generator->randomPrime($min, $finalMax, $timeout); - } else { - $primes[$i] = $generator->randomPrime($min, $max, $timeout); - } - - if ($primes[$i] === false) { // if we've reached the timeout - if (count($primes) > 1) { - $partialkey = ''; - } else { - array_pop($primes); - $partialkey = serialize(array( - 'primes' => $primes, - 'coefficients' => $coefficients, - 'lcm' => $lcm, - 'exponents' => $exponents - )); - } - - return array( - 'privatekey' => '', - 'publickey' => '', - 'partialkey' => $partialkey - ); - } - - // the first coefficient is calculated differently from the rest - // ie. instead of being $primes[1]->modInverse($primes[2]), it's $primes[2]->modInverse($primes[1]) - if ($i > 2) { - $coefficients[$i] = $n->modInverse($primes[$i]); - } - - $n = $n->multiply($primes[$i]); - - $temp = $primes[$i]->subtract($this->one); - - // textbook RSA implementations use Euler's totient function instead of the least common multiple. - // see http://en.wikipedia.org/wiki/Euler%27s_totient_function - $lcm['top'] = $lcm['top']->multiply($temp); - $lcm['bottom'] = $lcm['bottom'] === false ? $temp : $lcm['bottom']->gcd($temp); - - $exponents[$i] = $e->modInverse($temp); - } - - list($temp) = $lcm['top']->divide($lcm['bottom']); - $gcd = $temp->gcd($e); - $i0 = 1; - } while (!$gcd->equals($this->one)); - - $d = $e->modInverse($temp); - - $coefficients[2] = $primes[2]->modInverse($primes[1]); - - // from : - // RSAPrivateKey ::= SEQUENCE { - // version Version, - // modulus INTEGER, -- n - // publicExponent INTEGER, -- e - // privateExponent INTEGER, -- d - // prime1 INTEGER, -- p - // prime2 INTEGER, -- q - // exponent1 INTEGER, -- d mod (p-1) - // exponent2 INTEGER, -- d mod (q-1) - // coefficient INTEGER, -- (inverse of q) mod p - // otherPrimeInfos OtherPrimeInfos OPTIONAL - // } - - return array( - 'privatekey' => $this->_convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients), - 'publickey' => $this->_convertPublicKey($n, $e), - 'partialkey' => false - ); - } - - /** - * Convert a private key to the appropriate format. - * - * @access private - * @see setPrivateKeyFormat() - * @param String $RSAPrivateKey - * @return String - */ - function _convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients) - { - $signed = $this->privateKeyFormat != CRYPT_RSA_PRIVATE_FORMAT_XML; - $num_primes = count($primes); - $raw = array( - 'version' => $num_primes == 2 ? chr(0) : chr(1), // two-prime vs. multi - 'modulus' => $n->toBytes($signed), - 'publicExponent' => $e->toBytes($signed), - 'privateExponent' => $d->toBytes($signed), - 'prime1' => $primes[1]->toBytes($signed), - 'prime2' => $primes[2]->toBytes($signed), - 'exponent1' => $exponents[1]->toBytes($signed), - 'exponent2' => $exponents[2]->toBytes($signed), - 'coefficient' => $coefficients[2]->toBytes($signed) - ); - - // if the format in question does not support multi-prime rsa and multi-prime rsa was used, - // call _convertPublicKey() instead. - switch ($this->privateKeyFormat) { - case CRYPT_RSA_PRIVATE_FORMAT_XML: - if ($num_primes != 2) { - return false; - } - return "\r\n" . - ' ' . base64_encode($raw['modulus']) . "\r\n" . - ' ' . base64_encode($raw['publicExponent']) . "\r\n" . - '

      ' . base64_encode($raw['prime1']) . "

      \r\n" . - ' ' . base64_encode($raw['prime2']) . "\r\n" . - ' ' . base64_encode($raw['exponent1']) . "\r\n" . - ' ' . base64_encode($raw['exponent2']) . "\r\n" . - ' ' . base64_encode($raw['coefficient']) . "\r\n" . - ' ' . base64_encode($raw['privateExponent']) . "\r\n" . - '
      '; - break; - case CRYPT_RSA_PRIVATE_FORMAT_PUTTY: - if ($num_primes != 2) { - return false; - } - $key = "PuTTY-User-Key-File-2: ssh-rsa\r\nEncryption: "; - $encryption = (!empty($this->password) || is_string($this->password)) ? 'aes256-cbc' : 'none'; - $key.= $encryption; - $key.= "\r\nComment: " . $this->comment . "\r\n"; - $public = pack('Na*Na*Na*', - strlen('ssh-rsa'), 'ssh-rsa', strlen($raw['publicExponent']), $raw['publicExponent'], strlen($raw['modulus']), $raw['modulus'] - ); - $source = pack('Na*Na*Na*Na*', - strlen('ssh-rsa'), 'ssh-rsa', strlen($encryption), $encryption, - strlen($this->comment), $this->comment, strlen($public), $public - ); - $public = base64_encode($public); - $key.= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n"; - $key.= chunk_split($public, 64); - $private = pack('Na*Na*Na*Na*', - strlen($raw['privateExponent']), $raw['privateExponent'], strlen($raw['prime1']), $raw['prime1'], - strlen($raw['prime2']), $raw['prime2'], strlen($raw['coefficient']), $raw['coefficient'] - ); - if (empty($this->password) && !is_string($this->password)) { - $source.= pack('Na*', strlen($private), $private); - $hashkey = 'putty-private-key-file-mac-key'; - } else { - $private.= crypt_random_string(16 - (strlen($private) & 15)); - $source.= pack('Na*', strlen($private), $private); - if (!class_exists('Crypt_AES')) { - include_once 'Crypt/AES.php'; - } - $sequence = 0; - $symkey = ''; - while (strlen($symkey) < 32) { - $temp = pack('Na*', $sequence++, $this->password); - $symkey.= pack('H*', sha1($temp)); - } - $symkey = substr($symkey, 0, 32); - $crypto = new Crypt_AES(); - - $crypto->setKey($symkey); - $crypto->disablePadding(); - $private = $crypto->encrypt($private); - $hashkey = 'putty-private-key-file-mac-key' . $this->password; - } - - $private = base64_encode($private); - $key.= 'Private-Lines: ' . ((strlen($private) + 63) >> 6) . "\r\n"; - $key.= chunk_split($private, 64); - if (!class_exists('Crypt_Hash')) { - include_once 'Crypt/Hash.php'; - } - $hash = new Crypt_Hash('sha1'); - $hash->setKey(pack('H*', sha1($hashkey))); - $key.= 'Private-MAC: ' . bin2hex($hash->hash($source)) . "\r\n"; - - return $key; - default: // eg. CRYPT_RSA_PRIVATE_FORMAT_PKCS1 - $components = array(); - foreach ($raw as $name => $value) { - $components[$name] = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($value)), $value); - } - - $RSAPrivateKey = implode('', $components); - - if ($num_primes > 2) { - $OtherPrimeInfos = ''; - for ($i = 3; $i <= $num_primes; $i++) { - // OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo - // - // OtherPrimeInfo ::= SEQUENCE { - // prime INTEGER, -- ri - // exponent INTEGER, -- di - // coefficient INTEGER -- ti - // } - $OtherPrimeInfo = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($primes[$i]->toBytes(true))), $primes[$i]->toBytes(true)); - $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($exponents[$i]->toBytes(true))), $exponents[$i]->toBytes(true)); - $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($coefficients[$i]->toBytes(true))), $coefficients[$i]->toBytes(true)); - $OtherPrimeInfos.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfo)), $OtherPrimeInfo); - } - $RSAPrivateKey.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfos)), $OtherPrimeInfos); - } - - $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); - - if ($this->privateKeyFormat == CRYPT_RSA_PRIVATE_FORMAT_PKCS8) { - $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA - $RSAPrivateKey = pack('Ca*a*Ca*a*', - CRYPT_RSA_ASN1_INTEGER, "\01\00", $rsaOID, 4, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey - ); - $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); - if (!empty($this->password) || is_string($this->password)) { - $salt = crypt_random_string(8); - $iterationCount = 2048; - - if (!class_exists('Crypt_DES')) { - include_once 'Crypt/DES.php'; - } - $crypto = new Crypt_DES(); - $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount); - $RSAPrivateKey = $crypto->encrypt($RSAPrivateKey); - - $parameters = pack('Ca*a*Ca*N', - CRYPT_RSA_ASN1_OCTETSTRING, $this->_encodeLength(strlen($salt)), $salt, - CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(4), $iterationCount - ); - $pbeWithMD5AndDES_CBC = "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03"; - - $encryptionAlgorithm = pack('Ca*a*Ca*a*', - CRYPT_RSA_ASN1_OBJECT, $this->_encodeLength(strlen($pbeWithMD5AndDES_CBC)), $pbeWithMD5AndDES_CBC, - CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($parameters)), $parameters - ); - - $RSAPrivateKey = pack('Ca*a*Ca*a*', - CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($encryptionAlgorithm)), $encryptionAlgorithm, - CRYPT_RSA_ASN1_OCTETSTRING, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey - ); - - $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); - - $RSAPrivateKey = "-----BEGIN ENCRYPTED PRIVATE KEY-----\r\n" . - chunk_split(base64_encode($RSAPrivateKey), 64) . - '-----END ENCRYPTED PRIVATE KEY-----'; - } else { - $RSAPrivateKey = "-----BEGIN PRIVATE KEY-----\r\n" . - chunk_split(base64_encode($RSAPrivateKey), 64) . - '-----END PRIVATE KEY-----'; - } - return $RSAPrivateKey; - } - - if (!empty($this->password) || is_string($this->password)) { - $iv = crypt_random_string(8); - $symkey = pack('H*', md5($this->password . $iv)); // symkey is short for symmetric key - $symkey.= substr(pack('H*', md5($symkey . $this->password . $iv)), 0, 8); - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $des = new Crypt_TripleDES(); - $des->setKey($symkey); - $des->setIV($iv); - $iv = strtoupper(bin2hex($iv)); - $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" . - "Proc-Type: 4,ENCRYPTED\r\n" . - "DEK-Info: DES-EDE3-CBC,$iv\r\n" . - "\r\n" . - chunk_split(base64_encode($des->encrypt($RSAPrivateKey)), 64) . - '-----END RSA PRIVATE KEY-----'; - } else { - $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" . - chunk_split(base64_encode($RSAPrivateKey), 64) . - '-----END RSA PRIVATE KEY-----'; - } - - return $RSAPrivateKey; - } - } - - /** - * Convert a public key to the appropriate format - * - * @access private - * @see setPublicKeyFormat() - * @param String $RSAPrivateKey - * @return String - */ - function _convertPublicKey($n, $e) - { - $signed = $this->publicKeyFormat != CRYPT_RSA_PUBLIC_FORMAT_XML; - - $modulus = $n->toBytes($signed); - $publicExponent = $e->toBytes($signed); - - switch ($this->publicKeyFormat) { - case CRYPT_RSA_PUBLIC_FORMAT_RAW: - return array('e' => $e->copy(), 'n' => $n->copy()); - case CRYPT_RSA_PUBLIC_FORMAT_XML: - return "\r\n" . - ' ' . base64_encode($modulus) . "\r\n" . - ' ' . base64_encode($publicExponent) . "\r\n" . - ''; - break; - case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: - // from : - // string "ssh-rsa" - // mpint e - // mpint n - $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus); - $RSAPublicKey = 'ssh-rsa ' . base64_encode($RSAPublicKey) . ' ' . $this->comment; - - return $RSAPublicKey; - default: // eg. CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW or CRYPT_RSA_PUBLIC_FORMAT_PKCS1 - // from : - // RSAPublicKey ::= SEQUENCE { - // modulus INTEGER, -- n - // publicExponent INTEGER -- e - // } - $components = array( - 'modulus' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($modulus)), $modulus), - 'publicExponent' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($publicExponent)), $publicExponent) - ); - - $RSAPublicKey = pack('Ca*a*a*', - CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])), - $components['modulus'], $components['publicExponent'] - ); - - if ($this->publicKeyFormat == CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW) { - $RSAPublicKey = "-----BEGIN RSA PUBLIC KEY-----\r\n" . - chunk_split(base64_encode($RSAPublicKey), 64) . - '-----END RSA PUBLIC KEY-----'; - } else { - // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption. - $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA - $RSAPublicKey = chr(0) . $RSAPublicKey; - $RSAPublicKey = chr(3) . $this->_encodeLength(strlen($RSAPublicKey)) . $RSAPublicKey; - - $RSAPublicKey = pack('Ca*a*', - CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($rsaOID . $RSAPublicKey)), $rsaOID . $RSAPublicKey - ); - - $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . - chunk_split(base64_encode($RSAPublicKey), 64) . - '-----END PUBLIC KEY-----'; - } - - return $RSAPublicKey; - } - } - - /** - * Break a public or private key down into its constituant components - * - * @access private - * @see _convertPublicKey() - * @see _convertPrivateKey() - * @param String $key - * @param Integer $type - * @return Array - */ - function _parseKey($key, $type) - { - if ($type != CRYPT_RSA_PUBLIC_FORMAT_RAW && !is_string($key)) { - return false; - } - - switch ($type) { - case CRYPT_RSA_PUBLIC_FORMAT_RAW: - if (!is_array($key)) { - return false; - } - $components = array(); - switch (true) { - case isset($key['e']): - $components['publicExponent'] = $key['e']->copy(); - break; - case isset($key['exponent']): - $components['publicExponent'] = $key['exponent']->copy(); - break; - case isset($key['publicExponent']): - $components['publicExponent'] = $key['publicExponent']->copy(); - break; - case isset($key[0]): - $components['publicExponent'] = $key[0]->copy(); - } - switch (true) { - case isset($key['n']): - $components['modulus'] = $key['n']->copy(); - break; - case isset($key['modulo']): - $components['modulus'] = $key['modulo']->copy(); - break; - case isset($key['modulus']): - $components['modulus'] = $key['modulus']->copy(); - break; - case isset($key[1]): - $components['modulus'] = $key[1]->copy(); - } - return isset($components['modulus']) && isset($components['publicExponent']) ? $components : false; - case CRYPT_RSA_PRIVATE_FORMAT_PKCS1: - case CRYPT_RSA_PRIVATE_FORMAT_PKCS8: - case CRYPT_RSA_PUBLIC_FORMAT_PKCS1: - /* Although PKCS#1 proposes a format that public and private keys can use, encrypting them is - "outside the scope" of PKCS#1. PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to - protect private keys, however, that's not what OpenSSL* does. OpenSSL protects private keys by adding - two new "fields" to the key - DEK-Info and Proc-Type. These fields are discussed here: - - http://tools.ietf.org/html/rfc1421#section-4.6.1.1 - http://tools.ietf.org/html/rfc1421#section-4.6.1.3 - - DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell. - DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation - function. As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's - own implementation. ie. the implementation *is* the standard and any bugs that may exist in that - implementation are part of the standard, as well. - - * OpenSSL is the de facto standard. It's utilized by OpenSSH and other projects */ - if (preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) { - $iv = pack('H*', trim($matches[2])); - $symkey = pack('H*', md5($this->password . substr($iv, 0, 8))); // symkey is short for symmetric key - $symkey.= pack('H*', md5($symkey . $this->password . substr($iv, 0, 8))); - // remove the Proc-Type / DEK-Info sections as they're no longer needed - $key = preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $key); - $ciphertext = $this->_extractBER($key); - if ($ciphertext === false) { - $ciphertext = $key; - } - switch ($matches[1]) { - case 'AES-256-CBC': - if (!class_exists('Crypt_AES')) { - include_once 'Crypt/AES.php'; - } - $crypto = new Crypt_AES(); - break; - case 'AES-128-CBC': - if (!class_exists('Crypt_AES')) { - include_once 'Crypt/AES.php'; - } - $symkey = substr($symkey, 0, 16); - $crypto = new Crypt_AES(); - break; - case 'DES-EDE3-CFB': - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CFB); - break; - case 'DES-EDE3-CBC': - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $symkey = substr($symkey, 0, 24); - $crypto = new Crypt_TripleDES(); - break; - case 'DES-CBC': - if (!class_exists('Crypt_DES')) { - include_once 'Crypt/DES.php'; - } - $crypto = new Crypt_DES(); - break; - default: - return false; - } - $crypto->setKey($symkey); - $crypto->setIV($iv); - $decoded = $crypto->decrypt($ciphertext); - } else { - $decoded = $this->_extractBER($key); - } - - if ($decoded !== false) { - $key = $decoded; - } - - $components = array(); - - if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { - return false; - } - if ($this->_decodeLength($key) != strlen($key)) { - return false; - } - - $tag = ord($this->_string_shift($key)); - /* intended for keys for which OpenSSL's asn1parse returns the following: - - 0:d=0 hl=4 l= 631 cons: SEQUENCE - 4:d=1 hl=2 l= 1 prim: INTEGER :00 - 7:d=1 hl=2 l= 13 cons: SEQUENCE - 9:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 20:d=2 hl=2 l= 0 prim: NULL - 22:d=1 hl=4 l= 609 prim: OCTET STRING - - ie. PKCS8 keys*/ - - if ($tag == CRYPT_RSA_ASN1_INTEGER && substr($key, 0, 3) == "\x01\x00\x30") { - $this->_string_shift($key, 3); - $tag = CRYPT_RSA_ASN1_SEQUENCE; - } - - if ($tag == CRYPT_RSA_ASN1_SEQUENCE) { - $temp = $this->_string_shift($key, $this->_decodeLength($key)); - if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_OBJECT) { - return false; - } - $length = $this->_decodeLength($temp); - switch ($this->_string_shift($temp, $length)) { - case "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01": // rsaEncryption - break; - case "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03": // pbeWithMD5AndDES-CBC - /* - PBEParameter ::= SEQUENCE { - salt OCTET STRING (SIZE(8)), - iterationCount INTEGER } - */ - if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_SEQUENCE) { - return false; - } - if ($this->_decodeLength($temp) != strlen($temp)) { - return false; - } - $this->_string_shift($temp); // assume it's an octet string - $salt = $this->_string_shift($temp, $this->_decodeLength($temp)); - if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_INTEGER) { - return false; - } - $this->_decodeLength($temp); - list(, $iterationCount) = unpack('N', str_pad($temp, 4, chr(0), STR_PAD_LEFT)); - $this->_string_shift($key); // assume it's an octet string - $length = $this->_decodeLength($key); - if (strlen($key) != $length) { - return false; - } - - if (!class_exists('Crypt_DES')) { - include_once 'Crypt/DES.php'; - } - $crypto = new Crypt_DES(); - $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount); - $key = $crypto->decrypt($key); - if ($key === false) { - return false; - } - return $this->_parseKey($key, CRYPT_RSA_PRIVATE_FORMAT_PKCS1); - default: - return false; - } - /* intended for keys for which OpenSSL's asn1parse returns the following: - - 0:d=0 hl=4 l= 290 cons: SEQUENCE - 4:d=1 hl=2 l= 13 cons: SEQUENCE - 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption - 17:d=2 hl=2 l= 0 prim: NULL - 19:d=1 hl=4 l= 271 prim: BIT STRING */ - $tag = ord($this->_string_shift($key)); // skip over the BIT STRING / OCTET STRING tag - $this->_decodeLength($key); // skip over the BIT STRING / OCTET STRING length - // "The initial octet shall encode, as an unsigned binary integer wtih bit 1 as the least significant bit, the number of - // unused bits in the final subsequent octet. The number shall be in the range zero to seven." - // -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf (section 8.6.2.2) - if ($tag == CRYPT_RSA_ASN1_BITSTRING) { - $this->_string_shift($key); - } - if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { - return false; - } - if ($this->_decodeLength($key) != strlen($key)) { - return false; - } - $tag = ord($this->_string_shift($key)); - } - if ($tag != CRYPT_RSA_ASN1_INTEGER) { - return false; - } - - $length = $this->_decodeLength($key); - $temp = $this->_string_shift($key, $length); - if (strlen($temp) != 1 || ord($temp) > 2) { - $components['modulus'] = new Math_BigInteger($temp, 256); - $this->_string_shift($key); // skip over CRYPT_RSA_ASN1_INTEGER - $length = $this->_decodeLength($key); - $components[$type == CRYPT_RSA_PUBLIC_FORMAT_PKCS1 ? 'publicExponent' : 'privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); - - return $components; - } - if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_INTEGER) { - return false; - } - $length = $this->_decodeLength($key); - $components['modulus'] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['publicExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256)); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['exponents'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256)); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($key, $length), 256)); - - if (!empty($key)) { - if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { - return false; - } - $this->_decodeLength($key); - while (!empty($key)) { - if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { - return false; - } - $this->_decodeLength($key); - $key = substr($key, 1); - $length = $this->_decodeLength($key); - $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); - $this->_string_shift($key); - $length = $this->_decodeLength($key); - $components['coefficients'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); - } - } - - return $components; - case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: - $parts = explode(' ', $key, 3); - - $key = isset($parts[1]) ? base64_decode($parts[1]) : false; - if ($key === false) { - return false; - } - - $comment = isset($parts[2]) ? $parts[2] : false; - - $cleanup = substr($key, 0, 11) == "\0\0\0\7ssh-rsa"; - - if (strlen($key) <= 4) { - return false; - } - extract(unpack('Nlength', $this->_string_shift($key, 4))); - $publicExponent = new Math_BigInteger($this->_string_shift($key, $length), -256); - if (strlen($key) <= 4) { - return false; - } - extract(unpack('Nlength', $this->_string_shift($key, 4))); - $modulus = new Math_BigInteger($this->_string_shift($key, $length), -256); - - if ($cleanup && strlen($key)) { - if (strlen($key) <= 4) { - return false; - } - extract(unpack('Nlength', $this->_string_shift($key, 4))); - $realModulus = new Math_BigInteger($this->_string_shift($key, $length), -256); - return strlen($key) ? false : array( - 'modulus' => $realModulus, - 'publicExponent' => $modulus, - 'comment' => $comment - ); - } else { - return strlen($key) ? false : array( - 'modulus' => $modulus, - 'publicExponent' => $publicExponent, - 'comment' => $comment - ); - } - // http://www.w3.org/TR/xmldsig-core/#sec-RSAKeyValue - // http://en.wikipedia.org/wiki/XML_Signature - case CRYPT_RSA_PRIVATE_FORMAT_XML: - case CRYPT_RSA_PUBLIC_FORMAT_XML: - $this->components = array(); - - $xml = xml_parser_create('UTF-8'); - xml_set_object($xml, $this); - xml_set_element_handler($xml, '_start_element_handler', '_stop_element_handler'); - xml_set_character_data_handler($xml, '_data_handler'); - // add to account for "dangling" tags like ... that are sometimes added - if (!xml_parse($xml, '' . $key . '')) { - return false; - } - - return isset($this->components['modulus']) && isset($this->components['publicExponent']) ? $this->components : false; - // from PuTTY's SSHPUBK.C - case CRYPT_RSA_PRIVATE_FORMAT_PUTTY: - $components = array(); - $key = preg_split('#\r\n|\r|\n#', $key); - $type = trim(preg_replace('#PuTTY-User-Key-File-2: (.+)#', '$1', $key[0])); - if ($type != 'ssh-rsa') { - return false; - } - $encryption = trim(preg_replace('#Encryption: (.+)#', '$1', $key[1])); - $comment = trim(preg_replace('#Comment: (.+)#', '$1', $key[2])); - - $publicLength = trim(preg_replace('#Public-Lines: (\d+)#', '$1', $key[3])); - $public = base64_decode(implode('', array_map('trim', array_slice($key, 4, $publicLength)))); - $public = substr($public, 11); - extract(unpack('Nlength', $this->_string_shift($public, 4))); - $components['publicExponent'] = new Math_BigInteger($this->_string_shift($public, $length), -256); - extract(unpack('Nlength', $this->_string_shift($public, 4))); - $components['modulus'] = new Math_BigInteger($this->_string_shift($public, $length), -256); - - $privateLength = trim(preg_replace('#Private-Lines: (\d+)#', '$1', $key[$publicLength + 4])); - $private = base64_decode(implode('', array_map('trim', array_slice($key, $publicLength + 5, $privateLength)))); - - switch ($encryption) { - case 'aes256-cbc': - if (!class_exists('Crypt_AES')) { - include_once 'Crypt/AES.php'; - } - $symkey = ''; - $sequence = 0; - while (strlen($symkey) < 32) { - $temp = pack('Na*', $sequence++, $this->password); - $symkey.= pack('H*', sha1($temp)); - } - $symkey = substr($symkey, 0, 32); - $crypto = new Crypt_AES(); - } - - if ($encryption != 'none') { - $crypto->setKey($symkey); - $crypto->disablePadding(); - $private = $crypto->decrypt($private); - if ($private === false) { - return false; - } - } - - extract(unpack('Nlength', $this->_string_shift($private, 4))); - if (strlen($private) < $length) { - return false; - } - $components['privateExponent'] = new Math_BigInteger($this->_string_shift($private, $length), -256); - extract(unpack('Nlength', $this->_string_shift($private, 4))); - if (strlen($private) < $length) { - return false; - } - $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($private, $length), -256)); - extract(unpack('Nlength', $this->_string_shift($private, 4))); - if (strlen($private) < $length) { - return false; - } - $components['primes'][] = new Math_BigInteger($this->_string_shift($private, $length), -256); - - $temp = $components['primes'][1]->subtract($this->one); - $components['exponents'] = array(1 => $components['publicExponent']->modInverse($temp)); - $temp = $components['primes'][2]->subtract($this->one); - $components['exponents'][] = $components['publicExponent']->modInverse($temp); - - extract(unpack('Nlength', $this->_string_shift($private, 4))); - if (strlen($private) < $length) { - return false; - } - $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($private, $length), -256)); - - return $components; - } - } - - /** - * Returns the key size - * - * More specifically, this returns the size of the modulo in bits. - * - * @access public - * @return Integer - */ - function getSize() - { - return !isset($this->modulus) ? 0 : strlen($this->modulus->toBits()); - } - - /** - * Start Element Handler - * - * Called by xml_set_element_handler() - * - * @access private - * @param Resource $parser - * @param String $name - * @param Array $attribs - */ - function _start_element_handler($parser, $name, $attribs) - { - //$name = strtoupper($name); - switch ($name) { - case 'MODULUS': - $this->current = &$this->components['modulus']; - break; - case 'EXPONENT': - $this->current = &$this->components['publicExponent']; - break; - case 'P': - $this->current = &$this->components['primes'][1]; - break; - case 'Q': - $this->current = &$this->components['primes'][2]; - break; - case 'DP': - $this->current = &$this->components['exponents'][1]; - break; - case 'DQ': - $this->current = &$this->components['exponents'][2]; - break; - case 'INVERSEQ': - $this->current = &$this->components['coefficients'][2]; - break; - case 'D': - $this->current = &$this->components['privateExponent']; - } - $this->current = ''; - } - - /** - * Stop Element Handler - * - * Called by xml_set_element_handler() - * - * @access private - * @param Resource $parser - * @param String $name - */ - function _stop_element_handler($parser, $name) - { - if (isset($this->current)) { - $this->current = new Math_BigInteger(base64_decode($this->current), 256); - unset($this->current); - } - } - - /** - * Data Handler - * - * Called by xml_set_character_data_handler() - * - * @access private - * @param Resource $parser - * @param String $data - */ - function _data_handler($parser, $data) - { - if (!isset($this->current) || is_object($this->current)) { - return; - } - $this->current.= trim($data); - } - - /** - * Loads a public or private key - * - * Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed) - * - * @access public - * @param String $key - * @param Integer $type optional - */ - function loadKey($key, $type = false) - { - if (is_object($key) && strtolower(get_class($key)) == 'crypt_rsa') { - $this->privateKeyFormat = $key->privateKeyFormat; - $this->publicKeyFormat = $key->publicKeyFormat; - $this->k = $key->k; - $this->hLen = $key->hLen; - $this->sLen = $key->sLen; - $this->mgfHLen = $key->mgfHLen; - $this->encryptionMode = $key->encryptionMode; - $this->signatureMode = $key->signatureMode; - $this->password = $key->password; - $this->configFile = $key->configFile; - $this->comment = $key->comment; - - if (is_object($key->hash)) { - $this->hash = new Crypt_Hash($key->hash->getHash()); - } - if (is_object($key->mgfHash)) { - $this->mgfHash = new Crypt_Hash($key->mgfHash->getHash()); - } - - if (is_object($key->modulus)) { - $this->modulus = $key->modulus->copy(); - } - if (is_object($key->exponent)) { - $this->exponent = $key->exponent->copy(); - } - if (is_object($key->publicExponent)) { - $this->publicExponent = $key->publicExponent->copy(); - } - - $this->primes = array(); - $this->exponents = array(); - $this->coefficients = array(); - - foreach ($this->primes as $prime) { - $this->primes[] = $prime->copy(); - } - foreach ($this->exponents as $exponent) { - $this->exponents[] = $exponent->copy(); - } - foreach ($this->coefficients as $coefficient) { - $this->coefficients[] = $coefficient->copy(); - } - - return true; - } - - if ($type === false) { - $types = array( - CRYPT_RSA_PUBLIC_FORMAT_RAW, - CRYPT_RSA_PRIVATE_FORMAT_PKCS1, - CRYPT_RSA_PRIVATE_FORMAT_XML, - CRYPT_RSA_PRIVATE_FORMAT_PUTTY, - CRYPT_RSA_PUBLIC_FORMAT_OPENSSH - ); - foreach ($types as $type) { - $components = $this->_parseKey($key, $type); - if ($components !== false) { - break; - } - } - - } else { - $components = $this->_parseKey($key, $type); - } - - if ($components === false) { - return false; - } - - if (isset($components['comment']) && $components['comment'] !== false) { - $this->comment = $components['comment']; - } - $this->modulus = $components['modulus']; - $this->k = strlen($this->modulus->toBytes()); - $this->exponent = isset($components['privateExponent']) ? $components['privateExponent'] : $components['publicExponent']; - if (isset($components['primes'])) { - $this->primes = $components['primes']; - $this->exponents = $components['exponents']; - $this->coefficients = $components['coefficients']; - $this->publicExponent = $components['publicExponent']; - } else { - $this->primes = array(); - $this->exponents = array(); - $this->coefficients = array(); - $this->publicExponent = false; - } - - switch ($type) { - case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: - case CRYPT_RSA_PUBLIC_FORMAT_RAW: - $this->setPublicKey(); - break; - case CRYPT_RSA_PRIVATE_FORMAT_PKCS1: - switch (true) { - case strpos($key, '-BEGIN PUBLIC KEY-') !== false: - case strpos($key, '-BEGIN RSA PUBLIC KEY-') !== false: - $this->setPublicKey(); - } - } - - return true; - } - - /** - * Sets the password - * - * Private keys can be encrypted with a password. To unset the password, pass in the empty string or false. - * Or rather, pass in $password such that empty($password) && !is_string($password) is true. - * - * @see createKey() - * @see loadKey() - * @access public - * @param String $password - */ - function setPassword($password = false) - { - $this->password = $password; - } - - /** - * Defines the public key - * - * Some private key formats define the public exponent and some don't. Those that don't define it are problematic when - * used in certain contexts. For example, in SSH-2, RSA authentication works by sending the public key along with a - * message signed by the private key to the server. The SSH-2 server looks the public key up in an index of public keys - * and if it's present then proceeds to verify the signature. Problem is, if your private key doesn't include the public - * exponent this won't work unless you manually add the public exponent. phpseclib tries to guess if the key being used - * is the public key but in the event that it guesses incorrectly you might still want to explicitly set the key as being - * public. - * - * Do note that when a new key is loaded the index will be cleared. - * - * Returns true on success, false on failure - * - * @see getPublicKey() - * @access public - * @param String $key optional - * @param Integer $type optional - * @return Boolean - */ - function setPublicKey($key = false, $type = false) - { - // if a public key has already been loaded return false - if (!empty($this->publicExponent)) { - return false; - } - - if ($key === false && !empty($this->modulus)) { - $this->publicExponent = $this->exponent; - return true; - } - - if ($type === false) { - $types = array( - CRYPT_RSA_PUBLIC_FORMAT_RAW, - CRYPT_RSA_PUBLIC_FORMAT_PKCS1, - CRYPT_RSA_PUBLIC_FORMAT_XML, - CRYPT_RSA_PUBLIC_FORMAT_OPENSSH - ); - foreach ($types as $type) { - $components = $this->_parseKey($key, $type); - if ($components !== false) { - break; - } - } - } else { - $components = $this->_parseKey($key, $type); - } - - if ($components === false) { - return false; - } - - if (empty($this->modulus) || !$this->modulus->equals($components['modulus'])) { - $this->modulus = $components['modulus']; - $this->exponent = $this->publicExponent = $components['publicExponent']; - return true; - } - - $this->publicExponent = $components['publicExponent']; - - return true; - } - - /** - * Defines the private key - * - * If phpseclib guessed a private key was a public key and loaded it as such it might be desirable to force - * phpseclib to treat the key as a private key. This function will do that. - * - * Do note that when a new key is loaded the index will be cleared. - * - * Returns true on success, false on failure - * - * @see getPublicKey() - * @access public - * @param String $key optional - * @param Integer $type optional - * @return Boolean - */ - function setPrivateKey($key = false, $type = false) - { - if ($key === false && !empty($this->publicExponent)) { - unset($this->publicExponent); - return true; - } - - $rsa = new Crypt_RSA(); - if (!$rsa->loadKey($key, $type)) { - return false; - } - unset($rsa->publicExponent); - - // don't overwrite the old key if the new key is invalid - $this->loadKey($rsa); - return true; - } - - /** - * Returns the public key - * - * The public key is only returned under two circumstances - if the private key had the public key embedded within it - * or if the public key was set via setPublicKey(). If the currently loaded key is supposed to be the public key this - * function won't return it since this library, for the most part, doesn't distinguish between public and private keys. - * - * @see getPublicKey() - * @access public - * @param String $key - * @param Integer $type optional - */ - function getPublicKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS8) - { - if (empty($this->modulus) || empty($this->publicExponent)) { - return false; - } - - $oldFormat = $this->publicKeyFormat; - $this->publicKeyFormat = $type; - $temp = $this->_convertPublicKey($this->modulus, $this->publicExponent); - $this->publicKeyFormat = $oldFormat; - return $temp; - } - - /** - * Returns the private key - * - * The private key is only returned if the currently loaded key contains the constituent prime numbers. - * - * @see getPublicKey() - * @access public - * @param String $key - * @param Integer $type optional - */ - function getPrivateKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS1) - { - if (empty($this->primes)) { - return false; - } - - $oldFormat = $this->privateKeyFormat; - $this->privateKeyFormat = $type; - $temp = $this->_convertPrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients); - $this->privateKeyFormat = $oldFormat; - return $temp; - } - - /** - * Returns a minimalistic private key - * - * Returns the private key without the prime number constituants. Structurally identical to a public key that - * hasn't been set as the public key - * - * @see getPrivateKey() - * @access private - * @param String $key - * @param Integer $type optional - */ - function _getPrivatePublicKey($mode = CRYPT_RSA_PUBLIC_FORMAT_PKCS8) - { - if (empty($this->modulus) || empty($this->exponent)) { - return false; - } - - $oldFormat = $this->publicKeyFormat; - $this->publicKeyFormat = $mode; - $temp = $this->_convertPublicKey($this->modulus, $this->exponent); - $this->publicKeyFormat = $oldFormat; - return $temp; - } - - /** - * __toString() magic method - * - * @access public - */ - function __toString() - { - $key = $this->getPrivateKey($this->privateKeyFormat); - if ($key !== false) { - return $key; - } - $key = $this->_getPrivatePublicKey($this->publicKeyFormat); - return $key !== false ? $key : ''; - } - - /** - * __clone() magic method - * - * @access public - */ - function __clone() - { - $key = new Crypt_RSA(); - $key->loadKey($this); - return $key; - } - - /** - * Generates the smallest and largest numbers requiring $bits bits - * - * @access private - * @param Integer $bits - * @return Array - */ - function _generateMinMax($bits) - { - $bytes = $bits >> 3; - $min = str_repeat(chr(0), $bytes); - $max = str_repeat(chr(0xFF), $bytes); - $msb = $bits & 7; - if ($msb) { - $min = chr(1 << ($msb - 1)) . $min; - $max = chr((1 << $msb) - 1) . $max; - } else { - $min[0] = chr(0x80); - } - - return array( - 'min' => new Math_BigInteger($min, 256), - 'max' => new Math_BigInteger($max, 256) - ); - } - - /** - * DER-decode the length - * - * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See - * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. - * - * @access private - * @param String $string - * @return Integer - */ - function _decodeLength(&$string) - { - $length = ord($this->_string_shift($string)); - if ( $length & 0x80 ) { // definite length, long form - $length&= 0x7F; - $temp = $this->_string_shift($string, $length); - list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4)); - } - return $length; - } - - /** - * DER-encode the length - * - * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See - * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. - * - * @access private - * @param Integer $length - * @return String - */ - function _encodeLength($length) - { - if ($length <= 0x7F) { - return chr($length); - } - - $temp = ltrim(pack('N', $length), chr(0)); - return pack('Ca*', 0x80 | strlen($temp), $temp); - } - - /** - * String Shift - * - * Inspired by array_shift - * - * @param String $string - * @param optional Integer $index - * @return String - * @access private - */ - function _string_shift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } - - /** - * Determines the private key format - * - * @see createKey() - * @access public - * @param Integer $format - */ - function setPrivateKeyFormat($format) - { - $this->privateKeyFormat = $format; - } - - /** - * Determines the public key format - * - * @see createKey() - * @access public - * @param Integer $format - */ - function setPublicKeyFormat($format) - { - $this->publicKeyFormat = $format; - } - - /** - * Determines which hashing function should be used - * - * Used with signature production / verification and (if the encryption mode is CRYPT_RSA_ENCRYPTION_OAEP) encryption and - * decryption. If $hash isn't supported, sha1 is used. - * - * @access public - * @param String $hash - */ - function setHash($hash) - { - // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. - switch ($hash) { - case 'md2': - case 'md5': - case 'sha1': - case 'sha256': - case 'sha384': - case 'sha512': - $this->hash = new Crypt_Hash($hash); - $this->hashName = $hash; - break; - default: - $this->hash = new Crypt_Hash('sha1'); - $this->hashName = 'sha1'; - } - $this->hLen = $this->hash->getLength(); - } - - /** - * Determines which hashing function should be used for the mask generation function - * - * The mask generation function is used by CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_SIGNATURE_PSS and although it's - * best if Hash and MGFHash are set to the same thing this is not a requirement. - * - * @access public - * @param String $hash - */ - function setMGFHash($hash) - { - // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. - switch ($hash) { - case 'md2': - case 'md5': - case 'sha1': - case 'sha256': - case 'sha384': - case 'sha512': - $this->mgfHash = new Crypt_Hash($hash); - break; - default: - $this->mgfHash = new Crypt_Hash('sha1'); - } - $this->mgfHLen = $this->mgfHash->getLength(); - } - - /** - * Determines the salt length - * - * To quote from {@link http://tools.ietf.org/html/rfc3447#page-38 RFC3447#page-38}: - * - * Typical salt lengths in octets are hLen (the length of the output - * of the hash function Hash) and 0. - * - * @access public - * @param Integer $format - */ - function setSaltLength($sLen) - { - $this->sLen = $sLen; - } - - /** - * Integer-to-Octet-String primitive - * - * See {@link http://tools.ietf.org/html/rfc3447#section-4.1 RFC3447#section-4.1}. - * - * @access private - * @param Math_BigInteger $x - * @param Integer $xLen - * @return String - */ - function _i2osp($x, $xLen) - { - $x = $x->toBytes(); - if (strlen($x) > $xLen) { - user_error('Integer too large'); - return false; - } - return str_pad($x, $xLen, chr(0), STR_PAD_LEFT); - } - - /** - * Octet-String-to-Integer primitive - * - * See {@link http://tools.ietf.org/html/rfc3447#section-4.2 RFC3447#section-4.2}. - * - * @access private - * @param String $x - * @return Math_BigInteger - */ - function _os2ip($x) - { - return new Math_BigInteger($x, 256); - } - - /** - * Exponentiate with or without Chinese Remainder Theorem - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.2}. - * - * @access private - * @param Math_BigInteger $x - * @return Math_BigInteger - */ - function _exponentiate($x) - { - if (empty($this->primes) || empty($this->coefficients) || empty($this->exponents)) { - return $x->modPow($this->exponent, $this->modulus); - } - - $num_primes = count($this->primes); - - if (defined('CRYPT_RSA_DISABLE_BLINDING')) { - $m_i = array( - 1 => $x->modPow($this->exponents[1], $this->primes[1]), - 2 => $x->modPow($this->exponents[2], $this->primes[2]) - ); - $h = $m_i[1]->subtract($m_i[2]); - $h = $h->multiply($this->coefficients[2]); - list(, $h) = $h->divide($this->primes[1]); - $m = $m_i[2]->add($h->multiply($this->primes[2])); - - $r = $this->primes[1]; - for ($i = 3; $i <= $num_primes; $i++) { - $m_i = $x->modPow($this->exponents[$i], $this->primes[$i]); - - $r = $r->multiply($this->primes[$i - 1]); - - $h = $m_i->subtract($m); - $h = $h->multiply($this->coefficients[$i]); - list(, $h) = $h->divide($this->primes[$i]); - - $m = $m->add($r->multiply($h)); - } - } else { - $smallest = $this->primes[1]; - for ($i = 2; $i <= $num_primes; $i++) { - if ($smallest->compare($this->primes[$i]) > 0) { - $smallest = $this->primes[$i]; - } - } - - $one = new Math_BigInteger(1); - - $r = $one->random($one, $smallest->subtract($one)); - - $m_i = array( - 1 => $this->_blind($x, $r, 1), - 2 => $this->_blind($x, $r, 2) - ); - $h = $m_i[1]->subtract($m_i[2]); - $h = $h->multiply($this->coefficients[2]); - list(, $h) = $h->divide($this->primes[1]); - $m = $m_i[2]->add($h->multiply($this->primes[2])); - - $r = $this->primes[1]; - for ($i = 3; $i <= $num_primes; $i++) { - $m_i = $this->_blind($x, $r, $i); - - $r = $r->multiply($this->primes[$i - 1]); - - $h = $m_i->subtract($m); - $h = $h->multiply($this->coefficients[$i]); - list(, $h) = $h->divide($this->primes[$i]); - - $m = $m->add($r->multiply($h)); - } - } - - return $m; - } - - /** - * Performs RSA Blinding - * - * Protects against timing attacks by employing RSA Blinding. - * Returns $x->modPow($this->exponents[$i], $this->primes[$i]) - * - * @access private - * @param Math_BigInteger $x - * @param Math_BigInteger $r - * @param Integer $i - * @return Math_BigInteger - */ - function _blind($x, $r, $i) - { - $x = $x->multiply($r->modPow($this->publicExponent, $this->primes[$i])); - $x = $x->modPow($this->exponents[$i], $this->primes[$i]); - - $r = $r->modInverse($this->primes[$i]); - $x = $x->multiply($r); - list(, $x) = $x->divide($this->primes[$i]); - - return $x; - } - - /** - * Performs blinded RSA equality testing - * - * Protects against a particular type of timing attack described. - * - * See {@link http://codahale.com/a-lesson-in-timing-attacks/ A Lesson In Timing Attacks (or, Don't use MessageDigest.isEquals)} - * - * Thanks for the heads up singpolyma! - * - * @access private - * @param String $x - * @param String $y - * @return Boolean - */ - function _equals($x, $y) - { - if (strlen($x) != strlen($y)) { - return false; - } - - $result = 0; - for ($i = 0; $i < strlen($x); $i++) { - $result |= ord($x[$i]) ^ ord($y[$i]); - } - - return $result == 0; - } - - /** - * RSAEP - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.1}. - * - * @access private - * @param Math_BigInteger $m - * @return Math_BigInteger - */ - function _rsaep($m) - { - if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) { - user_error('Message representative out of range'); - return false; - } - return $this->_exponentiate($m); - } - - /** - * RSADP - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.2 RFC3447#section-5.1.2}. - * - * @access private - * @param Math_BigInteger $c - * @return Math_BigInteger - */ - function _rsadp($c) - { - if ($c->compare($this->zero) < 0 || $c->compare($this->modulus) > 0) { - user_error('Ciphertext representative out of range'); - return false; - } - return $this->_exponentiate($c); - } - - /** - * RSASP1 - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.1 RFC3447#section-5.2.1}. - * - * @access private - * @param Math_BigInteger $m - * @return Math_BigInteger - */ - function _rsasp1($m) - { - if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) { - user_error('Message representative out of range'); - return false; - } - return $this->_exponentiate($m); - } - - /** - * RSAVP1 - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.2 RFC3447#section-5.2.2}. - * - * @access private - * @param Math_BigInteger $s - * @return Math_BigInteger - */ - function _rsavp1($s) - { - if ($s->compare($this->zero) < 0 || $s->compare($this->modulus) > 0) { - user_error('Signature representative out of range'); - return false; - } - return $this->_exponentiate($s); - } - - /** - * MGF1 - * - * See {@link http://tools.ietf.org/html/rfc3447#appendix-B.2.1 RFC3447#appendix-B.2.1}. - * - * @access private - * @param String $mgfSeed - * @param Integer $mgfLen - * @return String - */ - function _mgf1($mgfSeed, $maskLen) - { - // if $maskLen would yield strings larger than 4GB, PKCS#1 suggests a "Mask too long" error be output. - - $t = ''; - $count = ceil($maskLen / $this->mgfHLen); - for ($i = 0; $i < $count; $i++) { - $c = pack('N', $i); - $t.= $this->mgfHash->hash($mgfSeed . $c); - } - - return substr($t, 0, $maskLen); - } - - /** - * RSAES-OAEP-ENCRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.1 RFC3447#section-7.1.1} and - * {http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding OAES}. - * - * @access private - * @param String $m - * @param String $l - * @return String - */ - function _rsaes_oaep_encrypt($m, $l = '') - { - $mLen = strlen($m); - - // Length checking - - // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - - if ($mLen > $this->k - 2 * $this->hLen - 2) { - user_error('Message too long'); - return false; - } - - // EME-OAEP encoding - - $lHash = $this->hash->hash($l); - $ps = str_repeat(chr(0), $this->k - $mLen - 2 * $this->hLen - 2); - $db = $lHash . $ps . chr(1) . $m; - $seed = crypt_random_string($this->hLen); - $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1); - $maskedDB = $db ^ $dbMask; - $seedMask = $this->_mgf1($maskedDB, $this->hLen); - $maskedSeed = $seed ^ $seedMask; - $em = chr(0) . $maskedSeed . $maskedDB; - - // RSA encryption - - $m = $this->_os2ip($em); - $c = $this->_rsaep($m); - $c = $this->_i2osp($c, $this->k); - - // Output the ciphertext C - - return $c; - } - - /** - * RSAES-OAEP-DECRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.2 RFC3447#section-7.1.2}. The fact that the error - * messages aren't distinguishable from one another hinders debugging, but, to quote from RFC3447#section-7.1.2: - * - * Note. Care must be taken to ensure that an opponent cannot - * distinguish the different error conditions in Step 3.g, whether by - * error message or timing, or, more generally, learn partial - * information about the encoded message EM. Otherwise an opponent may - * be able to obtain useful information about the decryption of the - * ciphertext C, leading to a chosen-ciphertext attack such as the one - * observed by Manger [36]. - * - * As for $l... to quote from {@link http://tools.ietf.org/html/rfc3447#page-17 RFC3447#page-17}: - * - * Both the encryption and the decryption operations of RSAES-OAEP take - * the value of a label L as input. In this version of PKCS #1, L is - * the empty string; other uses of the label are outside the scope of - * this document. - * - * @access private - * @param String $c - * @param String $l - * @return String - */ - function _rsaes_oaep_decrypt($c, $l = '') - { - // Length checking - - // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - - if (strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) { - user_error('Decryption error'); - return false; - } - - // RSA decryption - - $c = $this->_os2ip($c); - $m = $this->_rsadp($c); - if ($m === false) { - user_error('Decryption error'); - return false; - } - $em = $this->_i2osp($m, $this->k); - - // EME-OAEP decoding - - $lHash = $this->hash->hash($l); - $y = ord($em[0]); - $maskedSeed = substr($em, 1, $this->hLen); - $maskedDB = substr($em, $this->hLen + 1); - $seedMask = $this->_mgf1($maskedDB, $this->hLen); - $seed = $maskedSeed ^ $seedMask; - $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1); - $db = $maskedDB ^ $dbMask; - $lHash2 = substr($db, 0, $this->hLen); - $m = substr($db, $this->hLen); - if ($lHash != $lHash2) { - user_error('Decryption error'); - return false; - } - $m = ltrim($m, chr(0)); - if (ord($m[0]) != 1) { - user_error('Decryption error'); - return false; - } - - // Output the message M - - return substr($m, 1); - } - - /** - * RSAES-PKCS1-V1_5-ENCRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.1 RFC3447#section-7.2.1}. - * - * @access private - * @param String $m - * @return String - */ - function _rsaes_pkcs1_v1_5_encrypt($m) - { - $mLen = strlen($m); - - // Length checking - - if ($mLen > $this->k - 11) { - user_error('Message too long'); - return false; - } - - // EME-PKCS1-v1_5 encoding - - $psLen = $this->k - $mLen - 3; - $ps = ''; - while (strlen($ps) != $psLen) { - $temp = crypt_random_string($psLen - strlen($ps)); - $temp = str_replace("\x00", '', $temp); - $ps.= $temp; - } - $type = 2; - // see the comments of _rsaes_pkcs1_v1_5_decrypt() to understand why this is being done - if (defined('CRYPT_RSA_PKCS15_COMPAT') && (!isset($this->publicExponent) || $this->exponent !== $this->publicExponent)) { - $type = 1; - // "The padding string PS shall consist of k-3-||D|| octets. ... for block type 01, they shall have value FF" - $ps = str_repeat("\xFF", $psLen); - } - $em = chr(0) . chr($type) . $ps . chr(0) . $m; - - // RSA encryption - $m = $this->_os2ip($em); - $c = $this->_rsaep($m); - $c = $this->_i2osp($c, $this->k); - - // Output the ciphertext C - - return $c; - } - - /** - * RSAES-PKCS1-V1_5-DECRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.2 RFC3447#section-7.2.2}. - * - * For compatibility purposes, this function departs slightly from the description given in RFC3447. - * The reason being that RFC2313#section-8.1 (PKCS#1 v1.5) states that ciphertext's encrypted by the - * private key should have the second byte set to either 0 or 1 and that ciphertext's encrypted by the - * public key should have the second byte set to 2. In RFC3447 (PKCS#1 v2.1), the second byte is supposed - * to be 2 regardless of which key is used. For compatibility purposes, we'll just check to make sure the - * second byte is 2 or less. If it is, we'll accept the decrypted string as valid. - * - * As a consequence of this, a private key encrypted ciphertext produced with Crypt_RSA may not decrypt - * with a strictly PKCS#1 v1.5 compliant RSA implementation. Public key encrypted ciphertext's should but - * not private key encrypted ciphertext's. - * - * @access private - * @param String $c - * @return String - */ - function _rsaes_pkcs1_v1_5_decrypt($c) - { - // Length checking - - if (strlen($c) != $this->k) { // or if k < 11 - user_error('Decryption error'); - return false; - } - - // RSA decryption - - $c = $this->_os2ip($c); - $m = $this->_rsadp($c); - - if ($m === false) { - user_error('Decryption error'); - return false; - } - $em = $this->_i2osp($m, $this->k); - - // EME-PKCS1-v1_5 decoding - - if (ord($em[0]) != 0 || ord($em[1]) > 2) { - user_error('Decryption error'); - return false; - } - - $ps = substr($em, 2, strpos($em, chr(0), 2) - 2); - $m = substr($em, strlen($ps) + 3); - - if (strlen($ps) < 8) { - user_error('Decryption error'); - return false; - } - - // Output M - - return $m; - } - - /** - * EMSA-PSS-ENCODE - * - * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.1 RFC3447#section-9.1.1}. - * - * @access private - * @param String $m - * @param Integer $emBits - */ - function _emsa_pss_encode($m, $emBits) - { - // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - - $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8) - $sLen = $this->sLen == false ? $this->hLen : $this->sLen; - - $mHash = $this->hash->hash($m); - if ($emLen < $this->hLen + $sLen + 2) { - user_error('Encoding error'); - return false; - } - - $salt = crypt_random_string($sLen); - $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; - $h = $this->hash->hash($m2); - $ps = str_repeat(chr(0), $emLen - $sLen - $this->hLen - 2); - $db = $ps . chr(1) . $salt; - $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1); - $maskedDB = $db ^ $dbMask; - $maskedDB[0] = ~chr(0xFF << ($emBits & 7)) & $maskedDB[0]; - $em = $maskedDB . $h . chr(0xBC); - - return $em; - } - - /** - * EMSA-PSS-VERIFY - * - * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.2 RFC3447#section-9.1.2}. - * - * @access private - * @param String $m - * @param String $em - * @param Integer $emBits - * @return String - */ - function _emsa_pss_verify($m, $em, $emBits) - { - // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - - $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8); - $sLen = $this->sLen == false ? $this->hLen : $this->sLen; - - $mHash = $this->hash->hash($m); - if ($emLen < $this->hLen + $sLen + 2) { - return false; - } - - if ($em[strlen($em) - 1] != chr(0xBC)) { - return false; - } - - $maskedDB = substr($em, 0, -$this->hLen - 1); - $h = substr($em, -$this->hLen - 1, $this->hLen); - $temp = chr(0xFF << ($emBits & 7)); - if ((~$maskedDB[0] & $temp) != $temp) { - return false; - } - $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1); - $db = $maskedDB ^ $dbMask; - $db[0] = ~chr(0xFF << ($emBits & 7)) & $db[0]; - $temp = $emLen - $this->hLen - $sLen - 2; - if (substr($db, 0, $temp) != str_repeat(chr(0), $temp) || ord($db[$temp]) != 1) { - return false; - } - $salt = substr($db, $temp + 1); // should be $sLen long - $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; - $h2 = $this->hash->hash($m2); - return $this->_equals($h, $h2); - } - - /** - * RSASSA-PSS-SIGN - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.1 RFC3447#section-8.1.1}. - * - * @access private - * @param String $m - * @return String - */ - function _rsassa_pss_sign($m) - { - // EMSA-PSS encoding - - $em = $this->_emsa_pss_encode($m, 8 * $this->k - 1); - - // RSA signature - - $m = $this->_os2ip($em); - $s = $this->_rsasp1($m); - $s = $this->_i2osp($s, $this->k); - - // Output the signature S - - return $s; - } - - /** - * RSASSA-PSS-VERIFY - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.2 RFC3447#section-8.1.2}. - * - * @access private - * @param String $m - * @param String $s - * @return String - */ - function _rsassa_pss_verify($m, $s) - { - // Length checking - - if (strlen($s) != $this->k) { - user_error('Invalid signature'); - return false; - } - - // RSA verification - - $modBits = 8 * $this->k; - - $s2 = $this->_os2ip($s); - $m2 = $this->_rsavp1($s2); - if ($m2 === false) { - user_error('Invalid signature'); - return false; - } - $em = $this->_i2osp($m2, $modBits >> 3); - if ($em === false) { - user_error('Invalid signature'); - return false; - } - - // EMSA-PSS verification - - return $this->_emsa_pss_verify($m, $em, $modBits - 1); - } - - /** - * EMSA-PKCS1-V1_5-ENCODE - * - * See {@link http://tools.ietf.org/html/rfc3447#section-9.2 RFC3447#section-9.2}. - * - * @access private - * @param String $m - * @param Integer $emLen - * @return String - */ - function _emsa_pkcs1_v1_5_encode($m, $emLen) - { - $h = $this->hash->hash($m); - if ($h === false) { - return false; - } - - // see http://tools.ietf.org/html/rfc3447#page-43 - switch ($this->hashName) { - case 'md2': - $t = pack('H*', '3020300c06082a864886f70d020205000410'); - break; - case 'md5': - $t = pack('H*', '3020300c06082a864886f70d020505000410'); - break; - case 'sha1': - $t = pack('H*', '3021300906052b0e03021a05000414'); - break; - case 'sha256': - $t = pack('H*', '3031300d060960864801650304020105000420'); - break; - case 'sha384': - $t = pack('H*', '3041300d060960864801650304020205000430'); - break; - case 'sha512': - $t = pack('H*', '3051300d060960864801650304020305000440'); - } - $t.= $h; - $tLen = strlen($t); - - if ($emLen < $tLen + 11) { - user_error('Intended encoded message length too short'); - return false; - } - - $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3); - - $em = "\0\1$ps\0$t"; - - return $em; - } - - /** - * RSASSA-PKCS1-V1_5-SIGN - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.1 RFC3447#section-8.2.1}. - * - * @access private - * @param String $m - * @return String - */ - function _rsassa_pkcs1_v1_5_sign($m) - { - // EMSA-PKCS1-v1_5 encoding - - $em = $this->_emsa_pkcs1_v1_5_encode($m, $this->k); - if ($em === false) { - user_error('RSA modulus too short'); - return false; - } - - // RSA signature - - $m = $this->_os2ip($em); - $s = $this->_rsasp1($m); - $s = $this->_i2osp($s, $this->k); - - // Output the signature S - - return $s; - } - - /** - * RSASSA-PKCS1-V1_5-VERIFY - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.2 RFC3447#section-8.2.2}. - * - * @access private - * @param String $m - * @return String - */ - function _rsassa_pkcs1_v1_5_verify($m, $s) - { - // Length checking - - if (strlen($s) != $this->k) { - user_error('Invalid signature'); - return false; - } - - // RSA verification - - $s = $this->_os2ip($s); - $m2 = $this->_rsavp1($s); - if ($m2 === false) { - user_error('Invalid signature'); - return false; - } - $em = $this->_i2osp($m2, $this->k); - if ($em === false) { - user_error('Invalid signature'); - return false; - } - - // EMSA-PKCS1-v1_5 encoding - - $em2 = $this->_emsa_pkcs1_v1_5_encode($m, $this->k); - if ($em2 === false) { - user_error('RSA modulus too short'); - return false; - } - - // Compare - return $this->_equals($em, $em2); - } - - /** - * Set Encryption Mode - * - * Valid values include CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1. - * - * @access public - * @param Integer $mode - */ - function setEncryptionMode($mode) - { - $this->encryptionMode = $mode; - } - - /** - * Set Signature Mode - * - * Valid values include CRYPT_RSA_SIGNATURE_PSS and CRYPT_RSA_SIGNATURE_PKCS1 - * - * @access public - * @param Integer $mode - */ - function setSignatureMode($mode) - { - $this->signatureMode = $mode; - } - - /** - * Set public key comment. - * - * @access public - * @param String $comment - */ - function setComment($comment) - { - $this->comment = $comment; - } - - /** - * Get public key comment. - * - * @access public - * @return String - */ - function getComment() - { - return $this->comment; - } - - /** - * Encryption - * - * Both CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1 both place limits on how long $plaintext can be. - * If $plaintext exceeds those limits it will be broken up so that it does and the resultant ciphertext's will - * be concatenated together. - * - * @see decrypt() - * @access public - * @param String $plaintext - * @return String - */ - function encrypt($plaintext) - { - switch ($this->encryptionMode) { - case CRYPT_RSA_ENCRYPTION_PKCS1: - $length = $this->k - 11; - if ($length <= 0) { - return false; - } - - $plaintext = str_split($plaintext, $length); - $ciphertext = ''; - foreach ($plaintext as $m) { - $ciphertext.= $this->_rsaes_pkcs1_v1_5_encrypt($m); - } - return $ciphertext; - //case CRYPT_RSA_ENCRYPTION_OAEP: - default: - $length = $this->k - 2 * $this->hLen - 2; - if ($length <= 0) { - return false; - } - - $plaintext = str_split($plaintext, $length); - $ciphertext = ''; - foreach ($plaintext as $m) { - $ciphertext.= $this->_rsaes_oaep_encrypt($m); - } - return $ciphertext; - } - } - - /** - * Decryption - * - * @see encrypt() - * @access public - * @param String $plaintext - * @return String - */ - function decrypt($ciphertext) - { - if ($this->k <= 0) { - return false; - } - - $ciphertext = str_split($ciphertext, $this->k); - $ciphertext[count($ciphertext) - 1] = str_pad($ciphertext[count($ciphertext) - 1], $this->k, chr(0), STR_PAD_LEFT); - - $plaintext = ''; - - switch ($this->encryptionMode) { - case CRYPT_RSA_ENCRYPTION_PKCS1: - $decrypt = '_rsaes_pkcs1_v1_5_decrypt'; - break; - //case CRYPT_RSA_ENCRYPTION_OAEP: - default: - $decrypt = '_rsaes_oaep_decrypt'; - } - - foreach ($ciphertext as $c) { - $temp = $this->$decrypt($c); - if ($temp === false) { - return false; - } - $plaintext.= $temp; - } - - return $plaintext; - } - - /** - * Create a signature - * - * @see verify() - * @access public - * @param String $message - * @return String - */ - function sign($message) - { - if (empty($this->modulus) || empty($this->exponent)) { - return false; - } - - switch ($this->signatureMode) { - case CRYPT_RSA_SIGNATURE_PKCS1: - return $this->_rsassa_pkcs1_v1_5_sign($message); - //case CRYPT_RSA_SIGNATURE_PSS: - default: - return $this->_rsassa_pss_sign($message); - } - } - - /** - * Verifies a signature - * - * @see sign() - * @access public - * @param String $message - * @param String $signature - * @return Boolean - */ - function verify($message, $signature) - { - if (empty($this->modulus) || empty($this->exponent)) { - return false; - } - - switch ($this->signatureMode) { - case CRYPT_RSA_SIGNATURE_PKCS1: - return $this->_rsassa_pkcs1_v1_5_verify($message, $signature); - //case CRYPT_RSA_SIGNATURE_PSS: - default: - return $this->_rsassa_pss_verify($message, $signature); - } - } - - /** - * Extract raw BER from Base64 encoding - * - * @access private - * @param String $str - * @return String - */ - function _extractBER($str) - { - /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them - * above and beyond the ceritificate. - * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line: - * - * Bag Attributes - * localKeyID: 01 00 00 00 - * subject=/O=organization/OU=org unit/CN=common name - * issuer=/O=organization/CN=common name - */ - $temp = preg_replace('#.*?^-+[^-]+-+#ms', '', $str, 1); - // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff - $temp = preg_replace('#-+[^-]+-+#', '', $temp); - // remove new lines - $temp = str_replace(array("\r", "\n", ' '), '', $temp); - $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; - return $temp != false ? $temp : $str; - } -} + + * createKey()); + * + * $plaintext = 'terrafrost'; + * + * $rsa->loadKey($privatekey); + * $ciphertext = $rsa->encrypt($plaintext); + * + * $rsa->loadKey($publickey); + * echo $rsa->decrypt($ciphertext); + * ?> + * + * + * Here's an example of how to create signatures and verify signatures with this library: + * + * createKey()); + * + * $plaintext = 'terrafrost'; + * + * $rsa->loadKey($privatekey); + * $signature = $rsa->sign($plaintext); + * + * $rsa->loadKey($publickey); + * echo $rsa->verify($plaintext, $signature) ? 'verified' : 'unverified'; + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_RSA + * @author Jim Wigginton + * @copyright 2009 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Random + */ +// the class_exists() will only be called if the crypt_random_string function hasn't been defined and +// will trigger a call to __autoload() if you're wanting to auto-load classes +// call function_exists() a second time to stop the include_once from being called outside +// of the auto loader +if (!function_exists('crypt_random_string')) { + include_once 'Random.php'; +} + +/** + * Include Crypt_Hash + */ +if (!class_exists('Crypt_Hash')) { + include_once 'Hash.php'; +} + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Use {@link http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding Optimal Asymmetric Encryption Padding} + * (OAEP) for encryption / decryption. + * + * Uses sha1 by default. + * + * @see self::setHash() + * @see self::setMGFHash() + */ +define('CRYPT_RSA_ENCRYPTION_OAEP', 1); +/** + * Use PKCS#1 padding. + * + * Although CRYPT_RSA_ENCRYPTION_OAEP offers more security, including PKCS#1 padding is necessary for purposes of backwards + * compatibility with protocols (like SSH-1) written before OAEP's introduction. + */ +define('CRYPT_RSA_ENCRYPTION_PKCS1', 2); +/** + * Do not use any padding + * + * Although this method is not recommended it can none-the-less sometimes be useful if you're trying to decrypt some legacy + * stuff, if you're trying to diagnose why an encrypted message isn't decrypting, etc. + */ +define('CRYPT_RSA_ENCRYPTION_NONE', 3); +/**#@-*/ + +/**#@+ + * @access public + * @see self::sign() + * @see self::verify() + * @see self::setHash() + */ +/** + * Use the Probabilistic Signature Scheme for signing + * + * Uses sha1 by default. + * + * @see self::setSaltLength() + * @see self::setMGFHash() + */ +define('CRYPT_RSA_SIGNATURE_PSS', 1); +/** + * Use the PKCS#1 scheme by default. + * + * Although CRYPT_RSA_SIGNATURE_PSS offers more security, including PKCS#1 signing is necessary for purposes of backwards + * compatibility with protocols (like SSH-2) written before PSS's introduction. + */ +define('CRYPT_RSA_SIGNATURE_PKCS1', 2); +/**#@-*/ + +/**#@+ + * @access private + * @see self::createKey() + */ +/** + * ASN1 Integer + */ +define('CRYPT_RSA_ASN1_INTEGER', 2); +/** + * ASN1 Bit String + */ +define('CRYPT_RSA_ASN1_BITSTRING', 3); +/** + * ASN1 Octet String + */ +define('CRYPT_RSA_ASN1_OCTETSTRING', 4); +/** + * ASN1 Object Identifier + */ +define('CRYPT_RSA_ASN1_OBJECT', 6); +/** + * ASN1 Sequence (with the constucted bit set) + */ +define('CRYPT_RSA_ASN1_SEQUENCE', 48); +/**#@-*/ + +/**#@+ + * @access private + * @see self::Crypt_RSA() + */ +/** + * To use the pure-PHP implementation + */ +define('CRYPT_RSA_MODE_INTERNAL', 1); +/** + * To use the OpenSSL library + * + * (if enabled; otherwise, the internal implementation will be used) + */ +define('CRYPT_RSA_MODE_OPENSSL', 2); +/**#@-*/ + +/** + * Default openSSL configuration file. + */ +define('CRYPT_RSA_OPENSSL_CONFIG', dirname(__FILE__) . '/../openssl.cnf'); + +/**#@+ + * @access public + * @see self::createKey() + * @see self::setPrivateKeyFormat() + */ +/** + * PKCS#1 formatted private key + * + * Used by OpenSSH + */ +define('CRYPT_RSA_PRIVATE_FORMAT_PKCS1', 0); +/** + * PuTTY formatted private key + */ +define('CRYPT_RSA_PRIVATE_FORMAT_PUTTY', 1); +/** + * XML formatted private key + */ +define('CRYPT_RSA_PRIVATE_FORMAT_XML', 2); +/** + * PKCS#8 formatted private key + */ +define('CRYPT_RSA_PRIVATE_FORMAT_PKCS8', 8); +/**#@-*/ + +/**#@+ + * @access public + * @see self::createKey() + * @see self::setPublicKeyFormat() + */ +/** + * Raw public key + * + * An array containing two Math_BigInteger objects. + * + * The exponent can be indexed with any of the following: + * + * 0, e, exponent, publicExponent + * + * The modulus can be indexed with any of the following: + * + * 1, n, modulo, modulus + */ +define('CRYPT_RSA_PUBLIC_FORMAT_RAW', 3); +/** + * PKCS#1 formatted public key (raw) + * + * Used by File/X509.php + * + * Has the following header: + * + * -----BEGIN RSA PUBLIC KEY----- + * + * Analogous to ssh-keygen's pem format (as specified by -m) + */ +define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1', 4); +define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW', 4); +/** + * XML formatted public key + */ +define('CRYPT_RSA_PUBLIC_FORMAT_XML', 5); +/** + * OpenSSH formatted public key + * + * Place in $HOME/.ssh/authorized_keys + */ +define('CRYPT_RSA_PUBLIC_FORMAT_OPENSSH', 6); +/** + * PKCS#1 formatted public key (encapsulated) + * + * Used by PHP's openssl_public_encrypt() and openssl's rsautl (when -pubin is set) + * + * Has the following header: + * + * -----BEGIN PUBLIC KEY----- + * + * Analogous to ssh-keygen's pkcs8 format (as specified by -m). Although PKCS8 + * is specific to private keys it's basically creating a DER-encoded wrapper + * for keys. This just extends that same concept to public keys (much like ssh-keygen) + */ +define('CRYPT_RSA_PUBLIC_FORMAT_PKCS8', 7); +/**#@-*/ + +/** + * Pure-PHP PKCS#1 compliant implementation of RSA. + * + * @package Crypt_RSA + * @author Jim Wigginton + * @access public + */ +class Crypt_RSA +{ + /** + * Precomputed Zero + * + * @var Math_BigInteger + * @access private + */ + var $zero; + + /** + * Precomputed One + * + * @var Math_BigInteger + * @access private + */ + var $one; + + /** + * Private Key Format + * + * @var int + * @access private + */ + var $privateKeyFormat = CRYPT_RSA_PRIVATE_FORMAT_PKCS1; + + /** + * Public Key Format + * + * @var int + * @access public + */ + var $publicKeyFormat = CRYPT_RSA_PUBLIC_FORMAT_PKCS8; + + /** + * Modulus (ie. n) + * + * @var Math_BigInteger + * @access private + */ + var $modulus; + + /** + * Modulus length + * + * @var Math_BigInteger + * @access private + */ + var $k; + + /** + * Exponent (ie. e or d) + * + * @var Math_BigInteger + * @access private + */ + var $exponent; + + /** + * Primes for Chinese Remainder Theorem (ie. p and q) + * + * @var array + * @access private + */ + var $primes; + + /** + * Exponents for Chinese Remainder Theorem (ie. dP and dQ) + * + * @var array + * @access private + */ + var $exponents; + + /** + * Coefficients for Chinese Remainder Theorem (ie. qInv) + * + * @var array + * @access private + */ + var $coefficients; + + /** + * Hash name + * + * @var string + * @access private + */ + var $hashName; + + /** + * Hash function + * + * @var Crypt_Hash + * @access private + */ + var $hash; + + /** + * Length of hash function output + * + * @var int + * @access private + */ + var $hLen; + + /** + * Length of salt + * + * @var int + * @access private + */ + var $sLen; + + /** + * Hash function for the Mask Generation Function + * + * @var Crypt_Hash + * @access private + */ + var $mgfHash; + + /** + * Length of MGF hash function output + * + * @var int + * @access private + */ + var $mgfHLen; + + /** + * Encryption mode + * + * @var int + * @access private + */ + var $encryptionMode = CRYPT_RSA_ENCRYPTION_OAEP; + + /** + * Signature mode + * + * @var int + * @access private + */ + var $signatureMode = CRYPT_RSA_SIGNATURE_PSS; + + /** + * Public Exponent + * + * @var mixed + * @access private + */ + var $publicExponent = false; + + /** + * Password + * + * @var string + * @access private + */ + var $password = false; + + /** + * Components + * + * For use with parsing XML formatted keys. PHP's XML Parser functions use utilized - instead of PHP's DOM functions - + * because PHP's XML Parser functions work on PHP4 whereas PHP's DOM functions - although surperior - don't. + * + * @see self::_start_element_handler() + * @var array + * @access private + */ + var $components = array(); + + /** + * Current String + * + * For use with parsing XML formatted keys. + * + * @see self::_character_handler() + * @see self::_stop_element_handler() + * @var mixed + * @access private + */ + var $current; + + /** + * OpenSSL configuration file name. + * + * Set to null to use system configuration file. + * @see self::createKey() + * @var mixed + * @Access public + */ + var $configFile; + + /** + * Public key comment field. + * + * @var string + * @access private + */ + var $comment = 'phpseclib-generated-key'; + + /** + * The constructor + * + * If you want to make use of the openssl extension, you'll need to set the mode manually, yourself. The reason + * Crypt_RSA doesn't do it is because OpenSSL doesn't fail gracefully. openssl_pkey_new(), in particular, requires + * openssl.cnf be present somewhere and, unfortunately, the only real way to find out is too late. + * + * @return Crypt_RSA + * @access public + */ + function __construct() + { + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + + $this->configFile = CRYPT_RSA_OPENSSL_CONFIG; + + if (!defined('CRYPT_RSA_MODE')) { + switch (true) { + // Math/BigInteger's openssl requirements are a little less stringent than Crypt/RSA's. in particular, + // Math/BigInteger doesn't require an openssl.cfg file whereas Crypt/RSA does. so if Math/BigInteger + // can't use OpenSSL it can be pretty trivially assumed, then, that Crypt/RSA can't either. + case defined('MATH_BIGINTEGER_OPENSSL_DISABLE'): + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + break; + // openssl_pkey_get_details - which is used in the only place Crypt/RSA.php uses OpenSSL - was introduced in PHP 5.2.0 + case !function_exists('openssl_pkey_get_details'): + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + break; + case extension_loaded('openssl') && version_compare(PHP_VERSION, '4.2.0', '>=') && file_exists($this->configFile): + // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work + ob_start(); + @phpinfo(); + $content = ob_get_contents(); + ob_end_clean(); + + preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches); + + $versions = array(); + if (!empty($matches[1])) { + for ($i = 0; $i < count($matches[1]); $i++) { + $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i]))); + + // Remove letter part in OpenSSL version + if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) { + $versions[$matches[1][$i]] = $fullVersion; + } else { + $versions[$matches[1][$i]] = $m[0]; + } + } + } + + // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+ + switch (true) { + case !isset($versions['Header']): + case !isset($versions['Library']): + case $versions['Header'] == $versions['Library']: + case version_compare($versions['Header'], '1.0.0') >= 0 && version_compare($versions['Library'], '1.0.0') >= 0: + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_OPENSSL); + break; + default: + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + define('MATH_BIGINTEGER_OPENSSL_DISABLE', true); + } + break; + default: + define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL); + } + } + + $this->zero = new Math_BigInteger(); + $this->one = new Math_BigInteger(1); + + $this->hash = new Crypt_Hash('sha1'); + $this->hLen = $this->hash->getLength(); + $this->hashName = 'sha1'; + $this->mgfHash = new Crypt_Hash('sha1'); + $this->mgfHLen = $this->mgfHash->getLength(); + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @access public + */ + function Crypt_RSA() + { + $this->__construct(); + } + + /** + * Create public / private key pair + * + * Returns an array with the following three elements: + * - 'privatekey': The private key. + * - 'publickey': The public key. + * - 'partialkey': A partially computed key (if the execution time exceeded $timeout). + * Will need to be passed back to Crypt_RSA::createKey() as the third parameter for further processing. + * + * @access public + * @param int $bits + * @param int $timeout + * @param Math_BigInteger $p + */ + function createKey($bits = 1024, $timeout = false, $partial = array()) + { + if (!defined('CRYPT_RSA_EXPONENT')) { + // http://en.wikipedia.org/wiki/65537_%28number%29 + define('CRYPT_RSA_EXPONENT', '65537'); + } + // per , this number ought not result in primes smaller + // than 256 bits. as a consequence if the key you're trying to create is 1024 bits and you've set CRYPT_RSA_SMALLEST_PRIME + // to 384 bits then you're going to get a 384 bit prime and a 640 bit prime (384 + 1024 % 384). at least if + // CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_INTERNAL. if CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_OPENSSL then + // CRYPT_RSA_SMALLEST_PRIME is ignored (ie. multi-prime RSA support is more intended as a way to speed up RSA key + // generation when there's a chance neither gmp nor OpenSSL are installed) + if (!defined('CRYPT_RSA_SMALLEST_PRIME')) { + define('CRYPT_RSA_SMALLEST_PRIME', 4096); + } + + // OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum + if (CRYPT_RSA_MODE == CRYPT_RSA_MODE_OPENSSL && $bits >= 384 && CRYPT_RSA_EXPONENT == 65537) { + $config = array(); + if (isset($this->configFile)) { + $config['config'] = $this->configFile; + } + $rsa = openssl_pkey_new(array('private_key_bits' => $bits) + $config); + openssl_pkey_export($rsa, $privatekey, null, $config); + $publickey = openssl_pkey_get_details($rsa); + $publickey = $publickey['key']; + + $privatekey = call_user_func_array(array($this, '_convertPrivateKey'), array_values($this->_parseKey($privatekey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1))); + $publickey = call_user_func_array(array($this, '_convertPublicKey'), array_values($this->_parseKey($publickey, CRYPT_RSA_PUBLIC_FORMAT_PKCS1))); + + // clear the buffer of error strings stemming from a minimalistic openssl.cnf + while (openssl_error_string() !== false) { + } + + return array( + 'privatekey' => $privatekey, + 'publickey' => $publickey, + 'partialkey' => false + ); + } + + static $e; + if (!isset($e)) { + $e = new Math_BigInteger(CRYPT_RSA_EXPONENT); + } + + extract($this->_generateMinMax($bits)); + $absoluteMin = $min; + $temp = $bits >> 1; // divide by two to see how many bits P and Q would be + if ($temp > CRYPT_RSA_SMALLEST_PRIME) { + $num_primes = floor($bits / CRYPT_RSA_SMALLEST_PRIME); + $temp = CRYPT_RSA_SMALLEST_PRIME; + } else { + $num_primes = 2; + } + extract($this->_generateMinMax($temp + $bits % $temp)); + $finalMax = $max; + extract($this->_generateMinMax($temp)); + + $generator = new Math_BigInteger(); + + $n = $this->one->copy(); + if (!empty($partial)) { + extract(unserialize($partial)); + } else { + $exponents = $coefficients = $primes = array(); + $lcm = array( + 'top' => $this->one->copy(), + 'bottom' => false + ); + } + + $start = time(); + $i0 = count($primes) + 1; + + do { + for ($i = $i0; $i <= $num_primes; $i++) { + if ($timeout !== false) { + $timeout-= time() - $start; + $start = time(); + if ($timeout <= 0) { + return array( + 'privatekey' => '', + 'publickey' => '', + 'partialkey' => serialize(array( + 'primes' => $primes, + 'coefficients' => $coefficients, + 'lcm' => $lcm, + 'exponents' => $exponents + )) + ); + } + } + + if ($i == $num_primes) { + list($min, $temp) = $absoluteMin->divide($n); + if (!$temp->equals($this->zero)) { + $min = $min->add($this->one); // ie. ceil() + } + $primes[$i] = $generator->randomPrime($min, $finalMax, $timeout); + } else { + $primes[$i] = $generator->randomPrime($min, $max, $timeout); + } + + if ($primes[$i] === false) { // if we've reached the timeout + if (count($primes) > 1) { + $partialkey = ''; + } else { + array_pop($primes); + $partialkey = serialize(array( + 'primes' => $primes, + 'coefficients' => $coefficients, + 'lcm' => $lcm, + 'exponents' => $exponents + )); + } + + return array( + 'privatekey' => '', + 'publickey' => '', + 'partialkey' => $partialkey + ); + } + + // the first coefficient is calculated differently from the rest + // ie. instead of being $primes[1]->modInverse($primes[2]), it's $primes[2]->modInverse($primes[1]) + if ($i > 2) { + $coefficients[$i] = $n->modInverse($primes[$i]); + } + + $n = $n->multiply($primes[$i]); + + $temp = $primes[$i]->subtract($this->one); + + // textbook RSA implementations use Euler's totient function instead of the least common multiple. + // see http://en.wikipedia.org/wiki/Euler%27s_totient_function + $lcm['top'] = $lcm['top']->multiply($temp); + $lcm['bottom'] = $lcm['bottom'] === false ? $temp : $lcm['bottom']->gcd($temp); + + $exponents[$i] = $e->modInverse($temp); + } + + list($temp) = $lcm['top']->divide($lcm['bottom']); + $gcd = $temp->gcd($e); + $i0 = 1; + } while (!$gcd->equals($this->one)); + + $d = $e->modInverse($temp); + + $coefficients[2] = $primes[2]->modInverse($primes[1]); + + // from : + // RSAPrivateKey ::= SEQUENCE { + // version Version, + // modulus INTEGER, -- n + // publicExponent INTEGER, -- e + // privateExponent INTEGER, -- d + // prime1 INTEGER, -- p + // prime2 INTEGER, -- q + // exponent1 INTEGER, -- d mod (p-1) + // exponent2 INTEGER, -- d mod (q-1) + // coefficient INTEGER, -- (inverse of q) mod p + // otherPrimeInfos OtherPrimeInfos OPTIONAL + // } + + return array( + 'privatekey' => $this->_convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients), + 'publickey' => $this->_convertPublicKey($n, $e), + 'partialkey' => false + ); + } + + /** + * Convert a private key to the appropriate format. + * + * @access private + * @see self::setPrivateKeyFormat() + * @param string $RSAPrivateKey + * @return string + */ + function _convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients) + { + $signed = $this->privateKeyFormat != CRYPT_RSA_PRIVATE_FORMAT_XML; + $num_primes = count($primes); + $raw = array( + 'version' => $num_primes == 2 ? chr(0) : chr(1), // two-prime vs. multi + 'modulus' => $n->toBytes($signed), + 'publicExponent' => $e->toBytes($signed), + 'privateExponent' => $d->toBytes($signed), + 'prime1' => $primes[1]->toBytes($signed), + 'prime2' => $primes[2]->toBytes($signed), + 'exponent1' => $exponents[1]->toBytes($signed), + 'exponent2' => $exponents[2]->toBytes($signed), + 'coefficient' => $coefficients[2]->toBytes($signed) + ); + + // if the format in question does not support multi-prime rsa and multi-prime rsa was used, + // call _convertPublicKey() instead. + switch ($this->privateKeyFormat) { + case CRYPT_RSA_PRIVATE_FORMAT_XML: + if ($num_primes != 2) { + return false; + } + return "\r\n" . + ' ' . base64_encode($raw['modulus']) . "\r\n" . + ' ' . base64_encode($raw['publicExponent']) . "\r\n" . + '

      ' . base64_encode($raw['prime1']) . "

      \r\n" . + ' ' . base64_encode($raw['prime2']) . "\r\n" . + ' ' . base64_encode($raw['exponent1']) . "\r\n" . + ' ' . base64_encode($raw['exponent2']) . "\r\n" . + ' ' . base64_encode($raw['coefficient']) . "\r\n" . + ' ' . base64_encode($raw['privateExponent']) . "\r\n" . + '
      '; + break; + case CRYPT_RSA_PRIVATE_FORMAT_PUTTY: + if ($num_primes != 2) { + return false; + } + $key = "PuTTY-User-Key-File-2: ssh-rsa\r\nEncryption: "; + $encryption = (!empty($this->password) || is_string($this->password)) ? 'aes256-cbc' : 'none'; + $key.= $encryption; + $key.= "\r\nComment: " . $this->comment . "\r\n"; + $public = pack( + 'Na*Na*Na*', + strlen('ssh-rsa'), + 'ssh-rsa', + strlen($raw['publicExponent']), + $raw['publicExponent'], + strlen($raw['modulus']), + $raw['modulus'] + ); + $source = pack( + 'Na*Na*Na*Na*', + strlen('ssh-rsa'), + 'ssh-rsa', + strlen($encryption), + $encryption, + strlen($this->comment), + $this->comment, + strlen($public), + $public + ); + $public = base64_encode($public); + $key.= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n"; + $key.= chunk_split($public, 64); + $private = pack( + 'Na*Na*Na*Na*', + strlen($raw['privateExponent']), + $raw['privateExponent'], + strlen($raw['prime1']), + $raw['prime1'], + strlen($raw['prime2']), + $raw['prime2'], + strlen($raw['coefficient']), + $raw['coefficient'] + ); + if (empty($this->password) && !is_string($this->password)) { + $source.= pack('Na*', strlen($private), $private); + $hashkey = 'putty-private-key-file-mac-key'; + } else { + $private.= crypt_random_string(16 - (strlen($private) & 15)); + $source.= pack('Na*', strlen($private), $private); + if (!class_exists('Crypt_AES')) { + include_once 'Crypt/AES.php'; + } + $sequence = 0; + $symkey = ''; + while (strlen($symkey) < 32) { + $temp = pack('Na*', $sequence++, $this->password); + $symkey.= pack('H*', sha1($temp)); + } + $symkey = substr($symkey, 0, 32); + $crypto = new Crypt_AES(); + + $crypto->setKey($symkey); + $crypto->disablePadding(); + $private = $crypto->encrypt($private); + $hashkey = 'putty-private-key-file-mac-key' . $this->password; + } + + $private = base64_encode($private); + $key.= 'Private-Lines: ' . ((strlen($private) + 63) >> 6) . "\r\n"; + $key.= chunk_split($private, 64); + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $hash = new Crypt_Hash('sha1'); + $hash->setKey(pack('H*', sha1($hashkey))); + $key.= 'Private-MAC: ' . bin2hex($hash->hash($source)) . "\r\n"; + + return $key; + default: // eg. CRYPT_RSA_PRIVATE_FORMAT_PKCS1 + $components = array(); + foreach ($raw as $name => $value) { + $components[$name] = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($value)), $value); + } + + $RSAPrivateKey = implode('', $components); + + if ($num_primes > 2) { + $OtherPrimeInfos = ''; + for ($i = 3; $i <= $num_primes; $i++) { + // OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo + // + // OtherPrimeInfo ::= SEQUENCE { + // prime INTEGER, -- ri + // exponent INTEGER, -- di + // coefficient INTEGER -- ti + // } + $OtherPrimeInfo = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($primes[$i]->toBytes(true))), $primes[$i]->toBytes(true)); + $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($exponents[$i]->toBytes(true))), $exponents[$i]->toBytes(true)); + $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($coefficients[$i]->toBytes(true))), $coefficients[$i]->toBytes(true)); + $OtherPrimeInfos.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfo)), $OtherPrimeInfo); + } + $RSAPrivateKey.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfos)), $OtherPrimeInfos); + } + + $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); + + if ($this->privateKeyFormat == CRYPT_RSA_PRIVATE_FORMAT_PKCS8) { + $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $RSAPrivateKey = pack( + 'Ca*a*Ca*a*', + CRYPT_RSA_ASN1_INTEGER, + "\01\00", + $rsaOID, + 4, + $this->_encodeLength(strlen($RSAPrivateKey)), + $RSAPrivateKey + ); + $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); + if (!empty($this->password) || is_string($this->password)) { + $salt = crypt_random_string(8); + $iterationCount = 2048; + + if (!class_exists('Crypt_DES')) { + include_once 'Crypt/DES.php'; + } + $crypto = new Crypt_DES(); + $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount); + $RSAPrivateKey = $crypto->encrypt($RSAPrivateKey); + + $parameters = pack( + 'Ca*a*Ca*N', + CRYPT_RSA_ASN1_OCTETSTRING, + $this->_encodeLength(strlen($salt)), + $salt, + CRYPT_RSA_ASN1_INTEGER, + $this->_encodeLength(4), + $iterationCount + ); + $pbeWithMD5AndDES_CBC = "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03"; + + $encryptionAlgorithm = pack( + 'Ca*a*Ca*a*', + CRYPT_RSA_ASN1_OBJECT, + $this->_encodeLength(strlen($pbeWithMD5AndDES_CBC)), + $pbeWithMD5AndDES_CBC, + CRYPT_RSA_ASN1_SEQUENCE, + $this->_encodeLength(strlen($parameters)), + $parameters + ); + + $RSAPrivateKey = pack( + 'Ca*a*Ca*a*', + CRYPT_RSA_ASN1_SEQUENCE, + $this->_encodeLength(strlen($encryptionAlgorithm)), + $encryptionAlgorithm, + CRYPT_RSA_ASN1_OCTETSTRING, + $this->_encodeLength(strlen($RSAPrivateKey)), + $RSAPrivateKey + ); + + $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey); + + $RSAPrivateKey = "-----BEGIN ENCRYPTED PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($RSAPrivateKey), 64) . + '-----END ENCRYPTED PRIVATE KEY-----'; + } else { + $RSAPrivateKey = "-----BEGIN PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($RSAPrivateKey), 64) . + '-----END PRIVATE KEY-----'; + } + return $RSAPrivateKey; + } + + if (!empty($this->password) || is_string($this->password)) { + $iv = crypt_random_string(8); + $symkey = pack('H*', md5($this->password . $iv)); // symkey is short for symmetric key + $symkey.= substr(pack('H*', md5($symkey . $this->password . $iv)), 0, 8); + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $des = new Crypt_TripleDES(); + $des->setKey($symkey); + $des->setIV($iv); + $iv = strtoupper(bin2hex($iv)); + $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" . + "Proc-Type: 4,ENCRYPTED\r\n" . + "DEK-Info: DES-EDE3-CBC,$iv\r\n" . + "\r\n" . + chunk_split(base64_encode($des->encrypt($RSAPrivateKey)), 64) . + '-----END RSA PRIVATE KEY-----'; + } else { + $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" . + chunk_split(base64_encode($RSAPrivateKey), 64) . + '-----END RSA PRIVATE KEY-----'; + } + + return $RSAPrivateKey; + } + } + + /** + * Convert a public key to the appropriate format + * + * @access private + * @see self::setPublicKeyFormat() + * @param string $RSAPrivateKey + * @return string + */ + function _convertPublicKey($n, $e) + { + $signed = $this->publicKeyFormat != CRYPT_RSA_PUBLIC_FORMAT_XML; + + $modulus = $n->toBytes($signed); + $publicExponent = $e->toBytes($signed); + + switch ($this->publicKeyFormat) { + case CRYPT_RSA_PUBLIC_FORMAT_RAW: + return array('e' => $e->copy(), 'n' => $n->copy()); + case CRYPT_RSA_PUBLIC_FORMAT_XML: + return "\r\n" . + ' ' . base64_encode($modulus) . "\r\n" . + ' ' . base64_encode($publicExponent) . "\r\n" . + ''; + break; + case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: + // from : + // string "ssh-rsa" + // mpint e + // mpint n + $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus); + $RSAPublicKey = 'ssh-rsa ' . base64_encode($RSAPublicKey) . ' ' . $this->comment; + + return $RSAPublicKey; + default: // eg. CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW or CRYPT_RSA_PUBLIC_FORMAT_PKCS1 + // from : + // RSAPublicKey ::= SEQUENCE { + // modulus INTEGER, -- n + // publicExponent INTEGER -- e + // } + $components = array( + 'modulus' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($modulus)), $modulus), + 'publicExponent' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($publicExponent)), $publicExponent) + ); + + $RSAPublicKey = pack( + 'Ca*a*a*', + CRYPT_RSA_ASN1_SEQUENCE, + $this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])), + $components['modulus'], + $components['publicExponent'] + ); + + if ($this->publicKeyFormat == CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW) { + $RSAPublicKey = "-----BEGIN RSA PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($RSAPublicKey), 64) . + '-----END RSA PUBLIC KEY-----'; + } else { + // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption. + $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $RSAPublicKey = chr(0) . $RSAPublicKey; + $RSAPublicKey = chr(3) . $this->_encodeLength(strlen($RSAPublicKey)) . $RSAPublicKey; + + $RSAPublicKey = pack( + 'Ca*a*', + CRYPT_RSA_ASN1_SEQUENCE, + $this->_encodeLength(strlen($rsaOID . $RSAPublicKey)), + $rsaOID . $RSAPublicKey + ); + + $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($RSAPublicKey), 64) . + '-----END PUBLIC KEY-----'; + } + + return $RSAPublicKey; + } + } + + /** + * Break a public or private key down into its constituant components + * + * @access private + * @see self::_convertPublicKey() + * @see self::_convertPrivateKey() + * @param string $key + * @param int $type + * @return array + */ + function _parseKey($key, $type) + { + if ($type != CRYPT_RSA_PUBLIC_FORMAT_RAW && !is_string($key)) { + return false; + } + + switch ($type) { + case CRYPT_RSA_PUBLIC_FORMAT_RAW: + if (!is_array($key)) { + return false; + } + $components = array(); + switch (true) { + case isset($key['e']): + $components['publicExponent'] = $key['e']->copy(); + break; + case isset($key['exponent']): + $components['publicExponent'] = $key['exponent']->copy(); + break; + case isset($key['publicExponent']): + $components['publicExponent'] = $key['publicExponent']->copy(); + break; + case isset($key[0]): + $components['publicExponent'] = $key[0]->copy(); + } + switch (true) { + case isset($key['n']): + $components['modulus'] = $key['n']->copy(); + break; + case isset($key['modulo']): + $components['modulus'] = $key['modulo']->copy(); + break; + case isset($key['modulus']): + $components['modulus'] = $key['modulus']->copy(); + break; + case isset($key[1]): + $components['modulus'] = $key[1]->copy(); + } + return isset($components['modulus']) && isset($components['publicExponent']) ? $components : false; + case CRYPT_RSA_PRIVATE_FORMAT_PKCS1: + case CRYPT_RSA_PRIVATE_FORMAT_PKCS8: + case CRYPT_RSA_PUBLIC_FORMAT_PKCS1: + /* Although PKCS#1 proposes a format that public and private keys can use, encrypting them is + "outside the scope" of PKCS#1. PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to + protect private keys, however, that's not what OpenSSL* does. OpenSSL protects private keys by adding + two new "fields" to the key - DEK-Info and Proc-Type. These fields are discussed here: + + http://tools.ietf.org/html/rfc1421#section-4.6.1.1 + http://tools.ietf.org/html/rfc1421#section-4.6.1.3 + + DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell. + DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation + function. As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's + own implementation. ie. the implementation *is* the standard and any bugs that may exist in that + implementation are part of the standard, as well. + + * OpenSSL is the de facto standard. It's utilized by OpenSSH and other projects */ + if (preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) { + $iv = pack('H*', trim($matches[2])); + $symkey = pack('H*', md5($this->password . substr($iv, 0, 8))); // symkey is short for symmetric key + $symkey.= pack('H*', md5($symkey . $this->password . substr($iv, 0, 8))); + // remove the Proc-Type / DEK-Info sections as they're no longer needed + $key = preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $key); + $ciphertext = $this->_extractBER($key); + if ($ciphertext === false) { + $ciphertext = $key; + } + switch ($matches[1]) { + case 'AES-256-CBC': + if (!class_exists('Crypt_AES')) { + include_once 'Crypt/AES.php'; + } + $crypto = new Crypt_AES(); + break; + case 'AES-128-CBC': + if (!class_exists('Crypt_AES')) { + include_once 'Crypt/AES.php'; + } + $symkey = substr($symkey, 0, 16); + $crypto = new Crypt_AES(); + break; + case 'DES-EDE3-CFB': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CFB); + break; + case 'DES-EDE3-CBC': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $symkey = substr($symkey, 0, 24); + $crypto = new Crypt_TripleDES(); + break; + case 'DES-CBC': + if (!class_exists('Crypt_DES')) { + include_once 'Crypt/DES.php'; + } + $crypto = new Crypt_DES(); + break; + default: + return false; + } + $crypto->setKey($symkey); + $crypto->setIV($iv); + $decoded = $crypto->decrypt($ciphertext); + } else { + $decoded = $this->_extractBER($key); + } + + if ($decoded !== false) { + $key = $decoded; + } + + $components = array(); + + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + if ($this->_decodeLength($key) != strlen($key)) { + return false; + } + + $tag = ord($this->_string_shift($key)); + /* intended for keys for which OpenSSL's asn1parse returns the following: + + 0:d=0 hl=4 l= 631 cons: SEQUENCE + 4:d=1 hl=2 l= 1 prim: INTEGER :00 + 7:d=1 hl=2 l= 13 cons: SEQUENCE + 9:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption + 20:d=2 hl=2 l= 0 prim: NULL + 22:d=1 hl=4 l= 609 prim: OCTET STRING + + ie. PKCS8 keys*/ + + if ($tag == CRYPT_RSA_ASN1_INTEGER && substr($key, 0, 3) == "\x01\x00\x30") { + $this->_string_shift($key, 3); + $tag = CRYPT_RSA_ASN1_SEQUENCE; + } + + if ($tag == CRYPT_RSA_ASN1_SEQUENCE) { + $temp = $this->_string_shift($key, $this->_decodeLength($key)); + if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_OBJECT) { + return false; + } + $length = $this->_decodeLength($temp); + switch ($this->_string_shift($temp, $length)) { + case "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01": // rsaEncryption + break; + case "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03": // pbeWithMD5AndDES-CBC + /* + PBEParameter ::= SEQUENCE { + salt OCTET STRING (SIZE(8)), + iterationCount INTEGER } + */ + if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + if ($this->_decodeLength($temp) != strlen($temp)) { + return false; + } + $this->_string_shift($temp); // assume it's an octet string + $salt = $this->_string_shift($temp, $this->_decodeLength($temp)); + if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_INTEGER) { + return false; + } + $this->_decodeLength($temp); + list(, $iterationCount) = unpack('N', str_pad($temp, 4, chr(0), STR_PAD_LEFT)); + $this->_string_shift($key); // assume it's an octet string + $length = $this->_decodeLength($key); + if (strlen($key) != $length) { + return false; + } + + if (!class_exists('Crypt_DES')) { + include_once 'Crypt/DES.php'; + } + $crypto = new Crypt_DES(); + $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount); + $key = $crypto->decrypt($key); + if ($key === false) { + return false; + } + return $this->_parseKey($key, CRYPT_RSA_PRIVATE_FORMAT_PKCS1); + default: + return false; + } + /* intended for keys for which OpenSSL's asn1parse returns the following: + + 0:d=0 hl=4 l= 290 cons: SEQUENCE + 4:d=1 hl=2 l= 13 cons: SEQUENCE + 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption + 17:d=2 hl=2 l= 0 prim: NULL + 19:d=1 hl=4 l= 271 prim: BIT STRING */ + $tag = ord($this->_string_shift($key)); // skip over the BIT STRING / OCTET STRING tag + $this->_decodeLength($key); // skip over the BIT STRING / OCTET STRING length + // "The initial octet shall encode, as an unsigned binary integer wtih bit 1 as the least significant bit, the number of + // unused bits in the final subsequent octet. The number shall be in the range zero to seven." + // -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf (section 8.6.2.2) + if ($tag == CRYPT_RSA_ASN1_BITSTRING) { + $this->_string_shift($key); + } + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + if ($this->_decodeLength($key) != strlen($key)) { + return false; + } + $tag = ord($this->_string_shift($key)); + } + if ($tag != CRYPT_RSA_ASN1_INTEGER) { + return false; + } + + $length = $this->_decodeLength($key); + $temp = $this->_string_shift($key, $length); + if (strlen($temp) != 1 || ord($temp) > 2) { + $components['modulus'] = new Math_BigInteger($temp, 256); + $this->_string_shift($key); // skip over CRYPT_RSA_ASN1_INTEGER + $length = $this->_decodeLength($key); + $components[$type == CRYPT_RSA_PUBLIC_FORMAT_PKCS1 ? 'publicExponent' : 'privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); + + return $components; + } + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_INTEGER) { + return false; + } + $length = $this->_decodeLength($key); + $components['modulus'] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['publicExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256)); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['exponents'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256)); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($key, $length), 256)); + + if (!empty($key)) { + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + $this->_decodeLength($key); + while (!empty($key)) { + if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) { + return false; + } + $this->_decodeLength($key); + $key = substr($key, 1); + $length = $this->_decodeLength($key); + $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + $this->_string_shift($key); + $length = $this->_decodeLength($key); + $components['coefficients'][] = new Math_BigInteger($this->_string_shift($key, $length), 256); + } + } + + return $components; + case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: + $parts = explode(' ', $key, 3); + + $key = isset($parts[1]) ? base64_decode($parts[1]) : false; + if ($key === false) { + return false; + } + + $comment = isset($parts[2]) ? $parts[2] : false; + + $cleanup = substr($key, 0, 11) == "\0\0\0\7ssh-rsa"; + + if (strlen($key) <= 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($key, 4))); + $publicExponent = new Math_BigInteger($this->_string_shift($key, $length), -256); + if (strlen($key) <= 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($key, 4))); + $modulus = new Math_BigInteger($this->_string_shift($key, $length), -256); + + if ($cleanup && strlen($key)) { + if (strlen($key) <= 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($key, 4))); + $realModulus = new Math_BigInteger($this->_string_shift($key, $length), -256); + return strlen($key) ? false : array( + 'modulus' => $realModulus, + 'publicExponent' => $modulus, + 'comment' => $comment + ); + } else { + return strlen($key) ? false : array( + 'modulus' => $modulus, + 'publicExponent' => $publicExponent, + 'comment' => $comment + ); + } + // http://www.w3.org/TR/xmldsig-core/#sec-RSAKeyValue + // http://en.wikipedia.org/wiki/XML_Signature + case CRYPT_RSA_PRIVATE_FORMAT_XML: + case CRYPT_RSA_PUBLIC_FORMAT_XML: + $this->components = array(); + + $xml = xml_parser_create('UTF-8'); + xml_set_object($xml, $this); + xml_set_element_handler($xml, '_start_element_handler', '_stop_element_handler'); + xml_set_character_data_handler($xml, '_data_handler'); + // add to account for "dangling" tags like ... that are sometimes added + if (!xml_parse($xml, '' . $key . '')) { + xml_parser_free($xml); + unset($xml); + return false; + } + + xml_parser_free($xml); + unset($xml); + + return isset($this->components['modulus']) && isset($this->components['publicExponent']) ? $this->components : false; + // from PuTTY's SSHPUBK.C + case CRYPT_RSA_PRIVATE_FORMAT_PUTTY: + $components = array(); + $key = preg_split('#\r\n|\r|\n#', $key); + $type = trim(preg_replace('#PuTTY-User-Key-File-2: (.+)#', '$1', $key[0])); + if ($type != 'ssh-rsa') { + return false; + } + $encryption = trim(preg_replace('#Encryption: (.+)#', '$1', $key[1])); + $comment = trim(preg_replace('#Comment: (.+)#', '$1', $key[2])); + + $publicLength = trim(preg_replace('#Public-Lines: (\d+)#', '$1', $key[3])); + $public = base64_decode(implode('', array_map('trim', array_slice($key, 4, $publicLength)))); + $public = substr($public, 11); + extract(unpack('Nlength', $this->_string_shift($public, 4))); + $components['publicExponent'] = new Math_BigInteger($this->_string_shift($public, $length), -256); + extract(unpack('Nlength', $this->_string_shift($public, 4))); + $components['modulus'] = new Math_BigInteger($this->_string_shift($public, $length), -256); + + $privateLength = trim(preg_replace('#Private-Lines: (\d+)#', '$1', $key[$publicLength + 4])); + $private = base64_decode(implode('', array_map('trim', array_slice($key, $publicLength + 5, $privateLength)))); + + switch ($encryption) { + case 'aes256-cbc': + if (!class_exists('Crypt_AES')) { + include_once 'Crypt/AES.php'; + } + $symkey = ''; + $sequence = 0; + while (strlen($symkey) < 32) { + $temp = pack('Na*', $sequence++, $this->password); + $symkey.= pack('H*', sha1($temp)); + } + $symkey = substr($symkey, 0, 32); + $crypto = new Crypt_AES(); + } + + if ($encryption != 'none') { + $crypto->setKey($symkey); + $crypto->disablePadding(); + $private = $crypto->decrypt($private); + if ($private === false) { + return false; + } + } + + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['privateExponent'] = new Math_BigInteger($this->_string_shift($private, $length), -256); + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($private, $length), -256)); + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['primes'][] = new Math_BigInteger($this->_string_shift($private, $length), -256); + + $temp = $components['primes'][1]->subtract($this->one); + $components['exponents'] = array(1 => $components['publicExponent']->modInverse($temp)); + $temp = $components['primes'][2]->subtract($this->one); + $components['exponents'][] = $components['publicExponent']->modInverse($temp); + + extract(unpack('Nlength', $this->_string_shift($private, 4))); + if (strlen($private) < $length) { + return false; + } + $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($private, $length), -256)); + + return $components; + } + } + + /** + * Returns the key size + * + * More specifically, this returns the size of the modulo in bits. + * + * @access public + * @return int + */ + function getSize() + { + return !isset($this->modulus) ? 0 : strlen($this->modulus->toBits()); + } + + /** + * Start Element Handler + * + * Called by xml_set_element_handler() + * + * @access private + * @param resource $parser + * @param string $name + * @param array $attribs + */ + function _start_element_handler($parser, $name, $attribs) + { + //$name = strtoupper($name); + switch ($name) { + case 'MODULUS': + $this->current = &$this->components['modulus']; + break; + case 'EXPONENT': + $this->current = &$this->components['publicExponent']; + break; + case 'P': + $this->current = &$this->components['primes'][1]; + break; + case 'Q': + $this->current = &$this->components['primes'][2]; + break; + case 'DP': + $this->current = &$this->components['exponents'][1]; + break; + case 'DQ': + $this->current = &$this->components['exponents'][2]; + break; + case 'INVERSEQ': + $this->current = &$this->components['coefficients'][2]; + break; + case 'D': + $this->current = &$this->components['privateExponent']; + } + $this->current = ''; + } + + /** + * Stop Element Handler + * + * Called by xml_set_element_handler() + * + * @access private + * @param resource $parser + * @param string $name + */ + function _stop_element_handler($parser, $name) + { + if (isset($this->current)) { + $this->current = new Math_BigInteger(base64_decode($this->current), 256); + unset($this->current); + } + } + + /** + * Data Handler + * + * Called by xml_set_character_data_handler() + * + * @access private + * @param resource $parser + * @param string $data + */ + function _data_handler($parser, $data) + { + if (!isset($this->current) || is_object($this->current)) { + return; + } + $this->current.= trim($data); + } + + /** + * Loads a public or private key + * + * Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed) + * + * @access public + * @param string $key + * @param int $type optional + */ + function loadKey($key, $type = false) + { + if (is_object($key) && strtolower(get_class($key)) == 'crypt_rsa') { + $this->privateKeyFormat = $key->privateKeyFormat; + $this->publicKeyFormat = $key->publicKeyFormat; + $this->k = $key->k; + $this->hLen = $key->hLen; + $this->sLen = $key->sLen; + $this->mgfHLen = $key->mgfHLen; + $this->encryptionMode = $key->encryptionMode; + $this->signatureMode = $key->signatureMode; + $this->password = $key->password; + $this->configFile = $key->configFile; + $this->comment = $key->comment; + + if (is_object($key->hash)) { + $this->hash = new Crypt_Hash($key->hash->getHash()); + } + if (is_object($key->mgfHash)) { + $this->mgfHash = new Crypt_Hash($key->mgfHash->getHash()); + } + + if (is_object($key->modulus)) { + $this->modulus = $key->modulus->copy(); + } + if (is_object($key->exponent)) { + $this->exponent = $key->exponent->copy(); + } + if (is_object($key->publicExponent)) { + $this->publicExponent = $key->publicExponent->copy(); + } + + $this->primes = array(); + $this->exponents = array(); + $this->coefficients = array(); + + foreach ($this->primes as $prime) { + $this->primes[] = $prime->copy(); + } + foreach ($this->exponents as $exponent) { + $this->exponents[] = $exponent->copy(); + } + foreach ($this->coefficients as $coefficient) { + $this->coefficients[] = $coefficient->copy(); + } + + return true; + } + + if ($type === false) { + $types = array( + CRYPT_RSA_PUBLIC_FORMAT_RAW, + CRYPT_RSA_PRIVATE_FORMAT_PKCS1, + CRYPT_RSA_PRIVATE_FORMAT_XML, + CRYPT_RSA_PRIVATE_FORMAT_PUTTY, + CRYPT_RSA_PUBLIC_FORMAT_OPENSSH + ); + foreach ($types as $type) { + $components = $this->_parseKey($key, $type); + if ($components !== false) { + break; + } + } + } else { + $components = $this->_parseKey($key, $type); + } + + if ($components === false) { + $this->comment = null; + $this->modulus = null; + $this->k = null; + $this->exponent = null; + $this->primes = null; + $this->exponents = null; + $this->coefficients = null; + $this->publicExponent = null; + + return false; + } + + if (isset($components['comment']) && $components['comment'] !== false) { + $this->comment = $components['comment']; + } + $this->modulus = $components['modulus']; + $this->k = strlen($this->modulus->toBytes()); + $this->exponent = isset($components['privateExponent']) ? $components['privateExponent'] : $components['publicExponent']; + if (isset($components['primes'])) { + $this->primes = $components['primes']; + $this->exponents = $components['exponents']; + $this->coefficients = $components['coefficients']; + $this->publicExponent = $components['publicExponent']; + } else { + $this->primes = array(); + $this->exponents = array(); + $this->coefficients = array(); + $this->publicExponent = false; + } + + switch ($type) { + case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH: + case CRYPT_RSA_PUBLIC_FORMAT_RAW: + $this->setPublicKey(); + break; + case CRYPT_RSA_PRIVATE_FORMAT_PKCS1: + switch (true) { + case strpos($key, '-BEGIN PUBLIC KEY-') !== false: + case strpos($key, '-BEGIN RSA PUBLIC KEY-') !== false: + $this->setPublicKey(); + } + } + + return true; + } + + /** + * Sets the password + * + * Private keys can be encrypted with a password. To unset the password, pass in the empty string or false. + * Or rather, pass in $password such that empty($password) && !is_string($password) is true. + * + * @see self::createKey() + * @see self::loadKey() + * @access public + * @param string $password + */ + function setPassword($password = false) + { + $this->password = $password; + } + + /** + * Defines the public key + * + * Some private key formats define the public exponent and some don't. Those that don't define it are problematic when + * used in certain contexts. For example, in SSH-2, RSA authentication works by sending the public key along with a + * message signed by the private key to the server. The SSH-2 server looks the public key up in an index of public keys + * and if it's present then proceeds to verify the signature. Problem is, if your private key doesn't include the public + * exponent this won't work unless you manually add the public exponent. phpseclib tries to guess if the key being used + * is the public key but in the event that it guesses incorrectly you might still want to explicitly set the key as being + * public. + * + * Do note that when a new key is loaded the index will be cleared. + * + * Returns true on success, false on failure + * + * @see self::getPublicKey() + * @access public + * @param string $key optional + * @param int $type optional + * @return bool + */ + function setPublicKey($key = false, $type = false) + { + // if a public key has already been loaded return false + if (!empty($this->publicExponent)) { + return false; + } + + if ($key === false && !empty($this->modulus)) { + $this->publicExponent = $this->exponent; + return true; + } + + if ($type === false) { + $types = array( + CRYPT_RSA_PUBLIC_FORMAT_RAW, + CRYPT_RSA_PUBLIC_FORMAT_PKCS1, + CRYPT_RSA_PUBLIC_FORMAT_XML, + CRYPT_RSA_PUBLIC_FORMAT_OPENSSH + ); + foreach ($types as $type) { + $components = $this->_parseKey($key, $type); + if ($components !== false) { + break; + } + } + } else { + $components = $this->_parseKey($key, $type); + } + + if ($components === false) { + return false; + } + + if (empty($this->modulus) || !$this->modulus->equals($components['modulus'])) { + $this->modulus = $components['modulus']; + $this->exponent = $this->publicExponent = $components['publicExponent']; + return true; + } + + $this->publicExponent = $components['publicExponent']; + + return true; + } + + /** + * Defines the private key + * + * If phpseclib guessed a private key was a public key and loaded it as such it might be desirable to force + * phpseclib to treat the key as a private key. This function will do that. + * + * Do note that when a new key is loaded the index will be cleared. + * + * Returns true on success, false on failure + * + * @see self::getPublicKey() + * @access public + * @param string $key optional + * @param int $type optional + * @return bool + */ + function setPrivateKey($key = false, $type = false) + { + if ($key === false && !empty($this->publicExponent)) { + $this->publicExponent = false; + return true; + } + + $rsa = new Crypt_RSA(); + if (!$rsa->loadKey($key, $type)) { + return false; + } + $rsa->publicExponent = false; + + // don't overwrite the old key if the new key is invalid + $this->loadKey($rsa); + return true; + } + + /** + * Returns the public key + * + * The public key is only returned under two circumstances - if the private key had the public key embedded within it + * or if the public key was set via setPublicKey(). If the currently loaded key is supposed to be the public key this + * function won't return it since this library, for the most part, doesn't distinguish between public and private keys. + * + * @see self::getPublicKey() + * @access public + * @param string $key + * @param int $type optional + */ + function getPublicKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS8) + { + if (empty($this->modulus) || empty($this->publicExponent)) { + return false; + } + + $oldFormat = $this->publicKeyFormat; + $this->publicKeyFormat = $type; + $temp = $this->_convertPublicKey($this->modulus, $this->publicExponent); + $this->publicKeyFormat = $oldFormat; + return $temp; + } + + /** + * Returns the public key's fingerprint + * + * The public key's fingerprint is returned, which is equivalent to running `ssh-keygen -lf rsa.pub`. If there is + * no public key currently loaded, false is returned. + * Example output (md5): "c1:b1:30:29:d7:b8:de:6c:97:77:10:d7:46:41:63:87" (as specified by RFC 4716) + * + * @access public + * @param string $algorithm The hashing algorithm to be used. Valid options are 'md5' and 'sha256'. False is returned + * for invalid values. + * @return mixed + */ + function getPublicKeyFingerprint($algorithm = 'md5') + { + if (empty($this->modulus) || empty($this->publicExponent)) { + return false; + } + + $modulus = $this->modulus->toBytes(true); + $publicExponent = $this->publicExponent->toBytes(true); + + $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus); + + switch ($algorithm) { + case 'sha256': + $hash = new Crypt_Hash('sha256'); + $base = base64_encode($hash->hash($RSAPublicKey)); + return substr($base, 0, strlen($base) - 1); + case 'md5': + return substr(chunk_split(md5($RSAPublicKey), 2, ':'), 0, -1); + default: + return false; + } + } + + /** + * Returns the private key + * + * The private key is only returned if the currently loaded key contains the constituent prime numbers. + * + * @see self::getPublicKey() + * @access public + * @param string $key + * @param int $type optional + * @return mixed + */ + function getPrivateKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS1) + { + if (empty($this->primes)) { + return false; + } + + $oldFormat = $this->privateKeyFormat; + $this->privateKeyFormat = $type; + $temp = $this->_convertPrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients); + $this->privateKeyFormat = $oldFormat; + return $temp; + } + + /** + * Returns a minimalistic private key + * + * Returns the private key without the prime number constituants. Structurally identical to a public key that + * hasn't been set as the public key + * + * @see self::getPrivateKey() + * @access private + * @param string $key + * @param int $type optional + */ + function _getPrivatePublicKey($mode = CRYPT_RSA_PUBLIC_FORMAT_PKCS8) + { + if (empty($this->modulus) || empty($this->exponent)) { + return false; + } + + $oldFormat = $this->publicKeyFormat; + $this->publicKeyFormat = $mode; + $temp = $this->_convertPublicKey($this->modulus, $this->exponent); + $this->publicKeyFormat = $oldFormat; + return $temp; + } + + /** + * __toString() magic method + * + * @access public + * @return string + */ + function __toString() + { + $key = $this->getPrivateKey($this->privateKeyFormat); + if ($key !== false) { + return $key; + } + $key = $this->_getPrivatePublicKey($this->publicKeyFormat); + return $key !== false ? $key : ''; + } + + /** + * __clone() magic method + * + * @access public + * @return Crypt_RSA + */ + function __clone() + { + $key = new Crypt_RSA(); + $key->loadKey($this); + return $key; + } + + /** + * Generates the smallest and largest numbers requiring $bits bits + * + * @access private + * @param int $bits + * @return array + */ + function _generateMinMax($bits) + { + $bytes = $bits >> 3; + $min = str_repeat(chr(0), $bytes); + $max = str_repeat(chr(0xFF), $bytes); + $msb = $bits & 7; + if ($msb) { + $min = chr(1 << ($msb - 1)) . $min; + $max = chr((1 << $msb) - 1) . $max; + } else { + $min[0] = chr(0x80); + } + + return array( + 'min' => new Math_BigInteger($min, 256), + 'max' => new Math_BigInteger($max, 256) + ); + } + + /** + * DER-decode the length + * + * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See + * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. + * + * @access private + * @param string $string + * @return int + */ + function _decodeLength(&$string) + { + $length = ord($this->_string_shift($string)); + if ($length & 0x80) { // definite length, long form + $length&= 0x7F; + $temp = $this->_string_shift($string, $length); + list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4)); + } + return $length; + } + + /** + * DER-encode the length + * + * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See + * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. + * + * @access private + * @param int $length + * @return string + */ + function _encodeLength($length) + { + if ($length <= 0x7F) { + return chr($length); + } + + $temp = ltrim(pack('N', $length), chr(0)); + return pack('Ca*', 0x80 | strlen($temp), $temp); + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param string $string + * @param int $index + * @return string + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * Determines the private key format + * + * @see self::createKey() + * @access public + * @param int $format + */ + function setPrivateKeyFormat($format) + { + $this->privateKeyFormat = $format; + } + + /** + * Determines the public key format + * + * @see self::createKey() + * @access public + * @param int $format + */ + function setPublicKeyFormat($format) + { + $this->publicKeyFormat = $format; + } + + /** + * Determines which hashing function should be used + * + * Used with signature production / verification and (if the encryption mode is CRYPT_RSA_ENCRYPTION_OAEP) encryption and + * decryption. If $hash isn't supported, sha1 is used. + * + * @access public + * @param string $hash + */ + function setHash($hash) + { + // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. + switch ($hash) { + case 'md2': + case 'md5': + case 'sha1': + case 'sha256': + case 'sha384': + case 'sha512': + $this->hash = new Crypt_Hash($hash); + $this->hashName = $hash; + break; + default: + $this->hash = new Crypt_Hash('sha1'); + $this->hashName = 'sha1'; + } + $this->hLen = $this->hash->getLength(); + } + + /** + * Determines which hashing function should be used for the mask generation function + * + * The mask generation function is used by CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_SIGNATURE_PSS and although it's + * best if Hash and MGFHash are set to the same thing this is not a requirement. + * + * @access public + * @param string $hash + */ + function setMGFHash($hash) + { + // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. + switch ($hash) { + case 'md2': + case 'md5': + case 'sha1': + case 'sha256': + case 'sha384': + case 'sha512': + $this->mgfHash = new Crypt_Hash($hash); + break; + default: + $this->mgfHash = new Crypt_Hash('sha1'); + } + $this->mgfHLen = $this->mgfHash->getLength(); + } + + /** + * Determines the salt length + * + * To quote from {@link http://tools.ietf.org/html/rfc3447#page-38 RFC3447#page-38}: + * + * Typical salt lengths in octets are hLen (the length of the output + * of the hash function Hash) and 0. + * + * @access public + * @param int $format + */ + function setSaltLength($sLen) + { + $this->sLen = $sLen; + } + + /** + * Integer-to-Octet-String primitive + * + * See {@link http://tools.ietf.org/html/rfc3447#section-4.1 RFC3447#section-4.1}. + * + * @access private + * @param Math_BigInteger $x + * @param int $xLen + * @return string + */ + function _i2osp($x, $xLen) + { + $x = $x->toBytes(); + if (strlen($x) > $xLen) { + user_error('Integer too large'); + return false; + } + return str_pad($x, $xLen, chr(0), STR_PAD_LEFT); + } + + /** + * Octet-String-to-Integer primitive + * + * See {@link http://tools.ietf.org/html/rfc3447#section-4.2 RFC3447#section-4.2}. + * + * @access private + * @param string $x + * @return Math_BigInteger + */ + function _os2ip($x) + { + return new Math_BigInteger($x, 256); + } + + /** + * Exponentiate with or without Chinese Remainder Theorem + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.2}. + * + * @access private + * @param Math_BigInteger $x + * @return Math_BigInteger + */ + function _exponentiate($x) + { + switch (true) { + case empty($this->primes): + case $this->primes[1]->equals($this->zero): + case empty($this->coefficients): + case $this->coefficients[2]->equals($this->zero): + case empty($this->exponents): + case $this->exponents[1]->equals($this->zero): + return $x->modPow($this->exponent, $this->modulus); + } + + $num_primes = count($this->primes); + + if (defined('CRYPT_RSA_DISABLE_BLINDING')) { + $m_i = array( + 1 => $x->modPow($this->exponents[1], $this->primes[1]), + 2 => $x->modPow($this->exponents[2], $this->primes[2]) + ); + $h = $m_i[1]->subtract($m_i[2]); + $h = $h->multiply($this->coefficients[2]); + list(, $h) = $h->divide($this->primes[1]); + $m = $m_i[2]->add($h->multiply($this->primes[2])); + + $r = $this->primes[1]; + for ($i = 3; $i <= $num_primes; $i++) { + $m_i = $x->modPow($this->exponents[$i], $this->primes[$i]); + + $r = $r->multiply($this->primes[$i - 1]); + + $h = $m_i->subtract($m); + $h = $h->multiply($this->coefficients[$i]); + list(, $h) = $h->divide($this->primes[$i]); + + $m = $m->add($r->multiply($h)); + } + } else { + $smallest = $this->primes[1]; + for ($i = 2; $i <= $num_primes; $i++) { + if ($smallest->compare($this->primes[$i]) > 0) { + $smallest = $this->primes[$i]; + } + } + + $one = new Math_BigInteger(1); + + $r = $one->random($one, $smallest->subtract($one)); + + $m_i = array( + 1 => $this->_blind($x, $r, 1), + 2 => $this->_blind($x, $r, 2) + ); + $h = $m_i[1]->subtract($m_i[2]); + $h = $h->multiply($this->coefficients[2]); + list(, $h) = $h->divide($this->primes[1]); + $m = $m_i[2]->add($h->multiply($this->primes[2])); + + $r = $this->primes[1]; + for ($i = 3; $i <= $num_primes; $i++) { + $m_i = $this->_blind($x, $r, $i); + + $r = $r->multiply($this->primes[$i - 1]); + + $h = $m_i->subtract($m); + $h = $h->multiply($this->coefficients[$i]); + list(, $h) = $h->divide($this->primes[$i]); + + $m = $m->add($r->multiply($h)); + } + } + + return $m; + } + + /** + * Performs RSA Blinding + * + * Protects against timing attacks by employing RSA Blinding. + * Returns $x->modPow($this->exponents[$i], $this->primes[$i]) + * + * @access private + * @param Math_BigInteger $x + * @param Math_BigInteger $r + * @param int $i + * @return Math_BigInteger + */ + function _blind($x, $r, $i) + { + $x = $x->multiply($r->modPow($this->publicExponent, $this->primes[$i])); + $x = $x->modPow($this->exponents[$i], $this->primes[$i]); + + $r = $r->modInverse($this->primes[$i]); + $x = $x->multiply($r); + list(, $x) = $x->divide($this->primes[$i]); + + return $x; + } + + /** + * Performs blinded RSA equality testing + * + * Protects against a particular type of timing attack described. + * + * See {@link http://codahale.com/a-lesson-in-timing-attacks/ A Lesson In Timing Attacks (or, Don't use MessageDigest.isEquals)} + * + * Thanks for the heads up singpolyma! + * + * @access private + * @param string $x + * @param string $y + * @return bool + */ + function _equals($x, $y) + { + if (strlen($x) != strlen($y)) { + return false; + } + + $result = "\0"; + $x^= $y; + for ($i = 0; $i < strlen($x); $i++) { + $result|= $x[$i]; + } + + return $result === "\0"; + } + + /** + * RSAEP + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.1}. + * + * @access private + * @param Math_BigInteger $m + * @return Math_BigInteger + */ + function _rsaep($m) + { + if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) { + user_error('Message representative out of range'); + return false; + } + return $this->_exponentiate($m); + } + + /** + * RSADP + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.2 RFC3447#section-5.1.2}. + * + * @access private + * @param Math_BigInteger $c + * @return Math_BigInteger + */ + function _rsadp($c) + { + if ($c->compare($this->zero) < 0 || $c->compare($this->modulus) > 0) { + user_error('Ciphertext representative out of range'); + return false; + } + return $this->_exponentiate($c); + } + + /** + * RSASP1 + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.1 RFC3447#section-5.2.1}. + * + * @access private + * @param Math_BigInteger $m + * @return Math_BigInteger + */ + function _rsasp1($m) + { + if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) { + user_error('Message representative out of range'); + return false; + } + return $this->_exponentiate($m); + } + + /** + * RSAVP1 + * + * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.2 RFC3447#section-5.2.2}. + * + * @access private + * @param Math_BigInteger $s + * @return Math_BigInteger + */ + function _rsavp1($s) + { + if ($s->compare($this->zero) < 0 || $s->compare($this->modulus) > 0) { + user_error('Signature representative out of range'); + return false; + } + return $this->_exponentiate($s); + } + + /** + * MGF1 + * + * See {@link http://tools.ietf.org/html/rfc3447#appendix-B.2.1 RFC3447#appendix-B.2.1}. + * + * @access private + * @param string $mgfSeed + * @param int $mgfLen + * @return string + */ + function _mgf1($mgfSeed, $maskLen) + { + // if $maskLen would yield strings larger than 4GB, PKCS#1 suggests a "Mask too long" error be output. + + $t = ''; + $count = ceil($maskLen / $this->mgfHLen); + for ($i = 0; $i < $count; $i++) { + $c = pack('N', $i); + $t.= $this->mgfHash->hash($mgfSeed . $c); + } + + return substr($t, 0, $maskLen); + } + + /** + * RSAES-OAEP-ENCRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.1 RFC3447#section-7.1.1} and + * {http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding OAES}. + * + * @access private + * @param string $m + * @param string $l + * @return string + */ + function _rsaes_oaep_encrypt($m, $l = '') + { + $mLen = strlen($m); + + // Length checking + + // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + if ($mLen > $this->k - 2 * $this->hLen - 2) { + user_error('Message too long'); + return false; + } + + // EME-OAEP encoding + + $lHash = $this->hash->hash($l); + $ps = str_repeat(chr(0), $this->k - $mLen - 2 * $this->hLen - 2); + $db = $lHash . $ps . chr(1) . $m; + $seed = crypt_random_string($this->hLen); + $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1); + $maskedDB = $db ^ $dbMask; + $seedMask = $this->_mgf1($maskedDB, $this->hLen); + $maskedSeed = $seed ^ $seedMask; + $em = chr(0) . $maskedSeed . $maskedDB; + + // RSA encryption + + $m = $this->_os2ip($em); + $c = $this->_rsaep($m); + $c = $this->_i2osp($c, $this->k); + + // Output the ciphertext C + + return $c; + } + + /** + * RSAES-OAEP-DECRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.2 RFC3447#section-7.1.2}. The fact that the error + * messages aren't distinguishable from one another hinders debugging, but, to quote from RFC3447#section-7.1.2: + * + * Note. Care must be taken to ensure that an opponent cannot + * distinguish the different error conditions in Step 3.g, whether by + * error message or timing, or, more generally, learn partial + * information about the encoded message EM. Otherwise an opponent may + * be able to obtain useful information about the decryption of the + * ciphertext C, leading to a chosen-ciphertext attack such as the one + * observed by Manger [36]. + * + * As for $l... to quote from {@link http://tools.ietf.org/html/rfc3447#page-17 RFC3447#page-17}: + * + * Both the encryption and the decryption operations of RSAES-OAEP take + * the value of a label L as input. In this version of PKCS #1, L is + * the empty string; other uses of the label are outside the scope of + * this document. + * + * @access private + * @param string $c + * @param string $l + * @return string + */ + function _rsaes_oaep_decrypt($c, $l = '') + { + // Length checking + + // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + if (strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) { + user_error('Decryption error'); + return false; + } + + // RSA decryption + + $c = $this->_os2ip($c); + $m = $this->_rsadp($c); + if ($m === false) { + user_error('Decryption error'); + return false; + } + $em = $this->_i2osp($m, $this->k); + + // EME-OAEP decoding + + $lHash = $this->hash->hash($l); + $y = ord($em[0]); + $maskedSeed = substr($em, 1, $this->hLen); + $maskedDB = substr($em, $this->hLen + 1); + $seedMask = $this->_mgf1($maskedDB, $this->hLen); + $seed = $maskedSeed ^ $seedMask; + $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1); + $db = $maskedDB ^ $dbMask; + $lHash2 = substr($db, 0, $this->hLen); + $m = substr($db, $this->hLen); + $hashesMatch = $this->_equals($lHash, $lHash2); + $leadingZeros = 1; + $patternMatch = 0; + $offset = 0; + for ($i = 0; $i < strlen($m); $i++) { + $patternMatch|= $leadingZeros & ($m[$i] === "\1"); + $leadingZeros&= $m[$i] === "\0"; + $offset+= $patternMatch ? 0 : 1; + } + + // we do & instead of && to avoid https://en.wikipedia.org/wiki/Short-circuit_evaluation + // to protect against timing attacks + if (!$hashesMatch & !$patternMatch) { + user_error('Decryption error'); + return false; + } + + // Output the message M + + return substr($m, $offset + 1); + } + + /** + * Raw Encryption / Decryption + * + * Doesn't use padding and is not recommended. + * + * @access private + * @param string $m + * @return string + */ + function _raw_encrypt($m) + { + $temp = $this->_os2ip($m); + $temp = $this->_rsaep($temp); + return $this->_i2osp($temp, $this->k); + } + + /** + * RSAES-PKCS1-V1_5-ENCRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.1 RFC3447#section-7.2.1}. + * + * @access private + * @param string $m + * @return string + */ + function _rsaes_pkcs1_v1_5_encrypt($m) + { + $mLen = strlen($m); + + // Length checking + + if ($mLen > $this->k - 11) { + user_error('Message too long'); + return false; + } + + // EME-PKCS1-v1_5 encoding + + $psLen = $this->k - $mLen - 3; + $ps = ''; + while (strlen($ps) != $psLen) { + $temp = crypt_random_string($psLen - strlen($ps)); + $temp = str_replace("\x00", '', $temp); + $ps.= $temp; + } + $type = 2; + // see the comments of _rsaes_pkcs1_v1_5_decrypt() to understand why this is being done + if (defined('CRYPT_RSA_PKCS15_COMPAT') && (!isset($this->publicExponent) || $this->exponent !== $this->publicExponent)) { + $type = 1; + // "The padding string PS shall consist of k-3-||D|| octets. ... for block type 01, they shall have value FF" + $ps = str_repeat("\xFF", $psLen); + } + $em = chr(0) . chr($type) . $ps . chr(0) . $m; + + // RSA encryption + $m = $this->_os2ip($em); + $c = $this->_rsaep($m); + $c = $this->_i2osp($c, $this->k); + + // Output the ciphertext C + + return $c; + } + + /** + * RSAES-PKCS1-V1_5-DECRYPT + * + * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.2 RFC3447#section-7.2.2}. + * + * For compatibility purposes, this function departs slightly from the description given in RFC3447. + * The reason being that RFC2313#section-8.1 (PKCS#1 v1.5) states that ciphertext's encrypted by the + * private key should have the second byte set to either 0 or 1 and that ciphertext's encrypted by the + * public key should have the second byte set to 2. In RFC3447 (PKCS#1 v2.1), the second byte is supposed + * to be 2 regardless of which key is used. For compatibility purposes, we'll just check to make sure the + * second byte is 2 or less. If it is, we'll accept the decrypted string as valid. + * + * As a consequence of this, a private key encrypted ciphertext produced with Crypt_RSA may not decrypt + * with a strictly PKCS#1 v1.5 compliant RSA implementation. Public key encrypted ciphertext's should but + * not private key encrypted ciphertext's. + * + * @access private + * @param string $c + * @return string + */ + function _rsaes_pkcs1_v1_5_decrypt($c) + { + // Length checking + + if (strlen($c) != $this->k) { // or if k < 11 + user_error('Decryption error'); + return false; + } + + // RSA decryption + + $c = $this->_os2ip($c); + $m = $this->_rsadp($c); + + if ($m === false) { + user_error('Decryption error'); + return false; + } + $em = $this->_i2osp($m, $this->k); + + // EME-PKCS1-v1_5 decoding + + if (ord($em[0]) != 0 || ord($em[1]) > 2) { + user_error('Decryption error'); + return false; + } + + $ps = substr($em, 2, strpos($em, chr(0), 2) - 2); + $m = substr($em, strlen($ps) + 3); + + if (strlen($ps) < 8) { + user_error('Decryption error'); + return false; + } + + // Output M + + return $m; + } + + /** + * EMSA-PSS-ENCODE + * + * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.1 RFC3447#section-9.1.1}. + * + * @access private + * @param string $m + * @param int $emBits + */ + function _emsa_pss_encode($m, $emBits) + { + // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8) + $sLen = $this->sLen !== null ? $this->sLen : $this->hLen; + + $mHash = $this->hash->hash($m); + if ($emLen < $this->hLen + $sLen + 2) { + user_error('Encoding error'); + return false; + } + + $salt = crypt_random_string($sLen); + $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; + $h = $this->hash->hash($m2); + $ps = str_repeat(chr(0), $emLen - $sLen - $this->hLen - 2); + $db = $ps . chr(1) . $salt; + $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1); + $maskedDB = $db ^ $dbMask; + $maskedDB[0] = ~chr(0xFF << ($emBits & 7)) & $maskedDB[0]; + $em = $maskedDB . $h . chr(0xBC); + + return $em; + } + + /** + * EMSA-PSS-VERIFY + * + * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.2 RFC3447#section-9.1.2}. + * + * @access private + * @param string $m + * @param string $em + * @param int $emBits + * @return string + */ + function _emsa_pss_verify($m, $em, $emBits) + { + // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error + // be output. + + $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8); + $sLen = $this->sLen !== null ? $this->sLen : $this->hLen; + + $mHash = $this->hash->hash($m); + if ($emLen < $this->hLen + $sLen + 2) { + return false; + } + + if ($em[strlen($em) - 1] != chr(0xBC)) { + return false; + } + + $maskedDB = substr($em, 0, -$this->hLen - 1); + $h = substr($em, -$this->hLen - 1, $this->hLen); + $temp = chr(0xFF << ($emBits & 7)); + if ((~$maskedDB[0] & $temp) != $temp) { + return false; + } + $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1); + $db = $maskedDB ^ $dbMask; + $db[0] = ~chr(0xFF << ($emBits & 7)) & $db[0]; + $temp = $emLen - $this->hLen - $sLen - 2; + if (substr($db, 0, $temp) != str_repeat(chr(0), $temp) || ord($db[$temp]) != 1) { + return false; + } + $salt = substr($db, $temp + 1); // should be $sLen long + $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; + $h2 = $this->hash->hash($m2); + return $this->_equals($h, $h2); + } + + /** + * RSASSA-PSS-SIGN + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.1 RFC3447#section-8.1.1}. + * + * @access private + * @param string $m + * @return string + */ + function _rsassa_pss_sign($m) + { + // EMSA-PSS encoding + + $em = $this->_emsa_pss_encode($m, 8 * $this->k - 1); + + // RSA signature + + $m = $this->_os2ip($em); + $s = $this->_rsasp1($m); + $s = $this->_i2osp($s, $this->k); + + // Output the signature S + + return $s; + } + + /** + * RSASSA-PSS-VERIFY + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.2 RFC3447#section-8.1.2}. + * + * @access private + * @param string $m + * @param string $s + * @return string + */ + function _rsassa_pss_verify($m, $s) + { + // Length checking + + if (strlen($s) != $this->k) { + user_error('Invalid signature'); + return false; + } + + // RSA verification + + $modBits = 8 * $this->k; + + $s2 = $this->_os2ip($s); + $m2 = $this->_rsavp1($s2); + if ($m2 === false) { + user_error('Invalid signature'); + return false; + } + $em = $this->_i2osp($m2, $modBits >> 3); + if ($em === false) { + user_error('Invalid signature'); + return false; + } + + // EMSA-PSS verification + + return $this->_emsa_pss_verify($m, $em, $modBits - 1); + } + + /** + * EMSA-PKCS1-V1_5-ENCODE + * + * See {@link http://tools.ietf.org/html/rfc3447#section-9.2 RFC3447#section-9.2}. + * + * @access private + * @param string $m + * @param int $emLen + * @return string + */ + function _emsa_pkcs1_v1_5_encode($m, $emLen) + { + $h = $this->hash->hash($m); + if ($h === false) { + return false; + } + + // see http://tools.ietf.org/html/rfc3447#page-43 + switch ($this->hashName) { + case 'md2': + $t = pack('H*', '3020300c06082a864886f70d020205000410'); + break; + case 'md5': + $t = pack('H*', '3020300c06082a864886f70d020505000410'); + break; + case 'sha1': + $t = pack('H*', '3021300906052b0e03021a05000414'); + break; + case 'sha256': + $t = pack('H*', '3031300d060960864801650304020105000420'); + break; + case 'sha384': + $t = pack('H*', '3041300d060960864801650304020205000430'); + break; + case 'sha512': + $t = pack('H*', '3051300d060960864801650304020305000440'); + } + $t.= $h; + $tLen = strlen($t); + + if ($emLen < $tLen + 11) { + user_error('Intended encoded message length too short'); + return false; + } + + $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3); + + $em = "\0\1$ps\0$t"; + + return $em; + } + + /** + * RSASSA-PKCS1-V1_5-SIGN + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.1 RFC3447#section-8.2.1}. + * + * @access private + * @param string $m + * @return string + */ + function _rsassa_pkcs1_v1_5_sign($m) + { + // EMSA-PKCS1-v1_5 encoding + + $em = $this->_emsa_pkcs1_v1_5_encode($m, $this->k); + if ($em === false) { + user_error('RSA modulus too short'); + return false; + } + + // RSA signature + + $m = $this->_os2ip($em); + $s = $this->_rsasp1($m); + $s = $this->_i2osp($s, $this->k); + + // Output the signature S + + return $s; + } + + /** + * RSASSA-PKCS1-V1_5-VERIFY + * + * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.2 RFC3447#section-8.2.2}. + * + * @access private + * @param string $m + * @return string + */ + function _rsassa_pkcs1_v1_5_verify($m, $s) + { + // Length checking + + if (strlen($s) != $this->k) { + user_error('Invalid signature'); + return false; + } + + // RSA verification + + $s = $this->_os2ip($s); + $m2 = $this->_rsavp1($s); + if ($m2 === false) { + user_error('Invalid signature'); + return false; + } + $em = $this->_i2osp($m2, $this->k); + if ($em === false) { + user_error('Invalid signature'); + return false; + } + + // EMSA-PKCS1-v1_5 encoding + + $em2 = $this->_emsa_pkcs1_v1_5_encode($m, $this->k); + if ($em2 === false) { + user_error('RSA modulus too short'); + return false; + } + + // Compare + return $this->_equals($em, $em2); + } + + /** + * Set Encryption Mode + * + * Valid values include CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1. + * + * @access public + * @param int $mode + */ + function setEncryptionMode($mode) + { + $this->encryptionMode = $mode; + } + + /** + * Set Signature Mode + * + * Valid values include CRYPT_RSA_SIGNATURE_PSS and CRYPT_RSA_SIGNATURE_PKCS1 + * + * @access public + * @param int $mode + */ + function setSignatureMode($mode) + { + $this->signatureMode = $mode; + } + + /** + * Set public key comment. + * + * @access public + * @param string $comment + */ + function setComment($comment) + { + $this->comment = $comment; + } + + /** + * Get public key comment. + * + * @access public + * @return string + */ + function getComment() + { + return $this->comment; + } + + /** + * Encryption + * + * Both CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1 both place limits on how long $plaintext can be. + * If $plaintext exceeds those limits it will be broken up so that it does and the resultant ciphertext's will + * be concatenated together. + * + * @see self::decrypt() + * @access public + * @param string $plaintext + * @return string + */ + function encrypt($plaintext) + { + switch ($this->encryptionMode) { + case CRYPT_RSA_ENCRYPTION_NONE: + $plaintext = str_split($plaintext, $this->k); + $ciphertext = ''; + foreach ($plaintext as $m) { + $ciphertext.= $this->_raw_encrypt($m); + } + return $ciphertext; + case CRYPT_RSA_ENCRYPTION_PKCS1: + $length = $this->k - 11; + if ($length <= 0) { + return false; + } + + $plaintext = str_split($plaintext, $length); + $ciphertext = ''; + foreach ($plaintext as $m) { + $ciphertext.= $this->_rsaes_pkcs1_v1_5_encrypt($m); + } + return $ciphertext; + //case CRYPT_RSA_ENCRYPTION_OAEP: + default: + $length = $this->k - 2 * $this->hLen - 2; + if ($length <= 0) { + return false; + } + + $plaintext = str_split($plaintext, $length); + $ciphertext = ''; + foreach ($plaintext as $m) { + $ciphertext.= $this->_rsaes_oaep_encrypt($m); + } + return $ciphertext; + } + } + + /** + * Decryption + * + * @see self::encrypt() + * @access public + * @param string $plaintext + * @return string + */ + function decrypt($ciphertext) + { + if ($this->k <= 0) { + return false; + } + + $ciphertext = str_split($ciphertext, $this->k); + $ciphertext[count($ciphertext) - 1] = str_pad($ciphertext[count($ciphertext) - 1], $this->k, chr(0), STR_PAD_LEFT); + + $plaintext = ''; + + switch ($this->encryptionMode) { + case CRYPT_RSA_ENCRYPTION_NONE: + $decrypt = '_raw_encrypt'; + break; + case CRYPT_RSA_ENCRYPTION_PKCS1: + $decrypt = '_rsaes_pkcs1_v1_5_decrypt'; + break; + //case CRYPT_RSA_ENCRYPTION_OAEP: + default: + $decrypt = '_rsaes_oaep_decrypt'; + } + + foreach ($ciphertext as $c) { + $temp = $this->$decrypt($c); + if ($temp === false) { + return false; + } + $plaintext.= $temp; + } + + return $plaintext; + } + + /** + * Create a signature + * + * @see self::verify() + * @access public + * @param string $message + * @return string + */ + function sign($message) + { + if (empty($this->modulus) || empty($this->exponent)) { + return false; + } + + switch ($this->signatureMode) { + case CRYPT_RSA_SIGNATURE_PKCS1: + return $this->_rsassa_pkcs1_v1_5_sign($message); + //case CRYPT_RSA_SIGNATURE_PSS: + default: + return $this->_rsassa_pss_sign($message); + } + } + + /** + * Verifies a signature + * + * @see self::sign() + * @access public + * @param string $message + * @param string $signature + * @return bool + */ + function verify($message, $signature) + { + if (empty($this->modulus) || empty($this->exponent)) { + return false; + } + + switch ($this->signatureMode) { + case CRYPT_RSA_SIGNATURE_PKCS1: + return $this->_rsassa_pkcs1_v1_5_verify($message, $signature); + //case CRYPT_RSA_SIGNATURE_PSS: + default: + return $this->_rsassa_pss_verify($message, $signature); + } + } + + /** + * Extract raw BER from Base64 encoding + * + * @access private + * @param string $str + * @return string + */ + function _extractBER($str) + { + /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them + * above and beyond the ceritificate. + * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line: + * + * Bag Attributes + * localKeyID: 01 00 00 00 + * subject=/O=organization/OU=org unit/CN=common name + * issuer=/O=organization/CN=common name + */ + $temp = preg_replace('#.*?^-+[^-]+-+[\r\n ]*$#ms', '', $str, 1); + // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff + $temp = preg_replace('#-+[^-]+-+#', '', $temp); + // remove new lines + $temp = str_replace(array("\r", "\n", ' '), '', $temp); + $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; + return $temp != false ? $temp : $str; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Random.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Random.php old mode 100644 new mode 100755 index 918b97bf9..233c3554f --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Random.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Random.php @@ -1,300 +1,338 @@ - - * - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Crypt - * @package Crypt_Random - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -// laravel is a PHP framework that utilizes phpseclib. laravel workbenches may, independently, -// have phpseclib as a requirement as well. if you're developing such a program you may encounter -// a "Cannot redeclare crypt_random_string()" error. -if (!function_exists('crypt_random_string')) { - /** - * "Is Windows" test - * - * @access private - */ - define('CRYPT_RANDOM_IS_WINDOWS', strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'); - - /** - * Generate a random string. - * - * Although microoptimizations are generally discouraged as they impair readability this function is ripe with - * microoptimizations because this function has the potential of being called a huge number of times. - * eg. for RSA key generation. - * - * @param Integer $length - * @return String - * @access public - */ - function crypt_random_string($length) - { - if (CRYPT_RANDOM_IS_WINDOWS) { - // method 1. prior to PHP 5.3 this would call rand() on windows hence the function_exists('class_alias') call. - // ie. class_alias is a function that was introduced in PHP 5.3 - if (function_exists('mcrypt_create_iv') && function_exists('class_alias')) { - return mcrypt_create_iv($length); - } - // method 2. openssl_random_pseudo_bytes was introduced in PHP 5.3.0 but prior to PHP 5.3.4 there was, - // to quote , "possible blocking behavior". as of 5.3.4 - // openssl_random_pseudo_bytes and mcrypt_create_iv do the exact same thing on Windows. ie. they both - // call php_win32_get_random_bytes(): - // - // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/openssl/openssl.c#L5008 - // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1392 - // - // php_win32_get_random_bytes() is defined thusly: - // - // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/win32/winutil.c#L80 - // - // we're calling it, all the same, in the off chance that the mcrypt extension is not available - if (function_exists('openssl_random_pseudo_bytes') && version_compare(PHP_VERSION, '5.3.4', '>=')) { - return openssl_random_pseudo_bytes($length); - } - } else { - // method 1. the fastest - if (function_exists('openssl_random_pseudo_bytes')) { - return openssl_random_pseudo_bytes($length); - } - // method 2 - static $fp = true; - if ($fp === true) { - // warning's will be output unles the error suppression operator is used. errors such as - // "open_basedir restriction in effect", "Permission denied", "No such file or directory", etc. - $fp = @fopen('/dev/urandom', 'rb'); - } - if ($fp !== true && $fp !== false) { // surprisingly faster than !is_bool() or is_resource() - return fread($fp, $length); - } - // method 3. pretty much does the same thing as method 2 per the following url: - // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1391 - // surprisingly slower than method 2. maybe that's because mcrypt_create_iv does a bunch of error checking that we're - // not doing. regardless, this'll only be called if this PHP script couldn't open /dev/urandom due to open_basedir - // restrictions or some such - if (function_exists('mcrypt_create_iv')) { - return mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); - } - } - // at this point we have no choice but to use a pure-PHP CSPRNG - - // cascade entropy across multiple PHP instances by fixing the session and collecting all - // environmental variables, including the previous session data and the current session - // data. - // - // mt_rand seeds itself by looking at the PID and the time, both of which are (relatively) - // easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but - // PHP isn't low level to be able to use those as sources and on a web server there's not likely - // going to be a ton of keyboard or mouse action. web servers do have one thing that we can use - // however, a ton of people visiting the website. obviously you don't want to base your seeding - // soley on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled - // by the user and (2) this isn't just looking at the data sent by the current user - it's based - // on the data sent by all users. one user requests the page and a hash of their info is saved. - // another user visits the page and the serialization of their data is utilized along with the - // server envirnment stuff and a hash of the previous http request data (which itself utilizes - // a hash of the session data before that). certainly an attacker should be assumed to have - // full control over his own http requests. he, however, is not going to have control over - // everyone's http requests. - static $crypto = false, $v; - if ($crypto === false) { - // save old session data - $old_session_id = session_id(); - $old_use_cookies = ini_get('session.use_cookies'); - $old_session_cache_limiter = session_cache_limiter(); - $_OLD_SESSION = isset($_SESSION) ? $_SESSION : false; - if ($old_session_id != '') { - session_write_close(); - } - - session_id(1); - ini_set('session.use_cookies', 0); - session_cache_limiter(''); - session_start(); - - $v = $seed = $_SESSION['seed'] = pack('H*', sha1( - serialize($_SERVER) . - serialize($_POST) . - serialize($_GET) . - serialize($_COOKIE) . - serialize($GLOBALS) . - serialize($_SESSION) . - serialize($_OLD_SESSION) - )); - if (!isset($_SESSION['count'])) { - $_SESSION['count'] = 0; - } - $_SESSION['count']++; - - session_write_close(); - - // restore old session data - if ($old_session_id != '') { - session_id($old_session_id); - session_start(); - ini_set('session.use_cookies', $old_use_cookies); - session_cache_limiter($old_session_cache_limiter); - } else { - if ($_OLD_SESSION !== false) { - $_SESSION = $_OLD_SESSION; - unset($_OLD_SESSION); - } else { - unset($_SESSION); - } - } - - // in SSH2 a shared secret and an exchange hash are generated through the key exchange process. - // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C. - // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the - // original hash and the current hash. we'll be emulating that. for more info see the following URL: - // - // http://tools.ietf.org/html/rfc4253#section-7.2 - // - // see the is_string($crypto) part for an example of how to expand the keys - $key = pack('H*', sha1($seed . 'A')); - $iv = pack('H*', sha1($seed . 'C')); - - // ciphers are used as per the nist.gov link below. also, see this link: - // - // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives - switch (true) { - case phpseclib_resolve_include_path('Crypt/AES.php'): - if (!class_exists('Crypt_AES')) { - include_once 'AES.php'; - } - $crypto = new Crypt_AES(CRYPT_AES_MODE_CTR); - break; - case phpseclib_resolve_include_path('Crypt/Twofish.php'): - if (!class_exists('Crypt_Twofish')) { - include_once 'Twofish.php'; - } - $crypto = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); - break; - case phpseclib_resolve_include_path('Crypt/Blowfish.php'): - if (!class_exists('Crypt_Blowfish')) { - include_once 'Blowfish.php'; - } - $crypto = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); - break; - case phpseclib_resolve_include_path('Crypt/TripleDES.php'): - if (!class_exists('Crypt_TripleDES')) { - include_once 'TripleDES.php'; - } - $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); - break; - case phpseclib_resolve_include_path('Crypt/DES.php'): - if (!class_exists('Crypt_DES')) { - include_once 'DES.php'; - } - $crypto = new Crypt_DES(CRYPT_DES_MODE_CTR); - break; - case phpseclib_resolve_include_path('Crypt/RC4.php'): - if (!class_exists('Crypt_RC4')) { - include_once 'RC4.php'; - } - $crypto = new Crypt_RC4(); - break; - default: - user_error('crypt_random_string requires at least one symmetric cipher be loaded'); - return false; - } - - $crypto->setKey($key); - $crypto->setIV($iv); - $crypto->enableContinuousBuffer(); - } - - //return $crypto->encrypt(str_repeat("\0", $length)); - - // the following is based off of ANSI X9.31: - // - // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf - // - // OpenSSL uses that same standard for it's random numbers: - // - // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c - // (do a search for "ANS X9.31 A.2.4") - $result = ''; - while (strlen($result) < $length) { - $i = $crypto->encrypt(microtime()); // strlen(microtime()) == 21 - $r = $crypto->encrypt($i ^ $v); // strlen($v) == 20 - $v = $crypto->encrypt($r ^ $i); // strlen($r) == 20 - $result.= $r; - } - return substr($result, 0, $length); - } -} - -if (!function_exists('phpseclib_resolve_include_path')) { - /** - * Resolve filename against the include path. - * - * Wrapper around stream_resolve_include_path() (which was introduced in - * PHP 5.3.2) with fallback implementation for earlier PHP versions. - * - * @param string $filename - * @return mixed Filename (string) on success, false otherwise. - * @access public - */ - function phpseclib_resolve_include_path($filename) - { - if (function_exists('stream_resolve_include_path')) { - return stream_resolve_include_path($filename); - } - - // handle non-relative paths - if (file_exists($filename)) { - return realpath($filename); - } - - $paths = PATH_SEPARATOR == ':' ? - preg_split('#(? + * + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_Random + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +// laravel is a PHP framework that utilizes phpseclib. laravel workbenches may, independently, +// have phpseclib as a requirement as well. if you're developing such a program you may encounter +// a "Cannot redeclare crypt_random_string()" error. +if (!function_exists('crypt_random_string')) { + /** + * "Is Windows" test + * + * @access private + */ + define('CRYPT_RANDOM_IS_WINDOWS', strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'); + + /** + * Generate a random string. + * + * Although microoptimizations are generally discouraged as they impair readability this function is ripe with + * microoptimizations because this function has the potential of being called a huge number of times. + * eg. for RSA key generation. + * + * @param int $length + * @return string + * @access public + */ + function crypt_random_string($length) + { + if (!$length) { + return ''; + } + + if (CRYPT_RANDOM_IS_WINDOWS) { + // method 1. prior to PHP 5.3, mcrypt_create_iv() would call rand() on windows + if (extension_loaded('mcrypt') && version_compare(PHP_VERSION, '5.3.0', '>=')) { + return @mcrypt_create_iv($length); + } + // method 2. openssl_random_pseudo_bytes was introduced in PHP 5.3.0 but prior to PHP 5.3.4 there was, + // to quote , "possible blocking behavior". as of 5.3.4 + // openssl_random_pseudo_bytes and mcrypt_create_iv do the exact same thing on Windows. ie. they both + // call php_win32_get_random_bytes(): + // + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/openssl/openssl.c#L5008 + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1392 + // + // php_win32_get_random_bytes() is defined thusly: + // + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/win32/winutil.c#L80 + // + // we're calling it, all the same, in the off chance that the mcrypt extension is not available + if (extension_loaded('openssl') && version_compare(PHP_VERSION, '5.3.4', '>=')) { + return openssl_random_pseudo_bytes($length); + } + } else { + // method 1. the fastest + if (extension_loaded('openssl') && version_compare(PHP_VERSION, '5.3.0', '>=')) { + return openssl_random_pseudo_bytes($length); + } + // method 2 + static $fp = true; + if ($fp === true) { + // warning's will be output unles the error suppression operator is used. errors such as + // "open_basedir restriction in effect", "Permission denied", "No such file or directory", etc. + $fp = @fopen('/dev/urandom', 'rb'); + } + if ($fp !== true && $fp !== false) { // surprisingly faster than !is_bool() or is_resource() + return fread($fp, $length); + } + // method 3. pretty much does the same thing as method 2 per the following url: + // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1391 + // surprisingly slower than method 2. maybe that's because mcrypt_create_iv does a bunch of error checking that we're + // not doing. regardless, this'll only be called if this PHP script couldn't open /dev/urandom due to open_basedir + // restrictions or some such + if (extension_loaded('mcrypt')) { + return @mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); + } + } + // at this point we have no choice but to use a pure-PHP CSPRNG + + // cascade entropy across multiple PHP instances by fixing the session and collecting all + // environmental variables, including the previous session data and the current session + // data. + // + // mt_rand seeds itself by looking at the PID and the time, both of which are (relatively) + // easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but + // PHP isn't low level to be able to use those as sources and on a web server there's not likely + // going to be a ton of keyboard or mouse action. web servers do have one thing that we can use + // however, a ton of people visiting the website. obviously you don't want to base your seeding + // soley on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled + // by the user and (2) this isn't just looking at the data sent by the current user - it's based + // on the data sent by all users. one user requests the page and a hash of their info is saved. + // another user visits the page and the serialization of their data is utilized along with the + // server envirnment stuff and a hash of the previous http request data (which itself utilizes + // a hash of the session data before that). certainly an attacker should be assumed to have + // full control over his own http requests. he, however, is not going to have control over + // everyone's http requests. + static $crypto = false, $v; + if ($crypto === false) { + // save old session data + $old_session_id = session_id(); + $old_use_cookies = ini_get('session.use_cookies'); + $old_session_cache_limiter = session_cache_limiter(); + $_OLD_SESSION = isset($_SESSION) ? $_SESSION : false; + if ($old_session_id != '') { + session_write_close(); + } + + session_id(1); + ini_set('session.use_cookies', 0); + session_cache_limiter(''); + session_start(); + + $v = $seed = $_SESSION['seed'] = pack('H*', sha1( + (isset($_SERVER) ? phpseclib_safe_serialize($_SERVER) : '') . + (isset($_POST) ? phpseclib_safe_serialize($_POST) : '') . + (isset($_GET) ? phpseclib_safe_serialize($_GET) : '') . + (isset($_COOKIE) ? phpseclib_safe_serialize($_COOKIE) : '') . + phpseclib_safe_serialize($GLOBALS) . + phpseclib_safe_serialize($_SESSION) . + phpseclib_safe_serialize($_OLD_SESSION) + )); + if (!isset($_SESSION['count'])) { + $_SESSION['count'] = 0; + } + $_SESSION['count']++; + + session_write_close(); + + // restore old session data + if ($old_session_id != '') { + session_id($old_session_id); + session_start(); + ini_set('session.use_cookies', $old_use_cookies); + session_cache_limiter($old_session_cache_limiter); + } else { + if ($_OLD_SESSION !== false) { + $_SESSION = $_OLD_SESSION; + unset($_OLD_SESSION); + } else { + unset($_SESSION); + } + } + + // in SSH2 a shared secret and an exchange hash are generated through the key exchange process. + // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C. + // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the + // original hash and the current hash. we'll be emulating that. for more info see the following URL: + // + // http://tools.ietf.org/html/rfc4253#section-7.2 + // + // see the is_string($crypto) part for an example of how to expand the keys + $key = pack('H*', sha1($seed . 'A')); + $iv = pack('H*', sha1($seed . 'C')); + + // ciphers are used as per the nist.gov link below. also, see this link: + // + // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives + switch (true) { + case phpseclib_resolve_include_path('Crypt/AES.php'): + if (!class_exists('Crypt_AES')) { + include_once 'AES.php'; + } + $crypto = new Crypt_AES(CRYPT_AES_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/Twofish.php'): + if (!class_exists('Crypt_Twofish')) { + include_once 'Twofish.php'; + } + $crypto = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/Blowfish.php'): + if (!class_exists('Crypt_Blowfish')) { + include_once 'Blowfish.php'; + } + $crypto = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/TripleDES.php'): + if (!class_exists('Crypt_TripleDES')) { + include_once 'TripleDES.php'; + } + $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/DES.php'): + if (!class_exists('Crypt_DES')) { + include_once 'DES.php'; + } + $crypto = new Crypt_DES(CRYPT_DES_MODE_CTR); + break; + case phpseclib_resolve_include_path('Crypt/RC4.php'): + if (!class_exists('Crypt_RC4')) { + include_once 'RC4.php'; + } + $crypto = new Crypt_RC4(); + break; + default: + user_error('crypt_random_string requires at least one symmetric cipher be loaded'); + return false; + } + + $crypto->setKey($key); + $crypto->setIV($iv); + $crypto->enableContinuousBuffer(); + } + + //return $crypto->encrypt(str_repeat("\0", $length)); + + // the following is based off of ANSI X9.31: + // + // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf + // + // OpenSSL uses that same standard for it's random numbers: + // + // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c + // (do a search for "ANS X9.31 A.2.4") + $result = ''; + while (strlen($result) < $length) { + $i = $crypto->encrypt(microtime()); // strlen(microtime()) == 21 + $r = $crypto->encrypt($i ^ $v); // strlen($v) == 20 + $v = $crypto->encrypt($r ^ $i); // strlen($r) == 20 + $result.= $r; + } + return substr($result, 0, $length); + } +} + +if (!function_exists('phpseclib_safe_serialize')) { + /** + * Safely serialize variables + * + * If a class has a private __sleep() method it'll give a fatal error on PHP 5.2 and earlier. + * PHP 5.3 will emit a warning. + * + * @param mixed $arr + * @access public + */ + function phpseclib_safe_serialize(&$arr) + { + if (is_object($arr)) { + return ''; + } + if (!is_array($arr)) { + return serialize($arr); + } + // prevent circular array recursion + if (isset($arr['__phpseclib_marker'])) { + return ''; + } + $safearr = array(); + $arr['__phpseclib_marker'] = true; + foreach (array_keys($arr) as $key) { + // do not recurse on the '__phpseclib_marker' key itself, for smaller memory usage + if ($key !== '__phpseclib_marker') { + $safearr[$key] = phpseclib_safe_serialize($arr[$key]); + } + } + unset($arr['__phpseclib_marker']); + return serialize($safearr); + } +} + +if (!function_exists('phpseclib_resolve_include_path')) { + /** + * Resolve filename against the include path. + * + * Wrapper around stream_resolve_include_path() (which was introduced in + * PHP 5.3.2) with fallback implementation for earlier PHP versions. + * + * @param string $filename + * @return string|false + * @access public + */ + function phpseclib_resolve_include_path($filename) + { + if (function_exists('stream_resolve_include_path')) { + return stream_resolve_include_path($filename); + } + + // handle non-relative paths + if (file_exists($filename)) { + return realpath($filename); + } + + $paths = PATH_SEPARATOR == ':' ? + preg_split('#(? - * setKey('abcdefghijklmnop'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $rijndael->decrypt($rijndael->encrypt($plaintext)); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Crypt - * @package Crypt_Rijndael - * @author Jim Wigginton - * @copyright 2008 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Base - * - * Base cipher class - */ -if (!class_exists('Crypt_Base')) { - include_once 'Base.php'; -} - -/**#@+ - * @access public - * @see Crypt_Rijndael::encrypt() - * @see Crypt_Rijndael::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_RIJNDAEL_MODE_CTR', CRYPT_MODE_CTR); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_RIJNDAEL_MODE_ECB', CRYPT_MODE_ECB); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_RIJNDAEL_MODE_CBC', CRYPT_MODE_CBC); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_RIJNDAEL_MODE_CFB', CRYPT_MODE_CFB); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_RIJNDAEL_MODE_OFB', CRYPT_MODE_OFB); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_Base::Crypt_Base() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_RIJNDAEL_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_RIJNDAEL_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/** - * Pure-PHP implementation of Rijndael. - * - * @package Crypt_Rijndael - * @author Jim Wigginton - * @access public - */ -class Crypt_Rijndael extends Crypt_Base -{ - /** - * The default password key_size used by setPassword() - * - * @see Crypt_Base::password_key_size - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 16; - - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'RIJNDAEL'; - - /** - * The mcrypt specific name of the cipher - * - * Mcrypt is useable for 128/192/256-bit $block_size/$key_size. For 160/224 not. - * Crypt_Rijndael determines automatically whether mcrypt is useable - * or not for the current $block_size/$key_size. - * In case of, $cipher_name_mcrypt will be set dynamically at run time accordingly. - * - * @see Crypt_Base::cipher_name_mcrypt - * @see Crypt_Base::engine - * @see _setupEngine() - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'rijndael-128'; - - /** - * The default salt used by setPassword() - * - * @see Crypt_Base::password_default_salt - * @see Crypt_Base::setPassword() - * @var String - * @access private - */ - var $password_default_salt = 'phpseclib'; - - /** - * Has the key length explicitly been set or should it be derived from the key, itself? - * - * @see setKeyLength() - * @var Boolean - * @access private - */ - var $explicit_key_length = false; - - /** - * The Key Schedule - * - * @see _setup() - * @var Array - * @access private - */ - var $w; - - /** - * The Inverse Key Schedule - * - * @see _setup() - * @var Array - * @access private - */ - var $dw; - - /** - * The Block Length divided by 32 - * - * @see setBlockLength() - * @var Integer - * @access private - * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4. Exists in conjunction with $block_size - * because the encryption / decryption / key schedule creation requires this number and not $block_size. We could - * derive this from $block_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu - * of that, we'll just precompute it once. - * - */ - var $Nb = 4; - - /** - * The Key Length - * - * @see setKeyLength() - * @var Integer - * @access private - * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk - * because the encryption / decryption / key schedule creation requires this number and not $key_size. We could - * derive this from $key_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu - * of that, we'll just precompute it once. - */ - var $key_size = 16; - - /** - * The Key Length divided by 32 - * - * @see setKeyLength() - * @var Integer - * @access private - * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4 - */ - var $Nk = 4; - - /** - * The Number of Rounds - * - * @var Integer - * @access private - * @internal The max value is 14, the min value is 10. - */ - var $Nr; - - /** - * Shift offsets - * - * @var Array - * @access private - */ - var $c; - - /** - * Holds the last used key- and block_size information - * - * @var Array - * @access private - */ - var $kl; - - /** - * Precomputed mixColumns table - * - * According to (section 5.2.1), - * precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so - * those are the names we'll use. - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $t0 = array( - 0xC66363A5, 0xF87C7C84, 0xEE777799, 0xF67B7B8D, 0xFFF2F20D, 0xD66B6BBD, 0xDE6F6FB1, 0x91C5C554, - 0x60303050, 0x02010103, 0xCE6767A9, 0x562B2B7D, 0xE7FEFE19, 0xB5D7D762, 0x4DABABE6, 0xEC76769A, - 0x8FCACA45, 0x1F82829D, 0x89C9C940, 0xFA7D7D87, 0xEFFAFA15, 0xB25959EB, 0x8E4747C9, 0xFBF0F00B, - 0x41ADADEC, 0xB3D4D467, 0x5FA2A2FD, 0x45AFAFEA, 0x239C9CBF, 0x53A4A4F7, 0xE4727296, 0x9BC0C05B, - 0x75B7B7C2, 0xE1FDFD1C, 0x3D9393AE, 0x4C26266A, 0x6C36365A, 0x7E3F3F41, 0xF5F7F702, 0x83CCCC4F, - 0x6834345C, 0x51A5A5F4, 0xD1E5E534, 0xF9F1F108, 0xE2717193, 0xABD8D873, 0x62313153, 0x2A15153F, - 0x0804040C, 0x95C7C752, 0x46232365, 0x9DC3C35E, 0x30181828, 0x379696A1, 0x0A05050F, 0x2F9A9AB5, - 0x0E070709, 0x24121236, 0x1B80809B, 0xDFE2E23D, 0xCDEBEB26, 0x4E272769, 0x7FB2B2CD, 0xEA75759F, - 0x1209091B, 0x1D83839E, 0x582C2C74, 0x341A1A2E, 0x361B1B2D, 0xDC6E6EB2, 0xB45A5AEE, 0x5BA0A0FB, - 0xA45252F6, 0x763B3B4D, 0xB7D6D661, 0x7DB3B3CE, 0x5229297B, 0xDDE3E33E, 0x5E2F2F71, 0x13848497, - 0xA65353F5, 0xB9D1D168, 0x00000000, 0xC1EDED2C, 0x40202060, 0xE3FCFC1F, 0x79B1B1C8, 0xB65B5BED, - 0xD46A6ABE, 0x8DCBCB46, 0x67BEBED9, 0x7239394B, 0x944A4ADE, 0x984C4CD4, 0xB05858E8, 0x85CFCF4A, - 0xBBD0D06B, 0xC5EFEF2A, 0x4FAAAAE5, 0xEDFBFB16, 0x864343C5, 0x9A4D4DD7, 0x66333355, 0x11858594, - 0x8A4545CF, 0xE9F9F910, 0x04020206, 0xFE7F7F81, 0xA05050F0, 0x783C3C44, 0x259F9FBA, 0x4BA8A8E3, - 0xA25151F3, 0x5DA3A3FE, 0x804040C0, 0x058F8F8A, 0x3F9292AD, 0x219D9DBC, 0x70383848, 0xF1F5F504, - 0x63BCBCDF, 0x77B6B6C1, 0xAFDADA75, 0x42212163, 0x20101030, 0xE5FFFF1A, 0xFDF3F30E, 0xBFD2D26D, - 0x81CDCD4C, 0x180C0C14, 0x26131335, 0xC3ECEC2F, 0xBE5F5FE1, 0x359797A2, 0x884444CC, 0x2E171739, - 0x93C4C457, 0x55A7A7F2, 0xFC7E7E82, 0x7A3D3D47, 0xC86464AC, 0xBA5D5DE7, 0x3219192B, 0xE6737395, - 0xC06060A0, 0x19818198, 0x9E4F4FD1, 0xA3DCDC7F, 0x44222266, 0x542A2A7E, 0x3B9090AB, 0x0B888883, - 0x8C4646CA, 0xC7EEEE29, 0x6BB8B8D3, 0x2814143C, 0xA7DEDE79, 0xBC5E5EE2, 0x160B0B1D, 0xADDBDB76, - 0xDBE0E03B, 0x64323256, 0x743A3A4E, 0x140A0A1E, 0x924949DB, 0x0C06060A, 0x4824246C, 0xB85C5CE4, - 0x9FC2C25D, 0xBDD3D36E, 0x43ACACEF, 0xC46262A6, 0x399191A8, 0x319595A4, 0xD3E4E437, 0xF279798B, - 0xD5E7E732, 0x8BC8C843, 0x6E373759, 0xDA6D6DB7, 0x018D8D8C, 0xB1D5D564, 0x9C4E4ED2, 0x49A9A9E0, - 0xD86C6CB4, 0xAC5656FA, 0xF3F4F407, 0xCFEAEA25, 0xCA6565AF, 0xF47A7A8E, 0x47AEAEE9, 0x10080818, - 0x6FBABAD5, 0xF0787888, 0x4A25256F, 0x5C2E2E72, 0x381C1C24, 0x57A6A6F1, 0x73B4B4C7, 0x97C6C651, - 0xCBE8E823, 0xA1DDDD7C, 0xE874749C, 0x3E1F1F21, 0x964B4BDD, 0x61BDBDDC, 0x0D8B8B86, 0x0F8A8A85, - 0xE0707090, 0x7C3E3E42, 0x71B5B5C4, 0xCC6666AA, 0x904848D8, 0x06030305, 0xF7F6F601, 0x1C0E0E12, - 0xC26161A3, 0x6A35355F, 0xAE5757F9, 0x69B9B9D0, 0x17868691, 0x99C1C158, 0x3A1D1D27, 0x279E9EB9, - 0xD9E1E138, 0xEBF8F813, 0x2B9898B3, 0x22111133, 0xD26969BB, 0xA9D9D970, 0x078E8E89, 0x339494A7, - 0x2D9B9BB6, 0x3C1E1E22, 0x15878792, 0xC9E9E920, 0x87CECE49, 0xAA5555FF, 0x50282878, 0xA5DFDF7A, - 0x038C8C8F, 0x59A1A1F8, 0x09898980, 0x1A0D0D17, 0x65BFBFDA, 0xD7E6E631, 0x844242C6, 0xD06868B8, - 0x824141C3, 0x299999B0, 0x5A2D2D77, 0x1E0F0F11, 0x7BB0B0CB, 0xA85454FC, 0x6DBBBBD6, 0x2C16163A - ); - - /** - * Precomputed mixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $t1 = array( - 0xA5C66363, 0x84F87C7C, 0x99EE7777, 0x8DF67B7B, 0x0DFFF2F2, 0xBDD66B6B, 0xB1DE6F6F, 0x5491C5C5, - 0x50603030, 0x03020101, 0xA9CE6767, 0x7D562B2B, 0x19E7FEFE, 0x62B5D7D7, 0xE64DABAB, 0x9AEC7676, - 0x458FCACA, 0x9D1F8282, 0x4089C9C9, 0x87FA7D7D, 0x15EFFAFA, 0xEBB25959, 0xC98E4747, 0x0BFBF0F0, - 0xEC41ADAD, 0x67B3D4D4, 0xFD5FA2A2, 0xEA45AFAF, 0xBF239C9C, 0xF753A4A4, 0x96E47272, 0x5B9BC0C0, - 0xC275B7B7, 0x1CE1FDFD, 0xAE3D9393, 0x6A4C2626, 0x5A6C3636, 0x417E3F3F, 0x02F5F7F7, 0x4F83CCCC, - 0x5C683434, 0xF451A5A5, 0x34D1E5E5, 0x08F9F1F1, 0x93E27171, 0x73ABD8D8, 0x53623131, 0x3F2A1515, - 0x0C080404, 0x5295C7C7, 0x65462323, 0x5E9DC3C3, 0x28301818, 0xA1379696, 0x0F0A0505, 0xB52F9A9A, - 0x090E0707, 0x36241212, 0x9B1B8080, 0x3DDFE2E2, 0x26CDEBEB, 0x694E2727, 0xCD7FB2B2, 0x9FEA7575, - 0x1B120909, 0x9E1D8383, 0x74582C2C, 0x2E341A1A, 0x2D361B1B, 0xB2DC6E6E, 0xEEB45A5A, 0xFB5BA0A0, - 0xF6A45252, 0x4D763B3B, 0x61B7D6D6, 0xCE7DB3B3, 0x7B522929, 0x3EDDE3E3, 0x715E2F2F, 0x97138484, - 0xF5A65353, 0x68B9D1D1, 0x00000000, 0x2CC1EDED, 0x60402020, 0x1FE3FCFC, 0xC879B1B1, 0xEDB65B5B, - 0xBED46A6A, 0x468DCBCB, 0xD967BEBE, 0x4B723939, 0xDE944A4A, 0xD4984C4C, 0xE8B05858, 0x4A85CFCF, - 0x6BBBD0D0, 0x2AC5EFEF, 0xE54FAAAA, 0x16EDFBFB, 0xC5864343, 0xD79A4D4D, 0x55663333, 0x94118585, - 0xCF8A4545, 0x10E9F9F9, 0x06040202, 0x81FE7F7F, 0xF0A05050, 0x44783C3C, 0xBA259F9F, 0xE34BA8A8, - 0xF3A25151, 0xFE5DA3A3, 0xC0804040, 0x8A058F8F, 0xAD3F9292, 0xBC219D9D, 0x48703838, 0x04F1F5F5, - 0xDF63BCBC, 0xC177B6B6, 0x75AFDADA, 0x63422121, 0x30201010, 0x1AE5FFFF, 0x0EFDF3F3, 0x6DBFD2D2, - 0x4C81CDCD, 0x14180C0C, 0x35261313, 0x2FC3ECEC, 0xE1BE5F5F, 0xA2359797, 0xCC884444, 0x392E1717, - 0x5793C4C4, 0xF255A7A7, 0x82FC7E7E, 0x477A3D3D, 0xACC86464, 0xE7BA5D5D, 0x2B321919, 0x95E67373, - 0xA0C06060, 0x98198181, 0xD19E4F4F, 0x7FA3DCDC, 0x66442222, 0x7E542A2A, 0xAB3B9090, 0x830B8888, - 0xCA8C4646, 0x29C7EEEE, 0xD36BB8B8, 0x3C281414, 0x79A7DEDE, 0xE2BC5E5E, 0x1D160B0B, 0x76ADDBDB, - 0x3BDBE0E0, 0x56643232, 0x4E743A3A, 0x1E140A0A, 0xDB924949, 0x0A0C0606, 0x6C482424, 0xE4B85C5C, - 0x5D9FC2C2, 0x6EBDD3D3, 0xEF43ACAC, 0xA6C46262, 0xA8399191, 0xA4319595, 0x37D3E4E4, 0x8BF27979, - 0x32D5E7E7, 0x438BC8C8, 0x596E3737, 0xB7DA6D6D, 0x8C018D8D, 0x64B1D5D5, 0xD29C4E4E, 0xE049A9A9, - 0xB4D86C6C, 0xFAAC5656, 0x07F3F4F4, 0x25CFEAEA, 0xAFCA6565, 0x8EF47A7A, 0xE947AEAE, 0x18100808, - 0xD56FBABA, 0x88F07878, 0x6F4A2525, 0x725C2E2E, 0x24381C1C, 0xF157A6A6, 0xC773B4B4, 0x5197C6C6, - 0x23CBE8E8, 0x7CA1DDDD, 0x9CE87474, 0x213E1F1F, 0xDD964B4B, 0xDC61BDBD, 0x860D8B8B, 0x850F8A8A, - 0x90E07070, 0x427C3E3E, 0xC471B5B5, 0xAACC6666, 0xD8904848, 0x05060303, 0x01F7F6F6, 0x121C0E0E, - 0xA3C26161, 0x5F6A3535, 0xF9AE5757, 0xD069B9B9, 0x91178686, 0x5899C1C1, 0x273A1D1D, 0xB9279E9E, - 0x38D9E1E1, 0x13EBF8F8, 0xB32B9898, 0x33221111, 0xBBD26969, 0x70A9D9D9, 0x89078E8E, 0xA7339494, - 0xB62D9B9B, 0x223C1E1E, 0x92158787, 0x20C9E9E9, 0x4987CECE, 0xFFAA5555, 0x78502828, 0x7AA5DFDF, - 0x8F038C8C, 0xF859A1A1, 0x80098989, 0x171A0D0D, 0xDA65BFBF, 0x31D7E6E6, 0xC6844242, 0xB8D06868, - 0xC3824141, 0xB0299999, 0x775A2D2D, 0x111E0F0F, 0xCB7BB0B0, 0xFCA85454, 0xD66DBBBB, 0x3A2C1616 - ); - - /** - * Precomputed mixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $t2 = array( - 0x63A5C663, 0x7C84F87C, 0x7799EE77, 0x7B8DF67B, 0xF20DFFF2, 0x6BBDD66B, 0x6FB1DE6F, 0xC55491C5, - 0x30506030, 0x01030201, 0x67A9CE67, 0x2B7D562B, 0xFE19E7FE, 0xD762B5D7, 0xABE64DAB, 0x769AEC76, - 0xCA458FCA, 0x829D1F82, 0xC94089C9, 0x7D87FA7D, 0xFA15EFFA, 0x59EBB259, 0x47C98E47, 0xF00BFBF0, - 0xADEC41AD, 0xD467B3D4, 0xA2FD5FA2, 0xAFEA45AF, 0x9CBF239C, 0xA4F753A4, 0x7296E472, 0xC05B9BC0, - 0xB7C275B7, 0xFD1CE1FD, 0x93AE3D93, 0x266A4C26, 0x365A6C36, 0x3F417E3F, 0xF702F5F7, 0xCC4F83CC, - 0x345C6834, 0xA5F451A5, 0xE534D1E5, 0xF108F9F1, 0x7193E271, 0xD873ABD8, 0x31536231, 0x153F2A15, - 0x040C0804, 0xC75295C7, 0x23654623, 0xC35E9DC3, 0x18283018, 0x96A13796, 0x050F0A05, 0x9AB52F9A, - 0x07090E07, 0x12362412, 0x809B1B80, 0xE23DDFE2, 0xEB26CDEB, 0x27694E27, 0xB2CD7FB2, 0x759FEA75, - 0x091B1209, 0x839E1D83, 0x2C74582C, 0x1A2E341A, 0x1B2D361B, 0x6EB2DC6E, 0x5AEEB45A, 0xA0FB5BA0, - 0x52F6A452, 0x3B4D763B, 0xD661B7D6, 0xB3CE7DB3, 0x297B5229, 0xE33EDDE3, 0x2F715E2F, 0x84971384, - 0x53F5A653, 0xD168B9D1, 0x00000000, 0xED2CC1ED, 0x20604020, 0xFC1FE3FC, 0xB1C879B1, 0x5BEDB65B, - 0x6ABED46A, 0xCB468DCB, 0xBED967BE, 0x394B7239, 0x4ADE944A, 0x4CD4984C, 0x58E8B058, 0xCF4A85CF, - 0xD06BBBD0, 0xEF2AC5EF, 0xAAE54FAA, 0xFB16EDFB, 0x43C58643, 0x4DD79A4D, 0x33556633, 0x85941185, - 0x45CF8A45, 0xF910E9F9, 0x02060402, 0x7F81FE7F, 0x50F0A050, 0x3C44783C, 0x9FBA259F, 0xA8E34BA8, - 0x51F3A251, 0xA3FE5DA3, 0x40C08040, 0x8F8A058F, 0x92AD3F92, 0x9DBC219D, 0x38487038, 0xF504F1F5, - 0xBCDF63BC, 0xB6C177B6, 0xDA75AFDA, 0x21634221, 0x10302010, 0xFF1AE5FF, 0xF30EFDF3, 0xD26DBFD2, - 0xCD4C81CD, 0x0C14180C, 0x13352613, 0xEC2FC3EC, 0x5FE1BE5F, 0x97A23597, 0x44CC8844, 0x17392E17, - 0xC45793C4, 0xA7F255A7, 0x7E82FC7E, 0x3D477A3D, 0x64ACC864, 0x5DE7BA5D, 0x192B3219, 0x7395E673, - 0x60A0C060, 0x81981981, 0x4FD19E4F, 0xDC7FA3DC, 0x22664422, 0x2A7E542A, 0x90AB3B90, 0x88830B88, - 0x46CA8C46, 0xEE29C7EE, 0xB8D36BB8, 0x143C2814, 0xDE79A7DE, 0x5EE2BC5E, 0x0B1D160B, 0xDB76ADDB, - 0xE03BDBE0, 0x32566432, 0x3A4E743A, 0x0A1E140A, 0x49DB9249, 0x060A0C06, 0x246C4824, 0x5CE4B85C, - 0xC25D9FC2, 0xD36EBDD3, 0xACEF43AC, 0x62A6C462, 0x91A83991, 0x95A43195, 0xE437D3E4, 0x798BF279, - 0xE732D5E7, 0xC8438BC8, 0x37596E37, 0x6DB7DA6D, 0x8D8C018D, 0xD564B1D5, 0x4ED29C4E, 0xA9E049A9, - 0x6CB4D86C, 0x56FAAC56, 0xF407F3F4, 0xEA25CFEA, 0x65AFCA65, 0x7A8EF47A, 0xAEE947AE, 0x08181008, - 0xBAD56FBA, 0x7888F078, 0x256F4A25, 0x2E725C2E, 0x1C24381C, 0xA6F157A6, 0xB4C773B4, 0xC65197C6, - 0xE823CBE8, 0xDD7CA1DD, 0x749CE874, 0x1F213E1F, 0x4BDD964B, 0xBDDC61BD, 0x8B860D8B, 0x8A850F8A, - 0x7090E070, 0x3E427C3E, 0xB5C471B5, 0x66AACC66, 0x48D89048, 0x03050603, 0xF601F7F6, 0x0E121C0E, - 0x61A3C261, 0x355F6A35, 0x57F9AE57, 0xB9D069B9, 0x86911786, 0xC15899C1, 0x1D273A1D, 0x9EB9279E, - 0xE138D9E1, 0xF813EBF8, 0x98B32B98, 0x11332211, 0x69BBD269, 0xD970A9D9, 0x8E89078E, 0x94A73394, - 0x9BB62D9B, 0x1E223C1E, 0x87921587, 0xE920C9E9, 0xCE4987CE, 0x55FFAA55, 0x28785028, 0xDF7AA5DF, - 0x8C8F038C, 0xA1F859A1, 0x89800989, 0x0D171A0D, 0xBFDA65BF, 0xE631D7E6, 0x42C68442, 0x68B8D068, - 0x41C38241, 0x99B02999, 0x2D775A2D, 0x0F111E0F, 0xB0CB7BB0, 0x54FCA854, 0xBBD66DBB, 0x163A2C16 - ); - - /** - * Precomputed mixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $t3 = array( - 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491, - 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, - 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, - 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B, - 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, - 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, - 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F, - 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, - 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, - 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713, - 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, - 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, - 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411, - 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, - 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, - 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF, - 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, - 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, - 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B, - 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, - 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, - 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2, - 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, - 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, - 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197, - 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, - 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, - 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927, - 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, - 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, - 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0, - 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C - ); - - /** - * Precomputed invMixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $dt0 = array( - 0x51F4A750, 0x7E416553, 0x1A17A4C3, 0x3A275E96, 0x3BAB6BCB, 0x1F9D45F1, 0xACFA58AB, 0x4BE30393, - 0x2030FA55, 0xAD766DF6, 0x88CC7691, 0xF5024C25, 0x4FE5D7FC, 0xC52ACBD7, 0x26354480, 0xB562A38F, - 0xDEB15A49, 0x25BA1B67, 0x45EA0E98, 0x5DFEC0E1, 0xC32F7502, 0x814CF012, 0x8D4697A3, 0x6BD3F9C6, - 0x038F5FE7, 0x15929C95, 0xBF6D7AEB, 0x955259DA, 0xD4BE832D, 0x587421D3, 0x49E06929, 0x8EC9C844, - 0x75C2896A, 0xF48E7978, 0x99583E6B, 0x27B971DD, 0xBEE14FB6, 0xF088AD17, 0xC920AC66, 0x7DCE3AB4, - 0x63DF4A18, 0xE51A3182, 0x97513360, 0x62537F45, 0xB16477E0, 0xBB6BAE84, 0xFE81A01C, 0xF9082B94, - 0x70486858, 0x8F45FD19, 0x94DE6C87, 0x527BF8B7, 0xAB73D323, 0x724B02E2, 0xE31F8F57, 0x6655AB2A, - 0xB2EB2807, 0x2FB5C203, 0x86C57B9A, 0xD33708A5, 0x302887F2, 0x23BFA5B2, 0x02036ABA, 0xED16825C, - 0x8ACF1C2B, 0xA779B492, 0xF307F2F0, 0x4E69E2A1, 0x65DAF4CD, 0x0605BED5, 0xD134621F, 0xC4A6FE8A, - 0x342E539D, 0xA2F355A0, 0x058AE132, 0xA4F6EB75, 0x0B83EC39, 0x4060EFAA, 0x5E719F06, 0xBD6E1051, - 0x3E218AF9, 0x96DD063D, 0xDD3E05AE, 0x4DE6BD46, 0x91548DB5, 0x71C45D05, 0x0406D46F, 0x605015FF, - 0x1998FB24, 0xD6BDE997, 0x894043CC, 0x67D99E77, 0xB0E842BD, 0x07898B88, 0xE7195B38, 0x79C8EEDB, - 0xA17C0A47, 0x7C420FE9, 0xF8841EC9, 0x00000000, 0x09808683, 0x322BED48, 0x1E1170AC, 0x6C5A724E, - 0xFD0EFFFB, 0x0F853856, 0x3DAED51E, 0x362D3927, 0x0A0FD964, 0x685CA621, 0x9B5B54D1, 0x24362E3A, - 0x0C0A67B1, 0x9357E70F, 0xB4EE96D2, 0x1B9B919E, 0x80C0C54F, 0x61DC20A2, 0x5A774B69, 0x1C121A16, - 0xE293BA0A, 0xC0A02AE5, 0x3C22E043, 0x121B171D, 0x0E090D0B, 0xF28BC7AD, 0x2DB6A8B9, 0x141EA9C8, - 0x57F11985, 0xAF75074C, 0xEE99DDBB, 0xA37F60FD, 0xF701269F, 0x5C72F5BC, 0x44663BC5, 0x5BFB7E34, - 0x8B432976, 0xCB23C6DC, 0xB6EDFC68, 0xB8E4F163, 0xD731DCCA, 0x42638510, 0x13972240, 0x84C61120, - 0x854A247D, 0xD2BB3DF8, 0xAEF93211, 0xC729A16D, 0x1D9E2F4B, 0xDCB230F3, 0x0D8652EC, 0x77C1E3D0, - 0x2BB3166C, 0xA970B999, 0x119448FA, 0x47E96422, 0xA8FC8CC4, 0xA0F03F1A, 0x567D2CD8, 0x223390EF, - 0x87494EC7, 0xD938D1C1, 0x8CCAA2FE, 0x98D40B36, 0xA6F581CF, 0xA57ADE28, 0xDAB78E26, 0x3FADBFA4, - 0x2C3A9DE4, 0x5078920D, 0x6A5FCC9B, 0x547E4662, 0xF68D13C2, 0x90D8B8E8, 0x2E39F75E, 0x82C3AFF5, - 0x9F5D80BE, 0x69D0937C, 0x6FD52DA9, 0xCF2512B3, 0xC8AC993B, 0x10187DA7, 0xE89C636E, 0xDB3BBB7B, - 0xCD267809, 0x6E5918F4, 0xEC9AB701, 0x834F9AA8, 0xE6956E65, 0xAAFFE67E, 0x21BCCF08, 0xEF15E8E6, - 0xBAE79BD9, 0x4A6F36CE, 0xEA9F09D4, 0x29B07CD6, 0x31A4B2AF, 0x2A3F2331, 0xC6A59430, 0x35A266C0, - 0x744EBC37, 0xFC82CAA6, 0xE090D0B0, 0x33A7D815, 0xF104984A, 0x41ECDAF7, 0x7FCD500E, 0x1791F62F, - 0x764DD68D, 0x43EFB04D, 0xCCAA4D54, 0xE49604DF, 0x9ED1B5E3, 0x4C6A881B, 0xC12C1FB8, 0x4665517F, - 0x9D5EEA04, 0x018C355D, 0xFA877473, 0xFB0B412E, 0xB3671D5A, 0x92DBD252, 0xE9105633, 0x6DD64713, - 0x9AD7618C, 0x37A10C7A, 0x59F8148E, 0xEB133C89, 0xCEA927EE, 0xB761C935, 0xE11CE5ED, 0x7A47B13C, - 0x9CD2DF59, 0x55F2733F, 0x1814CE79, 0x73C737BF, 0x53F7CDEA, 0x5FFDAA5B, 0xDF3D6F14, 0x7844DB86, - 0xCAAFF381, 0xB968C43E, 0x3824342C, 0xC2A3405F, 0x161DC372, 0xBCE2250C, 0x283C498B, 0xFF0D9541, - 0x39A80171, 0x080CB3DE, 0xD8B4E49C, 0x6456C190, 0x7BCB8461, 0xD532B670, 0x486C5C74, 0xD0B85742 - ); - - /** - * Precomputed invMixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $dt1 = array( - 0x5051F4A7, 0x537E4165, 0xC31A17A4, 0x963A275E, 0xCB3BAB6B, 0xF11F9D45, 0xABACFA58, 0x934BE303, - 0x552030FA, 0xF6AD766D, 0x9188CC76, 0x25F5024C, 0xFC4FE5D7, 0xD7C52ACB, 0x80263544, 0x8FB562A3, - 0x49DEB15A, 0x6725BA1B, 0x9845EA0E, 0xE15DFEC0, 0x02C32F75, 0x12814CF0, 0xA38D4697, 0xC66BD3F9, - 0xE7038F5F, 0x9515929C, 0xEBBF6D7A, 0xDA955259, 0x2DD4BE83, 0xD3587421, 0x2949E069, 0x448EC9C8, - 0x6A75C289, 0x78F48E79, 0x6B99583E, 0xDD27B971, 0xB6BEE14F, 0x17F088AD, 0x66C920AC, 0xB47DCE3A, - 0x1863DF4A, 0x82E51A31, 0x60975133, 0x4562537F, 0xE0B16477, 0x84BB6BAE, 0x1CFE81A0, 0x94F9082B, - 0x58704868, 0x198F45FD, 0x8794DE6C, 0xB7527BF8, 0x23AB73D3, 0xE2724B02, 0x57E31F8F, 0x2A6655AB, - 0x07B2EB28, 0x032FB5C2, 0x9A86C57B, 0xA5D33708, 0xF2302887, 0xB223BFA5, 0xBA02036A, 0x5CED1682, - 0x2B8ACF1C, 0x92A779B4, 0xF0F307F2, 0xA14E69E2, 0xCD65DAF4, 0xD50605BE, 0x1FD13462, 0x8AC4A6FE, - 0x9D342E53, 0xA0A2F355, 0x32058AE1, 0x75A4F6EB, 0x390B83EC, 0xAA4060EF, 0x065E719F, 0x51BD6E10, - 0xF93E218A, 0x3D96DD06, 0xAEDD3E05, 0x464DE6BD, 0xB591548D, 0x0571C45D, 0x6F0406D4, 0xFF605015, - 0x241998FB, 0x97D6BDE9, 0xCC894043, 0x7767D99E, 0xBDB0E842, 0x8807898B, 0x38E7195B, 0xDB79C8EE, - 0x47A17C0A, 0xE97C420F, 0xC9F8841E, 0x00000000, 0x83098086, 0x48322BED, 0xAC1E1170, 0x4E6C5A72, - 0xFBFD0EFF, 0x560F8538, 0x1E3DAED5, 0x27362D39, 0x640A0FD9, 0x21685CA6, 0xD19B5B54, 0x3A24362E, - 0xB10C0A67, 0x0F9357E7, 0xD2B4EE96, 0x9E1B9B91, 0x4F80C0C5, 0xA261DC20, 0x695A774B, 0x161C121A, - 0x0AE293BA, 0xE5C0A02A, 0x433C22E0, 0x1D121B17, 0x0B0E090D, 0xADF28BC7, 0xB92DB6A8, 0xC8141EA9, - 0x8557F119, 0x4CAF7507, 0xBBEE99DD, 0xFDA37F60, 0x9FF70126, 0xBC5C72F5, 0xC544663B, 0x345BFB7E, - 0x768B4329, 0xDCCB23C6, 0x68B6EDFC, 0x63B8E4F1, 0xCAD731DC, 0x10426385, 0x40139722, 0x2084C611, - 0x7D854A24, 0xF8D2BB3D, 0x11AEF932, 0x6DC729A1, 0x4B1D9E2F, 0xF3DCB230, 0xEC0D8652, 0xD077C1E3, - 0x6C2BB316, 0x99A970B9, 0xFA119448, 0x2247E964, 0xC4A8FC8C, 0x1AA0F03F, 0xD8567D2C, 0xEF223390, - 0xC787494E, 0xC1D938D1, 0xFE8CCAA2, 0x3698D40B, 0xCFA6F581, 0x28A57ADE, 0x26DAB78E, 0xA43FADBF, - 0xE42C3A9D, 0x0D507892, 0x9B6A5FCC, 0x62547E46, 0xC2F68D13, 0xE890D8B8, 0x5E2E39F7, 0xF582C3AF, - 0xBE9F5D80, 0x7C69D093, 0xA96FD52D, 0xB3CF2512, 0x3BC8AC99, 0xA710187D, 0x6EE89C63, 0x7BDB3BBB, - 0x09CD2678, 0xF46E5918, 0x01EC9AB7, 0xA8834F9A, 0x65E6956E, 0x7EAAFFE6, 0x0821BCCF, 0xE6EF15E8, - 0xD9BAE79B, 0xCE4A6F36, 0xD4EA9F09, 0xD629B07C, 0xAF31A4B2, 0x312A3F23, 0x30C6A594, 0xC035A266, - 0x37744EBC, 0xA6FC82CA, 0xB0E090D0, 0x1533A7D8, 0x4AF10498, 0xF741ECDA, 0x0E7FCD50, 0x2F1791F6, - 0x8D764DD6, 0x4D43EFB0, 0x54CCAA4D, 0xDFE49604, 0xE39ED1B5, 0x1B4C6A88, 0xB8C12C1F, 0x7F466551, - 0x049D5EEA, 0x5D018C35, 0x73FA8774, 0x2EFB0B41, 0x5AB3671D, 0x5292DBD2, 0x33E91056, 0x136DD647, - 0x8C9AD761, 0x7A37A10C, 0x8E59F814, 0x89EB133C, 0xEECEA927, 0x35B761C9, 0xEDE11CE5, 0x3C7A47B1, - 0x599CD2DF, 0x3F55F273, 0x791814CE, 0xBF73C737, 0xEA53F7CD, 0x5B5FFDAA, 0x14DF3D6F, 0x867844DB, - 0x81CAAFF3, 0x3EB968C4, 0x2C382434, 0x5FC2A340, 0x72161DC3, 0x0CBCE225, 0x8B283C49, 0x41FF0D95, - 0x7139A801, 0xDE080CB3, 0x9CD8B4E4, 0x906456C1, 0x617BCB84, 0x70D532B6, 0x74486C5C, 0x42D0B857 - ); - - /** - * Precomputed invMixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $dt2 = array( - 0xA75051F4, 0x65537E41, 0xA4C31A17, 0x5E963A27, 0x6BCB3BAB, 0x45F11F9D, 0x58ABACFA, 0x03934BE3, - 0xFA552030, 0x6DF6AD76, 0x769188CC, 0x4C25F502, 0xD7FC4FE5, 0xCBD7C52A, 0x44802635, 0xA38FB562, - 0x5A49DEB1, 0x1B6725BA, 0x0E9845EA, 0xC0E15DFE, 0x7502C32F, 0xF012814C, 0x97A38D46, 0xF9C66BD3, - 0x5FE7038F, 0x9C951592, 0x7AEBBF6D, 0x59DA9552, 0x832DD4BE, 0x21D35874, 0x692949E0, 0xC8448EC9, - 0x896A75C2, 0x7978F48E, 0x3E6B9958, 0x71DD27B9, 0x4FB6BEE1, 0xAD17F088, 0xAC66C920, 0x3AB47DCE, - 0x4A1863DF, 0x3182E51A, 0x33609751, 0x7F456253, 0x77E0B164, 0xAE84BB6B, 0xA01CFE81, 0x2B94F908, - 0x68587048, 0xFD198F45, 0x6C8794DE, 0xF8B7527B, 0xD323AB73, 0x02E2724B, 0x8F57E31F, 0xAB2A6655, - 0x2807B2EB, 0xC2032FB5, 0x7B9A86C5, 0x08A5D337, 0x87F23028, 0xA5B223BF, 0x6ABA0203, 0x825CED16, - 0x1C2B8ACF, 0xB492A779, 0xF2F0F307, 0xE2A14E69, 0xF4CD65DA, 0xBED50605, 0x621FD134, 0xFE8AC4A6, - 0x539D342E, 0x55A0A2F3, 0xE132058A, 0xEB75A4F6, 0xEC390B83, 0xEFAA4060, 0x9F065E71, 0x1051BD6E, - 0x8AF93E21, 0x063D96DD, 0x05AEDD3E, 0xBD464DE6, 0x8DB59154, 0x5D0571C4, 0xD46F0406, 0x15FF6050, - 0xFB241998, 0xE997D6BD, 0x43CC8940, 0x9E7767D9, 0x42BDB0E8, 0x8B880789, 0x5B38E719, 0xEEDB79C8, - 0x0A47A17C, 0x0FE97C42, 0x1EC9F884, 0x00000000, 0x86830980, 0xED48322B, 0x70AC1E11, 0x724E6C5A, - 0xFFFBFD0E, 0x38560F85, 0xD51E3DAE, 0x3927362D, 0xD9640A0F, 0xA621685C, 0x54D19B5B, 0x2E3A2436, - 0x67B10C0A, 0xE70F9357, 0x96D2B4EE, 0x919E1B9B, 0xC54F80C0, 0x20A261DC, 0x4B695A77, 0x1A161C12, - 0xBA0AE293, 0x2AE5C0A0, 0xE0433C22, 0x171D121B, 0x0D0B0E09, 0xC7ADF28B, 0xA8B92DB6, 0xA9C8141E, - 0x198557F1, 0x074CAF75, 0xDDBBEE99, 0x60FDA37F, 0x269FF701, 0xF5BC5C72, 0x3BC54466, 0x7E345BFB, - 0x29768B43, 0xC6DCCB23, 0xFC68B6ED, 0xF163B8E4, 0xDCCAD731, 0x85104263, 0x22401397, 0x112084C6, - 0x247D854A, 0x3DF8D2BB, 0x3211AEF9, 0xA16DC729, 0x2F4B1D9E, 0x30F3DCB2, 0x52EC0D86, 0xE3D077C1, - 0x166C2BB3, 0xB999A970, 0x48FA1194, 0x642247E9, 0x8CC4A8FC, 0x3F1AA0F0, 0x2CD8567D, 0x90EF2233, - 0x4EC78749, 0xD1C1D938, 0xA2FE8CCA, 0x0B3698D4, 0x81CFA6F5, 0xDE28A57A, 0x8E26DAB7, 0xBFA43FAD, - 0x9DE42C3A, 0x920D5078, 0xCC9B6A5F, 0x4662547E, 0x13C2F68D, 0xB8E890D8, 0xF75E2E39, 0xAFF582C3, - 0x80BE9F5D, 0x937C69D0, 0x2DA96FD5, 0x12B3CF25, 0x993BC8AC, 0x7DA71018, 0x636EE89C, 0xBB7BDB3B, - 0x7809CD26, 0x18F46E59, 0xB701EC9A, 0x9AA8834F, 0x6E65E695, 0xE67EAAFF, 0xCF0821BC, 0xE8E6EF15, - 0x9BD9BAE7, 0x36CE4A6F, 0x09D4EA9F, 0x7CD629B0, 0xB2AF31A4, 0x23312A3F, 0x9430C6A5, 0x66C035A2, - 0xBC37744E, 0xCAA6FC82, 0xD0B0E090, 0xD81533A7, 0x984AF104, 0xDAF741EC, 0x500E7FCD, 0xF62F1791, - 0xD68D764D, 0xB04D43EF, 0x4D54CCAA, 0x04DFE496, 0xB5E39ED1, 0x881B4C6A, 0x1FB8C12C, 0x517F4665, - 0xEA049D5E, 0x355D018C, 0x7473FA87, 0x412EFB0B, 0x1D5AB367, 0xD25292DB, 0x5633E910, 0x47136DD6, - 0x618C9AD7, 0x0C7A37A1, 0x148E59F8, 0x3C89EB13, 0x27EECEA9, 0xC935B761, 0xE5EDE11C, 0xB13C7A47, - 0xDF599CD2, 0x733F55F2, 0xCE791814, 0x37BF73C7, 0xCDEA53F7, 0xAA5B5FFD, 0x6F14DF3D, 0xDB867844, - 0xF381CAAF, 0xC43EB968, 0x342C3824, 0x405FC2A3, 0xC372161D, 0x250CBCE2, 0x498B283C, 0x9541FF0D, - 0x017139A8, 0xB3DE080C, 0xE49CD8B4, 0xC1906456, 0x84617BCB, 0xB670D532, 0x5C74486C, 0x5742D0B8 - ); - - /** - * Precomputed invMixColumns table - * - * @see Crypt_Rijndael:_encryptBlock() - * @see Crypt_Rijndael:_decryptBlock() - * @var Array - * @access private - */ - var $dt3 = array( - 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B, - 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, - 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, - 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E, - 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, - 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, - 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66, - 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, - 0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, - 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD, - 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, - 0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, - 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C, - 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, - 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, - 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814, - 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, - 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, - 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077, - 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, - 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, - 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582, - 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, - 0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, - 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035, - 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, - 0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, - 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D, - 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, - 0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, - 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF, - 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0 - ); - - /** - * The SubByte S-Box - * - * @see Crypt_Rijndael::_encryptBlock() - * @var Array - * @access private - */ - var $sbox = array( - 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, - 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, - 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, - 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, - 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, - 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, - 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, - 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, - 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, - 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, - 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, - 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, - 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, - 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, - 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, - 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 - ); - - /** - * The inverse SubByte S-Box - * - * @see Crypt_Rijndael::_decryptBlock() - * @var Array - * @access private - */ - var $isbox = array( - 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, - 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, - 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, - 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, - 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, - 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, - 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, - 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, - 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, - 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, - 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, - 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, - 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, - 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, - 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D - ); - - /** - * Sets the key. - * - * Keys can be of any length. Rijndael, itself, requires the use of a key that's between 128-bits and 256-bits long and - * whose length is a multiple of 32. If the key is less than 256-bits and the key length isn't set, we round the length - * up to the closest valid key length, padding $key with null bytes. If the key is more than 256-bits, we trim the - * excess bits. - * - * If the key is not explicitly set, it'll be assumed to be all null bytes. - * - * Note: 160/224-bit keys must explicitly set by setKeyLength(), otherwise they will be round/pad up to 192/256 bits. - * - * @see Crypt_Base:setKey() - * @see setKeyLength() - * @access public - * @param String $key - */ - function setKey($key) - { - parent::setKey($key); - - if (!$this->explicit_key_length) { - $length = strlen($key); - switch (true) { - case $length <= 16: - $this->key_size = 16; - break; - case $length <= 20: - $this->key_size = 20; - break; - case $length <= 24: - $this->key_size = 24; - break; - case $length <= 28: - $this->key_size = 28; - break; - default: - $this->key_size = 32; - } - $this->_setupEngine(); - } - } - - /** - * Sets the key length - * - * Valid key lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to - * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. - * - * Note: phpseclib extends Rijndael (and AES) for using 160- and 224-bit keys but they are officially not defined - * and the most (if not all) implementations are not able using 160/224-bit keys but round/pad them up to - * 192/256 bits as, for example, mcrypt will do. - * - * That said, if you want be compatible with other Rijndael and AES implementations, - * you should not setKeyLength(160) or setKeyLength(224). - * - * Additional: In case of 160- and 224-bit keys, phpseclib will/can, for that reason, not use - * the mcrypt php extension, even if available. - * This results then in slower encryption. - * - * @access public - * @param Integer $length - */ - function setKeyLength($length) - { - switch (true) { - case $length == 160: - $this->key_size = 20; - break; - case $length == 224: - $this->key_size = 28; - break; - case $length <= 128: - $this->key_size = 16; - break; - case $length <= 192: - $this->key_size = 24; - break; - default: - $this->key_size = 32; - } - - $this->explicit_key_length = true; - $this->changed = true; - $this->_setupEngine(); - } - - /** - * Sets the block length - * - * Valid block lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to - * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. - * - * @access public - * @param Integer $length - */ - function setBlockLength($length) - { - $length >>= 5; - if ($length > 8) { - $length = 8; - } else if ($length < 4) { - $length = 4; - } - $this->Nb = $length; - $this->block_size = $length << 2; - $this->changed = true; - $this->_setupEngine(); - } - - /** - * Setup the fastest possible $engine - * - * Determines if the mcrypt (MODE_MCRYPT) $engine available - * and usable for the current $block_size and $key_size. - * - * If not, the slower MODE_INTERNAL $engine will be set. - * - * @see setKey() - * @see setKeyLength() - * @see setBlockLength() - * @access private - */ - function _setupEngine() - { - if (constant('CRYPT_' . $this->const_namespace . '_MODE') == CRYPT_MODE_INTERNAL) { - // No mcrypt support at all for rijndael - return; - } - - // The required mcrypt module name for the current $block_size of rijndael - $cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3); - - // Determining the availibility/usability of $cipher_name_mcrypt - switch (true) { - case $this->key_size % 8: // mcrypt is not usable for 160/224-bit keys, only for 128/192/256-bit keys - case !in_array($cipher_name_mcrypt, mcrypt_list_algorithms()): // $cipher_name_mcrypt is not available for the current $block_size - $engine = CRYPT_MODE_INTERNAL; - break; - default: - $engine = CRYPT_MODE_MCRYPT; - } - - if ($this->engine == $engine && $this->cipher_name_mcrypt == $cipher_name_mcrypt) { - // allready set, so we not unnecessary close $this->enmcrypt/demcrypt/ecb - return; - } - - // Set the $engine - $this->engine = $engine; - $this->cipher_name_mcrypt = $cipher_name_mcrypt; - - if ($this->enmcrypt) { - // Closing the current mcrypt resource(s). _mcryptSetup() will, if needed, - // (re)open them with the module named in $this->cipher_name_mcrypt - mcrypt_module_close($this->enmcrypt); - mcrypt_module_close($this->demcrypt); - $this->enmcrypt = null; - $this->demcrypt = null; - - if ($this->ecb) { - mcrypt_module_close($this->ecb); - $this->ecb = null; - } - } - } - - /** - * Setup the CRYPT_MODE_MCRYPT $engine - * - * @see Crypt_Base::_setupMcrypt() - * @access private - */ - function _setupMcrypt() - { - $this->key = str_pad(substr($this->key, 0, $this->key_size), $this->key_size, "\0"); - parent::_setupMcrypt(); - } - - /** - * Encrypts a block - * - * @access private - * @param String $in - * @return String - */ - function _encryptBlock($in) - { - static $t0, $t1, $t2, $t3, $sbox; - if (!$t0) { - for ($i = 0; $i < 256; ++$i) { - $t0[] = (int)$this->t0[$i]; - $t1[] = (int)$this->t1[$i]; - $t2[] = (int)$this->t2[$i]; - $t3[] = (int)$this->t3[$i]; - $sbox[] = (int)$this->sbox[$i]; - } - } - - $state = array(); - $words = unpack('N*', $in); - - $c = $this->c; - $w = $this->w; - $Nb = $this->Nb; - $Nr = $this->Nr; - - // addRoundKey - $i = -1; - foreach ($words as $word) { - $state[] = $word ^ $w[0][++$i]; - } - - // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components - - // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding - // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf. - // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization. - // Unfortunately, the description given there is not quite correct. Per aes.spec.v316.pdf#page=19 [1], - // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well. - - // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf - $temp = array(); - for ($round = 1; $round < $Nr; ++$round) { - $i = 0; // $c[0] == 0 - $j = $c[1]; - $k = $c[2]; - $l = $c[3]; - - while ($i < $Nb) { - $temp[$i] = $t0[$state[$i] >> 24 & 0x000000FF] ^ - $t1[$state[$j] >> 16 & 0x000000FF] ^ - $t2[$state[$k] >> 8 & 0x000000FF] ^ - $t3[$state[$l] & 0x000000FF] ^ - $w[$round][$i]; - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - $state = $temp; - } - - // subWord - for ($i = 0; $i < $Nb; ++$i) { - $state[$i] = $sbox[$state[$i] & 0x000000FF] | - ($sbox[$state[$i] >> 8 & 0x000000FF] << 8) | - ($sbox[$state[$i] >> 16 & 0x000000FF] << 16) | - ($sbox[$state[$i] >> 24 & 0x000000FF] << 24); - } - - // shiftRows + addRoundKey - $i = 0; // $c[0] == 0 - $j = $c[1]; - $k = $c[2]; - $l = $c[3]; - while ($i < $Nb) { - $temp[$i] = ($state[$i] & 0xFF000000) ^ - ($state[$j] & 0x00FF0000) ^ - ($state[$k] & 0x0000FF00) ^ - ($state[$l] & 0x000000FF) ^ - $w[$Nr][$i]; - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - - switch ($Nb) { - case 8: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]); - case 7: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]); - case 6: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]); - case 5: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]); - default: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]); - } - } - - /** - * Decrypts a block - * - * @access private - * @param String $in - * @return String - */ - function _decryptBlock($in) - { - static $dt0, $dt1, $dt2, $dt3, $isbox; - if (!$dt0) { - for ($i = 0; $i < 256; ++$i) { - $dt0[] = (int)$this->dt0[$i]; - $dt1[] = (int)$this->dt1[$i]; - $dt2[] = (int)$this->dt2[$i]; - $dt3[] = (int)$this->dt3[$i]; - $isbox[] = (int)$this->isbox[$i]; - } - } - - $state = array(); - $words = unpack('N*', $in); - - $c = $this->c; - $dw = $this->dw; - $Nb = $this->Nb; - $Nr = $this->Nr; - - // addRoundKey - $i = -1; - foreach ($words as $word) { - $state[] = $word ^ $dw[$Nr][++$i]; - } - - $temp = array(); - for ($round = $Nr - 1; $round > 0; --$round) { - $i = 0; // $c[0] == 0 - $j = $Nb - $c[1]; - $k = $Nb - $c[2]; - $l = $Nb - $c[3]; - - while ($i < $Nb) { - $temp[$i] = $dt0[$state[$i] >> 24 & 0x000000FF] ^ - $dt1[$state[$j] >> 16 & 0x000000FF] ^ - $dt2[$state[$k] >> 8 & 0x000000FF] ^ - $dt3[$state[$l] & 0x000000FF] ^ - $dw[$round][$i]; - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - $state = $temp; - } - - // invShiftRows + invSubWord + addRoundKey - $i = 0; // $c[0] == 0 - $j = $Nb - $c[1]; - $k = $Nb - $c[2]; - $l = $Nb - $c[3]; - - while ($i < $Nb) { - $word = ($state[$i] & 0xFF000000) | - ($state[$j] & 0x00FF0000) | - ($state[$k] & 0x0000FF00) | - ($state[$l] & 0x000000FF); - - $temp[$i] = $dw[0][$i] ^ ($isbox[$word & 0x000000FF] | - ($isbox[$word >> 8 & 0x000000FF] << 8) | - ($isbox[$word >> 16 & 0x000000FF] << 16) | - ($isbox[$word >> 24 & 0x000000FF] << 24)); - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - - switch ($Nb) { - case 8: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]); - case 7: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]); - case 6: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]); - case 5: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]); - default: - return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]); - } - } - - /** - * Setup the key (expansion) - * - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field. - // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse - static $rcon = array(0, - 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, - 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000, - 0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000, - 0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000, - 0x97000000, 0x35000000, 0x6A000000, 0xD4000000, 0xB3000000, - 0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000, 0x91000000 - ); - - $this->key = str_pad(substr($this->key, 0, $this->key_size), $this->key_size, "\0"); - - if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->key_size === $this->kl['key_size'] && $this->block_size === $this->kl['block_size']) { - // already expanded - return; - } - $this->kl = array('key' => $this->key, 'key_size' => $this->key_size, 'block_size' => $this->block_size); - - $this->Nk = $this->key_size >> 2; - // see Rijndael-ammended.pdf#page=44 - $this->Nr = max($this->Nk, $this->Nb) + 6; - - // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44, - // "Table 8: Shift offsets in Shiftrow for the alternative block lengths" - // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14, - // "Table 2: Shift offsets for different block lengths" - switch ($this->Nb) { - case 4: - case 5: - case 6: - $this->c = array(0, 1, 2, 3); - break; - case 7: - $this->c = array(0, 1, 2, 4); - break; - case 8: - $this->c = array(0, 1, 3, 4); - } - - $w = array_values(unpack('N*words', $this->key)); - - $length = $this->Nb * ($this->Nr + 1); - for ($i = $this->Nk; $i < $length; $i++) { - $temp = $w[$i - 1]; - if ($i % $this->Nk == 0) { - // according to , "the size of an integer is platform-dependent". - // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine, - // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and' - // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is. - $temp = (($temp << 8) & 0xFFFFFF00) | (($temp >> 24) & 0x000000FF); // rotWord - $temp = $this->_subWord($temp) ^ $rcon[$i / $this->Nk]; - } else if ($this->Nk > 6 && $i % $this->Nk == 4) { - $temp = $this->_subWord($temp); - } - $w[$i] = $w[$i - $this->Nk] ^ $temp; - } - - // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns - // and generate the inverse key schedule. more specifically, - // according to (section 5.3.3), - // "The key expansion for the Inverse Cipher is defined as follows: - // 1. Apply the Key Expansion. - // 2. Apply InvMixColumn to all Round Keys except the first and the last one." - // also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher" - $temp = $this->w = $this->dw = array(); - for ($i = $row = $col = 0; $i < $length; $i++, $col++) { - if ($col == $this->Nb) { - if ($row == 0) { - $this->dw[0] = $this->w[0]; - } else { - // subWord + invMixColumn + invSubWord = invMixColumn - $j = 0; - while ($j < $this->Nb) { - $dw = $this->_subWord($this->w[$row][$j]); - $temp[$j] = $this->dt0[$dw >> 24 & 0x000000FF] ^ - $this->dt1[$dw >> 16 & 0x000000FF] ^ - $this->dt2[$dw >> 8 & 0x000000FF] ^ - $this->dt3[$dw & 0x000000FF]; - $j++; - } - $this->dw[$row] = $temp; - } - - $col = 0; - $row++; - } - $this->w[$row][$col] = $w[$i]; - } - - $this->dw[$row] = $this->w[$row]; - - // In case of $this->use_inline_crypt === true we have to use 1-dim key arrays (both ascending) - if ($this->use_inline_crypt) { - $this->dw = array_reverse($this->dw); - $w = array_pop($this->w); - $dw = array_pop($this->dw); - foreach ($this->w as $r => $wr) { - foreach ($wr as $c => $wc) { - $w[] = $wc; - $dw[] = $this->dw[$r][$c]; - } - } - $this->w = $w; - $this->dw = $dw; - } - } - - /** - * Performs S-Box substitutions - * - * @access private - * @param Integer $word - */ - function _subWord($word) - { - $sbox = $this->sbox; - - return $sbox[$word & 0x000000FF] | - ($sbox[$word >> 8 & 0x000000FF] << 8) | - ($sbox[$word >> 16 & 0x000000FF] << 16) | - ($sbox[$word >> 24 & 0x000000FF] << 24); - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Crypt_Base::_setupInlineCrypt() - * @access private - */ - function _setupInlineCrypt() - { - // Note: _setupInlineCrypt() will be called only if $this->changed === true - // So here we are'nt under the same heavy timing-stress as we are in _de/encryptBlock() or de/encrypt(). - // However...the here generated function- $code, stored as php callback in $this->inline_crypt, must work as fast as even possible. - - $lambda_functions =& Crypt_Rijndael::_getLambdaFunctions(); - - // The first 10 generated $lambda_functions will use the key-words hardcoded for better performance. - // For memory reason we limit those ultra-optimized functions. - // After that, we use pure (extracted) integer vars for the key-words which is faster than accessing them via array. - if (count($lambda_functions) < 10) { - $w = $this->w; - $dw = $this->dw; - $init_encrypt = ''; - $init_decrypt = ''; - } else { - for ($i = 0, $cw = count($this->w); $i < $cw; ++$i) { - $w[] = '$w[' . $i . ']'; - $dw[] = '$dw[' . $i . ']'; - } - $init_encrypt = '$w = $self->w;'; - $init_decrypt = '$dw = $self->dw;'; - } - - $code_hash = md5(str_pad("Crypt_Rijndael, {$this->mode}, {$this->block_size}, ", 32, "\0") . implode(',', $w)); - - if (!isset($lambda_functions[$code_hash])) { - $Nr = $this->Nr; - $Nb = $this->Nb; - $c = $this->c; - - // Generating encrypt code: - $init_encrypt.= ' - static $t0, $t1, $t2, $t3, $sbox; - if (!$t0) { - for ($i = 0; $i < 256; ++$i) { - $t0[$i] = (int)$self->t0[$i]; - $t1[$i] = (int)$self->t1[$i]; - $t2[$i] = (int)$self->t2[$i]; - $t3[$i] = (int)$self->t3[$i]; - $sbox[$i] = (int)$self->sbox[$i]; - } - } - '; - - $s = 'e'; - $e = 's'; - $wc = $Nb - 1; - - // Preround: addRoundKey - $encrypt_block = '$in = unpack("N*", $in);'."\n"; - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$w[++$wc].";\n"; - } - - // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey - for ($round = 1; $round < $Nr; ++$round) { - list($s, $e) = array($e, $s); - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block.= - '$'.$e.$i.' = - $t0[($'.$s.$i .' >> 24) & 0xff] ^ - $t1[($'.$s.(($i + $c[1]) % $Nb).' >> 16) & 0xff] ^ - $t2[($'.$s.(($i + $c[2]) % $Nb).' >> 8) & 0xff] ^ - $t3[ $'.$s.(($i + $c[3]) % $Nb).' & 0xff] ^ - '.$w[++$wc].";\n"; - } - } - - // Finalround: subWord + shiftRows + addRoundKey - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block.= - '$'.$e.$i.' = - $sbox[ $'.$e.$i.' & 0xff] | - ($sbox[($'.$e.$i.' >> 8) & 0xff] << 8) | - ($sbox[($'.$e.$i.' >> 16) & 0xff] << 16) | - ($sbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n"; - } - $encrypt_block .= '$in = pack("N*"'."\n"; - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block.= ', - ($'.$e.$i .' & 0xFF000000) ^ - ($'.$e.(($i + $c[1]) % $Nb).' & 0x00FF0000) ^ - ($'.$e.(($i + $c[2]) % $Nb).' & 0x0000FF00) ^ - ($'.$e.(($i + $c[3]) % $Nb).' & 0x000000FF) ^ - '.$w[$i]."\n"; - } - $encrypt_block .= ');'; - - // Generating decrypt code: - $init_decrypt.= ' - static $dt0, $dt1, $dt2, $dt3, $isbox; - if (!$dt0) { - for ($i = 0; $i < 256; ++$i) { - $dt0[$i] = (int)$self->dt0[$i]; - $dt1[$i] = (int)$self->dt1[$i]; - $dt2[$i] = (int)$self->dt2[$i]; - $dt3[$i] = (int)$self->dt3[$i]; - $isbox[$i] = (int)$self->isbox[$i]; - } - } - '; - - $s = 'e'; - $e = 's'; - $wc = $Nb - 1; - - // Preround: addRoundKey - $decrypt_block = '$in = unpack("N*", $in);'."\n"; - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$dw[++$wc].';'."\n"; - } - - // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey - for ($round = 1; $round < $Nr; ++$round) { - list($s, $e) = array($e, $s); - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block.= - '$'.$e.$i.' = - $dt0[($'.$s.$i .' >> 24) & 0xff] ^ - $dt1[($'.$s.(($Nb + $i - $c[1]) % $Nb).' >> 16) & 0xff] ^ - $dt2[($'.$s.(($Nb + $i - $c[2]) % $Nb).' >> 8) & 0xff] ^ - $dt3[ $'.$s.(($Nb + $i - $c[3]) % $Nb).' & 0xff] ^ - '.$dw[++$wc].";\n"; - } - } - - // Finalround: subWord + shiftRows + addRoundKey - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block.= - '$'.$e.$i.' = - $isbox[ $'.$e.$i.' & 0xff] | - ($isbox[($'.$e.$i.' >> 8) & 0xff] << 8) | - ($isbox[($'.$e.$i.' >> 16) & 0xff] << 16) | - ($isbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n"; - } - $decrypt_block .= '$in = pack("N*"'."\n"; - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block.= ', - ($'.$e.$i. ' & 0xFF000000) ^ - ($'.$e.(($Nb + $i - $c[1]) % $Nb).' & 0x00FF0000) ^ - ($'.$e.(($Nb + $i - $c[2]) % $Nb).' & 0x0000FF00) ^ - ($'.$e.(($Nb + $i - $c[3]) % $Nb).' & 0x000000FF) ^ - '.$dw[$i]."\n"; - } - $decrypt_block .= ');'; - - $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( - array( - 'init_crypt' => '', - 'init_encrypt' => $init_encrypt, - 'init_decrypt' => $init_decrypt, - 'encrypt_block' => $encrypt_block, - 'decrypt_block' => $decrypt_block - ) - ); - } - $this->inline_crypt = $lambda_functions[$code_hash]; - } -} + + * setKey('abcdefghijklmnop'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $rijndael->decrypt($rijndael->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_Rijndael + * @author Jim Wigginton + * @copyright 2008 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_RIJNDAEL_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_RIJNDAEL_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_RIJNDAEL_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_RIJNDAEL_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_RIJNDAEL_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/** + * Pure-PHP implementation of Rijndael. + * + * @package Crypt_Rijndael + * @author Jim Wigginton + * @access public + */ +class Crypt_Rijndael extends Crypt_Base +{ + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'RIJNDAEL'; + + /** + * The mcrypt specific name of the cipher + * + * Mcrypt is useable for 128/192/256-bit $block_size/$key_length. For 160/224 not. + * Crypt_Rijndael determines automatically whether mcrypt is useable + * or not for the current $block_size/$key_length. + * In case of, $cipher_name_mcrypt will be set dynamically at run time accordingly. + * + * @see Crypt_Base::cipher_name_mcrypt + * @see Crypt_Base::engine + * @see self::isValidEngine() + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'rijndael-128'; + + /** + * The default salt used by setPassword() + * + * @see Crypt_Base::password_default_salt + * @see Crypt_Base::setPassword() + * @var string + * @access private + */ + var $password_default_salt = 'phpseclib'; + + /** + * The Key Schedule + * + * @see self::_setup() + * @var array + * @access private + */ + var $w; + + /** + * The Inverse Key Schedule + * + * @see self::_setup() + * @var array + * @access private + */ + var $dw; + + /** + * The Block Length divided by 32 + * + * @see self::setBlockLength() + * @var int + * @access private + * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4. Exists in conjunction with $block_size + * because the encryption / decryption / key schedule creation requires this number and not $block_size. We could + * derive this from $block_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu + * of that, we'll just precompute it once. + */ + var $Nb = 4; + + /** + * The Key Length (in bytes) + * + * @see self::setKeyLength() + * @var int + * @access private + * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk + * because the encryption / decryption / key schedule creation requires this number and not $key_length. We could + * derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu + * of that, we'll just precompute it once. + */ + var $key_length = 16; + + /** + * The Key Length divided by 32 + * + * @see self::setKeyLength() + * @var int + * @access private + * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4 + */ + var $Nk = 4; + + /** + * The Number of Rounds + * + * @var int + * @access private + * @internal The max value is 14, the min value is 10. + */ + var $Nr; + + /** + * Shift offsets + * + * @var array + * @access private + */ + var $c; + + /** + * Holds the last used key- and block_size information + * + * @var array + * @access private + */ + var $kl; + + /** + * Sets the key. + * + * Keys can be of any length. Rijndael, itself, requires the use of a key that's between 128-bits and 256-bits long and + * whose length is a multiple of 32. If the key is less than 256-bits and the key length isn't set, we round the length + * up to the closest valid key length, padding $key with null bytes. If the key is more than 256-bits, we trim the + * excess bits. + * + * If the key is not explicitly set, it'll be assumed to be all null bytes. + * + * Note: 160/224-bit keys must explicitly set by setKeyLength(), otherwise they will be round/pad up to 192/256 bits. + * + * @see Crypt_Base:setKey() + * @see self::setKeyLength() + * @access public + * @param string $key + */ + function setKey($key) + { + if (!$this->explicit_key_length) { + $length = strlen($key); + switch (true) { + case $length <= 16: + $this->key_size = 16; + break; + case $length <= 20: + $this->key_size = 20; + break; + case $length <= 24: + $this->key_size = 24; + break; + case $length <= 28: + $this->key_size = 28; + break; + default: + $this->key_size = 32; + } + } + parent::setKey($key); + } + + /** + * Sets the key length + * + * Valid key lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to + * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. + * + * Note: phpseclib extends Rijndael (and AES) for using 160- and 224-bit keys but they are officially not defined + * and the most (if not all) implementations are not able using 160/224-bit keys but round/pad them up to + * 192/256 bits as, for example, mcrypt will do. + * + * That said, if you want be compatible with other Rijndael and AES implementations, + * you should not setKeyLength(160) or setKeyLength(224). + * + * Additional: In case of 160- and 224-bit keys, phpseclib will/can, for that reason, not use + * the mcrypt php extension, even if available. + * This results then in slower encryption. + * + * @access public + * @param int $length + */ + function setKeyLength($length) + { + switch (true) { + case $length <= 128: + $this->key_length = 16; + break; + case $length <= 160: + $this->key_length = 20; + break; + case $length <= 192: + $this->key_length = 24; + break; + case $length <= 224: + $this->key_length = 28; + break; + default: + $this->key_length = 32; + } + + parent::setKeyLength($length); + } + + /** + * Sets the block length + * + * Valid block lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to + * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount. + * + * @access public + * @param int $length + */ + function setBlockLength($length) + { + $length >>= 5; + if ($length > 8) { + $length = 8; + } elseif ($length < 4) { + $length = 4; + } + $this->Nb = $length; + $this->block_size = $length << 2; + $this->changed = true; + $this->_setEngine(); + } + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine() + * + * @see Crypt_Base::Crypt_Base() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + switch ($engine) { + case CRYPT_ENGINE_OPENSSL: + if ($this->block_size != 16) { + return false; + } + $this->cipher_name_openssl_ecb = 'aes-' . ($this->key_length << 3) . '-ecb'; + $this->cipher_name_openssl = 'aes-' . ($this->key_length << 3) . '-' . $this->_openssl_translate_mode(); + break; + case CRYPT_ENGINE_MCRYPT: + $this->cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3); + if ($this->key_length % 8) { // is it a 160/224-bit key? + // mcrypt is not usable for them, only for 128/192/256-bit keys + return false; + } + } + + return parent::isValidEngine($engine); + } + + /** + * Encrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _encryptBlock($in) + { + static $tables; + if (empty($tables)) { + $tables = &$this->_getTables(); + } + $t0 = $tables[0]; + $t1 = $tables[1]; + $t2 = $tables[2]; + $t3 = $tables[3]; + $sbox = $tables[4]; + + $state = array(); + $words = unpack('N*', $in); + + $c = $this->c; + $w = $this->w; + $Nb = $this->Nb; + $Nr = $this->Nr; + + // addRoundKey + $wc = $Nb - 1; + foreach ($words as $word) { + $state[] = $word ^ $w[++$wc]; + } + + // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components - + // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding + // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf. + // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization. + // Unfortunately, the description given there is not quite correct. Per aes.spec.v316.pdf#page=19 [1], + // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well. + + // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf + $temp = array(); + for ($round = 1; $round < $Nr; ++$round) { + $i = 0; // $c[0] == 0 + $j = $c[1]; + $k = $c[2]; + $l = $c[3]; + + while ($i < $Nb) { + $temp[$i] = $t0[$state[$i] >> 24 & 0x000000FF] ^ + $t1[$state[$j] >> 16 & 0x000000FF] ^ + $t2[$state[$k] >> 8 & 0x000000FF] ^ + $t3[$state[$l] & 0x000000FF] ^ + $w[++$wc]; + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + $state = $temp; + } + + // subWord + for ($i = 0; $i < $Nb; ++$i) { + $state[$i] = $sbox[$state[$i] & 0x000000FF] | + ($sbox[$state[$i] >> 8 & 0x000000FF] << 8) | + ($sbox[$state[$i] >> 16 & 0x000000FF] << 16) | + ($sbox[$state[$i] >> 24 & 0x000000FF] << 24); + } + + // shiftRows + addRoundKey + $i = 0; // $c[0] == 0 + $j = $c[1]; + $k = $c[2]; + $l = $c[3]; + while ($i < $Nb) { + $temp[$i] = ($state[$i] & 0xFF000000) ^ + ($state[$j] & 0x00FF0000) ^ + ($state[$k] & 0x0000FF00) ^ + ($state[$l] & 0x000000FF) ^ + $w[$i]; + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + + switch ($Nb) { + case 8: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]); + case 7: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]); + case 6: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]); + case 5: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]); + default: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]); + } + } + + /** + * Decrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _decryptBlock($in) + { + static $invtables; + if (empty($invtables)) { + $invtables = &$this->_getInvTables(); + } + $dt0 = $invtables[0]; + $dt1 = $invtables[1]; + $dt2 = $invtables[2]; + $dt3 = $invtables[3]; + $isbox = $invtables[4]; + + $state = array(); + $words = unpack('N*', $in); + + $c = $this->c; + $dw = $this->dw; + $Nb = $this->Nb; + $Nr = $this->Nr; + + // addRoundKey + $wc = $Nb - 1; + foreach ($words as $word) { + $state[] = $word ^ $dw[++$wc]; + } + + $temp = array(); + for ($round = $Nr - 1; $round > 0; --$round) { + $i = 0; // $c[0] == 0 + $j = $Nb - $c[1]; + $k = $Nb - $c[2]; + $l = $Nb - $c[3]; + + while ($i < $Nb) { + $temp[$i] = $dt0[$state[$i] >> 24 & 0x000000FF] ^ + $dt1[$state[$j] >> 16 & 0x000000FF] ^ + $dt2[$state[$k] >> 8 & 0x000000FF] ^ + $dt3[$state[$l] & 0x000000FF] ^ + $dw[++$wc]; + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + $state = $temp; + } + + // invShiftRows + invSubWord + addRoundKey + $i = 0; // $c[0] == 0 + $j = $Nb - $c[1]; + $k = $Nb - $c[2]; + $l = $Nb - $c[3]; + + while ($i < $Nb) { + $word = ($state[$i] & 0xFF000000) | + ($state[$j] & 0x00FF0000) | + ($state[$k] & 0x0000FF00) | + ($state[$l] & 0x000000FF); + + $temp[$i] = $dw[$i] ^ ($isbox[$word & 0x000000FF] | + ($isbox[$word >> 8 & 0x000000FF] << 8) | + ($isbox[$word >> 16 & 0x000000FF] << 16) | + ($isbox[$word >> 24 & 0x000000FF] << 24)); + ++$i; + $j = ($j + 1) % $Nb; + $k = ($k + 1) % $Nb; + $l = ($l + 1) % $Nb; + } + + switch ($Nb) { + case 8: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]); + case 7: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]); + case 6: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]); + case 5: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]); + default: + return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]); + } + } + + /** + * Setup the key (expansion) + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field. + // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse + static $rcon = array(0, + 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, + 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000, + 0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000, + 0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000, + 0x97000000, 0x35000000, 0x6A000000, 0xD4000000, 0xB3000000, + 0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000, 0x91000000 + ); + + if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->key_length === $this->kl['key_length'] && $this->block_size === $this->kl['block_size']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key, 'key_length' => $this->key_length, 'block_size' => $this->block_size); + + $this->Nk = $this->key_length >> 2; + // see Rijndael-ammended.pdf#page=44 + $this->Nr = max($this->Nk, $this->Nb) + 6; + + // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44, + // "Table 8: Shift offsets in Shiftrow for the alternative block lengths" + // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14, + // "Table 2: Shift offsets for different block lengths" + switch ($this->Nb) { + case 4: + case 5: + case 6: + $this->c = array(0, 1, 2, 3); + break; + case 7: + $this->c = array(0, 1, 2, 4); + break; + case 8: + $this->c = array(0, 1, 3, 4); + } + + $w = array_values(unpack('N*words', $this->key)); + + $length = $this->Nb * ($this->Nr + 1); + for ($i = $this->Nk; $i < $length; $i++) { + $temp = $w[$i - 1]; + if ($i % $this->Nk == 0) { + // according to , "the size of an integer is platform-dependent". + // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine, + // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and' + // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is. + $temp = (($temp << 8) & 0xFFFFFF00) | (($temp >> 24) & 0x000000FF); // rotWord + $temp = $this->_subWord($temp) ^ $rcon[$i / $this->Nk]; + } elseif ($this->Nk > 6 && $i % $this->Nk == 4) { + $temp = $this->_subWord($temp); + } + $w[$i] = $w[$i - $this->Nk] ^ $temp; + } + + // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns + // and generate the inverse key schedule. more specifically, + // according to (section 5.3.3), + // "The key expansion for the Inverse Cipher is defined as follows: + // 1. Apply the Key Expansion. + // 2. Apply InvMixColumn to all Round Keys except the first and the last one." + // also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher" + list($dt0, $dt1, $dt2, $dt3) = $this->_getInvTables(); + $temp = $this->w = $this->dw = array(); + for ($i = $row = $col = 0; $i < $length; $i++, $col++) { + if ($col == $this->Nb) { + if ($row == 0) { + $this->dw[0] = $this->w[0]; + } else { + // subWord + invMixColumn + invSubWord = invMixColumn + $j = 0; + while ($j < $this->Nb) { + $dw = $this->_subWord($this->w[$row][$j]); + $temp[$j] = $dt0[$dw >> 24 & 0x000000FF] ^ + $dt1[$dw >> 16 & 0x000000FF] ^ + $dt2[$dw >> 8 & 0x000000FF] ^ + $dt3[$dw & 0x000000FF]; + $j++; + } + $this->dw[$row] = $temp; + } + + $col = 0; + $row++; + } + $this->w[$row][$col] = $w[$i]; + } + + $this->dw[$row] = $this->w[$row]; + + // Converting to 1-dim key arrays (both ascending) + $this->dw = array_reverse($this->dw); + $w = array_pop($this->w); + $dw = array_pop($this->dw); + foreach ($this->w as $r => $wr) { + foreach ($wr as $c => $wc) { + $w[] = $wc; + $dw[] = $this->dw[$r][$c]; + } + } + $this->w = $w; + $this->dw = $dw; + } + + /** + * Performs S-Box substitutions + * + * @access private + * @param int $word + */ + function _subWord($word) + { + static $sbox; + if (empty($sbox)) { + list(, , , , $sbox) = $this->_getTables(); + } + + return $sbox[$word & 0x000000FF] | + ($sbox[$word >> 8 & 0x000000FF] << 8) | + ($sbox[$word >> 16 & 0x000000FF] << 16) | + ($sbox[$word >> 24 & 0x000000FF] << 24); + } + + /** + * Provides the mixColumns and sboxes tables + * + * @see Crypt_Rijndael:_encryptBlock() + * @see Crypt_Rijndael:_setupInlineCrypt() + * @see Crypt_Rijndael:_subWord() + * @access private + * @return array &$tables + */ + function &_getTables() + { + static $tables; + if (empty($tables)) { + // according to (section 5.2.1), + // precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so + // those are the names we'll use. + $t3 = array_map('intval', array( + // with array_map('intval', ...) we ensure we have only int's and not + // some slower floats converted by php automatically on high values + 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491, + 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, + 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, + 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B, + 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, + 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, + 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F, + 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, + 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, + 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713, + 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, + 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, + 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411, + 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, + 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, + 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF, + 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, + 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, + 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B, + 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, + 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, + 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2, + 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, + 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, + 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197, + 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, + 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, + 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927, + 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, + 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, + 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0, + 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C + )); + + foreach ($t3 as $t3i) { + $t0[] = (($t3i << 24) & 0xFF000000) | (($t3i >> 8) & 0x00FFFFFF); + $t1[] = (($t3i << 16) & 0xFFFF0000) | (($t3i >> 16) & 0x0000FFFF); + $t2[] = (($t3i << 8) & 0xFFFFFF00) | (($t3i >> 24) & 0x000000FF); + } + + $tables = array( + // The Precomputed mixColumns tables t0 - t3 + $t0, + $t1, + $t2, + $t3, + // The SubByte S-Box + array( + 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, + 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, + 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, + 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, + 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, + 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, + 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, + 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, + 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, + 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, + 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 + ) + ); + } + return $tables; + } + + /** + * Provides the inverse mixColumns and inverse sboxes tables + * + * @see Crypt_Rijndael:_decryptBlock() + * @see Crypt_Rijndael:_setupInlineCrypt() + * @see Crypt_Rijndael:_setupKey() + * @access private + * @return array &$tables + */ + function &_getInvTables() + { + static $tables; + if (empty($tables)) { + $dt3 = array_map('intval', array( + 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B, + 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, + 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, + 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E, + 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, + 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, + 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66, + 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, + 0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, + 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD, + 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, + 0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, + 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C, + 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, + 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, + 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814, + 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, + 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, + 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077, + 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, + 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, + 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582, + 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, + 0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, + 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035, + 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, + 0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, + 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D, + 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, + 0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, + 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF, + 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0 + )); + + foreach ($dt3 as $dt3i) { + $dt0[] = (($dt3i << 24) & 0xFF000000) | (($dt3i >> 8) & 0x00FFFFFF); + $dt1[] = (($dt3i << 16) & 0xFFFF0000) | (($dt3i >> 16) & 0x0000FFFF); + $dt2[] = (($dt3i << 8) & 0xFFFFFF00) | (($dt3i >> 24) & 0x000000FF); + }; + + $tables = array( + // The Precomputed inverse mixColumns tables dt0 - dt3 + $dt0, + $dt1, + $dt2, + $dt3, + // The inverse SubByte S-Box + array( + 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, + 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, + 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, + 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, + 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, + 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, + 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, + 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, + 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, + 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, + 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, + 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, + 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, + 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, + 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D + ) + ); + } + return $tables; + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + // Note: _setupInlineCrypt() will be called only if $this->changed === true + // So here we are'nt under the same heavy timing-stress as we are in _de/encryptBlock() or de/encrypt(). + // However...the here generated function- $code, stored as php callback in $this->inline_crypt, must work as fast as even possible. + + $lambda_functions =& Crypt_Rijndael::_getLambdaFunctions(); + + // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function. + // (Currently, for Crypt_Rijndael/AES, one generated $lambda_function cost on php5.5@32bit ~80kb unfreeable mem and ~130kb on php5.5@64bit) + // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one. + $gen_hi_opt_code = (bool)(count($lambda_functions) < 10); + + // Generation of a uniqe hash for our generated code + $code_hash = "Crypt_Rijndael, {$this->mode}, {$this->Nr}, {$this->Nb}"; + if ($gen_hi_opt_code) { + $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key); + } + + if (!isset($lambda_functions[$code_hash])) { + switch (true) { + case $gen_hi_opt_code: + // The hi-optimized $lambda_functions will use the key-words hardcoded for better performance. + $w = $this->w; + $dw = $this->dw; + $init_encrypt = ''; + $init_decrypt = ''; + break; + default: + for ($i = 0, $cw = count($this->w); $i < $cw; ++$i) { + $w[] = '$w[' . $i . ']'; + $dw[] = '$dw[' . $i . ']'; + } + $init_encrypt = '$w = $self->w;'; + $init_decrypt = '$dw = $self->dw;'; + } + + $Nr = $this->Nr; + $Nb = $this->Nb; + $c = $this->c; + + // Generating encrypt code: + $init_encrypt.= ' + static $tables; + if (empty($tables)) { + $tables = &$self->_getTables(); + } + $t0 = $tables[0]; + $t1 = $tables[1]; + $t2 = $tables[2]; + $t3 = $tables[3]; + $sbox = $tables[4]; + '; + + $s = 'e'; + $e = 's'; + $wc = $Nb - 1; + + // Preround: addRoundKey + $encrypt_block = '$in = unpack("N*", $in);'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$w[++$wc].";\n"; + } + + // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey + for ($round = 1; $round < $Nr; ++$round) { + list($s, $e) = array($e, $s); + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block.= + '$'.$e.$i.' = + $t0[($'.$s.$i .' >> 24) & 0xff] ^ + $t1[($'.$s.(($i + $c[1]) % $Nb).' >> 16) & 0xff] ^ + $t2[($'.$s.(($i + $c[2]) % $Nb).' >> 8) & 0xff] ^ + $t3[ $'.$s.(($i + $c[3]) % $Nb).' & 0xff] ^ + '.$w[++$wc].";\n"; + } + } + + // Finalround: subWord + shiftRows + addRoundKey + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block.= + '$'.$e.$i.' = + $sbox[ $'.$e.$i.' & 0xff] | + ($sbox[($'.$e.$i.' >> 8) & 0xff] << 8) | + ($sbox[($'.$e.$i.' >> 16) & 0xff] << 16) | + ($sbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n"; + } + $encrypt_block .= '$in = pack("N*"'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $encrypt_block.= ', + ($'.$e.$i .' & '.((int)0xFF000000).') ^ + ($'.$e.(($i + $c[1]) % $Nb).' & 0x00FF0000 ) ^ + ($'.$e.(($i + $c[2]) % $Nb).' & 0x0000FF00 ) ^ + ($'.$e.(($i + $c[3]) % $Nb).' & 0x000000FF ) ^ + '.$w[$i]."\n"; + } + $encrypt_block .= ');'; + + // Generating decrypt code: + $init_decrypt.= ' + static $invtables; + if (empty($invtables)) { + $invtables = &$self->_getInvTables(); + } + $dt0 = $invtables[0]; + $dt1 = $invtables[1]; + $dt2 = $invtables[2]; + $dt3 = $invtables[3]; + $isbox = $invtables[4]; + '; + + $s = 'e'; + $e = 's'; + $wc = $Nb - 1; + + // Preround: addRoundKey + $decrypt_block = '$in = unpack("N*", $in);'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$dw[++$wc].';'."\n"; + } + + // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey + for ($round = 1; $round < $Nr; ++$round) { + list($s, $e) = array($e, $s); + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block.= + '$'.$e.$i.' = + $dt0[($'.$s.$i .' >> 24) & 0xff] ^ + $dt1[($'.$s.(($Nb + $i - $c[1]) % $Nb).' >> 16) & 0xff] ^ + $dt2[($'.$s.(($Nb + $i - $c[2]) % $Nb).' >> 8) & 0xff] ^ + $dt3[ $'.$s.(($Nb + $i - $c[3]) % $Nb).' & 0xff] ^ + '.$dw[++$wc].";\n"; + } + } + + // Finalround: subWord + shiftRows + addRoundKey + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block.= + '$'.$e.$i.' = + $isbox[ $'.$e.$i.' & 0xff] | + ($isbox[($'.$e.$i.' >> 8) & 0xff] << 8) | + ($isbox[($'.$e.$i.' >> 16) & 0xff] << 16) | + ($isbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n"; + } + $decrypt_block .= '$in = pack("N*"'."\n"; + for ($i = 0; $i < $Nb; ++$i) { + $decrypt_block.= ', + ($'.$e.$i. ' & '.((int)0xFF000000).') ^ + ($'.$e.(($Nb + $i - $c[1]) % $Nb).' & 0x00FF0000 ) ^ + ($'.$e.(($Nb + $i - $c[2]) % $Nb).' & 0x0000FF00 ) ^ + ($'.$e.(($Nb + $i - $c[3]) % $Nb).' & 0x000000FF ) ^ + '.$dw[$i]."\n"; + } + $decrypt_block .= ');'; + + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => '', + 'init_encrypt' => $init_encrypt, + 'init_decrypt' => $init_decrypt, + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/TripleDES.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/TripleDES.php old mode 100644 new mode 100755 index 06ea09b1e..2aa684a04 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/TripleDES.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/TripleDES.php @@ -1,428 +1,517 @@ - - * setKey('abcdefghijklmnopqrstuvwx'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $des->decrypt($des->encrypt($plaintext)); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Crypt - * @package Crypt_TripleDES - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_DES - */ -if (!class_exists('Crypt_DES')) { - include_once 'DES.php'; -} - -/** - * Encrypt / decrypt using inner chaining - * - * Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (CRYPT_DES_MODE_CBC3). - */ -define('CRYPT_DES_MODE_3CBC', -2); - -/** - * Encrypt / decrypt using outer chaining - * - * Outer chaining is used by SSH-2 and when the mode is set to CRYPT_DES_MODE_CBC. - */ -define('CRYPT_DES_MODE_CBC3', CRYPT_DES_MODE_CBC); - -/** - * Pure-PHP implementation of Triple DES. - * - * @package Crypt_TripleDES - * @author Jim Wigginton - * @access public - */ -class Crypt_TripleDES extends Crypt_DES -{ - /** - * The default password key_size used by setPassword() - * - * @see Crypt_DES::password_key_size - * @see Crypt_Base::password_key_size - * @see Crypt_Base::setPassword() - * @var Integer - * @access private - */ - var $password_key_size = 24; - - /** - * The default salt used by setPassword() - * - * @see Crypt_Base::password_default_salt - * @see Crypt_Base::setPassword() - * @var String - * @access private - */ - var $password_default_salt = 'phpseclib'; - - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_DES::const_namespace - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'DES'; - - /** - * The mcrypt specific name of the cipher - * - * @see Crypt_DES::cipher_name_mcrypt - * @see Crypt_Base::cipher_name_mcrypt - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'tripledes'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Crypt_Base::cfb_init_len - * @var Integer - * @access private - */ - var $cfb_init_len = 750; - - /** - * max possible size of $key - * - * @see Crypt_TripleDES::setKey() - * @see Crypt_DES::setKey() - * @var String - * @access private - */ - var $key_size_max = 24; - - /** - * Internal flag whether using CRYPT_DES_MODE_3CBC or not - * - * @var Boolean - * @access private - */ - var $mode_3cbc; - - /** - * The Crypt_DES objects - * - * Used only if $mode_3cbc === true - * - * @var Array - * @access private - */ - var $des; - - /** - * Default Constructor. - * - * Determines whether or not the mcrypt extension should be used. - * - * $mode could be: - * - * - CRYPT_DES_MODE_ECB - * - * - CRYPT_DES_MODE_CBC - * - * - CRYPT_DES_MODE_CTR - * - * - CRYPT_DES_MODE_CFB - * - * - CRYPT_DES_MODE_OFB - * - * - CRYPT_DES_MODE_3CBC - * - * If not explicitly set, CRYPT_DES_MODE_CBC will be used. - * - * @see Crypt_DES::Crypt_DES() - * @see Crypt_Base::Crypt_Base() - * @param optional Integer $mode - * @access public - */ - function Crypt_TripleDES($mode = CRYPT_DES_MODE_CBC) - { - switch ($mode) { - // In case of CRYPT_DES_MODE_3CBC, we init as CRYPT_DES_MODE_CBC - // and additional flag us internally as 3CBC - case CRYPT_DES_MODE_3CBC: - parent::Crypt_Base(CRYPT_DES_MODE_CBC); - $this->mode_3cbc = true; - - // This three $des'es will do the 3CBC work (if $key > 64bits) - $this->des = array( - new Crypt_DES(CRYPT_DES_MODE_CBC), - new Crypt_DES(CRYPT_DES_MODE_CBC), - new Crypt_DES(CRYPT_DES_MODE_CBC), - ); - - // we're going to be doing the padding, ourselves, so disable it in the Crypt_DES objects - $this->des[0]->disablePadding(); - $this->des[1]->disablePadding(); - $this->des[2]->disablePadding(); - break; - // If not 3CBC, we init as usual - default: - parent::Crypt_Base($mode); - } - } - - /** - * Sets the initialization vector. (optional) - * - * SetIV is not required when CRYPT_DES_MODE_ECB is being used. If not explicitly set, it'll be assumed - * to be all zero's. - * - * @see Crypt_Base::setIV() - * @access public - * @param String $iv - */ - function setIV($iv) - { - parent::setIV($iv); - if ($this->mode_3cbc) { - $this->des[0]->setIV($iv); - $this->des[1]->setIV($iv); - $this->des[2]->setIV($iv); - } - } - - /** - * Sets the key. - * - * Keys can be of any length. Triple DES, itself, can use 128-bit (eg. strlen($key) == 16) or - * 192-bit (eg. strlen($key) == 24) keys. This function pads and truncates $key as appropriate. - * - * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. - * - * If the key is not explicitly set, it'll be assumed to be all null bytes. - * - * @access public - * @see Crypt_DES::setKey() - * @see Crypt_Base::setKey() - * @param String $key - */ - function setKey($key) - { - $length = strlen($key); - if ($length > 8) { - $key = str_pad(substr($key, 0, 24), 24, chr(0)); - // if $key is between 64 and 128-bits, use the first 64-bits as the last, per this: - // http://php.net/function.mcrypt-encrypt#47973 - //$key = $length <= 16 ? substr_replace($key, substr($key, 0, 8), 16) : substr($key, 0, 24); - } else { - $key = str_pad($key, 8, chr(0)); - } - parent::setKey($key); - - // And in case of CRYPT_DES_MODE_3CBC: - // if key <= 64bits we not need the 3 $des to work, - // because we will then act as regular DES-CBC with just a <= 64bit key. - // So only if the key > 64bits (> 8 bytes) we will call setKey() for the 3 $des. - if ($this->mode_3cbc && $length > 8) { - $this->des[0]->setKey(substr($key, 0, 8)); - $this->des[1]->setKey(substr($key, 8, 8)); - $this->des[2]->setKey(substr($key, 16, 8)); - } - } - - /** - * Encrypts a message. - * - * @see Crypt_Base::encrypt() - * @access public - * @param String $plaintext - * @return String $cipertext - */ - function encrypt($plaintext) - { - // parent::en/decrypt() is able to do all the work for all modes and keylengths, - // except for: CRYPT_DES_MODE_3CBC (inner chaining CBC) with a key > 64bits - - // if the key is smaller then 8, do what we'd normally do - if ($this->mode_3cbc && strlen($this->key) > 8) { - return $this->des[2]->encrypt( - $this->des[1]->decrypt( - $this->des[0]->encrypt( - $this->_pad($plaintext) - ) - ) - ); - } - - return parent::encrypt($plaintext); - } - - /** - * Decrypts a message. - * - * @see Crypt_Base::decrypt() - * @access public - * @param String $ciphertext - * @return String $plaintext - */ - function decrypt($ciphertext) - { - if ($this->mode_3cbc && strlen($this->key) > 8) { - return $this->_unpad( - $this->des[0]->decrypt( - $this->des[1]->encrypt( - $this->des[2]->decrypt( - str_pad($ciphertext, (strlen($ciphertext) + 7) & 0xFFFFFFF8, "\0") - ) - ) - ) - ); - } - - return parent::decrypt($ciphertext); - } - - /** - * Treat consecutive "packets" as if they are a continuous buffer. - * - * Say you have a 16-byte plaintext $plaintext. Using the default behavior, the two following code snippets - * will yield different outputs: - * - * - * echo $des->encrypt(substr($plaintext, 0, 8)); - * echo $des->encrypt(substr($plaintext, 8, 8)); - * - * - * echo $des->encrypt($plaintext); - * - * - * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates - * another, as demonstrated with the following: - * - * - * $des->encrypt(substr($plaintext, 0, 8)); - * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); - * - * - * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); - * - * - * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different - * outputs. The reason is due to the fact that the initialization vector's change after every encryption / - * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. - * - * Put another way, when the continuous buffer is enabled, the state of the Crypt_DES() object changes after each - * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that - * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), - * however, they are also less intuitive and more likely to cause you problems. - * - * @see Crypt_Base::enableContinuousBuffer() - * @see Crypt_TripleDES::disableContinuousBuffer() - * @access public - */ - function enableContinuousBuffer() - { - parent::enableContinuousBuffer(); - if ($this->mode_3cbc) { - $this->des[0]->enableContinuousBuffer(); - $this->des[1]->enableContinuousBuffer(); - $this->des[2]->enableContinuousBuffer(); - } - } - - /** - * Treat consecutive packets as if they are a discontinuous buffer. - * - * The default behavior. - * - * @see Crypt_Base::disableContinuousBuffer() - * @see Crypt_TripleDES::enableContinuousBuffer() - * @access public - */ - function disableContinuousBuffer() - { - parent::disableContinuousBuffer(); - if ($this->mode_3cbc) { - $this->des[0]->disableContinuousBuffer(); - $this->des[1]->disableContinuousBuffer(); - $this->des[2]->disableContinuousBuffer(); - } - } - - /** - * Creates the key schedule - * - * @see Crypt_DES::_setupKey() - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - switch (true) { - // if $key <= 64bits we configure our internal pure-php cipher engine - // to act as regular [1]DES, not as 3DES. mcrypt.so::tripledes does the same. - case strlen($this->key) <= 8: - $this->des_rounds = 1; - break; - - // otherwise, if $key > 64bits, we configure our engine to work as 3DES. - default: - $this->des_rounds = 3; - - // (only) if 3CBC is used we have, of course, to setup the $des[0-2] keys also separately. - if ($this->mode_3cbc) { - $this->des[0]->_setupKey(); - $this->des[1]->_setupKey(); - $this->des[2]->_setupKey(); - - // because $des[0-2] will, now, do all the work we can return here - // not need unnecessary stress parent::_setupKey() with our, now unused, $key. - return; - } - } - // setup our key - parent::_setupKey(); - } -} + + * setKey('abcdefghijklmnopqrstuvwx'); + * + * $size = 10 * 1024; + * $plaintext = ''; + * for ($i = 0; $i < $size; $i++) { + * $plaintext.= 'a'; + * } + * + * echo $des->decrypt($des->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_TripleDES + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_DES + */ +if (!class_exists('Crypt_DES')) { + include_once 'DES.php'; +} + +/**#@+ + * @access public + * @see self::Crypt_TripleDES() + */ +/** + * Encrypt / decrypt using inner chaining + * + * Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (CRYPT_DES_MODE_CBC3). + */ +define('CRYPT_MODE_3CBC', -2); +/** + * BC version of the above. + */ +define('CRYPT_DES_MODE_3CBC', -2); +/** + * Encrypt / decrypt using outer chaining + * + * Outer chaining is used by SSH-2 and when the mode is set to CRYPT_DES_MODE_CBC. + */ +define('CRYPT_MODE_CBC3', CRYPT_MODE_CBC); +/** + * BC version of the above. + */ +define('CRYPT_DES_MODE_CBC3', CRYPT_MODE_CBC3); +/**#@-*/ + +/** + * Pure-PHP implementation of Triple DES. + * + * @package Crypt_TripleDES + * @author Jim Wigginton + * @access public + */ +class Crypt_TripleDES extends Crypt_DES +{ + /** + * Key Length (in bytes) + * + * @see Crypt_TripleDES::setKeyLength() + * @var int + * @access private + */ + var $key_length = 24; + + /** + * The default salt used by setPassword() + * + * @see Crypt_Base::password_default_salt + * @see Crypt_Base::setPassword() + * @var string + * @access private + */ + var $password_default_salt = 'phpseclib'; + + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_DES::const_namespace + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'DES'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_DES::cipher_name_mcrypt + * @see Crypt_Base::cipher_name_mcrypt + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'tripledes'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var int + * @access private + */ + var $cfb_init_len = 750; + + /** + * max possible size of $key + * + * @see self::setKey() + * @see Crypt_DES::setKey() + * @var string + * @access private + */ + var $key_length_max = 24; + + /** + * Internal flag whether using CRYPT_DES_MODE_3CBC or not + * + * @var bool + * @access private + */ + var $mode_3cbc; + + /** + * The Crypt_DES objects + * + * Used only if $mode_3cbc === true + * + * @var array + * @access private + */ + var $des; + + /** + * Default Constructor. + * + * Determines whether or not the mcrypt extension should be used. + * + * $mode could be: + * + * - CRYPT_DES_MODE_ECB + * + * - CRYPT_DES_MODE_CBC + * + * - CRYPT_DES_MODE_CTR + * + * - CRYPT_DES_MODE_CFB + * + * - CRYPT_DES_MODE_OFB + * + * - CRYPT_DES_MODE_3CBC + * + * If not explicitly set, CRYPT_DES_MODE_CBC will be used. + * + * @see Crypt_DES::Crypt_DES() + * @see Crypt_Base::Crypt_Base() + * @param int $mode + * @access public + */ + function __construct($mode = CRYPT_MODE_CBC) + { + switch ($mode) { + // In case of CRYPT_DES_MODE_3CBC, we init as CRYPT_DES_MODE_CBC + // and additional flag us internally as 3CBC + case CRYPT_DES_MODE_3CBC: + parent::Crypt_Base(CRYPT_MODE_CBC); + $this->mode_3cbc = true; + + // This three $des'es will do the 3CBC work (if $key > 64bits) + $this->des = array( + new Crypt_DES(CRYPT_MODE_CBC), + new Crypt_DES(CRYPT_MODE_CBC), + new Crypt_DES(CRYPT_MODE_CBC), + ); + + // we're going to be doing the padding, ourselves, so disable it in the Crypt_DES objects + $this->des[0]->disablePadding(); + $this->des[1]->disablePadding(); + $this->des[2]->disablePadding(); + break; + // If not 3CBC, we init as usual + default: + parent::__construct($mode); + } + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param int $mode + * @access public + */ + function Crypt_TripleDES($mode = CRYPT_MODE_CBC) + { + $this->__construct($mode); + } + + /** + * Test for engine validity + * + * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine() + * + * @see Crypt_Base::Crypt_Base() + * @param int $engine + * @access public + * @return bool + */ + function isValidEngine($engine) + { + if ($engine == CRYPT_ENGINE_OPENSSL) { + $this->cipher_name_openssl_ecb = 'des-ede3'; + $mode = $this->_openssl_translate_mode(); + $this->cipher_name_openssl = $mode == 'ecb' ? 'des-ede3' : 'des-ede3-' . $mode; + } + + return parent::isValidEngine($engine); + } + + /** + * Sets the initialization vector. (optional) + * + * SetIV is not required when CRYPT_DES_MODE_ECB is being used. If not explicitly set, it'll be assumed + * to be all zero's. + * + * @see Crypt_Base::setIV() + * @access public + * @param string $iv + */ + function setIV($iv) + { + parent::setIV($iv); + if ($this->mode_3cbc) { + $this->des[0]->setIV($iv); + $this->des[1]->setIV($iv); + $this->des[2]->setIV($iv); + } + } + + /** + * Sets the key length. + * + * Valid key lengths are 64, 128 and 192 + * + * @see Crypt_Base:setKeyLength() + * @access public + * @param int $length + */ + function setKeyLength($length) + { + $length >>= 3; + switch (true) { + case $length <= 8: + $this->key_length = 8; + break; + case $length <= 16: + $this->key_length = 16; + break; + default: + $this->key_length = 24; + } + + parent::setKeyLength($length); + } + + /** + * Sets the key. + * + * Keys can be of any length. Triple DES, itself, can use 128-bit (eg. strlen($key) == 16) or + * 192-bit (eg. strlen($key) == 24) keys. This function pads and truncates $key as appropriate. + * + * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. + * + * If the key is not explicitly set, it'll be assumed to be all null bytes. + * + * @access public + * @see Crypt_DES::setKey() + * @see Crypt_Base::setKey() + * @param string $key + */ + function setKey($key) + { + $length = $this->explicit_key_length ? $this->key_length : strlen($key); + if ($length > 8) { + $key = str_pad(substr($key, 0, 24), 24, chr(0)); + // if $key is between 64 and 128-bits, use the first 64-bits as the last, per this: + // http://php.net/function.mcrypt-encrypt#47973 + $key = $length <= 16 ? substr_replace($key, substr($key, 0, 8), 16) : substr($key, 0, 24); + } else { + $key = str_pad($key, 8, chr(0)); + } + parent::setKey($key); + + // And in case of CRYPT_DES_MODE_3CBC: + // if key <= 64bits we not need the 3 $des to work, + // because we will then act as regular DES-CBC with just a <= 64bit key. + // So only if the key > 64bits (> 8 bytes) we will call setKey() for the 3 $des. + if ($this->mode_3cbc && $length > 8) { + $this->des[0]->setKey(substr($key, 0, 8)); + $this->des[1]->setKey(substr($key, 8, 8)); + $this->des[2]->setKey(substr($key, 16, 8)); + } + } + + /** + * Encrypts a message. + * + * @see Crypt_Base::encrypt() + * @access public + * @param string $plaintext + * @return string $cipertext + */ + function encrypt($plaintext) + { + // parent::en/decrypt() is able to do all the work for all modes and keylengths, + // except for: CRYPT_MODE_3CBC (inner chaining CBC) with a key > 64bits + + // if the key is smaller then 8, do what we'd normally do + if ($this->mode_3cbc && strlen($this->key) > 8) { + return $this->des[2]->encrypt( + $this->des[1]->decrypt( + $this->des[0]->encrypt( + $this->_pad($plaintext) + ) + ) + ); + } + + return parent::encrypt($plaintext); + } + + /** + * Decrypts a message. + * + * @see Crypt_Base::decrypt() + * @access public + * @param string $ciphertext + * @return string $plaintext + */ + function decrypt($ciphertext) + { + if ($this->mode_3cbc && strlen($this->key) > 8) { + return $this->_unpad( + $this->des[0]->decrypt( + $this->des[1]->encrypt( + $this->des[2]->decrypt( + str_pad($ciphertext, (strlen($ciphertext) + 7) & 0xFFFFFFF8, "\0") + ) + ) + ) + ); + } + + return parent::decrypt($ciphertext); + } + + /** + * Treat consecutive "packets" as if they are a continuous buffer. + * + * Say you have a 16-byte plaintext $plaintext. Using the default behavior, the two following code snippets + * will yield different outputs: + * + * + * echo $des->encrypt(substr($plaintext, 0, 8)); + * echo $des->encrypt(substr($plaintext, 8, 8)); + * + * + * echo $des->encrypt($plaintext); + * + * + * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates + * another, as demonstrated with the following: + * + * + * $des->encrypt(substr($plaintext, 0, 8)); + * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); + * + * + * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); + * + * + * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different + * outputs. The reason is due to the fact that the initialization vector's change after every encryption / + * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. + * + * Put another way, when the continuous buffer is enabled, the state of the Crypt_DES() object changes after each + * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that + * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), + * however, they are also less intuitive and more likely to cause you problems. + * + * @see Crypt_Base::enableContinuousBuffer() + * @see self::disableContinuousBuffer() + * @access public + */ + function enableContinuousBuffer() + { + parent::enableContinuousBuffer(); + if ($this->mode_3cbc) { + $this->des[0]->enableContinuousBuffer(); + $this->des[1]->enableContinuousBuffer(); + $this->des[2]->enableContinuousBuffer(); + } + } + + /** + * Treat consecutive packets as if they are a discontinuous buffer. + * + * The default behavior. + * + * @see Crypt_Base::disableContinuousBuffer() + * @see self::enableContinuousBuffer() + * @access public + */ + function disableContinuousBuffer() + { + parent::disableContinuousBuffer(); + if ($this->mode_3cbc) { + $this->des[0]->disableContinuousBuffer(); + $this->des[1]->disableContinuousBuffer(); + $this->des[2]->disableContinuousBuffer(); + } + } + + /** + * Creates the key schedule + * + * @see Crypt_DES::_setupKey() + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + switch (true) { + // if $key <= 64bits we configure our internal pure-php cipher engine + // to act as regular [1]DES, not as 3DES. mcrypt.so::tripledes does the same. + case strlen($this->key) <= 8: + $this->des_rounds = 1; + break; + + // otherwise, if $key > 64bits, we configure our engine to work as 3DES. + default: + $this->des_rounds = 3; + + // (only) if 3CBC is used we have, of course, to setup the $des[0-2] keys also separately. + if ($this->mode_3cbc) { + $this->des[0]->_setupKey(); + $this->des[1]->_setupKey(); + $this->des[2]->_setupKey(); + + // because $des[0-2] will, now, do all the work we can return here + // not need unnecessary stress parent::_setupKey() with our, now unused, $key. + return; + } + } + // setup our key + parent::_setupKey(); + } + + /** + * Sets the internal crypt engine + * + * @see Crypt_Base::Crypt_Base() + * @see Crypt_Base::setPreferredEngine() + * @param int $engine + * @access public + * @return int + */ + function setPreferredEngine($engine) + { + if ($this->mode_3cbc) { + $this->des[0]->setPreferredEngine($engine); + $this->des[1]->setPreferredEngine($engine); + $this->des[2]->setPreferredEngine($engine); + } + + return parent::setPreferredEngine($engine); + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Twofish.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Twofish.php old mode 100644 new mode 100755 index 8dd7933a8..cf628a4a3 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Twofish.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Crypt/Twofish.php @@ -1,895 +1,889 @@ - - * setKey('12345678901234567890123456789012'); - * - * $plaintext = str_repeat('a', 1024); - * - * echo $twofish->decrypt($twofish->encrypt($plaintext)); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Crypt - * @package Crypt_Twofish - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Crypt_Base - * - * Base cipher class - */ -if (!class_exists('Crypt_Base')) { - include_once 'Base.php'; -} - -/**#@+ - * @access public - * @see Crypt_Twofish::encrypt() - * @see Crypt_Twofish::decrypt() - */ -/** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - */ -define('CRYPT_TWOFISH_MODE_CTR', CRYPT_MODE_CTR); -/** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - */ -define('CRYPT_TWOFISH_MODE_ECB', CRYPT_MODE_ECB); -/** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - */ -define('CRYPT_TWOFISH_MODE_CBC', CRYPT_MODE_CBC); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - */ -define('CRYPT_TWOFISH_MODE_CFB', CRYPT_MODE_CFB); -/** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - */ -define('CRYPT_TWOFISH_MODE_OFB', CRYPT_MODE_OFB); -/**#@-*/ - -/**#@+ - * @access private - * @see Crypt_Base::Crypt_Base() - */ -/** - * Toggles the internal implementation - */ -define('CRYPT_TWOFISH_MODE_INTERNAL', CRYPT_MODE_INTERNAL); -/** - * Toggles the mcrypt implementation - */ -define('CRYPT_TWOFISH_MODE_MCRYPT', CRYPT_MODE_MCRYPT); -/**#@-*/ - -/** - * Pure-PHP implementation of Twofish. - * - * @package Crypt_Twofish - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @access public - */ -class Crypt_Twofish extends Crypt_Base -{ - /** - * The namespace used by the cipher for its constants. - * - * @see Crypt_Base::const_namespace - * @var String - * @access private - */ - var $const_namespace = 'TWOFISH'; - - /** - * The mcrypt specific name of the cipher - * - * @see Crypt_Base::cipher_name_mcrypt - * @var String - * @access private - */ - var $cipher_name_mcrypt = 'twofish'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Crypt_Base::cfb_init_len - * @var Integer - * @access private - */ - var $cfb_init_len = 800; - - /** - * Q-Table - * - * @var Array - * @access private - */ - var $q0 = array ( - 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, - 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38, - 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, - 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, - 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23, - 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, - 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, - 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61, - 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, - 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, - 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66, - 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, - 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, - 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71, - 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, - 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, - 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2, - 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, - 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, - 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF, - 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, - 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, - 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A, - 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, - 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, - 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D, - 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, - 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, - 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8, - 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, - 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, - 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0 - ); - - /** - * Q-Table - * - * @var Array - * @access private - */ - var $q1 = array ( - 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, - 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B, - 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, - 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, - 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D, - 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, - 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, - 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51, - 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, - 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, - 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70, - 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, - 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, - 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2, - 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, - 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, - 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3, - 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, - 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, - 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9, - 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, - 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, - 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19, - 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, - 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, - 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69, - 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, - 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, - 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB, - 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, - 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, - 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91 - ); - - /** - * M-Table - * - * @var Array - * @access private - */ - var $m0 = array ( - 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, 0xE2E22BFB, 0x9E9EFAC8, - 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, - 0x3C3C57D6, 0x93938A32, 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, - 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, 0xB0B0B306, 0x7575DE3F, - 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, - 0xAEAE2C6D, 0x7F7FABC1, 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, - 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, 0x3131272C, 0x808065A3, - 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, - 0x2A2A3638, 0xC4C49CB0, 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, - 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, 0x6767C027, 0xE9E9AF8C, - 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, - 0x29294CCA, 0xF0F035E3, 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, - 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, 0xC8C81DC3, 0x9999FFCC, - 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, - 0xB5B53D79, 0x09090F0C, 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, - 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, 0xEDEDD07A, 0x4343FC17, - 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, - 0x5656E70B, 0xE3E3DA72, 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, - 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, 0x8181942A, 0x91910149, - 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, - 0x7878AEC5, 0xC5C56D39, 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, - 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, 0x55559DF9, 0x7E7E5A48, - 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, - 0x0606F48D, 0x404086E5, 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, - 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, 0x2D2D333C, 0x3030D6A5, - 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, - 0xD9D97929, 0x8686912E, 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, - 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, 0xC1C112CF, 0x8585EBDC, - 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, - 0xABABA212, 0x6F6F3EA2, 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, - 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, 0x04047FF6, 0x272746C2, - 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91 - ); - - /** - * M-Table - * - * @var Array - * @access private - */ - var $m1 = array ( - 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, 0xA3658080, 0x76DFE4E4, - 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, - 0x0D54E6E6, 0xC6432020, 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, - 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, 0x94B1FBFB, 0x485A7E7E, - 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, - 0x1945FDFD, 0x5BA33A3A, 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, - 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, 0x9B53AAAA, 0x7C635D5D, - 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, - 0xC0F09090, 0x8CAFE9E9, 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, - 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, 0xB499C3C3, 0xF1975B5B, - 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, - 0xCCFF9999, 0x95EA1414, 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, - 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, 0xBF7E9595, 0xBA207D7D, - 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, - 0x81FB0F0F, 0x793DB5B5, 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, - 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, 0x86135050, 0xE730F7F7, - 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, - 0x410B9F9F, 0x7B8B0202, 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, - 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, 0xB1C72B2B, 0xAB6F8E8E, - 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, - 0x91EF1313, 0x85FE0808, 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, - 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, 0x6929A9A9, 0x647D4F4F, - 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, - 0xAC87D1D1, 0x7F8E0505, 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, - 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, 0x4C5F7979, 0x02B6B7B7, - 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, - 0x57AC3333, 0xC718CFCF, 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, - 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, 0x99E51D1D, 0x34392323, - 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, - 0xC8FA9E9E, 0xA882D6D6, 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, - 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, 0x0FE25151, 0x00000000, - 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8 - ); - - /** - * M-Table - * - * @var Array - * @access private - */ - var $m2 = array ( - 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, 0xE2FBE22B, 0x9EC89EFA, - 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, - 0x3CD63C57, 0x9332938A, 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, - 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, 0xB006B0B3, 0x753F75DE, - 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, - 0xAE6DAE2C, 0x7FC17FAB, 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, - 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, 0x312C3127, 0x80A38065, - 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, - 0x2A382A36, 0xC4B0C49C, 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, - 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, 0x672767C0, 0xE98CE9AF, - 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, - 0x29CA294C, 0xF0E3F035, 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, - 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, 0xC8C3C81D, 0x99CC99FF, - 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, - 0xB579B53D, 0x090C090F, 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, - 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, 0xED7AEDD0, 0x431743FC, - 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, - 0x560B56E7, 0xE372E3DA, 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, - 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, 0x812A8194, 0x91499101, - 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, - 0x78C578AE, 0xC539C56D, 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, - 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, 0x55F9559D, 0x7E487E5A, - 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, - 0x068D06F4, 0x40E54086, 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, - 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, 0x2D3C2D33, 0x30A530D6, - 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, - 0xD929D979, 0x862E8691, 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, - 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, 0xC1CFC112, 0x85DC85EB, - 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, - 0xAB12ABA2, 0x6FA26F3E, 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, - 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, 0x04F6047F, 0x27C22746, - 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF - ); - - /** - * M-Table - * - * @var Array - * @access private - */ - var $m3 = array ( - 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, 0x6580A365, 0xDFE476DF, - 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, - 0x54E60D54, 0x4320C643, 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, - 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, 0xB1FB94B1, 0x5A7E485A, - 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, - 0x45FD1945, 0xA33A5BA3, 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, - 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, 0x53AA9B53, 0x635D7C63, - 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, - 0xF090C0F0, 0xAFE98CAF, 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, - 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, 0x99C3B499, 0x975BF197, - 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, - 0xFF99CCFF, 0xEA1495EA, 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, - 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, 0x7E95BF7E, 0x207DBA20, - 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, - 0xFB0F81FB, 0x3DB5793D, 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, - 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, 0x13508613, 0x30F7E730, - 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, - 0x0B9F410B, 0x8B027B8B, 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, - 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, 0xC72BB1C7, 0x6F8EAB6F, - 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, - 0xEF1391EF, 0xFE0885FE, 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, - 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, 0x29A96929, 0x7D4F647D, - 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, - 0x87D1AC87, 0x8E057F8E, 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, - 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, 0x5F794C5F, 0xB6B702B6, - 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, - 0xAC3357AC, 0x18CFC718, 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, - 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, 0xE51D99E5, 0x39233439, - 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, - 0xFA9EC8FA, 0x82D6A882, 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, - 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, 0xE2510FE2, 0x00000000, - 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8 - ); - - /** - * The Key Schedule Array - * - * @var Array - * @access private - */ - var $K = array(); - - /** - * The Key depended S-Table 0 - * - * @var Array - * @access private - */ - var $S0 = array(); - - /** - * The Key depended S-Table 1 - * - * @var Array - * @access private - */ - var $S1 = array(); - - /** - * The Key depended S-Table 2 - * - * @var Array - * @access private - */ - var $S2 = array(); - - /** - * The Key depended S-Table 3 - * - * @var Array - * @access private - */ - var $S3 = array(); - - /** - * Holds the last used key - * - * @var Array - * @access private - */ - var $kl; - - /** - * Sets the key. - * - * Keys can be of any length. Twofish, itself, requires the use of a key that's 128, 192 or 256-bits long. - * If the key is less than 256-bits we round the length up to the closest valid key length, - * padding $key with null bytes. If the key is more than 256-bits, we trim the excess bits. - * - * If the key is not explicitly set, it'll be assumed a 128 bits key to be all null bytes. - * - * @access public - * @see Crypt_Base::setKey() - * @param String $key - */ - function setKey($key) - { - $keylength = strlen($key); - switch (true) { - case $keylength <= 16: - $key = str_pad($key, 16, "\0"); - break; - case $keylength <= 24: - $key = str_pad($key, 24, "\0"); - break; - case $keylength < 32: - $key = str_pad($key, 32, "\0"); - break; - case $keylength > 32: - $key = substr($key, 0, 32); - } - parent::setKey($key); - } - - /** - * Setup the key (expansion) - * - * @see Crypt_Base::_setupKey() - * @access private - */ - function _setupKey() - { - if (isset($this->kl['key']) && $this->key === $this->kl['key']) { - // already expanded - return; - } - $this->kl = array('key' => $this->key); - - /* Key expanding and generating the key-depended s-boxes */ - $le_longs = unpack('V*', $this->key); - $key = unpack('C*', $this->key); - $m0 = $this->m0; - $m1 = $this->m1; - $m2 = $this->m2; - $m3 = $this->m3; - $q0 = $this->q0; - $q1 = $this->q1; - - $K = $S0 = $S1 = $S2 = $S3 = array(); - - switch (strlen($this->key)) { - case 16: - list ($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[1], $le_longs[2]); - list ($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[3], $le_longs[4]); - for ($i = 0, $j = 1; $i < 40; $i+= 2,$j+= 2) { - $A = $m0[$q0[$q0[$i] ^ $key[ 9]] ^ $key[1]] ^ - $m1[$q0[$q1[$i] ^ $key[10]] ^ $key[2]] ^ - $m2[$q1[$q0[$i] ^ $key[11]] ^ $key[3]] ^ - $m3[$q1[$q1[$i] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$j] ^ $key[13]] ^ $key[5]] ^ - $m1[$q0[$q1[$j] ^ $key[14]] ^ $key[6]] ^ - $m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^ - $m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]]; - $B = ($B << 8) | ($B >> 24 & 0xff); - $K[] = $A+= $B; - $K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff); - } - for ($i = 0; $i < 256; ++$i) { - $S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0]; - $S1[$i] = $m1[$q0[$q1[$i] ^ $s5] ^ $s1]; - $S2[$i] = $m2[$q1[$q0[$i] ^ $s6] ^ $s2]; - $S3[$i] = $m3[$q1[$q1[$i] ^ $s7] ^ $s3]; - } - break; - case 24: - list ($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[1], $le_longs[2]); - list ($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[3], $le_longs[4]); - list ($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[5], $le_longs[6]); - for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) { - $A = $m0[$q0[$q0[$q1[$i] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ - $m1[$q0[$q1[$q1[$i] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ - $m2[$q1[$q0[$q0[$i] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ - $m3[$q1[$q1[$q0[$i] ^ $key[20]] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$q1[$j] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ - $m1[$q0[$q1[$q1[$j] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ - $m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ - $m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]]; - $B = ($B << 8) | ($B >> 24 & 0xff); - $K[] = $A+= $B; - $K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff); - } - for ($i = 0; $i < 256; ++$i) { - $S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0]; - $S1[$i] = $m1[$q0[$q1[$q1[$i] ^ $s9] ^ $s5] ^ $s1]; - $S2[$i] = $m2[$q1[$q0[$q0[$i] ^ $sa] ^ $s6] ^ $s2]; - $S3[$i] = $m3[$q1[$q1[$q0[$i] ^ $sb] ^ $s7] ^ $s3]; - } - break; - default: // 32 - list ($sf, $se, $sd, $sc) = $this->_mdsrem($le_longs[1], $le_longs[2]); - list ($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[3], $le_longs[4]); - list ($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[5], $le_longs[6]); - list ($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[7], $le_longs[8]); - for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) { - $A = $m0[$q0[$q0[$q1[$q1[$i] ^ $key[25]] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ - $m1[$q0[$q1[$q1[$q0[$i] ^ $key[26]] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ - $m2[$q1[$q0[$q0[$q0[$i] ^ $key[27]] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ - $m3[$q1[$q1[$q0[$q1[$i] ^ $key[28]] ^ $key[20]] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$q1[$q1[$j] ^ $key[29]] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ - $m1[$q0[$q1[$q1[$q0[$j] ^ $key[30]] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ - $m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ - $m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]]; - $B = ($B << 8) | ($B >> 24 & 0xff); - $K[] = $A+= $B; - $K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff); - } - for ($i = 0; $i < 256; ++$i) { - $S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0]; - $S1[$i] = $m1[$q0[$q1[$q1[$q0[$i] ^ $sd] ^ $s9] ^ $s5] ^ $s1]; - $S2[$i] = $m2[$q1[$q0[$q0[$q0[$i] ^ $se] ^ $sa] ^ $s6] ^ $s2]; - $S3[$i] = $m3[$q1[$q1[$q0[$q1[$i] ^ $sf] ^ $sb] ^ $s7] ^ $s3]; - } - } - - $this->K = $K; - $this->S0 = $S0; - $this->S1 = $S1; - $this->S2 = $S2; - $this->S3 = $S3; - } - - /** - * _mdsrem function using by the twofish cipher algorithm - * - * @access private - * @param String $A - * @param String $B - * @return Array - */ - function _mdsrem($A, $B) - { - // No gain by unrolling this loop. - for ($i = 0; $i < 8; ++$i) { - // Get most significant coefficient. - $t = 0xff & ($B >> 24); - - // Shift the others up. - $B = ($B << 8) | (0xff & ($A >> 24)); - $A<<= 8; - - $u = $t << 1; - - // Subtract the modular polynomial on overflow. - if ($t & 0x80) { - $u^= 0x14d; - } - - // Remove t * (a * x^2 + 1). - $B ^= $t ^ ($u << 16); - - // Form u = a*t + t/a = t*(a + 1/a). - $u^= 0x7fffffff & ($t >> 1); - - // Add the modular polynomial on underflow. - if ($t & 0x01) $u^= 0xa6 ; - - // Remove t * (a + 1/a) * (x^3 + x). - $B^= ($u << 24) | ($u << 8); - } - - return array( - 0xff & $B >> 24, - 0xff & $B >> 16, - 0xff & $B >> 8, - 0xff & $B); - } - - /** - * Encrypts a block - * - * @access private - * @param String $in - * @return String - */ - function _encryptBlock($in) - { - $S0 = $this->S0; - $S1 = $this->S1; - $S2 = $this->S2; - $S3 = $this->S3; - $K = $this->K; - - $in = unpack("V4", $in); - $R0 = $K[0] ^ $in[1]; - $R1 = $K[1] ^ $in[2]; - $R2 = $K[2] ^ $in[3]; - $R3 = $K[3] ^ $in[4]; - - $ki = 7; - while ($ki < 39) { - $t0 = $S0[ $R0 & 0xff] ^ - $S1[($R0 >> 8) & 0xff] ^ - $S2[($R0 >> 16) & 0xff] ^ - $S3[($R0 >> 24) & 0xff]; - $t1 = $S0[($R1 >> 24) & 0xff] ^ - $S1[ $R1 & 0xff] ^ - $S2[($R1 >> 8) & 0xff] ^ - $S3[($R1 >> 16) & 0xff]; - $R2^= $t0 + $t1 + $K[++$ki]; - $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); - $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ($t0 + ($t1 << 1) + $K[++$ki]); - - $t0 = $S0[ $R2 & 0xff] ^ - $S1[($R2 >> 8) & 0xff] ^ - $S2[($R2 >> 16) & 0xff] ^ - $S3[($R2 >> 24) & 0xff]; - $t1 = $S0[($R3 >> 24) & 0xff] ^ - $S1[ $R3 & 0xff] ^ - $S2[($R3 >> 8) & 0xff] ^ - $S3[($R3 >> 16) & 0xff]; - $R0^= ($t0 + $t1 + $K[++$ki]); - $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); - $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ($t0 + ($t1 << 1) + $K[++$ki]); - } - - // @codingStandardsIgnoreStart - return pack("V4", $K[4] ^ $R2, - $K[5] ^ $R3, - $K[6] ^ $R0, - $K[7] ^ $R1); - // @codingStandardsIgnoreEnd - } - - /** - * Decrypts a block - * - * @access private - * @param String $in - * @return String - */ - function _decryptBlock($in) - { - $S0 = $this->S0; - $S1 = $this->S1; - $S2 = $this->S2; - $S3 = $this->S3; - $K = $this->K; - - $in = unpack("V4", $in); - $R0 = $K[4] ^ $in[1]; - $R1 = $K[5] ^ $in[2]; - $R2 = $K[6] ^ $in[3]; - $R3 = $K[7] ^ $in[4]; - - $ki = 40; - while ($ki > 8) { - $t0 = $S0[$R0 & 0xff] ^ - $S1[$R0 >> 8 & 0xff] ^ - $S2[$R0 >> 16 & 0xff] ^ - $S3[$R0 >> 24 & 0xff]; - $t1 = $S0[$R1 >> 24 & 0xff] ^ - $S1[$R1 & 0xff] ^ - $S2[$R1 >> 8 & 0xff] ^ - $S3[$R1 >> 16 & 0xff]; - $R3^= $t0 + ($t1 << 1) + $K[--$ki]; - $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; - $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ($t0 + $t1 + $K[--$ki]); - - $t0 = $S0[$R2 & 0xff] ^ - $S1[$R2 >> 8 & 0xff] ^ - $S2[$R2 >> 16 & 0xff] ^ - $S3[$R2 >> 24 & 0xff]; - $t1 = $S0[$R3 >> 24 & 0xff] ^ - $S1[$R3 & 0xff] ^ - $S2[$R3 >> 8 & 0xff] ^ - $S3[$R3 >> 16 & 0xff]; - $R1^= $t0 + ($t1 << 1) + $K[--$ki]; - $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; - $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ($t0 + $t1 + $K[--$ki]); - } - - // @codingStandardsIgnoreStart - return pack("V4", $K[0] ^ $R2, - $K[1] ^ $R3, - $K[2] ^ $R0, - $K[3] ^ $R1); - // @codingStandardsIgnoreEnd - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Crypt_Base::_setupInlineCrypt() - * @access private - */ - function _setupInlineCrypt() - { - $lambda_functions =& Crypt_Twofish::_getLambdaFunctions(); - - // Max. 10 Ultra-Hi-optimized inline-crypt functions. After that, we'll (still) create very fast code, but not the ultimate fast one. - $gen_hi_opt_code = (bool)( count($lambda_functions) < 10 ); - - switch (true) { - case $gen_hi_opt_code: - $code_hash = md5(str_pad("Crypt_Twofish, {$this->mode}, ", 32, "\0") . $this->key); - break; - default: - $code_hash = "Crypt_Twofish, {$this->mode}"; - } - - if (!isset($lambda_functions[$code_hash])) { - switch (true) { - case $gen_hi_opt_code: - $K = $this->K; - - $init_crypt = ' - static $S0, $S1, $S2, $S3; - if (!$S0) { - for ($i = 0; $i < 256; ++$i) { - $S0[] = (int)$self->S0[$i]; - $S1[] = (int)$self->S1[$i]; - $S2[] = (int)$self->S2[$i]; - $S3[] = (int)$self->S3[$i]; - } - } - '; - break; - default: - $K = array(); - for ($i = 0; $i < 40; ++$i) { - $K[] = '$K_' . $i; - } - - $init_crypt = ' - $S0 = $self->S0; - $S1 = $self->S1; - $S2 = $self->S2; - $S3 = $self->S3; - list(' . implode(',', $K) . ') = $self->K; - '; - } - - // Generating encrypt code: - $encrypt_block = ' - $in = unpack("V4", $in); - $R0 = '.$K[0].' ^ $in[1]; - $R1 = '.$K[1].' ^ $in[2]; - $R2 = '.$K[2].' ^ $in[3]; - $R3 = '.$K[3].' ^ $in[4]; - '; - for ($ki = 7, $i = 0; $i < 8; ++$i) { - $encrypt_block.= ' - $t0 = $S0[ $R0 & 0xff] ^ - $S1[($R0 >> 8) & 0xff] ^ - $S2[($R0 >> 16) & 0xff] ^ - $S3[($R0 >> 24) & 0xff]; - $t1 = $S0[($R1 >> 24) & 0xff] ^ - $S1[ $R1 & 0xff] ^ - $S2[($R1 >> 8) & 0xff] ^ - $S3[($R1 >> 16) & 0xff]; - $R2^= ($t0 + $t1 + '.$K[++$ki].'); - $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); - $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ($t0 + ($t1 << 1) + '.$K[++$ki].'); - - $t0 = $S0[ $R2 & 0xff] ^ - $S1[($R2 >> 8) & 0xff] ^ - $S2[($R2 >> 16) & 0xff] ^ - $S3[($R2 >> 24) & 0xff]; - $t1 = $S0[($R3 >> 24) & 0xff] ^ - $S1[ $R3 & 0xff] ^ - $S2[($R3 >> 8) & 0xff] ^ - $S3[($R3 >> 16) & 0xff]; - $R0^= ($t0 + $t1 + '.$K[++$ki].'); - $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); - $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ($t0 + ($t1 << 1) + '.$K[++$ki].'); - '; - } - $encrypt_block.= ' - $in = pack("V4", '.$K[4].' ^ $R2, - '.$K[5].' ^ $R3, - '.$K[6].' ^ $R0, - '.$K[7].' ^ $R1); - '; - - // Generating decrypt code: - $decrypt_block = ' - $in = unpack("V4", $in); - $R0 = '.$K[4].' ^ $in[1]; - $R1 = '.$K[5].' ^ $in[2]; - $R2 = '.$K[6].' ^ $in[3]; - $R3 = '.$K[7].' ^ $in[4]; - '; - for ($ki = 40, $i = 0; $i < 8; ++$i) { - $decrypt_block.= ' - $t0 = $S0[$R0 & 0xff] ^ - $S1[$R0 >> 8 & 0xff] ^ - $S2[$R0 >> 16 & 0xff] ^ - $S3[$R0 >> 24 & 0xff]; - $t1 = $S0[$R1 >> 24 & 0xff] ^ - $S1[$R1 & 0xff] ^ - $S2[$R1 >> 8 & 0xff] ^ - $S3[$R1 >> 16 & 0xff]; - $R3^= $t0 + ($t1 << 1) + '.$K[--$ki].'; - $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; - $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ($t0 + $t1 + '.$K[--$ki].'); - - $t0 = $S0[$R2 & 0xff] ^ - $S1[$R2 >> 8 & 0xff] ^ - $S2[$R2 >> 16 & 0xff] ^ - $S3[$R2 >> 24 & 0xff]; - $t1 = $S0[$R3 >> 24 & 0xff] ^ - $S1[$R3 & 0xff] ^ - $S2[$R3 >> 8 & 0xff] ^ - $S3[$R3 >> 16 & 0xff]; - $R1^= $t0 + ($t1 << 1) + '.$K[--$ki].'; - $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; - $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ($t0 + $t1 + '.$K[--$ki].'); - '; - } - $decrypt_block.= ' - $in = pack("V4", '.$K[0].' ^ $R2, - '.$K[1].' ^ $R3, - '.$K[2].' ^ $R0, - '.$K[3].' ^ $R1); - '; - - $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( - array( - 'init_crypt' => $init_crypt, - 'init_encrypt' => '', - 'init_decrypt' => '', - 'encrypt_block' => $encrypt_block, - 'decrypt_block' => $decrypt_block - ) - ); - } - $this->inline_crypt = $lambda_functions[$code_hash]; - } -} + + * setKey('12345678901234567890123456789012'); + * + * $plaintext = str_repeat('a', 1024); + * + * echo $twofish->decrypt($twofish->encrypt($plaintext)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Crypt + * @package Crypt_Twofish + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Crypt_Base + * + * Base cipher class + */ +if (!class_exists('Crypt_Base')) { + include_once 'Base.php'; +} + +/**#@+ + * @access public + * @see self::encrypt() + * @see self::decrypt() + */ +/** + * Encrypt / decrypt using the Counter mode. + * + * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 + */ +define('CRYPT_TWOFISH_MODE_CTR', CRYPT_MODE_CTR); +/** + * Encrypt / decrypt using the Electronic Code Book mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 + */ +define('CRYPT_TWOFISH_MODE_ECB', CRYPT_MODE_ECB); +/** + * Encrypt / decrypt using the Code Book Chaining mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 + */ +define('CRYPT_TWOFISH_MODE_CBC', CRYPT_MODE_CBC); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 + */ +define('CRYPT_TWOFISH_MODE_CFB', CRYPT_MODE_CFB); +/** + * Encrypt / decrypt using the Cipher Feedback mode. + * + * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 + */ +define('CRYPT_TWOFISH_MODE_OFB', CRYPT_MODE_OFB); +/**#@-*/ + +/** + * Pure-PHP implementation of Twofish. + * + * @package Crypt_Twofish + * @author Jim Wigginton + * @author Hans-Juergen Petrich + * @access public + */ +class Crypt_Twofish extends Crypt_Base +{ + /** + * The namespace used by the cipher for its constants. + * + * @see Crypt_Base::const_namespace + * @var string + * @access private + */ + var $const_namespace = 'TWOFISH'; + + /** + * The mcrypt specific name of the cipher + * + * @see Crypt_Base::cipher_name_mcrypt + * @var string + * @access private + */ + var $cipher_name_mcrypt = 'twofish'; + + /** + * Optimizing value while CFB-encrypting + * + * @see Crypt_Base::cfb_init_len + * @var int + * @access private + */ + var $cfb_init_len = 800; + + /** + * Q-Table + * + * @var array + * @access private + */ + var $q0 = array( + 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, + 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38, + 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, + 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, + 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23, + 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, + 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, + 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61, + 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, + 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, + 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66, + 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, + 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, + 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71, + 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, + 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, + 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2, + 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, + 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, + 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF, + 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, + 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, + 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A, + 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, + 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, + 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D, + 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, + 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, + 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8, + 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, + 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, + 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0 + ); + + /** + * Q-Table + * + * @var array + * @access private + */ + var $q1 = array( + 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, + 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B, + 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, + 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, + 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D, + 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, + 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, + 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51, + 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, + 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, + 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70, + 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, + 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, + 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2, + 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, + 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, + 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3, + 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, + 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, + 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9, + 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, + 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, + 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19, + 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, + 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, + 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69, + 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, + 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, + 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB, + 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, + 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, + 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91 + ); + + /** + * M-Table + * + * @var array + * @access private + */ + var $m0 = array( + 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, 0xE2E22BFB, 0x9E9EFAC8, + 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, + 0x3C3C57D6, 0x93938A32, 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, + 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, 0xB0B0B306, 0x7575DE3F, + 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, + 0xAEAE2C6D, 0x7F7FABC1, 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, + 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, 0x3131272C, 0x808065A3, + 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, + 0x2A2A3638, 0xC4C49CB0, 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, + 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, 0x6767C027, 0xE9E9AF8C, + 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, + 0x29294CCA, 0xF0F035E3, 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, + 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, 0xC8C81DC3, 0x9999FFCC, + 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, + 0xB5B53D79, 0x09090F0C, 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, + 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, 0xEDEDD07A, 0x4343FC17, + 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, + 0x5656E70B, 0xE3E3DA72, 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, + 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, 0x8181942A, 0x91910149, + 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, + 0x7878AEC5, 0xC5C56D39, 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, + 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, 0x55559DF9, 0x7E7E5A48, + 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, + 0x0606F48D, 0x404086E5, 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, + 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, 0x2D2D333C, 0x3030D6A5, + 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, + 0xD9D97929, 0x8686912E, 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, + 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, 0xC1C112CF, 0x8585EBDC, + 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, + 0xABABA212, 0x6F6F3EA2, 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, + 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, 0x04047FF6, 0x272746C2, + 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91 + ); + + /** + * M-Table + * + * @var array + * @access private + */ + var $m1 = array( + 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, 0xA3658080, 0x76DFE4E4, + 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, + 0x0D54E6E6, 0xC6432020, 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, + 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, 0x94B1FBFB, 0x485A7E7E, + 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, + 0x1945FDFD, 0x5BA33A3A, 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, + 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, 0x9B53AAAA, 0x7C635D5D, + 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, + 0xC0F09090, 0x8CAFE9E9, 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, + 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, 0xB499C3C3, 0xF1975B5B, + 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, + 0xCCFF9999, 0x95EA1414, 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, + 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, 0xBF7E9595, 0xBA207D7D, + 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, + 0x81FB0F0F, 0x793DB5B5, 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, + 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, 0x86135050, 0xE730F7F7, + 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, + 0x410B9F9F, 0x7B8B0202, 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, + 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, 0xB1C72B2B, 0xAB6F8E8E, + 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, + 0x91EF1313, 0x85FE0808, 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, + 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, 0x6929A9A9, 0x647D4F4F, + 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, + 0xAC87D1D1, 0x7F8E0505, 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, + 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, 0x4C5F7979, 0x02B6B7B7, + 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, + 0x57AC3333, 0xC718CFCF, 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, + 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, 0x99E51D1D, 0x34392323, + 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, + 0xC8FA9E9E, 0xA882D6D6, 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, + 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, 0x0FE25151, 0x00000000, + 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8 + ); + + /** + * M-Table + * + * @var array + * @access private + */ + var $m2 = array( + 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, 0xE2FBE22B, 0x9EC89EFA, + 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, + 0x3CD63C57, 0x9332938A, 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, + 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, 0xB006B0B3, 0x753F75DE, + 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, + 0xAE6DAE2C, 0x7FC17FAB, 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, + 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, 0x312C3127, 0x80A38065, + 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, + 0x2A382A36, 0xC4B0C49C, 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, + 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, 0x672767C0, 0xE98CE9AF, + 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, + 0x29CA294C, 0xF0E3F035, 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, + 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, 0xC8C3C81D, 0x99CC99FF, + 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, + 0xB579B53D, 0x090C090F, 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, + 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, 0xED7AEDD0, 0x431743FC, + 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, + 0x560B56E7, 0xE372E3DA, 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, + 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, 0x812A8194, 0x91499101, + 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, + 0x78C578AE, 0xC539C56D, 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, + 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, 0x55F9559D, 0x7E487E5A, + 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, + 0x068D06F4, 0x40E54086, 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, + 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, 0x2D3C2D33, 0x30A530D6, + 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, + 0xD929D979, 0x862E8691, 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, + 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, 0xC1CFC112, 0x85DC85EB, + 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, + 0xAB12ABA2, 0x6FA26F3E, 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, + 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, 0x04F6047F, 0x27C22746, + 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF + ); + + /** + * M-Table + * + * @var array + * @access private + */ + var $m3 = array( + 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, 0x6580A365, 0xDFE476DF, + 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, + 0x54E60D54, 0x4320C643, 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, + 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, 0xB1FB94B1, 0x5A7E485A, + 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, + 0x45FD1945, 0xA33A5BA3, 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, + 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, 0x53AA9B53, 0x635D7C63, + 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, + 0xF090C0F0, 0xAFE98CAF, 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, + 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, 0x99C3B499, 0x975BF197, + 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, + 0xFF99CCFF, 0xEA1495EA, 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, + 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, 0x7E95BF7E, 0x207DBA20, + 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, + 0xFB0F81FB, 0x3DB5793D, 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, + 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, 0x13508613, 0x30F7E730, + 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, + 0x0B9F410B, 0x8B027B8B, 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, + 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, 0xC72BB1C7, 0x6F8EAB6F, + 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, + 0xEF1391EF, 0xFE0885FE, 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, + 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, 0x29A96929, 0x7D4F647D, + 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, + 0x87D1AC87, 0x8E057F8E, 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, + 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, 0x5F794C5F, 0xB6B702B6, + 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, + 0xAC3357AC, 0x18CFC718, 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, + 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, 0xE51D99E5, 0x39233439, + 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, + 0xFA9EC8FA, 0x82D6A882, 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, + 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, 0xE2510FE2, 0x00000000, + 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8 + ); + + /** + * The Key Schedule Array + * + * @var array + * @access private + */ + var $K = array(); + + /** + * The Key depended S-Table 0 + * + * @var array + * @access private + */ + var $S0 = array(); + + /** + * The Key depended S-Table 1 + * + * @var array + * @access private + */ + var $S1 = array(); + + /** + * The Key depended S-Table 2 + * + * @var array + * @access private + */ + var $S2 = array(); + + /** + * The Key depended S-Table 3 + * + * @var array + * @access private + */ + var $S3 = array(); + + /** + * Holds the last used key + * + * @var array + * @access private + */ + var $kl; + + /** + * The Key Length (in bytes) + * + * @see Crypt_Twofish::setKeyLength() + * @var int + * @access private + */ + var $key_length = 16; + + /** + * Sets the key length. + * + * Valid key lengths are 128, 192 or 256 bits + * + * @access public + * @param int $length + */ + function setKeyLength($length) + { + switch (true) { + case $length <= 128: + $this->key_length = 16; + break; + case $length <= 192: + $this->key_length = 24; + break; + default: + $this->key_length = 32; + } + + parent::setKeyLength($length); + } + + /** + * Setup the key (expansion) + * + * @see Crypt_Base::_setupKey() + * @access private + */ + function _setupKey() + { + if (isset($this->kl['key']) && $this->key === $this->kl['key']) { + // already expanded + return; + } + $this->kl = array('key' => $this->key); + + /* Key expanding and generating the key-depended s-boxes */ + $le_longs = unpack('V*', $this->key); + $key = unpack('C*', $this->key); + $m0 = $this->m0; + $m1 = $this->m1; + $m2 = $this->m2; + $m3 = $this->m3; + $q0 = $this->q0; + $q1 = $this->q1; + + $K = $S0 = $S1 = $S2 = $S3 = array(); + + switch (strlen($this->key)) { + case 16: + list($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[1], $le_longs[2]); + list($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[3], $le_longs[4]); + for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) { + $A = $m0[$q0[$q0[$i] ^ $key[ 9]] ^ $key[1]] ^ + $m1[$q0[$q1[$i] ^ $key[10]] ^ $key[2]] ^ + $m2[$q1[$q0[$i] ^ $key[11]] ^ $key[3]] ^ + $m3[$q1[$q1[$i] ^ $key[12]] ^ $key[4]]; + $B = $m0[$q0[$q0[$j] ^ $key[13]] ^ $key[5]] ^ + $m1[$q0[$q1[$j] ^ $key[14]] ^ $key[6]] ^ + $m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^ + $m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]]; + $B = ($B << 8) | ($B >> 24 & 0xff); + $A = $this->safe_intval($A + $B); + $K[] = $A; + $A = $this->safe_intval($A + $B); + $K[] = ($A << 9 | $A >> 23 & 0x1ff); + } + for ($i = 0; $i < 256; ++$i) { + $S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0]; + $S1[$i] = $m1[$q0[$q1[$i] ^ $s5] ^ $s1]; + $S2[$i] = $m2[$q1[$q0[$i] ^ $s6] ^ $s2]; + $S3[$i] = $m3[$q1[$q1[$i] ^ $s7] ^ $s3]; + } + break; + case 24: + list($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[1], $le_longs[2]); + list($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[3], $le_longs[4]); + list($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[5], $le_longs[6]); + for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) { + $A = $m0[$q0[$q0[$q1[$i] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ + $m1[$q0[$q1[$q1[$i] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ + $m2[$q1[$q0[$q0[$i] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ + $m3[$q1[$q1[$q0[$i] ^ $key[20]] ^ $key[12]] ^ $key[4]]; + $B = $m0[$q0[$q0[$q1[$j] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ + $m1[$q0[$q1[$q1[$j] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ + $m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ + $m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]]; + $B = ($B << 8) | ($B >> 24 & 0xff); + $A = $this->safe_intval($A + $B); + $K[] = $A; + $A = $this->safe_intval($A + $B); + $K[] = ($A << 9 | $A >> 23 & 0x1ff); + } + for ($i = 0; $i < 256; ++$i) { + $S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0]; + $S1[$i] = $m1[$q0[$q1[$q1[$i] ^ $s9] ^ $s5] ^ $s1]; + $S2[$i] = $m2[$q1[$q0[$q0[$i] ^ $sa] ^ $s6] ^ $s2]; + $S3[$i] = $m3[$q1[$q1[$q0[$i] ^ $sb] ^ $s7] ^ $s3]; + } + break; + default: // 32 + list($sf, $se, $sd, $sc) = $this->_mdsrem($le_longs[1], $le_longs[2]); + list($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[3], $le_longs[4]); + list($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[5], $le_longs[6]); + list($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[7], $le_longs[8]); + for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) { + $A = $m0[$q0[$q0[$q1[$q1[$i] ^ $key[25]] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ + $m1[$q0[$q1[$q1[$q0[$i] ^ $key[26]] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ + $m2[$q1[$q0[$q0[$q0[$i] ^ $key[27]] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ + $m3[$q1[$q1[$q0[$q1[$i] ^ $key[28]] ^ $key[20]] ^ $key[12]] ^ $key[4]]; + $B = $m0[$q0[$q0[$q1[$q1[$j] ^ $key[29]] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ + $m1[$q0[$q1[$q1[$q0[$j] ^ $key[30]] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ + $m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ + $m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]]; + $B = ($B << 8) | ($B >> 24 & 0xff); + $A = $this->safe_intval($A + $B); + $K[] = $A; + $A = $this->safe_intval($A + $B); + $K[] = ($A << 9 | $A >> 23 & 0x1ff); + } + for ($i = 0; $i < 256; ++$i) { + $S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0]; + $S1[$i] = $m1[$q0[$q1[$q1[$q0[$i] ^ $sd] ^ $s9] ^ $s5] ^ $s1]; + $S2[$i] = $m2[$q1[$q0[$q0[$q0[$i] ^ $se] ^ $sa] ^ $s6] ^ $s2]; + $S3[$i] = $m3[$q1[$q1[$q0[$q1[$i] ^ $sf] ^ $sb] ^ $s7] ^ $s3]; + } + } + + $this->K = $K; + $this->S0 = $S0; + $this->S1 = $S1; + $this->S2 = $S2; + $this->S3 = $S3; + } + + /** + * _mdsrem function using by the twofish cipher algorithm + * + * @access private + * @param string $A + * @param string $B + * @return array + */ + function _mdsrem($A, $B) + { + // No gain by unrolling this loop. + for ($i = 0; $i < 8; ++$i) { + // Get most significant coefficient. + $t = 0xff & ($B >> 24); + + // Shift the others up. + $B = ($B << 8) | (0xff & ($A >> 24)); + $A<<= 8; + + $u = $t << 1; + + // Subtract the modular polynomial on overflow. + if ($t & 0x80) { + $u^= 0x14d; + } + + // Remove t * (a * x^2 + 1). + $B ^= $t ^ ($u << 16); + + // Form u = a*t + t/a = t*(a + 1/a). + $u^= 0x7fffffff & ($t >> 1); + + // Add the modular polynomial on underflow. + if ($t & 0x01) { + $u^= 0xa6 ; + } + + // Remove t * (a + 1/a) * (x^3 + x). + $B^= ($u << 24) | ($u << 8); + } + + return array( + 0xff & $B >> 24, + 0xff & $B >> 16, + 0xff & $B >> 8, + 0xff & $B); + } + + /** + * Encrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _encryptBlock($in) + { + $S0 = $this->S0; + $S1 = $this->S1; + $S2 = $this->S2; + $S3 = $this->S3; + $K = $this->K; + + $in = unpack("V4", $in); + $R0 = $K[0] ^ $in[1]; + $R1 = $K[1] ^ $in[2]; + $R2 = $K[2] ^ $in[3]; + $R3 = $K[3] ^ $in[4]; + + $ki = 7; + while ($ki < 39) { + $t0 = $S0[ $R0 & 0xff] ^ + $S1[($R0 >> 8) & 0xff] ^ + $S2[($R0 >> 16) & 0xff] ^ + $S3[($R0 >> 24) & 0xff]; + $t1 = $S0[($R1 >> 24) & 0xff] ^ + $S1[ $R1 & 0xff] ^ + $S2[($R1 >> 8) & 0xff] ^ + $S3[($R1 >> 16) & 0xff]; + $R2^= $this->safe_intval($t0 + $t1 + $K[++$ki]); + $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); + $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ $this->safe_intval($t0 + ($t1 << 1) + $K[++$ki]); + + $t0 = $S0[ $R2 & 0xff] ^ + $S1[($R2 >> 8) & 0xff] ^ + $S2[($R2 >> 16) & 0xff] ^ + $S3[($R2 >> 24) & 0xff]; + $t1 = $S0[($R3 >> 24) & 0xff] ^ + $S1[ $R3 & 0xff] ^ + $S2[($R3 >> 8) & 0xff] ^ + $S3[($R3 >> 16) & 0xff]; + $R0^= $this->safe_intval($t0 + $t1 + $K[++$ki]); + $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); + $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ $this->safe_intval($t0 + ($t1 << 1) + $K[++$ki]); + } + + // @codingStandardsIgnoreStart + return pack("V4", $K[4] ^ $R2, + $K[5] ^ $R3, + $K[6] ^ $R0, + $K[7] ^ $R1); + // @codingStandardsIgnoreEnd + } + + /** + * Decrypts a block + * + * @access private + * @param string $in + * @return string + */ + function _decryptBlock($in) + { + $S0 = $this->S0; + $S1 = $this->S1; + $S2 = $this->S2; + $S3 = $this->S3; + $K = $this->K; + + $in = unpack("V4", $in); + $R0 = $K[4] ^ $in[1]; + $R1 = $K[5] ^ $in[2]; + $R2 = $K[6] ^ $in[3]; + $R3 = $K[7] ^ $in[4]; + + $ki = 40; + while ($ki > 8) { + $t0 = $S0[$R0 & 0xff] ^ + $S1[$R0 >> 8 & 0xff] ^ + $S2[$R0 >> 16 & 0xff] ^ + $S3[$R0 >> 24 & 0xff]; + $t1 = $S0[$R1 >> 24 & 0xff] ^ + $S1[$R1 & 0xff] ^ + $S2[$R1 >> 8 & 0xff] ^ + $S3[$R1 >> 16 & 0xff]; + $R3^= $this->safe_intval($t0 + ($t1 << 1) + $K[--$ki]); + $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; + $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ $this->safe_intval($t0 + $t1 + $K[--$ki]); + + $t0 = $S0[$R2 & 0xff] ^ + $S1[$R2 >> 8 & 0xff] ^ + $S2[$R2 >> 16 & 0xff] ^ + $S3[$R2 >> 24 & 0xff]; + $t1 = $S0[$R3 >> 24 & 0xff] ^ + $S1[$R3 & 0xff] ^ + $S2[$R3 >> 8 & 0xff] ^ + $S3[$R3 >> 16 & 0xff]; + $R1^= $this->safe_intval($t0 + ($t1 << 1) + $K[--$ki]); + $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; + $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ $this->safe_intval($t0 + $t1 + $K[--$ki]); + } + + // @codingStandardsIgnoreStart + return pack("V4", $K[0] ^ $R2, + $K[1] ^ $R3, + $K[2] ^ $R0, + $K[3] ^ $R1); + // @codingStandardsIgnoreEnd + } + + /** + * Setup the performance-optimized function for de/encrypt() + * + * @see Crypt_Base::_setupInlineCrypt() + * @access private + */ + function _setupInlineCrypt() + { + $lambda_functions =& Crypt_Twofish::_getLambdaFunctions(); + + // Max. 10 Ultra-Hi-optimized inline-crypt functions. After that, we'll (still) create very fast code, but not the ultimate fast one. + // (Currently, for Crypt_Twofish, one generated $lambda_function cost on php5.5@32bit ~140kb unfreeable mem and ~240kb on php5.5@64bit) + $gen_hi_opt_code = (bool)(count($lambda_functions) < 10); + + // Generation of a unique hash for our generated code + $code_hash = "Crypt_Twofish, {$this->mode}"; + if ($gen_hi_opt_code) { + $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key); + } + + $safeint = $this->safe_intval_inline(); + + if (!isset($lambda_functions[$code_hash])) { + switch (true) { + case $gen_hi_opt_code: + $K = $this->K; + $init_crypt = ' + static $S0, $S1, $S2, $S3; + if (!$S0) { + for ($i = 0; $i < 256; ++$i) { + $S0[] = (int)$self->S0[$i]; + $S1[] = (int)$self->S1[$i]; + $S2[] = (int)$self->S2[$i]; + $S3[] = (int)$self->S3[$i]; + } + } + '; + break; + default: + $K = array(); + for ($i = 0; $i < 40; ++$i) { + $K[] = '$K_' . $i; + } + $init_crypt = ' + $S0 = $self->S0; + $S1 = $self->S1; + $S2 = $self->S2; + $S3 = $self->S3; + list(' . implode(',', $K) . ') = $self->K; + '; + } + + // Generating encrypt code: + $encrypt_block = ' + $in = unpack("V4", $in); + $R0 = '.$K[0].' ^ $in[1]; + $R1 = '.$K[1].' ^ $in[2]; + $R2 = '.$K[2].' ^ $in[3]; + $R3 = '.$K[3].' ^ $in[4]; + '; + for ($ki = 7, $i = 0; $i < 8; ++$i) { + $encrypt_block.= ' + $t0 = $S0[ $R0 & 0xff] ^ + $S1[($R0 >> 8) & 0xff] ^ + $S2[($R0 >> 16) & 0xff] ^ + $S3[($R0 >> 24) & 0xff]; + $t1 = $S0[($R1 >> 24) & 0xff] ^ + $S1[ $R1 & 0xff] ^ + $S2[($R1 >> 8) & 0xff] ^ + $S3[($R1 >> 16) & 0xff]; + $R2^= ' . sprintf($safeint, '$t0 + $t1 + ' . $K[++$ki]) . '; + $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); + $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ' . sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . '; + + $t0 = $S0[ $R2 & 0xff] ^ + $S1[($R2 >> 8) & 0xff] ^ + $S2[($R2 >> 16) & 0xff] ^ + $S3[($R2 >> 24) & 0xff]; + $t1 = $S0[($R3 >> 24) & 0xff] ^ + $S1[ $R3 & 0xff] ^ + $S2[($R3 >> 8) & 0xff] ^ + $S3[($R3 >> 16) & 0xff]; + $R0^= ' . sprintf($safeint, '($t0 + $t1 + ' . $K[++$ki] . ')') . '; + $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); + $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ' . sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . '; + '; + } + $encrypt_block.= ' + $in = pack("V4", ' . $K[4] . ' ^ $R2, + ' . $K[5] . ' ^ $R3, + ' . $K[6] . ' ^ $R0, + ' . $K[7] . ' ^ $R1); + '; + + // Generating decrypt code: + $decrypt_block = ' + $in = unpack("V4", $in); + $R0 = '.$K[4].' ^ $in[1]; + $R1 = '.$K[5].' ^ $in[2]; + $R2 = '.$K[6].' ^ $in[3]; + $R3 = '.$K[7].' ^ $in[4]; + '; + for ($ki = 40, $i = 0; $i < 8; ++$i) { + $decrypt_block.= ' + $t0 = $S0[$R0 & 0xff] ^ + $S1[$R0 >> 8 & 0xff] ^ + $S2[$R0 >> 16 & 0xff] ^ + $S3[$R0 >> 24 & 0xff]; + $t1 = $S0[$R1 >> 24 & 0xff] ^ + $S1[$R1 & 0xff] ^ + $S2[$R1 >> 8 & 0xff] ^ + $S3[$R1 >> 16 & 0xff]; + $R3^= ' . sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . '; + $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; + $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ' . sprintf($safeint, '($t0 + $t1 + '.$K[--$ki] . ')') . '; + + $t0 = $S0[$R2 & 0xff] ^ + $S1[$R2 >> 8 & 0xff] ^ + $S2[$R2 >> 16 & 0xff] ^ + $S3[$R2 >> 24 & 0xff]; + $t1 = $S0[$R3 >> 24 & 0xff] ^ + $S1[$R3 & 0xff] ^ + $S2[$R3 >> 8 & 0xff] ^ + $S3[$R3 >> 16 & 0xff]; + $R1^= ' . sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . '; + $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; + $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ' . sprintf($safeint, '($t0 + $t1 + '.$K[--$ki] . ')') . '; + '; + } + $decrypt_block.= ' + $in = pack("V4", ' . $K[0] . ' ^ $R2, + ' . $K[1] . ' ^ $R3, + ' . $K[2] . ' ^ $R0, + ' . $K[3] . ' ^ $R1); + '; + + $lambda_functions[$code_hash] = $this->_createInlineCryptFunction( + array( + 'init_crypt' => $init_crypt, + 'init_encrypt' => '', + 'init_decrypt' => '', + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ) + ); + } + $this->inline_crypt = $lambda_functions[$code_hash]; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/File/ANSI.php b/rainloop/v/0.0.0/app/libraries/phpseclib/File/ANSI.php old mode 100644 new mode 100755 index 3ff1b7d4b..7411adf6d --- a/rainloop/v/0.0.0/app/libraries/phpseclib/File/ANSI.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/File/ANSI.php @@ -1,559 +1,604 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Pure-PHP ANSI Decoder - * - * @package File_ANSI - * @author Jim Wigginton - * @access public - */ -class File_ANSI -{ - /** - * Max Width - * - * @var Integer - * @access private - */ - var $max_x; - - /** - * Max Height - * - * @var Integer - * @access private - */ - var $max_y; - - /** - * Max History - * - * @var Integer - * @access private - */ - var $max_history; - - /** - * History - * - * @var Array - * @access private - */ - var $history; - - /** - * History Attributes - * - * @var Array - * @access private - */ - var $history_attrs; - - /** - * Current Column - * - * @var Integer - * @access private - */ - var $x; - - /** - * Current Row - * - * @var Integer - * @access private - */ - var $y; - - /** - * Old Column - * - * @var Integer - * @access private - */ - var $old_x; - - /** - * Old Row - * - * @var Integer - * @access private - */ - var $old_y; - - /** - * An empty attribute row - * - * @var Array - * @access private - */ - var $attr_row; - - /** - * The current screen text - * - * @var Array - * @access private - */ - var $screen; - - /** - * The current screen attributes - * - * @var Array - * @access private - */ - var $attrs; - - /** - * The current foreground color - * - * @var String - * @access private - */ - var $foreground; - - /** - * The current background color - * - * @var String - * @access private - */ - var $background; - - /** - * Bold flag - * - * @var Boolean - * @access private - */ - var $bold; - - /** - * Underline flag - * - * @var Boolean - * @access private - */ - var $underline; - - /** - * Blink flag - * - * @var Boolean - * @access private - */ - var $blink; - - /** - * Reverse flag - * - * @var Boolean - * @access private - */ - var $reverse; - - /** - * Color flag - * - * @var Boolean - * @access private - */ - var $color; - - /** - * Current ANSI code - * - * @var String - * @access private - */ - var $ansi; - - /** - * Default Constructor. - * - * @return File_ANSI - * @access public - */ - function File_ANSI() - { - $this->setHistory(200); - $this->setDimensions(80, 24); - } - - /** - * Set terminal width and height - * - * Resets the screen as well - * - * @param Integer $x - * @param Integer $y - * @access public - */ - function setDimensions($x, $y) - { - $this->max_x = $x - 1; - $this->max_y = $y - 1; - $this->x = $this->y = 0; - $this->history = $this->history_attrs = array(); - $this->attr_row = array_fill(0, $this->max_x + 1, ''); - $this->screen = array_fill(0, $this->max_y + 1, ''); - $this->attrs = array_fill(0, $this->max_y + 1, $this->attr_row); - $this->foreground = 'white'; - $this->background = 'black'; - $this->bold = false; - $this->underline = false; - $this->blink = false; - $this->reverse = false; - $this->color = false; - - $this->ansi = ''; - } - - /** - * Set the number of lines that should be logged past the terminal height - * - * @param Integer $x - * @param Integer $y - * @access public - */ - function setHistory($history) - { - $this->max_history = $history; - } - - /** - * Load a string - * - * @param String $source - * @access public - */ - function loadString($source) - { - $this->setDimensions($this->max_x + 1, $this->max_y + 1); - $this->appendString($source); - } - - /** - * Appdend a string - * - * @param String $source - * @access public - */ - function appendString($source) - { - for ($i = 0; $i < strlen($source); $i++) { - if (strlen($this->ansi)) { - $this->ansi.= $source[$i]; - $chr = ord($source[$i]); - // http://en.wikipedia.org/wiki/ANSI_escape_code#Sequence_elements - // single character CSI's not currently supported - switch (true) { - case $this->ansi == "\x1B=": - $this->ansi = ''; - continue 2; - case strlen($this->ansi) == 2 && $chr >= 64 && $chr <= 95 && $chr != ord('['): - case strlen($this->ansi) > 2 && $chr >= 64 && $chr <= 126: - break; - default: - continue 2; - } - // http://ascii-table.com/ansi-escape-sequences-vt-100.php - switch ($this->ansi) { - case "\x1B[H": // Move cursor to upper left corner - $this->old_x = $this->x; - $this->old_y = $this->y; - $this->x = $this->y = 0; - break; - case "\x1B[J": // Clear screen from cursor down - $this->history = array_merge($this->history, array_slice(array_splice($this->screen, $this->y + 1), 0, $this->old_y)); - $this->screen = array_merge($this->screen, array_fill($this->y, $this->max_y, '')); - - $this->history_attrs = array_merge($this->history_attrs, array_slice(array_splice($this->attrs, $this->y + 1), 0, $this->old_y)); - $this->attrs = array_merge($this->attrs, array_fill($this->y, $this->max_y, $this->attr_row)); - - if (count($this->history) == $this->max_history) { - array_shift($this->history); - array_shift($this->history_attrs); - } - case "\x1B[K": // Clear screen from cursor right - $this->screen[$this->y] = substr($this->screen[$this->y], 0, $this->x); - - array_splice($this->attrs[$this->y], $this->x + 1); - break; - case "\x1B[2K": // Clear entire line - $this->screen[$this->y] = str_repeat(' ', $this->x); - $this->attrs[$this->y] = $this->attr_row; - break; - case "\x1B[?1h": // set cursor key to application - case "\x1B[?25h": // show the cursor - break; - case "\x1BE": // Move to next line - $this->_newLine(); - $this->x = 0; - break; - default: - switch (true) { - case preg_match('#\x1B\[(\d+);(\d+)H#', $this->ansi, $match): // Move cursor to screen location v,h - $this->old_x = $this->x; - $this->old_y = $this->y; - $this->x = $match[2] - 1; - $this->y = $match[1] - 1; - break; - case preg_match('#\x1B\[(\d+)C#', $this->ansi, $match): // Move cursor right n lines - $this->old_x = $this->x; - $x = $match[1] - 1; - break; - case preg_match('#\x1B\[(\d+);(\d+)r#', $this->ansi, $match): // Set top and bottom lines of a window - break; - case preg_match('#\x1B\[(\d*(?:;\d*)*)m#', $this->ansi, $match): // character attributes - $mods = explode(';', $match[1]); - foreach ($mods as $mod) { - switch ($mod) { - case 0: // Turn off character attributes - $this->attrs[$this->y][$this->x] = ''; - - if ($this->bold) $this->attrs[$this->y][$this->x].= '
      '; - if ($this->underline) $this->attrs[$this->y][$this->x].= '
      '; - if ($this->blink) $this->attrs[$this->y][$this->x].= ''; - if ($this->color) $this->attrs[$this->y][$this->x].= ''; - - if ($this->reverse) { - $temp = $this->background; - $this->background = $this->foreground; - $this->foreground = $temp; - } - - $this->bold = $this->underline = $this->blink = $this->color = $this->reverse = false; - break; - case 1: // Turn bold mode on - if (!$this->bold) { - $this->attrs[$this->y][$this->x] = ''; - $this->bold = true; - } - break; - case 4: // Turn underline mode on - if (!$this->underline) { - $this->attrs[$this->y][$this->x] = ''; - $this->underline = true; - } - break; - case 5: // Turn blinking mode on - if (!$this->blink) { - $this->attrs[$this->y][$this->x] = ''; - $this->blink = true; - } - break; - case 7: // Turn reverse video on - $this->reverse = !$this->reverse; - $temp = $this->background; - $this->background = $this->foreground; - $this->foreground = $temp; - $this->attrs[$this->y][$this->x] = ''; - if ($this->color) { - $this->attrs[$this->y][$this->x] = '' . $this->attrs[$this->y][$this->x]; - } - $this->color = true; - break; - default: // set colors - //$front = $this->reverse ? &$this->background : &$this->foreground; - $front = &$this->{ $this->reverse ? 'background' : 'foreground' }; - //$back = $this->reverse ? &$this->foreground : &$this->background; - $back = &$this->{ $this->reverse ? 'foreground' : 'background' }; - switch ($mod) { - case 30: $front = 'black'; break; - case 31: $front = 'red'; break; - case 32: $front = 'green'; break; - case 33: $front = 'yellow'; break; - case 34: $front = 'blue'; break; - case 35: $front = 'magenta'; break; - case 36: $front = 'cyan'; break; - case 37: $front = 'white'; break; - - case 40: $back = 'black'; break; - case 41: $back = 'red'; break; - case 42: $back = 'green'; break; - case 43: $back = 'yellow'; break; - case 44: $back = 'blue'; break; - case 45: $back = 'magenta'; break; - case 46: $back = 'cyan'; break; - case 47: $back = 'white'; break; - - default: - user_error('Unsupported attribute: ' . $mod); - $this->ansi = ''; - break 2; - } - - unset($temp); - $this->attrs[$this->y][$this->x] = ''; - if ($this->color) { - $this->attrs[$this->y][$this->x] = '' . $this->attrs[$this->y][$this->x]; - } - $this->color = true; - } - } - break; - default: - user_error("{$this->ansi} unsupported\r\n"); - } - } - $this->ansi = ''; - continue; - } - - switch ($source[$i]) { - case "\r": - $this->x = 0; - break; - case "\n": - $this->_newLine(); - break; - case "\x0F": // shift - break; - case "\x1B": // start ANSI escape code - $this->ansi.= "\x1B"; - break; - default: - $this->screen[$this->y] = substr_replace( - $this->screen[$this->y], - $source[$i], - $this->x, - 1 - ); - - if ($this->x > $this->max_x) { - $this->x = 0; - $this->y++; - } else { - $this->x++; - } - } - } - } - - /** - * Add a new line - * - * Also update the $this->screen and $this->history buffers - * - * @access private - */ - function _newLine() - { - //if ($this->y < $this->max_y) { - // $this->y++; - //} - - while ($this->y >= $this->max_y) { - $this->history = array_merge($this->history, array(array_shift($this->screen))); - $this->screen[] = ''; - - $this->history_attrs = array_merge($this->history_attrs, array(array_shift($this->attrs))); - $this->attrs[] = $this->attr_row; - - if (count($this->history) >= $this->max_history) { - array_shift($this->history); - array_shift($this->history_attrs); - } - - $this->y--; - } - $this->y++; - } - - /** - * Returns the current screen without preformating - * - * @access private - * @return String - */ - function _getScreen() - { - $output = ''; - for ($i = 0; $i <= $this->max_y; $i++) { - for ($j = 0; $j <= $this->max_x + 1; $j++) { - if (isset($this->attrs[$i][$j])) { - $output.= $this->attrs[$i][$j]; - } - if (isset($this->screen[$i][$j])) { - $output.= htmlspecialchars($this->screen[$i][$j]); - } - } - $output.= "\r\n"; - } - return rtrim($output); - } - - /** - * Returns the current screen - * - * @access public - * @return String - */ - function getScreen() - { - return '
      ' . $this->_getScreen() . '
      '; - } - - /** - * Returns the current screen and the x previous lines - * - * @access public - * @return String - */ - function getHistory() - { - $scrollback = ''; - for ($i = 0; $i < count($this->history); $i++) { - for ($j = 0; $j <= $this->max_x + 1; $j++) { - if (isset($this->history_attrs[$i][$j])) { - $scrollback.= $this->history_attrs[$i][$j]; - } - if (isset($this->history[$i][$j])) { - $scrollback.= htmlspecialchars($this->history[$i][$j]); - } - } - $scrollback.= "\r\n"; - } - $scrollback.= $this->_getScreen(); - - return '
      ' . $scrollback . '
      '; - } -} + + * @copyright 2012 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Pure-PHP ANSI Decoder + * + * @package File_ANSI + * @author Jim Wigginton + * @access public + */ +class File_ANSI +{ + /** + * Max Width + * + * @var int + * @access private + */ + var $max_x; + + /** + * Max Height + * + * @var int + * @access private + */ + var $max_y; + + /** + * Max History + * + * @var int + * @access private + */ + var $max_history; + + /** + * History + * + * @var array + * @access private + */ + var $history; + + /** + * History Attributes + * + * @var array + * @access private + */ + var $history_attrs; + + /** + * Current Column + * + * @var int + * @access private + */ + var $x; + + /** + * Current Row + * + * @var int + * @access private + */ + var $y; + + /** + * Old Column + * + * @var int + * @access private + */ + var $old_x; + + /** + * Old Row + * + * @var int + * @access private + */ + var $old_y; + + /** + * An empty attribute cell + * + * @var object + * @access private + */ + var $base_attr_cell; + + /** + * The current attribute cell + * + * @var object + * @access private + */ + var $attr_cell; + + /** + * An empty attribute row + * + * @var array + * @access private + */ + var $attr_row; + + /** + * The current screen text + * + * @var array + * @access private + */ + var $screen; + + /** + * The current screen attributes + * + * @var array + * @access private + */ + var $attrs; + + /** + * Current ANSI code + * + * @var string + * @access private + */ + var $ansi; + + /** + * Tokenization + * + * @var array + * @access private + */ + var $tokenization; + + /** + * Default Constructor. + * + * @return File_ANSI + * @access public + */ + function __construct() + { + $attr_cell = new stdClass(); + $attr_cell->bold = false; + $attr_cell->underline = false; + $attr_cell->blink = false; + $attr_cell->background = 'black'; + $attr_cell->foreground = 'white'; + $attr_cell->reverse = false; + $this->base_attr_cell = clone($attr_cell); + $this->attr_cell = clone($attr_cell); + + $this->setHistory(200); + $this->setDimensions(80, 24); + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @access public + */ + function File_ANSI() + { + $this->__construct($mode); + } + + /** + * Set terminal width and height + * + * Resets the screen as well + * + * @param int $x + * @param int $y + * @access public + */ + function setDimensions($x, $y) + { + $this->max_x = $x - 1; + $this->max_y = $y - 1; + $this->x = $this->y = 0; + $this->history = $this->history_attrs = array(); + $this->attr_row = array_fill(0, $this->max_x + 2, $this->base_attr_cell); + $this->screen = array_fill(0, $this->max_y + 1, ''); + $this->attrs = array_fill(0, $this->max_y + 1, $this->attr_row); + $this->ansi = ''; + } + + /** + * Set the number of lines that should be logged past the terminal height + * + * @param int $x + * @param int $y + * @access public + */ + function setHistory($history) + { + $this->max_history = $history; + } + + /** + * Load a string + * + * @param string $source + * @access public + */ + function loadString($source) + { + $this->setDimensions($this->max_x + 1, $this->max_y + 1); + $this->appendString($source); + } + + /** + * Appdend a string + * + * @param string $source + * @access public + */ + function appendString($source) + { + $this->tokenization = array(''); + for ($i = 0; $i < strlen($source); $i++) { + if (strlen($this->ansi)) { + $this->ansi.= $source[$i]; + $chr = ord($source[$i]); + // http://en.wikipedia.org/wiki/ANSI_escape_code#Sequence_elements + // single character CSI's not currently supported + switch (true) { + case $this->ansi == "\x1B=": + $this->ansi = ''; + continue 2; + case strlen($this->ansi) == 2 && $chr >= 64 && $chr <= 95 && $chr != ord('['): + case strlen($this->ansi) > 2 && $chr >= 64 && $chr <= 126: + break; + default: + continue 2; + } + $this->tokenization[] = $this->ansi; + $this->tokenization[] = ''; + // http://ascii-table.com/ansi-escape-sequences-vt-100.php + switch ($this->ansi) { + case "\x1B[H": // Move cursor to upper left corner + $this->old_x = $this->x; + $this->old_y = $this->y; + $this->x = $this->y = 0; + break; + case "\x1B[J": // Clear screen from cursor down + $this->history = array_merge($this->history, array_slice(array_splice($this->screen, $this->y + 1), 0, $this->old_y)); + $this->screen = array_merge($this->screen, array_fill($this->y, $this->max_y, '')); + + $this->history_attrs = array_merge($this->history_attrs, array_slice(array_splice($this->attrs, $this->y + 1), 0, $this->old_y)); + $this->attrs = array_merge($this->attrs, array_fill($this->y, $this->max_y, $this->attr_row)); + + if (count($this->history) == $this->max_history) { + array_shift($this->history); + array_shift($this->history_attrs); + } + case "\x1B[K": // Clear screen from cursor right + $this->screen[$this->y] = substr($this->screen[$this->y], 0, $this->x); + + array_splice($this->attrs[$this->y], $this->x + 1, $this->max_x - $this->x, array_fill($this->x, $this->max_x - $this->x - 1, $this->base_attr_cell)); + break; + case "\x1B[2K": // Clear entire line + $this->screen[$this->y] = str_repeat(' ', $this->x); + $this->attrs[$this->y] = $this->attr_row; + break; + case "\x1B[?1h": // set cursor key to application + case "\x1B[?25h": // show the cursor + case "\x1B(B": // set united states g0 character set + break; + case "\x1BE": // Move to next line + $this->_newLine(); + $this->x = 0; + break; + default: + switch (true) { + case preg_match('#\x1B\[(\d+)B#', $this->ansi, $match): // Move cursor down n lines + $this->old_y = $this->y; + $this->y+= $match[1]; + break; + case preg_match('#\x1B\[(\d+);(\d+)H#', $this->ansi, $match): // Move cursor to screen location v,h + $this->old_x = $this->x; + $this->old_y = $this->y; + $this->x = $match[2] - 1; + $this->y = $match[1] - 1; + break; + case preg_match('#\x1B\[(\d+)C#', $this->ansi, $match): // Move cursor right n lines + $this->old_x = $this->x; + $this->x+= $match[1]; + break; + case preg_match('#\x1B\[(\d+)D#', $this->ansi, $match): // Move cursor left n lines + $this->old_x = $this->x; + $this->x-= $match[1]; + if ($this->x < 0) { + $this->x = 0; + } + break; + case preg_match('#\x1B\[(\d+);(\d+)r#', $this->ansi, $match): // Set top and bottom lines of a window + break; + case preg_match('#\x1B\[(\d*(?:;\d*)*)m#', $this->ansi, $match): // character attributes + $attr_cell = &$this->attr_cell; + $mods = explode(';', $match[1]); + foreach ($mods as $mod) { + switch ($mod) { + case 0: // Turn off character attributes + $attr_cell = clone($this->base_attr_cell); + break; + case 1: // Turn bold mode on + $attr_cell->bold = true; + break; + case 4: // Turn underline mode on + $attr_cell->underline = true; + break; + case 5: // Turn blinking mode on + $attr_cell->blink = true; + break; + case 7: // Turn reverse video on + $attr_cell->reverse = !$attr_cell->reverse; + $temp = $attr_cell->background; + $attr_cell->background = $attr_cell->foreground; + $attr_cell->foreground = $temp; + break; + default: // set colors + //$front = $attr_cell->reverse ? &$attr_cell->background : &$attr_cell->foreground; + $front = &$attr_cell->{ $attr_cell->reverse ? 'background' : 'foreground' }; + //$back = $attr_cell->reverse ? &$attr_cell->foreground : &$attr_cell->background; + $back = &$attr_cell->{ $attr_cell->reverse ? 'foreground' : 'background' }; + switch ($mod) { + // @codingStandardsIgnoreStart + case 30: $front = 'black'; break; + case 31: $front = 'red'; break; + case 32: $front = 'green'; break; + case 33: $front = 'yellow'; break; + case 34: $front = 'blue'; break; + case 35: $front = 'magenta'; break; + case 36: $front = 'cyan'; break; + case 37: $front = 'white'; break; + + case 40: $back = 'black'; break; + case 41: $back = 'red'; break; + case 42: $back = 'green'; break; + case 43: $back = 'yellow'; break; + case 44: $back = 'blue'; break; + case 45: $back = 'magenta'; break; + case 46: $back = 'cyan'; break; + case 47: $back = 'white'; break; + // @codingStandardsIgnoreEnd + + default: + //user_error('Unsupported attribute: ' . $mod); + $this->ansi = ''; + break 2; + } + } + } + break; + default: + //user_error("{$this->ansi} is unsupported\r\n"); + } + } + $this->ansi = ''; + continue; + } + + $this->tokenization[count($this->tokenization) - 1].= $source[$i]; + switch ($source[$i]) { + case "\r": + $this->x = 0; + break; + case "\n": + $this->_newLine(); + break; + case "\x08": // backspace + if ($this->x) { + $this->x--; + $this->attrs[$this->y][$this->x] = clone($this->base_attr_cell); + $this->screen[$this->y] = substr_replace( + $this->screen[$this->y], + $source[$i], + $this->x, + 1 + ); + } + break; + case "\x0F": // shift + break; + case "\x1B": // start ANSI escape code + $this->tokenization[count($this->tokenization) - 1] = substr($this->tokenization[count($this->tokenization) - 1], 0, -1); + //if (!strlen($this->tokenization[count($this->tokenization) - 1])) { + // array_pop($this->tokenization); + //} + $this->ansi.= "\x1B"; + break; + default: + $this->attrs[$this->y][$this->x] = clone($this->attr_cell); + if ($this->x > strlen($this->screen[$this->y])) { + $this->screen[$this->y] = str_repeat(' ', $this->x); + } + $this->screen[$this->y] = substr_replace( + $this->screen[$this->y], + $source[$i], + $this->x, + 1 + ); + + if ($this->x > $this->max_x) { + $this->x = 0; + $this->_newLine(); + } else { + $this->x++; + } + } + } + } + + /** + * Add a new line + * + * Also update the $this->screen and $this->history buffers + * + * @access private + */ + function _newLine() + { + //if ($this->y < $this->max_y) { + // $this->y++; + //} + + while ($this->y >= $this->max_y) { + $this->history = array_merge($this->history, array(array_shift($this->screen))); + $this->screen[] = ''; + + $this->history_attrs = array_merge($this->history_attrs, array(array_shift($this->attrs))); + $this->attrs[] = $this->attr_row; + + if (count($this->history) >= $this->max_history) { + array_shift($this->history); + array_shift($this->history_attrs); + } + + $this->y--; + } + $this->y++; + } + + /** + * Returns the current coordinate without preformating + * + * @access private + * @return string + */ + function _processCoordinate($last_attr, $cur_attr, $char) + { + $output = ''; + + if ($last_attr != $cur_attr) { + $close = $open = ''; + if ($last_attr->foreground != $cur_attr->foreground) { + if ($cur_attr->foreground != 'white') { + $open.= ''; + } + if ($last_attr->foreground != 'white') { + $close = '' . $close; + } + } + if ($last_attr->background != $cur_attr->background) { + if ($cur_attr->background != 'black') { + $open.= ''; + } + if ($last_attr->background != 'black') { + $close = '' . $close; + } + } + if ($last_attr->bold != $cur_attr->bold) { + if ($cur_attr->bold) { + $open.= ''; + } else { + $close = '' . $close; + } + } + if ($last_attr->underline != $cur_attr->underline) { + if ($cur_attr->underline) { + $open.= ''; + } else { + $close = '' . $close; + } + } + if ($last_attr->blink != $cur_attr->blink) { + if ($cur_attr->blink) { + $open.= ''; + } else { + $close = '' . $close; + } + } + $output.= $close . $open; + } + + $output.= htmlspecialchars($char); + + return $output; + } + + /** + * Returns the current screen without preformating + * + * @access private + * @return string + */ + function _getScreen() + { + $output = ''; + $last_attr = $this->base_attr_cell; + for ($i = 0; $i <= $this->max_y; $i++) { + for ($j = 0; $j <= $this->max_x; $j++) { + $cur_attr = $this->attrs[$i][$j]; + $output.= $this->_processCoordinate($last_attr, $cur_attr, isset($this->screen[$i][$j]) ? $this->screen[$i][$j] : ''); + $last_attr = $this->attrs[$i][$j]; + } + $output.= "\r\n"; + } + $output = substr($output, 0, -2); + // close any remaining open tags + $output.= $this->_processCoordinate($last_attr, $this->base_attr_cell, ''); + return rtrim($output); + } + + /** + * Returns the current screen + * + * @access public + * @return string + */ + function getScreen() + { + return '
      ' . $this->_getScreen() . '
      '; + } + + /** + * Returns the current screen and the x previous lines + * + * @access public + * @return string + */ + function getHistory() + { + $scrollback = ''; + $last_attr = $this->base_attr_cell; + for ($i = 0; $i < count($this->history); $i++) { + for ($j = 0; $j <= $this->max_x + 1; $j++) { + $cur_attr = $this->history_attrs[$i][$j]; + $scrollback.= $this->_processCoordinate($last_attr, $cur_attr, isset($this->history[$i][$j]) ? $this->history[$i][$j] : ''); + $last_attr = $this->history_attrs[$i][$j]; + } + $scrollback.= "\r\n"; + } + $base_attr_cell = $this->base_attr_cell; + $this->base_attr_cell = $last_attr; + $scrollback.= $this->_getScreen(); + $this->base_attr_cell = $base_attr_cell; + + return '
      ' . $scrollback . '
      '; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/File/ASN1.php b/rainloop/v/0.0.0/app/libraries/phpseclib/File/ASN1.php old mode 100644 new mode 100755 index 1d66793a1..dd85f6d52 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/File/ASN1.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/File/ASN1.php @@ -1,1358 +1,1485 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/**#@+ - * Tag Classes - * - * @access private - * @link http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=12 - */ -define('FILE_ASN1_CLASS_UNIVERSAL', 0); -define('FILE_ASN1_CLASS_APPLICATION', 1); -define('FILE_ASN1_CLASS_CONTEXT_SPECIFIC', 2); -define('FILE_ASN1_CLASS_PRIVATE', 3); -/**#@-*/ - -/**#@+ - * Tag Classes - * - * @access private - * @link http://www.obj-sys.com/asn1tutorial/node124.html - */ -define('FILE_ASN1_TYPE_BOOLEAN', 1); -define('FILE_ASN1_TYPE_INTEGER', 2); -define('FILE_ASN1_TYPE_BIT_STRING', 3); -define('FILE_ASN1_TYPE_OCTET_STRING', 4); -define('FILE_ASN1_TYPE_NULL', 5); -define('FILE_ASN1_TYPE_OBJECT_IDENTIFIER', 6); -//define('FILE_ASN1_TYPE_OBJECT_DESCRIPTOR', 7); -//define('FILE_ASN1_TYPE_INSTANCE_OF', 8); // EXTERNAL -define('FILE_ASN1_TYPE_REAL', 9); -define('FILE_ASN1_TYPE_ENUMERATED', 10); -//define('FILE_ASN1_TYPE_EMBEDDED', 11); -define('FILE_ASN1_TYPE_UTF8_STRING', 12); -//define('FILE_ASN1_TYPE_RELATIVE_OID', 13); -define('FILE_ASN1_TYPE_SEQUENCE', 16); // SEQUENCE OF -define('FILE_ASN1_TYPE_SET', 17); // SET OF -/**#@-*/ -/**#@+ - * More Tag Classes - * - * @access private - * @link http://www.obj-sys.com/asn1tutorial/node10.html - */ -define('FILE_ASN1_TYPE_NUMERIC_STRING', 18); -define('FILE_ASN1_TYPE_PRINTABLE_STRING', 19); -define('FILE_ASN1_TYPE_TELETEX_STRING', 20); // T61String -define('FILE_ASN1_TYPE_VIDEOTEX_STRING', 21); -define('FILE_ASN1_TYPE_IA5_STRING', 22); -define('FILE_ASN1_TYPE_UTC_TIME', 23); -define('FILE_ASN1_TYPE_GENERALIZED_TIME', 24); -define('FILE_ASN1_TYPE_GRAPHIC_STRING', 25); -define('FILE_ASN1_TYPE_VISIBLE_STRING', 26); // ISO646String -define('FILE_ASN1_TYPE_GENERAL_STRING', 27); -define('FILE_ASN1_TYPE_UNIVERSAL_STRING', 28); -//define('FILE_ASN1_TYPE_CHARACTER_STRING', 29); -define('FILE_ASN1_TYPE_BMP_STRING', 30); -/**#@-*/ - -/**#@+ - * Tag Aliases - * - * These tags are kinda place holders for other tags. - * - * @access private - */ -define('FILE_ASN1_TYPE_CHOICE', -1); -define('FILE_ASN1_TYPE_ANY', -2); -/**#@-*/ - -/** - * ASN.1 Element - * - * Bypass normal encoding rules in File_ASN1::encodeDER() - * - * @package File_ASN1 - * @author Jim Wigginton - * @access public - */ -class File_ASN1_Element -{ - /** - * Raw element value - * - * @var String - * @access private - */ - var $element; - - /** - * Constructor - * - * @param String $encoded - * @return File_ASN1_Element - * @access public - */ - function File_ASN1_Element($encoded) - { - $this->element = $encoded; - } -} - -/** - * Pure-PHP ASN.1 Parser - * - * @package File_ASN1 - * @author Jim Wigginton - * @access public - */ -class File_ASN1 -{ - /** - * ASN.1 object identifier - * - * @var Array - * @access private - * @link http://en.wikipedia.org/wiki/Object_identifier - */ - var $oids = array(); - - /** - * Default date format - * - * @var String - * @access private - * @link http://php.net/class.datetime - */ - var $format = 'D, d M Y H:i:s O'; - - /** - * Default date format - * - * @var Array - * @access private - * @see File_ASN1::setTimeFormat() - * @see File_ASN1::asn1map() - * @link http://php.net/class.datetime - */ - var $encoded; - - /** - * Filters - * - * If the mapping type is FILE_ASN1_TYPE_ANY what do we actually encode it as? - * - * @var Array - * @access private - * @see File_ASN1::_encode_der() - */ - var $filters; - - /** - * Type mapping table for the ANY type. - * - * Structured or unknown types are mapped to a FILE_ASN1_Element. - * Unambiguous types get the direct mapping (int/real/bool). - * Others are mapped as a choice, with an extra indexing level. - * - * @var Array - * @access public - */ - var $ANYmap = array( - FILE_ASN1_TYPE_BOOLEAN => true, - FILE_ASN1_TYPE_INTEGER => true, - FILE_ASN1_TYPE_BIT_STRING => 'bitString', - FILE_ASN1_TYPE_OCTET_STRING => 'octetString', - FILE_ASN1_TYPE_NULL => 'null', - FILE_ASN1_TYPE_OBJECT_IDENTIFIER => 'objectIdentifier', - FILE_ASN1_TYPE_REAL => true, - FILE_ASN1_TYPE_ENUMERATED => 'enumerated', - FILE_ASN1_TYPE_UTF8_STRING => 'utf8String', - FILE_ASN1_TYPE_NUMERIC_STRING => 'numericString', - FILE_ASN1_TYPE_PRINTABLE_STRING => 'printableString', - FILE_ASN1_TYPE_TELETEX_STRING => 'teletexString', - FILE_ASN1_TYPE_VIDEOTEX_STRING => 'videotexString', - FILE_ASN1_TYPE_IA5_STRING => 'ia5String', - FILE_ASN1_TYPE_UTC_TIME => 'utcTime', - FILE_ASN1_TYPE_GENERALIZED_TIME => 'generalTime', - FILE_ASN1_TYPE_GRAPHIC_STRING => 'graphicString', - FILE_ASN1_TYPE_VISIBLE_STRING => 'visibleString', - FILE_ASN1_TYPE_GENERAL_STRING => 'generalString', - FILE_ASN1_TYPE_UNIVERSAL_STRING => 'universalString', - //FILE_ASN1_TYPE_CHARACTER_STRING => 'characterString', - FILE_ASN1_TYPE_BMP_STRING => 'bmpString' - ); - - /** - * String type to character size mapping table. - * - * Non-convertable types are absent from this table. - * size == 0 indicates variable length encoding. - * - * @var Array - * @access public - */ - var $stringTypeSize = array( - FILE_ASN1_TYPE_UTF8_STRING => 0, - FILE_ASN1_TYPE_BMP_STRING => 2, - FILE_ASN1_TYPE_UNIVERSAL_STRING => 4, - FILE_ASN1_TYPE_PRINTABLE_STRING => 1, - FILE_ASN1_TYPE_TELETEX_STRING => 1, - FILE_ASN1_TYPE_IA5_STRING => 1, - FILE_ASN1_TYPE_VISIBLE_STRING => 1, - ); - - /** - * Default Constructor. - * - * @access public - */ - function File_ASN1() - { - static $static_init = null; - if (!$static_init) { - $static_init = true; - if (!class_exists('Math_BigInteger')) { - include_once 'Math/BigInteger.php'; - } - } - } - - /** - * Parse BER-encoding - * - * Serves a similar purpose to openssl's asn1parse - * - * @param String $encoded - * @return Array - * @access public - */ - function decodeBER($encoded) - { - if (is_object($encoded) && strtolower(get_class($encoded)) == 'file_asn1_element') { - $encoded = $encoded->element; - } - - $this->encoded = $encoded; - // encapsulate in an array for BC with the old decodeBER - return array($this->_decode_ber($encoded)); - } - - /** - * Parse BER-encoding (Helper function) - * - * Sometimes we want to get the BER encoding of a particular tag. $start lets us do that without having to reencode. - * $encoded is passed by reference for the recursive calls done for FILE_ASN1_TYPE_BIT_STRING and - * FILE_ASN1_TYPE_OCTET_STRING. In those cases, the indefinite length is used. - * - * @param String $encoded - * @param Integer $start - * @return Array - * @access private - */ - function _decode_ber($encoded, $start = 0) - { - $current = array('start' => $start); - - $type = ord($this->_string_shift($encoded)); - $start++; - - $constructed = ($type >> 5) & 1; - - $tag = $type & 0x1F; - if ($tag == 0x1F) { - $tag = 0; - // process septets (since the eighth bit is ignored, it's not an octet) - do { - $loop = ord($encoded[0]) >> 7; - $tag <<= 7; - $tag |= ord($this->_string_shift($encoded)) & 0x7F; - $start++; - } while ( $loop ); - } - - // Length, as discussed in paragraph 8.1.3 of X.690-0207.pdf#page=13 - $length = ord($this->_string_shift($encoded)); - $start++; - if ( $length == 0x80 ) { // indefinite length - // "[A sender shall] use the indefinite form (see 8.1.3.6) if the encoding is constructed and is not all - // immediately available." -- paragraph 8.1.3.2.c - $length = strlen($encoded); - } elseif ( $length & 0x80 ) { // definite length, long form - // technically, the long form of the length can be represented by up to 126 octets (bytes), but we'll only - // support it up to four. - $length&= 0x7F; - $temp = $this->_string_shift($encoded, $length); - // tags of indefinte length don't really have a header length; this length includes the tag - $current+= array('headerlength' => $length + 2); - $start+= $length; - extract(unpack('Nlength', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4))); - } else { - $current+= array('headerlength' => 2); - } - - $content = $this->_string_shift($encoded, $length); - - // at this point $length can be overwritten. it's only accurate for definite length things as is - - /* Class is UNIVERSAL, APPLICATION, PRIVATE, or CONTEXT-SPECIFIC. The UNIVERSAL class is restricted to the ASN.1 - built-in types. It defines an application-independent data type that must be distinguishable from all other - data types. The other three classes are user defined. The APPLICATION class distinguishes data types that - have a wide, scattered use within a particular presentation context. PRIVATE distinguishes data types within - a particular organization or country. CONTEXT-SPECIFIC distinguishes members of a sequence or set, the - alternatives of a CHOICE, or universally tagged set members. Only the class number appears in braces for this - data type; the term CONTEXT-SPECIFIC does not appear. - - -- http://www.obj-sys.com/asn1tutorial/node12.html */ - $class = ($type >> 6) & 3; - switch ($class) { - case FILE_ASN1_CLASS_APPLICATION: - case FILE_ASN1_CLASS_PRIVATE: - case FILE_ASN1_CLASS_CONTEXT_SPECIFIC: - if (!$constructed) { - return array( - 'type' => $class, - 'constant' => $tag, - 'content' => $content, - 'length' => $length + $start - $current['start'] - ); - } - - $newcontent = array(); - if (strlen($content)) { - $newcontent = $this->_decode_ber($content, $start); - $length = $newcontent['length']; - if (substr($content, $length, 2) == "\0\0") { - $length+= 2; - } - $start+= $length; - $newcontent = array($newcontent); - } - - return array( - 'type' => $class, - 'constant' => $tag, - // the array encapsulation is for BC with the old format - 'content' => $newcontent, - // the only time when $content['headerlength'] isn't defined is when the length is indefinite. - // the absence of $content['headerlength'] is how we know if something is indefinite or not. - // technically, it could be defined to be 2 and then another indicator could be used but whatever. - 'length' => $start - $current['start'] - ) + $current; - } - - $current+= array('type' => $tag); - - // decode UNIVERSAL tags - switch ($tag) { - case FILE_ASN1_TYPE_BOOLEAN: - // "The contents octets shall consist of a single octet." -- paragraph 8.2.1 - //if (strlen($content) != 1) { - // return false; - //} - $current['content'] = (bool) ord($content[0]); - break; - case FILE_ASN1_TYPE_INTEGER: - case FILE_ASN1_TYPE_ENUMERATED: - $current['content'] = new Math_BigInteger($content, -256); - break; - case FILE_ASN1_TYPE_REAL: // not currently supported - return false; - case FILE_ASN1_TYPE_BIT_STRING: - // The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, - // the number of unused bits in the final subsequent octet. The number shall be in the range zero to - // seven. - if (!$constructed) { - $current['content'] = $content; - } else { - $temp = $this->_decode_ber($content, $start); - $length-= strlen($content); - $last = count($temp) - 1; - for ($i = 0; $i < $last; $i++) { - // all subtags should be bit strings - //if ($temp[$i]['type'] != FILE_ASN1_TYPE_BIT_STRING) { - // return false; - //} - $current['content'].= substr($temp[$i]['content'], 1); - } - // all subtags should be bit strings - //if ($temp[$last]['type'] != FILE_ASN1_TYPE_BIT_STRING) { - // return false; - //} - $current['content'] = $temp[$last]['content'][0] . $current['content'] . substr($temp[$i]['content'], 1); - } - break; - case FILE_ASN1_TYPE_OCTET_STRING: - if (!$constructed) { - $current['content'] = $content; - } else { - $current['content'] = ''; - $length = 0; - while (substr($content, 0, 2) != "\0\0") { - $temp = $this->_decode_ber($content, $length + $start); - $this->_string_shift($content, $temp['length']); - // all subtags should be octet strings - //if ($temp['type'] != FILE_ASN1_TYPE_OCTET_STRING) { - // return false; - //} - $current['content'].= $temp['content']; - $length+= $temp['length']; - } - if (substr($content, 0, 2) == "\0\0") { - $length+= 2; // +2 for the EOC - } - } - break; - case FILE_ASN1_TYPE_NULL: - // "The contents octets shall not contain any octets." -- paragraph 8.8.2 - //if (strlen($content)) { - // return false; - //} - break; - case FILE_ASN1_TYPE_SEQUENCE: - case FILE_ASN1_TYPE_SET: - $offset = 0; - $current['content'] = array(); - while (strlen($content)) { - // if indefinite length construction was used and we have an end-of-content string next - // see paragraphs 8.1.1.3, 8.1.3.2, 8.1.3.6, 8.1.5, and (for an example) 8.6.4.2 - if (!isset($current['headerlength']) && substr($content, 0, 2) == "\0\0") { - $length = $offset + 2; // +2 for the EOC - break 2; - } - $temp = $this->_decode_ber($content, $start + $offset); - $this->_string_shift($content, $temp['length']); - $current['content'][] = $temp; - $offset+= $temp['length']; - } - break; - case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: - $temp = ord($this->_string_shift($content)); - $current['content'] = sprintf('%d.%d', floor($temp / 40), $temp % 40); - $valuen = 0; - // process septets - while (strlen($content)) { - $temp = ord($this->_string_shift($content)); - $valuen <<= 7; - $valuen |= $temp & 0x7F; - if (~$temp & 0x80) { - $current['content'].= ".$valuen"; - $valuen = 0; - } - } - // the eighth bit of the last byte should not be 1 - //if ($temp >> 7) { - // return false; - //} - break; - /* Each character string type shall be encoded as if it had been declared: - [UNIVERSAL x] IMPLICIT OCTET STRING - - -- X.690-0207.pdf#page=23 (paragraph 8.21.3) - - Per that, we're not going to do any validation. If there are any illegal characters in the string, - we don't really care */ - case FILE_ASN1_TYPE_NUMERIC_STRING: - // 0,1,2,3,4,5,6,7,8,9, and space - case FILE_ASN1_TYPE_PRINTABLE_STRING: - // Upper and lower case letters, digits, space, apostrophe, left/right parenthesis, plus sign, comma, - // hyphen, full stop, solidus, colon, equal sign, question mark - case FILE_ASN1_TYPE_TELETEX_STRING: - // The Teletex character set in CCITT's T61, space, and delete - // see http://en.wikipedia.org/wiki/Teletex#Character_sets - case FILE_ASN1_TYPE_VIDEOTEX_STRING: - // The Videotex character set in CCITT's T.100 and T.101, space, and delete - case FILE_ASN1_TYPE_VISIBLE_STRING: - // Printing character sets of international ASCII, and space - case FILE_ASN1_TYPE_IA5_STRING: - // International Alphabet 5 (International ASCII) - case FILE_ASN1_TYPE_GRAPHIC_STRING: - // All registered G sets, and space - case FILE_ASN1_TYPE_GENERAL_STRING: - // All registered C and G sets, space and delete - case FILE_ASN1_TYPE_UTF8_STRING: - // ???? - case FILE_ASN1_TYPE_BMP_STRING: - $current['content'] = $content; - break; - case FILE_ASN1_TYPE_UTC_TIME: - case FILE_ASN1_TYPE_GENERALIZED_TIME: - $current['content'] = $this->_decodeTime($content, $tag); - default: - } - - $start+= $length; - - // ie. length is the length of the full TLV encoding - it's not just the length of the value - return $current + array('length' => $start - $current['start']); - } - - /** - * ASN.1 Map - * - * Provides an ASN.1 semantic mapping ($mapping) from a parsed BER-encoding to a human readable format. - * - * "Special" mappings may be applied on a per tag-name basis via $special. - * - * @param Array $decoded - * @param Array $mapping - * @param Array $special - * @return Array - * @access public - */ - function asn1map($decoded, $mapping, $special = array()) - { - if (isset($mapping['explicit']) && is_array($decoded['content'])) { - $decoded = $decoded['content'][0]; - } - - switch (true) { - case $mapping['type'] == FILE_ASN1_TYPE_ANY: - $intype = $decoded['type']; - if (isset($decoded['constant']) || !isset($this->ANYmap[$intype]) || ($this->encoded[$decoded['start']] & 0x20)) { - return new File_ASN1_Element(substr($this->encoded, $decoded['start'], $decoded['length'])); - } - $inmap = $this->ANYmap[$intype]; - if (is_string($inmap)) { - return array($inmap => $this->asn1map($decoded, array('type' => $intype) + $mapping, $special)); - } - break; - case $mapping['type'] == FILE_ASN1_TYPE_CHOICE: - foreach ($mapping['children'] as $key => $option) { - switch (true) { - case isset($option['constant']) && $option['constant'] == $decoded['constant']: - case !isset($option['constant']) && $option['type'] == $decoded['type']: - $value = $this->asn1map($decoded, $option, $special); - break; - case !isset($option['constant']) && $option['type'] == FILE_ASN1_TYPE_CHOICE: - $v = $this->asn1map($decoded, $option, $special); - if (isset($v)) { - $value = $v; - } - } - if (isset($value)) { - if (isset($special[$key])) { - $value = call_user_func($special[$key], $value); - } - return array($key => $value); - } - } - return null; - case isset($mapping['implicit']): - case isset($mapping['explicit']): - case $decoded['type'] == $mapping['type']: - break; - default: - // if $decoded['type'] and $mapping['type'] are both strings, but different types of strings, - // let it through - switch (true) { - case $decoded['type'] < 18: // FILE_ASN1_TYPE_NUMERIC_STRING == 18 - case $decoded['type'] > 30: // FILE_ASN1_TYPE_BMP_STRING == 30 - case $mapping['type'] < 18: - case $mapping['type'] > 30: - return null; - } - } - - if (isset($mapping['implicit'])) { - $decoded['type'] = $mapping['type']; - } - - switch ($decoded['type']) { - case FILE_ASN1_TYPE_SEQUENCE: - $map = array(); - - // ignore the min and max - if (isset($mapping['min']) && isset($mapping['max'])) { - $child = $mapping['children']; - foreach ($decoded['content'] as $content) { - if (($map[] = $this->asn1map($content, $child, $special)) === null) { - return null; - } - } - - return $map; - } - - $n = count($decoded['content']); - $i = 0; - - foreach ($mapping['children'] as $key => $child) { - $maymatch = $i < $n; // Match only existing input. - if ($maymatch) { - $temp = $decoded['content'][$i]; - - if ($child['type'] != FILE_ASN1_TYPE_CHOICE) { - // Get the mapping and input class & constant. - $childClass = $tempClass = FILE_ASN1_CLASS_UNIVERSAL; - $constant = null; - if (isset($temp['constant'])) { - $tempClass = isset($temp['class']) ? $temp['class'] : FILE_ASN1_CLASS_CONTEXT_SPECIFIC; - } - if (isset($child['class'])) { - $childClass = $child['class']; - $constant = $child['cast']; - } elseif (isset($child['constant'])) { - $childClass = FILE_ASN1_CLASS_CONTEXT_SPECIFIC; - $constant = $child['constant']; - } - - if (isset($constant) && isset($temp['constant'])) { - // Can only match if constants and class match. - $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; - } else { - // Can only match if no constant expected and type matches or is generic. - $maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], FILE_ASN1_TYPE_ANY, FILE_ASN1_TYPE_CHOICE)) !== false; - } - } - } - - if ($maymatch) { - // Attempt submapping. - $candidate = $this->asn1map($temp, $child, $special); - $maymatch = $candidate !== null; - } - - if ($maymatch) { - // Got the match: use it. - if (isset($special[$key])) { - $candidate = call_user_func($special[$key], $candidate); - } - $map[$key] = $candidate; - $i++; - } elseif (isset($child['default'])) { - $map[$key] = $child['default']; // Use default. - } elseif (!isset($child['optional'])) { - return null; // Syntax error. - } - } - - // Fail mapping if all input items have not been consumed. - return $i < $n? null: $map; - - // the main diff between sets and sequences is the encapsulation of the foreach in another for loop - case FILE_ASN1_TYPE_SET: - $map = array(); - - // ignore the min and max - if (isset($mapping['min']) && isset($mapping['max'])) { - $child = $mapping['children']; - foreach ($decoded['content'] as $content) { - if (($map[] = $this->asn1map($content, $child, $special)) === null) { - return null; - } - } - - return $map; - } - - for ($i = 0; $i < count($decoded['content']); $i++) { - $temp = $decoded['content'][$i]; - $tempClass = FILE_ASN1_CLASS_UNIVERSAL; - if (isset($temp['constant'])) { - $tempClass = isset($temp['class']) ? $temp['class'] : FILE_ASN1_CLASS_CONTEXT_SPECIFIC; - } - - foreach ($mapping['children'] as $key => $child) { - if (isset($map[$key])) { - continue; - } - $maymatch = true; - if ($child['type'] != FILE_ASN1_TYPE_CHOICE) { - $childClass = FILE_ASN1_CLASS_UNIVERSAL; - $constant = null; - if (isset($child['class'])) { - $childClass = $child['class']; - $constant = $child['cast']; - } elseif (isset($child['constant'])) { - $childClass = FILE_ASN1_CLASS_CONTEXT_SPECIFIC; - $constant = $child['constant']; - } - - if (isset($constant) && isset($temp['constant'])) { - // Can only match if constants and class match. - $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; - } else { - // Can only match if no constant expected and type matches or is generic. - $maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], FILE_ASN1_TYPE_ANY, FILE_ASN1_TYPE_CHOICE)) !== false; - } - } - - if ($maymatch) { - // Attempt submapping. - $candidate = $this->asn1map($temp, $child, $special); - $maymatch = $candidate !== null; - } - - if (!$maymatch) { - break; - } - - // Got the match: use it. - if (isset($special[$key])) { - $candidate = call_user_func($special[$key], $candidate); - } - $map[$key] = $candidate; - break; - } - } - - foreach ($mapping['children'] as $key => $child) { - if (!isset($map[$key])) { - if (isset($child['default'])) { - $map[$key] = $child['default']; - } elseif (!isset($child['optional'])) { - return null; - } - } - } - return $map; - case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: - return isset($this->oids[$decoded['content']]) ? $this->oids[$decoded['content']] : $decoded['content']; - case FILE_ASN1_TYPE_UTC_TIME: - case FILE_ASN1_TYPE_GENERALIZED_TIME: - if (isset($mapping['implicit'])) { - $decoded['content'] = $this->_decodeTime($decoded['content'], $decoded['type']); - } - return @date($this->format, $decoded['content']); - case FILE_ASN1_TYPE_BIT_STRING: - if (isset($mapping['mapping'])) { - $offset = ord($decoded['content'][0]); - $size = (strlen($decoded['content']) - 1) * 8 - $offset; - /* - From X.680-0207.pdf#page=46 (21.7): - - "When a "NamedBitList" is used in defining a bitstring type ASN.1 encoding rules are free to add (or remove) - arbitrarily any trailing 0 bits to (or from) values that are being encoded or decoded. Application designers should - therefore ensure that different semantics are not associated with such values which differ only in the number of trailing - 0 bits." - */ - $bits = count($mapping['mapping']) == $size ? array() : array_fill(0, count($mapping['mapping']) - $size, false); - for ($i = strlen($decoded['content']) - 1; $i > 0; $i--) { - $current = ord($decoded['content'][$i]); - for ($j = $offset; $j < 8; $j++) { - $bits[] = (bool) ($current & (1 << $j)); - } - $offset = 0; - } - $values = array(); - $map = array_reverse($mapping['mapping']); - foreach ($map as $i => $value) { - if ($bits[$i]) { - $values[] = $value; - } - } - return $values; - } - case FILE_ASN1_TYPE_OCTET_STRING: - return base64_encode($decoded['content']); - case FILE_ASN1_TYPE_NULL: - return ''; - case FILE_ASN1_TYPE_BOOLEAN: - return $decoded['content']; - case FILE_ASN1_TYPE_NUMERIC_STRING: - case FILE_ASN1_TYPE_PRINTABLE_STRING: - case FILE_ASN1_TYPE_TELETEX_STRING: - case FILE_ASN1_TYPE_VIDEOTEX_STRING: - case FILE_ASN1_TYPE_IA5_STRING: - case FILE_ASN1_TYPE_GRAPHIC_STRING: - case FILE_ASN1_TYPE_VISIBLE_STRING: - case FILE_ASN1_TYPE_GENERAL_STRING: - case FILE_ASN1_TYPE_UNIVERSAL_STRING: - case FILE_ASN1_TYPE_UTF8_STRING: - case FILE_ASN1_TYPE_BMP_STRING: - return $decoded['content']; - case FILE_ASN1_TYPE_INTEGER: - case FILE_ASN1_TYPE_ENUMERATED: - $temp = $decoded['content']; - if (isset($mapping['implicit'])) { - $temp = new Math_BigInteger($decoded['content'], -256); - } - if (isset($mapping['mapping'])) { - $temp = (int) $temp->toString(); - return isset($mapping['mapping'][$temp]) ? - $mapping['mapping'][$temp] : - false; - } - return $temp; - } - } - - /** - * ASN.1 Encode - * - * DER-encodes an ASN.1 semantic mapping ($mapping). Some libraries would probably call this function - * an ASN.1 compiler. - * - * "Special" mappings can be applied via $special. - * - * @param String $source - * @param String $mapping - * @param Integer $idx - * @return String - * @access public - */ - function encodeDER($source, $mapping, $special = array()) - { - $this->location = array(); - return $this->_encode_der($source, $mapping, null, $special); - } - - /** - * ASN.1 Encode (Helper function) - * - * @param String $source - * @param String $mapping - * @param Integer $idx - * @return String - * @access private - */ - function _encode_der($source, $mapping, $idx = null, $special = array()) - { - if (is_object($source) && strtolower(get_class($source)) == 'file_asn1_element') { - return $source->element; - } - - // do not encode (implicitly optional) fields with value set to default - if (isset($mapping['default']) && $source === $mapping['default']) { - return ''; - } - - if (isset($idx)) { - if (isset($special[$idx])) { - $source = call_user_func($special[$idx], $source); - } - $this->location[] = $idx; - } - - $tag = $mapping['type']; - - switch ($tag) { - case FILE_ASN1_TYPE_SET: // Children order is not important, thus process in sequence. - case FILE_ASN1_TYPE_SEQUENCE: - $tag|= 0x20; // set the constructed bit - $value = ''; - - // ignore the min and max - if (isset($mapping['min']) && isset($mapping['max'])) { - $child = $mapping['children']; - - foreach ($source as $content) { - $temp = $this->_encode_der($content, $child, null, $special); - if ($temp === false) { - return false; - } - $value.= $temp; - } - break; - } - - foreach ($mapping['children'] as $key => $child) { - if (!isset($source[$key])) { - if (!isset($child['optional'])) { - return false; - } - continue; - } - - $temp = $this->_encode_der($source[$key], $child, $key, $special); - if ($temp === false) { - return false; - } - - // An empty child encoding means it has been optimized out. - // Else we should have at least one tag byte. - if ($temp === '') { - continue; - } - - // if isset($child['constant']) is true then isset($child['optional']) should be true as well - if (isset($child['constant'])) { - /* - From X.680-0207.pdf#page=58 (30.6): - - "The tagging construction specifies explicit tagging if any of the following holds: - ... - c) the "Tag Type" alternative is used and the value of "TagDefault" for the module is IMPLICIT TAGS or - AUTOMATIC TAGS, but the type defined by "Type" is an untagged choice type, an untagged open type, or - an untagged "DummyReference" (see ITU-T Rec. X.683 | ISO/IEC 8824-4, 8.3)." - */ - if (isset($child['explicit']) || $child['type'] == FILE_ASN1_TYPE_CHOICE) { - $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); - $temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp; - } else { - $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); - $temp = $subtag . substr($temp, 1); - } - } - $value.= $temp; - } - break; - case FILE_ASN1_TYPE_CHOICE: - $temp = false; - - foreach ($mapping['children'] as $key => $child) { - if (!isset($source[$key])) { - continue; - } - - $temp = $this->_encode_der($source[$key], $child, $key, $special); - if ($temp === false) { - return false; - } - - // An empty child encoding means it has been optimized out. - // Else we should have at least one tag byte. - if ($temp === '') { - continue; - } - - $tag = ord($temp[0]); - - // if isset($child['constant']) is true then isset($child['optional']) should be true as well - if (isset($child['constant'])) { - if (isset($child['explicit']) || $child['type'] == FILE_ASN1_TYPE_CHOICE) { - $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); - $temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp; - } else { - $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); - $temp = $subtag . substr($temp, 1); - } - } - } - - if (isset($idx)) { - array_pop($this->location); - } - - if ($temp && isset($mapping['cast'])) { - $temp[0] = chr(($mapping['class'] << 6) | ($tag & 0x20) | $mapping['cast']); - } - - return $temp; - case FILE_ASN1_TYPE_INTEGER: - case FILE_ASN1_TYPE_ENUMERATED: - if (!isset($mapping['mapping'])) { - if (is_numeric($source)) { - $source = new Math_BigInteger($source); - } - $value = $source->toBytes(true); - } else { - $value = array_search($source, $mapping['mapping']); - if ($value === false) { - return false; - } - $value = new Math_BigInteger($value); - $value = $value->toBytes(true); - } - if (!strlen($value)) { - $value = chr(0); - } - break; - case FILE_ASN1_TYPE_UTC_TIME: - case FILE_ASN1_TYPE_GENERALIZED_TIME: - $format = $mapping['type'] == FILE_ASN1_TYPE_UTC_TIME ? 'y' : 'Y'; - $format.= 'mdHis'; - $value = @gmdate($format, strtotime($source)) . 'Z'; - break; - case FILE_ASN1_TYPE_BIT_STRING: - if (isset($mapping['mapping'])) { - $bits = array_fill(0, count($mapping['mapping']), 0); - $size = 0; - for ($i = 0; $i < count($mapping['mapping']); $i++) { - if (in_array($mapping['mapping'][$i], $source)) { - $bits[$i] = 1; - $size = $i; - } - } - - if (isset($mapping['min']) && $mapping['min'] >= 1 && $size < $mapping['min']) { - $size = $mapping['min'] - 1; - } - - $offset = 8 - (($size + 1) & 7); - $offset = $offset !== 8 ? $offset : 0; - - $value = chr($offset); - - for ($i = $size + 1; $i < count($mapping['mapping']); $i++) { - unset($bits[$i]); - } - - $bits = implode('', array_pad($bits, $size + $offset + 1, 0)); - $bytes = explode(' ', rtrim(chunk_split($bits, 8, ' '))); - foreach ($bytes as $byte) { - $value.= chr(bindec($byte)); - } - - break; - } - case FILE_ASN1_TYPE_OCTET_STRING: - /* The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, - the number of unused bits in the final subsequent octet. The number shall be in the range zero to seven. - - -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=16 */ - $value = base64_decode($source); - break; - case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: - $oid = preg_match('#(?:\d+\.)+#', $source) ? $source : array_search($source, $this->oids); - if ($oid === false) { - user_error('Invalid OID'); - return false; - } - $value = ''; - $parts = explode('.', $oid); - $value = chr(40 * $parts[0] + $parts[1]); - for ($i = 2; $i < count($parts); $i++) { - $temp = ''; - if (!$parts[$i]) { - $temp = "\0"; - } else { - while ($parts[$i]) { - $temp = chr(0x80 | ($parts[$i] & 0x7F)) . $temp; - $parts[$i] >>= 7; - } - $temp[strlen($temp) - 1] = $temp[strlen($temp) - 1] & chr(0x7F); - } - $value.= $temp; - } - break; - case FILE_ASN1_TYPE_ANY: - $loc = $this->location; - if (isset($idx)) { - array_pop($this->location); - } - - switch (true) { - case !isset($source): - return $this->_encode_der(null, array('type' => FILE_ASN1_TYPE_NULL) + $mapping, null, $special); - case is_int($source): - case is_object($source) && strtolower(get_class($source)) == 'math_biginteger': - return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_INTEGER) + $mapping, null, $special); - case is_float($source): - return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_REAL) + $mapping, null, $special); - case is_bool($source): - return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_BOOLEAN) + $mapping, null, $special); - case is_array($source) && count($source) == 1: - $typename = implode('', array_keys($source)); - $outtype = array_search($typename, $this->ANYmap, true); - if ($outtype !== false) { - return $this->_encode_der($source[$typename], array('type' => $outtype) + $mapping, null, $special); - } - } - - $filters = $this->filters; - foreach ($loc as $part) { - if (!isset($filters[$part])) { - $filters = false; - break; - } - $filters = $filters[$part]; - } - if ($filters === false) { - user_error('No filters defined for ' . implode('/', $loc)); - return false; - } - return $this->_encode_der($source, $filters + $mapping, null, $special); - case FILE_ASN1_TYPE_NULL: - $value = ''; - break; - case FILE_ASN1_TYPE_NUMERIC_STRING: - case FILE_ASN1_TYPE_TELETEX_STRING: - case FILE_ASN1_TYPE_PRINTABLE_STRING: - case FILE_ASN1_TYPE_UNIVERSAL_STRING: - case FILE_ASN1_TYPE_UTF8_STRING: - case FILE_ASN1_TYPE_BMP_STRING: - case FILE_ASN1_TYPE_IA5_STRING: - case FILE_ASN1_TYPE_VISIBLE_STRING: - case FILE_ASN1_TYPE_VIDEOTEX_STRING: - case FILE_ASN1_TYPE_GRAPHIC_STRING: - case FILE_ASN1_TYPE_GENERAL_STRING: - $value = $source; - break; - case FILE_ASN1_TYPE_BOOLEAN: - $value = $source ? "\xFF" : "\x00"; - break; - default: - user_error('Mapping provides no type definition for ' . implode('/', $this->location)); - return false; - } - - if (isset($idx)) { - array_pop($this->location); - } - - if (isset($mapping['cast'])) { - if (isset($mapping['explicit']) || $mapping['type'] == FILE_ASN1_TYPE_CHOICE) { - $value = chr($tag) . $this->_encodeLength(strlen($value)) . $value; - $tag = ($mapping['class'] << 6) | 0x20 | $mapping['cast']; - } else { - $tag = ($mapping['class'] << 6) | (ord($temp[0]) & 0x20) | $mapping['cast']; - } - } - - return chr($tag) . $this->_encodeLength(strlen($value)) . $value; - } - - /** - * DER-encode the length - * - * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See - * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. - * - * @access private - * @param Integer $length - * @return String - */ - function _encodeLength($length) - { - if ($length <= 0x7F) { - return chr($length); - } - - $temp = ltrim(pack('N', $length), chr(0)); - return pack('Ca*', 0x80 | strlen($temp), $temp); - } - - /** - * BER-decode the time - * - * Called by _decode_ber() and in the case of implicit tags asn1map(). - * - * @access private - * @param String $content - * @param Integer $tag - * @return String - */ - function _decodeTime($content, $tag) - { - /* UTCTime: - http://tools.ietf.org/html/rfc5280#section-4.1.2.5.1 - http://www.obj-sys.com/asn1tutorial/node15.html - - GeneralizedTime: - http://tools.ietf.org/html/rfc5280#section-4.1.2.5.2 - http://www.obj-sys.com/asn1tutorial/node14.html */ - - $pattern = $tag == FILE_ASN1_TYPE_UTC_TIME ? - '#(..)(..)(..)(..)(..)(..)(.*)#' : - '#(....)(..)(..)(..)(..)(..).*([Z+-].*)$#'; - - preg_match($pattern, $content, $matches); - - list(, $year, $month, $day, $hour, $minute, $second, $timezone) = $matches; - - if ($tag == FILE_ASN1_TYPE_UTC_TIME) { - $year = $year >= 50 ? "19$year" : "20$year"; - } - - if ($timezone == 'Z') { - $mktime = 'gmmktime'; - $timezone = 0; - } elseif (preg_match('#([+-])(\d\d)(\d\d)#', $timezone, $matches)) { - $mktime = 'gmmktime'; - $timezone = 60 * $matches[3] + 3600 * $matches[2]; - if ($matches[1] == '-') { - $timezone = -$timezone; - } - } else { - $mktime = 'mktime'; - $timezone = 0; - } - - return @$mktime($hour, $minute, $second, $month, $day, $year) + $timezone; - } - - /** - * Set the time format - * - * Sets the time / date format for asn1map(). - * - * @access public - * @param String $format - */ - function setTimeFormat($format) - { - $this->format = $format; - } - - /** - * Load OIDs - * - * Load the relevant OIDs for a particular ASN.1 semantic mapping. - * - * @access public - * @param Array $oids - */ - function loadOIDs($oids) - { - $this->oids = $oids; - } - - /** - * Load filters - * - * See File_X509, etc, for an example. - * - * @access public - * @param Array $filters - */ - function loadFilters($filters) - { - $this->filters = $filters; - } - - /** - * String Shift - * - * Inspired by array_shift - * - * @param String $string - * @param optional Integer $index - * @return String - * @access private - */ - function _string_shift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } - - /** - * String type conversion - * - * This is a lazy conversion, dealing only with character size. - * No real conversion table is used. - * - * @param String $in - * @param optional Integer $from - * @param optional Integer $to - * @return String - * @access public - */ - function convert($in, $from = FILE_ASN1_TYPE_UTF8_STRING, $to = FILE_ASN1_TYPE_UTF8_STRING) - { - if (!isset($this->stringTypeSize[$from]) || !isset($this->stringTypeSize[$to])) { - return false; - } - $insize = $this->stringTypeSize[$from]; - $outsize = $this->stringTypeSize[$to]; - $inlength = strlen($in); - $out = ''; - - for ($i = 0; $i < $inlength;) { - if ($inlength - $i < $insize) { - return false; - } - - // Get an input character as a 32-bit value. - $c = ord($in[$i++]); - switch (true) { - case $insize == 4: - $c = ($c << 8) | ord($in[$i++]); - $c = ($c << 8) | ord($in[$i++]); - case $insize == 2: - $c = ($c << 8) | ord($in[$i++]); - case $insize == 1: - break; - case ($c & 0x80) == 0x00: - break; - case ($c & 0x40) == 0x00: - return false; - default: - $bit = 6; - do { - if ($bit > 25 || $i >= $inlength || (ord($in[$i]) & 0xC0) != 0x80) { - return false; - } - $c = ($c << 6) | (ord($in[$i++]) & 0x3F); - $bit += 5; - $mask = 1 << $bit; - } while ($c & $bit); - $c &= $mask - 1; - break; - } - - // Convert and append the character to output string. - $v = ''; - switch (true) { - case $outsize == 4: - $v .= chr($c & 0xFF); - $c >>= 8; - $v .= chr($c & 0xFF); - $c >>= 8; - case $outsize == 2: - $v .= chr($c & 0xFF); - $c >>= 8; - case $outsize == 1: - $v .= chr($c & 0xFF); - $c >>= 8; - if ($c) { - return false; - } - break; - case ($c & 0x80000000) != 0: - return false; - case $c >= 0x04000000: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x04000000; - case $c >= 0x00200000: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x00200000; - case $c >= 0x00010000: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x00010000; - case $c >= 0x00000800: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x00000800; - case $c >= 0x00000080: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x000000C0; - default: - $v .= chr($c); - break; - } - $out .= strrev($v); - } - return $out; - } -} + + * @copyright 2012 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * Tag Classes + * + * @access private + * @link http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=12 + */ +define('FILE_ASN1_CLASS_UNIVERSAL', 0); +define('FILE_ASN1_CLASS_APPLICATION', 1); +define('FILE_ASN1_CLASS_CONTEXT_SPECIFIC', 2); +define('FILE_ASN1_CLASS_PRIVATE', 3); +/**#@-*/ + +/**#@+ + * Tag Classes + * + * @access private + * @link http://www.obj-sys.com/asn1tutorial/node124.html + */ +define('FILE_ASN1_TYPE_BOOLEAN', 1); +define('FILE_ASN1_TYPE_INTEGER', 2); +define('FILE_ASN1_TYPE_BIT_STRING', 3); +define('FILE_ASN1_TYPE_OCTET_STRING', 4); +define('FILE_ASN1_TYPE_NULL', 5); +define('FILE_ASN1_TYPE_OBJECT_IDENTIFIER', 6); +//define('FILE_ASN1_TYPE_OBJECT_DESCRIPTOR', 7); +//define('FILE_ASN1_TYPE_INSTANCE_OF', 8); // EXTERNAL +define('FILE_ASN1_TYPE_REAL', 9); +define('FILE_ASN1_TYPE_ENUMERATED', 10); +//define('FILE_ASN1_TYPE_EMBEDDED', 11); +define('FILE_ASN1_TYPE_UTF8_STRING', 12); +//define('FILE_ASN1_TYPE_RELATIVE_OID', 13); +define('FILE_ASN1_TYPE_SEQUENCE', 16); // SEQUENCE OF +define('FILE_ASN1_TYPE_SET', 17); // SET OF +/**#@-*/ +/**#@+ + * More Tag Classes + * + * @access private + * @link http://www.obj-sys.com/asn1tutorial/node10.html + */ +define('FILE_ASN1_TYPE_NUMERIC_STRING', 18); +define('FILE_ASN1_TYPE_PRINTABLE_STRING', 19); +define('FILE_ASN1_TYPE_TELETEX_STRING', 20); // T61String +define('FILE_ASN1_TYPE_VIDEOTEX_STRING', 21); +define('FILE_ASN1_TYPE_IA5_STRING', 22); +define('FILE_ASN1_TYPE_UTC_TIME', 23); +define('FILE_ASN1_TYPE_GENERALIZED_TIME', 24); +define('FILE_ASN1_TYPE_GRAPHIC_STRING', 25); +define('FILE_ASN1_TYPE_VISIBLE_STRING', 26); // ISO646String +define('FILE_ASN1_TYPE_GENERAL_STRING', 27); +define('FILE_ASN1_TYPE_UNIVERSAL_STRING', 28); +//define('FILE_ASN1_TYPE_CHARACTER_STRING', 29); +define('FILE_ASN1_TYPE_BMP_STRING', 30); +/**#@-*/ + +/**#@+ + * Tag Aliases + * + * These tags are kinda place holders for other tags. + * + * @access private + */ +define('FILE_ASN1_TYPE_CHOICE', -1); +define('FILE_ASN1_TYPE_ANY', -2); +/**#@-*/ + +/** + * ASN.1 Element + * + * Bypass normal encoding rules in File_ASN1::encodeDER() + * + * @package File_ASN1 + * @author Jim Wigginton + * @access public + */ +class File_ASN1_Element +{ + /** + * Raw element value + * + * @var string + * @access private + */ + var $element; + + /** + * Constructor + * + * @param string $encoded + * @return File_ASN1_Element + * @access public + */ + function __construct($encoded) + { + $this->element = $encoded; + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param int $mode + * @access public + */ + function File_ASN1_Element($encoded) + { + $this->__construct($encoded); + } +} + +/** + * Pure-PHP ASN.1 Parser + * + * @package File_ASN1 + * @author Jim Wigginton + * @access public + */ +class File_ASN1 +{ + /** + * ASN.1 object identifier + * + * @var array + * @access private + * @link http://en.wikipedia.org/wiki/Object_identifier + */ + var $oids = array(); + + /** + * Default date format + * + * @var string + * @access private + * @link http://php.net/class.datetime + */ + var $format = 'D, d M Y H:i:s O'; + + /** + * Default date format + * + * @var array + * @access private + * @see self::setTimeFormat() + * @see self::asn1map() + * @link http://php.net/class.datetime + */ + var $encoded; + + /** + * Filters + * + * If the mapping type is FILE_ASN1_TYPE_ANY what do we actually encode it as? + * + * @var array + * @access private + * @see self::_encode_der() + */ + var $filters; + + /** + * Type mapping table for the ANY type. + * + * Structured or unknown types are mapped to a FILE_ASN1_Element. + * Unambiguous types get the direct mapping (int/real/bool). + * Others are mapped as a choice, with an extra indexing level. + * + * @var array + * @access public + */ + var $ANYmap = array( + FILE_ASN1_TYPE_BOOLEAN => true, + FILE_ASN1_TYPE_INTEGER => true, + FILE_ASN1_TYPE_BIT_STRING => 'bitString', + FILE_ASN1_TYPE_OCTET_STRING => 'octetString', + FILE_ASN1_TYPE_NULL => 'null', + FILE_ASN1_TYPE_OBJECT_IDENTIFIER => 'objectIdentifier', + FILE_ASN1_TYPE_REAL => true, + FILE_ASN1_TYPE_ENUMERATED => 'enumerated', + FILE_ASN1_TYPE_UTF8_STRING => 'utf8String', + FILE_ASN1_TYPE_NUMERIC_STRING => 'numericString', + FILE_ASN1_TYPE_PRINTABLE_STRING => 'printableString', + FILE_ASN1_TYPE_TELETEX_STRING => 'teletexString', + FILE_ASN1_TYPE_VIDEOTEX_STRING => 'videotexString', + FILE_ASN1_TYPE_IA5_STRING => 'ia5String', + FILE_ASN1_TYPE_UTC_TIME => 'utcTime', + FILE_ASN1_TYPE_GENERALIZED_TIME => 'generalTime', + FILE_ASN1_TYPE_GRAPHIC_STRING => 'graphicString', + FILE_ASN1_TYPE_VISIBLE_STRING => 'visibleString', + FILE_ASN1_TYPE_GENERAL_STRING => 'generalString', + FILE_ASN1_TYPE_UNIVERSAL_STRING => 'universalString', + //FILE_ASN1_TYPE_CHARACTER_STRING => 'characterString', + FILE_ASN1_TYPE_BMP_STRING => 'bmpString' + ); + + /** + * String type to character size mapping table. + * + * Non-convertable types are absent from this table. + * size == 0 indicates variable length encoding. + * + * @var array + * @access public + */ + var $stringTypeSize = array( + FILE_ASN1_TYPE_UTF8_STRING => 0, + FILE_ASN1_TYPE_BMP_STRING => 2, + FILE_ASN1_TYPE_UNIVERSAL_STRING => 4, + FILE_ASN1_TYPE_PRINTABLE_STRING => 1, + FILE_ASN1_TYPE_TELETEX_STRING => 1, + FILE_ASN1_TYPE_IA5_STRING => 1, + FILE_ASN1_TYPE_VISIBLE_STRING => 1, + ); + + /** + * Default Constructor. + * + * @access public + */ + function __construct() + { + static $static_init = null; + if (!$static_init) { + $static_init = true; + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + } + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @access public + */ + function File_ASN1() + { + $this->__construct($mode); + } + + /** + * Parse BER-encoding + * + * Serves a similar purpose to openssl's asn1parse + * + * @param string $encoded + * @return array + * @access public + */ + function decodeBER($encoded) + { + if (is_object($encoded) && strtolower(get_class($encoded)) == 'file_asn1_element') { + $encoded = $encoded->element; + } + + $this->encoded = $encoded; + // encapsulate in an array for BC with the old decodeBER + return array($this->_decode_ber($encoded)); + } + + /** + * Parse BER-encoding (Helper function) + * + * Sometimes we want to get the BER encoding of a particular tag. $start lets us do that without having to reencode. + * $encoded is passed by reference for the recursive calls done for FILE_ASN1_TYPE_BIT_STRING and + * FILE_ASN1_TYPE_OCTET_STRING. In those cases, the indefinite length is used. + * + * @param string $encoded + * @param int $start + * @param int $encoded_pos + * @return array + * @access private + */ + function _decode_ber($encoded, $start = 0, $encoded_pos = 0) + { + $current = array('start' => $start); + + $type = ord($encoded[$encoded_pos++]); + $start++; + + $constructed = ($type >> 5) & 1; + + $tag = $type & 0x1F; + if ($tag == 0x1F) { + $tag = 0; + // process septets (since the eighth bit is ignored, it's not an octet) + do { + $loop = ord($encoded[0]) >> 7; + $tag <<= 7; + $tag |= ord($encoded[$encoded_pos++]) & 0x7F; + $start++; + } while ($loop); + } + + // Length, as discussed in paragraph 8.1.3 of X.690-0207.pdf#page=13 + $length = ord($encoded[$encoded_pos++]); + $start++; + if ($length == 0x80) { // indefinite length + // "[A sender shall] use the indefinite form (see 8.1.3.6) if the encoding is constructed and is not all + // immediately available." -- paragraph 8.1.3.2.c + $length = strlen($encoded) - $encoded_pos; + } elseif ($length & 0x80) { // definite length, long form + // technically, the long form of the length can be represented by up to 126 octets (bytes), but we'll only + // support it up to four. + $length&= 0x7F; + $temp = substr($encoded, $encoded_pos, $length); + $encoded_pos += $length; + // tags of indefinte length don't really have a header length; this length includes the tag + $current+= array('headerlength' => $length + 2); + $start+= $length; + extract(unpack('Nlength', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4))); + } else { + $current+= array('headerlength' => 2); + } + + if ($length > (strlen($encoded) - $encoded_pos)) { + return false; + } + + $content = substr($encoded, $encoded_pos, $length); + $content_pos = 0; + + // at this point $length can be overwritten. it's only accurate for definite length things as is + + /* Class is UNIVERSAL, APPLICATION, PRIVATE, or CONTEXT-SPECIFIC. The UNIVERSAL class is restricted to the ASN.1 + built-in types. It defines an application-independent data type that must be distinguishable from all other + data types. The other three classes are user defined. The APPLICATION class distinguishes data types that + have a wide, scattered use within a particular presentation context. PRIVATE distinguishes data types within + a particular organization or country. CONTEXT-SPECIFIC distinguishes members of a sequence or set, the + alternatives of a CHOICE, or universally tagged set members. Only the class number appears in braces for this + data type; the term CONTEXT-SPECIFIC does not appear. + + -- http://www.obj-sys.com/asn1tutorial/node12.html */ + $class = ($type >> 6) & 3; + switch ($class) { + case FILE_ASN1_CLASS_APPLICATION: + case FILE_ASN1_CLASS_PRIVATE: + case FILE_ASN1_CLASS_CONTEXT_SPECIFIC: + if (!$constructed) { + return array( + 'type' => $class, + 'constant' => $tag, + 'content' => $content, + 'length' => $length + $start - $current['start'] + ); + } + + $newcontent = array(); + $remainingLength = $length; + while ($remainingLength > 0) { + $temp = $this->_decode_ber($content, $start, $content_pos); + if ($temp === false) { + break; + } + $length = $temp['length']; + // end-of-content octets - see paragraph 8.1.5 + if (substr($content, $content_pos + $length, 2) == "\0\0") { + $length+= 2; + $start+= $length; + $newcontent[] = $temp; + break; + } + $start+= $length; + $remainingLength-= $length; + $newcontent[] = $temp; + $content_pos += $length; + } + + return array( + 'type' => $class, + 'constant' => $tag, + // the array encapsulation is for BC with the old format + 'content' => $newcontent, + // the only time when $content['headerlength'] isn't defined is when the length is indefinite. + // the absence of $content['headerlength'] is how we know if something is indefinite or not. + // technically, it could be defined to be 2 and then another indicator could be used but whatever. + 'length' => $start - $current['start'] + ) + $current; + } + + $current+= array('type' => $tag); + + // decode UNIVERSAL tags + switch ($tag) { + case FILE_ASN1_TYPE_BOOLEAN: + // "The contents octets shall consist of a single octet." -- paragraph 8.2.1 + //if (strlen($content) != 1) { + // return false; + //} + $current['content'] = (bool) ord($content[$content_pos]); + break; + case FILE_ASN1_TYPE_INTEGER: + case FILE_ASN1_TYPE_ENUMERATED: + $current['content'] = new Math_BigInteger(substr($content, $content_pos), -256); + break; + case FILE_ASN1_TYPE_REAL: // not currently supported + return false; + case FILE_ASN1_TYPE_BIT_STRING: + // The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, + // the number of unused bits in the final subsequent octet. The number shall be in the range zero to + // seven. + if (!$constructed) { + $current['content'] = substr($content, $content_pos); + } else { + $temp = $this->_decode_ber($content, $start, $content_pos); + if ($temp === false) { + return false; + } + $length-= (strlen($content) - $content_pos); + $last = count($temp) - 1; + for ($i = 0; $i < $last; $i++) { + // all subtags should be bit strings + //if ($temp[$i]['type'] != FILE_ASN1_TYPE_BIT_STRING) { + // return false; + //} + $current['content'].= substr($temp[$i]['content'], 1); + } + // all subtags should be bit strings + //if ($temp[$last]['type'] != FILE_ASN1_TYPE_BIT_STRING) { + // return false; + //} + $current['content'] = $temp[$last]['content'][0] . $current['content'] . substr($temp[$i]['content'], 1); + } + break; + case FILE_ASN1_TYPE_OCTET_STRING: + if (!$constructed) { + $current['content'] = substr($content, $content_pos); + } else { + $current['content'] = ''; + $length = 0; + while (substr($content, $content_pos, 2) != "\0\0") { + $temp = $this->_decode_ber($content, $length + $start, $content_pos); + if ($temp === false) { + return false; + } + $content_pos += $temp['length']; + // all subtags should be octet strings + //if ($temp['type'] != FILE_ASN1_TYPE_OCTET_STRING) { + // return false; + //} + $current['content'].= $temp['content']; + $length+= $temp['length']; + } + if (substr($content, $content_pos, 2) == "\0\0") { + $length+= 2; // +2 for the EOC + } + } + break; + case FILE_ASN1_TYPE_NULL: + // "The contents octets shall not contain any octets." -- paragraph 8.8.2 + //if (strlen($content)) { + // return false; + //} + break; + case FILE_ASN1_TYPE_SEQUENCE: + case FILE_ASN1_TYPE_SET: + $offset = 0; + $current['content'] = array(); + $content_len = strlen($content); + while ($content_pos < $content_len) { + // if indefinite length construction was used and we have an end-of-content string next + // see paragraphs 8.1.1.3, 8.1.3.2, 8.1.3.6, 8.1.5, and (for an example) 8.6.4.2 + if (!isset($current['headerlength']) && substr($content, $content_pos, 2) == "\0\0") { + $length = $offset + 2; // +2 for the EOC + break 2; + } + $temp = $this->_decode_ber($content, $start + $offset, $content_pos); + if ($temp === false) { + return false; + } + $content_pos += $temp['length']; + $current['content'][] = $temp; + $offset+= $temp['length']; + } + break; + case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: + $temp = ord($content[$content_pos++]); + $current['content'] = sprintf('%d.%d', floor($temp / 40), $temp % 40); + $valuen = 0; + // process septets + $content_len = strlen($content); + while ($content_pos < $content_len) { + $temp = ord($content[$content_pos++]); + $valuen <<= 7; + $valuen |= $temp & 0x7F; + if (~$temp & 0x80) { + $current['content'].= ".$valuen"; + $valuen = 0; + } + } + // the eighth bit of the last byte should not be 1 + //if ($temp >> 7) { + // return false; + //} + break; + /* Each character string type shall be encoded as if it had been declared: + [UNIVERSAL x] IMPLICIT OCTET STRING + + -- X.690-0207.pdf#page=23 (paragraph 8.21.3) + + Per that, we're not going to do any validation. If there are any illegal characters in the string, + we don't really care */ + case FILE_ASN1_TYPE_NUMERIC_STRING: + // 0,1,2,3,4,5,6,7,8,9, and space + case FILE_ASN1_TYPE_PRINTABLE_STRING: + // Upper and lower case letters, digits, space, apostrophe, left/right parenthesis, plus sign, comma, + // hyphen, full stop, solidus, colon, equal sign, question mark + case FILE_ASN1_TYPE_TELETEX_STRING: + // The Teletex character set in CCITT's T61, space, and delete + // see http://en.wikipedia.org/wiki/Teletex#Character_sets + case FILE_ASN1_TYPE_VIDEOTEX_STRING: + // The Videotex character set in CCITT's T.100 and T.101, space, and delete + case FILE_ASN1_TYPE_VISIBLE_STRING: + // Printing character sets of international ASCII, and space + case FILE_ASN1_TYPE_IA5_STRING: + // International Alphabet 5 (International ASCII) + case FILE_ASN1_TYPE_GRAPHIC_STRING: + // All registered G sets, and space + case FILE_ASN1_TYPE_GENERAL_STRING: + // All registered C and G sets, space and delete + case FILE_ASN1_TYPE_UTF8_STRING: + // ???? + case FILE_ASN1_TYPE_BMP_STRING: + $current['content'] = substr($content, $content_pos); + break; + case FILE_ASN1_TYPE_UTC_TIME: + case FILE_ASN1_TYPE_GENERALIZED_TIME: + $current['content'] = class_exists('DateTime') ? + $this->_decodeDateTime(substr($content, $content_pos), $tag) : + $this->_decodeUnixTime(substr($content, $content_pos), $tag); + default: + } + + $start+= $length; + + // ie. length is the length of the full TLV encoding - it's not just the length of the value + return $current + array('length' => $start - $current['start']); + } + + /** + * ASN.1 Map + * + * Provides an ASN.1 semantic mapping ($mapping) from a parsed BER-encoding to a human readable format. + * + * "Special" mappings may be applied on a per tag-name basis via $special. + * + * @param array $decoded + * @param array $mapping + * @param array $special + * @return array + * @access public + */ + function asn1map($decoded, $mapping, $special = array()) + { + if (isset($mapping['explicit']) && is_array($decoded['content'])) { + $decoded = $decoded['content'][0]; + } + + switch (true) { + case $mapping['type'] == FILE_ASN1_TYPE_ANY: + $intype = $decoded['type']; + if (isset($decoded['constant']) || !isset($this->ANYmap[$intype]) || (ord($this->encoded[$decoded['start']]) & 0x20)) { + return new File_ASN1_Element(substr($this->encoded, $decoded['start'], $decoded['length'])); + } + $inmap = $this->ANYmap[$intype]; + if (is_string($inmap)) { + return array($inmap => $this->asn1map($decoded, array('type' => $intype) + $mapping, $special)); + } + break; + case $mapping['type'] == FILE_ASN1_TYPE_CHOICE: + foreach ($mapping['children'] as $key => $option) { + switch (true) { + case isset($option['constant']) && $option['constant'] == $decoded['constant']: + case !isset($option['constant']) && $option['type'] == $decoded['type']: + $value = $this->asn1map($decoded, $option, $special); + break; + case !isset($option['constant']) && $option['type'] == FILE_ASN1_TYPE_CHOICE: + $v = $this->asn1map($decoded, $option, $special); + if (isset($v)) { + $value = $v; + } + } + if (isset($value)) { + if (isset($special[$key])) { + $value = call_user_func($special[$key], $value); + } + return array($key => $value); + } + } + return null; + case isset($mapping['implicit']): + case isset($mapping['explicit']): + case $decoded['type'] == $mapping['type']: + break; + default: + // if $decoded['type'] and $mapping['type'] are both strings, but different types of strings, + // let it through + switch (true) { + case $decoded['type'] < 18: // FILE_ASN1_TYPE_NUMERIC_STRING == 18 + case $decoded['type'] > 30: // FILE_ASN1_TYPE_BMP_STRING == 30 + case $mapping['type'] < 18: + case $mapping['type'] > 30: + return null; + } + } + + if (isset($mapping['implicit'])) { + $decoded['type'] = $mapping['type']; + } + + switch ($decoded['type']) { + case FILE_ASN1_TYPE_SEQUENCE: + $map = array(); + + // ignore the min and max + if (isset($mapping['min']) && isset($mapping['max'])) { + $child = $mapping['children']; + foreach ($decoded['content'] as $content) { + if (($map[] = $this->asn1map($content, $child, $special)) === null) { + return null; + } + } + + return $map; + } + + $n = count($decoded['content']); + $i = 0; + + foreach ($mapping['children'] as $key => $child) { + $maymatch = $i < $n; // Match only existing input. + if ($maymatch) { + $temp = $decoded['content'][$i]; + + if ($child['type'] != FILE_ASN1_TYPE_CHOICE) { + // Get the mapping and input class & constant. + $childClass = $tempClass = FILE_ASN1_CLASS_UNIVERSAL; + $constant = null; + if (isset($temp['constant'])) { + $tempClass = $temp['type']; + } + if (isset($child['class'])) { + $childClass = $child['class']; + $constant = $child['cast']; + } elseif (isset($child['constant'])) { + $childClass = FILE_ASN1_CLASS_CONTEXT_SPECIFIC; + $constant = $child['constant']; + } + + if (isset($constant) && isset($temp['constant'])) { + // Can only match if constants and class match. + $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; + } else { + // Can only match if no constant expected and type matches or is generic. + $maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], FILE_ASN1_TYPE_ANY, FILE_ASN1_TYPE_CHOICE)) !== false; + } + } + } + + if ($maymatch) { + // Attempt submapping. + $candidate = $this->asn1map($temp, $child, $special); + $maymatch = $candidate !== null; + } + + if ($maymatch) { + // Got the match: use it. + if (isset($special[$key])) { + $candidate = call_user_func($special[$key], $candidate); + } + $map[$key] = $candidate; + $i++; + } elseif (isset($child['default'])) { + $map[$key] = $child['default']; // Use default. + } elseif (!isset($child['optional'])) { + return null; // Syntax error. + } + } + + // Fail mapping if all input items have not been consumed. + return $i < $n ? null: $map; + + // the main diff between sets and sequences is the encapsulation of the foreach in another for loop + case FILE_ASN1_TYPE_SET: + $map = array(); + + // ignore the min and max + if (isset($mapping['min']) && isset($mapping['max'])) { + $child = $mapping['children']; + foreach ($decoded['content'] as $content) { + if (($map[] = $this->asn1map($content, $child, $special)) === null) { + return null; + } + } + + return $map; + } + + for ($i = 0; $i < count($decoded['content']); $i++) { + $temp = $decoded['content'][$i]; + $tempClass = FILE_ASN1_CLASS_UNIVERSAL; + if (isset($temp['constant'])) { + $tempClass = $temp['type']; + } + + foreach ($mapping['children'] as $key => $child) { + if (isset($map[$key])) { + continue; + } + $maymatch = true; + if ($child['type'] != FILE_ASN1_TYPE_CHOICE) { + $childClass = FILE_ASN1_CLASS_UNIVERSAL; + $constant = null; + if (isset($child['class'])) { + $childClass = $child['class']; + $constant = $child['cast']; + } elseif (isset($child['constant'])) { + $childClass = FILE_ASN1_CLASS_CONTEXT_SPECIFIC; + $constant = $child['constant']; + } + + if (isset($constant) && isset($temp['constant'])) { + // Can only match if constants and class match. + $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; + } else { + // Can only match if no constant expected and type matches or is generic. + $maymatch = !isset($child['constant']) && array_search($child['type'], array($temp['type'], FILE_ASN1_TYPE_ANY, FILE_ASN1_TYPE_CHOICE)) !== false; + } + } + + if ($maymatch) { + // Attempt submapping. + $candidate = $this->asn1map($temp, $child, $special); + $maymatch = $candidate !== null; + } + + if (!$maymatch) { + break; + } + + // Got the match: use it. + if (isset($special[$key])) { + $candidate = call_user_func($special[$key], $candidate); + } + $map[$key] = $candidate; + break; + } + } + + foreach ($mapping['children'] as $key => $child) { + if (!isset($map[$key])) { + if (isset($child['default'])) { + $map[$key] = $child['default']; + } elseif (!isset($child['optional'])) { + return null; + } + } + } + return $map; + case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: + return isset($this->oids[$decoded['content']]) ? $this->oids[$decoded['content']] : $decoded['content']; + case FILE_ASN1_TYPE_UTC_TIME: + case FILE_ASN1_TYPE_GENERALIZED_TIME: + if (class_exists('DateTime')) { + if (isset($mapping['implicit'])) { + $decoded['content'] = $this->_decodeDateTime($decoded['content'], $decoded['type']); + } + if (!$decoded['content']) { + return false; + } + return $decoded['content']->format($this->format); + } else { + if (isset($mapping['implicit'])) { + $decoded['content'] = $this->_decodeUnixTime($decoded['content'], $decoded['type']); + } + return @date($this->format, $decoded['content']); + } + case FILE_ASN1_TYPE_BIT_STRING: + if (isset($mapping['mapping'])) { + $offset = ord($decoded['content'][0]); + $size = (strlen($decoded['content']) - 1) * 8 - $offset; + /* + From X.680-0207.pdf#page=46 (21.7): + + "When a "NamedBitList" is used in defining a bitstring type ASN.1 encoding rules are free to add (or remove) + arbitrarily any trailing 0 bits to (or from) values that are being encoded or decoded. Application designers should + therefore ensure that different semantics are not associated with such values which differ only in the number of trailing + 0 bits." + */ + $bits = count($mapping['mapping']) == $size ? array() : array_fill(0, count($mapping['mapping']) - $size, false); + for ($i = strlen($decoded['content']) - 1; $i > 0; $i--) { + $current = ord($decoded['content'][$i]); + for ($j = $offset; $j < 8; $j++) { + $bits[] = (bool) ($current & (1 << $j)); + } + $offset = 0; + } + $values = array(); + $map = array_reverse($mapping['mapping']); + foreach ($map as $i => $value) { + if ($bits[$i]) { + $values[] = $value; + } + } + return $values; + } + case FILE_ASN1_TYPE_OCTET_STRING: + return base64_encode($decoded['content']); + case FILE_ASN1_TYPE_NULL: + return ''; + case FILE_ASN1_TYPE_BOOLEAN: + return $decoded['content']; + case FILE_ASN1_TYPE_NUMERIC_STRING: + case FILE_ASN1_TYPE_PRINTABLE_STRING: + case FILE_ASN1_TYPE_TELETEX_STRING: + case FILE_ASN1_TYPE_VIDEOTEX_STRING: + case FILE_ASN1_TYPE_IA5_STRING: + case FILE_ASN1_TYPE_GRAPHIC_STRING: + case FILE_ASN1_TYPE_VISIBLE_STRING: + case FILE_ASN1_TYPE_GENERAL_STRING: + case FILE_ASN1_TYPE_UNIVERSAL_STRING: + case FILE_ASN1_TYPE_UTF8_STRING: + case FILE_ASN1_TYPE_BMP_STRING: + return $decoded['content']; + case FILE_ASN1_TYPE_INTEGER: + case FILE_ASN1_TYPE_ENUMERATED: + $temp = $decoded['content']; + if (isset($mapping['implicit'])) { + $temp = new Math_BigInteger($decoded['content'], -256); + } + if (isset($mapping['mapping'])) { + $temp = (int) $temp->toString(); + return isset($mapping['mapping'][$temp]) ? + $mapping['mapping'][$temp] : + false; + } + return $temp; + } + } + + /** + * ASN.1 Encode + * + * DER-encodes an ASN.1 semantic mapping ($mapping). Some libraries would probably call this function + * an ASN.1 compiler. + * + * "Special" mappings can be applied via $special. + * + * @param string $source + * @param string $mapping + * @param int $idx + * @return string + * @access public + */ + function encodeDER($source, $mapping, $special = array()) + { + $this->location = array(); + return $this->_encode_der($source, $mapping, null, $special); + } + + /** + * ASN.1 Encode (Helper function) + * + * @param string $source + * @param string $mapping + * @param int $idx + * @return string + * @access private + */ + function _encode_der($source, $mapping, $idx = null, $special = array()) + { + if (is_object($source) && strtolower(get_class($source)) == 'file_asn1_element') { + return $source->element; + } + + // do not encode (implicitly optional) fields with value set to default + if (isset($mapping['default']) && $source === $mapping['default']) { + return ''; + } + + if (isset($idx)) { + if (isset($special[$idx])) { + $source = call_user_func($special[$idx], $source); + } + $this->location[] = $idx; + } + + $tag = $mapping['type']; + + switch ($tag) { + case FILE_ASN1_TYPE_SET: // Children order is not important, thus process in sequence. + case FILE_ASN1_TYPE_SEQUENCE: + $tag|= 0x20; // set the constructed bit + + // ignore the min and max + if (isset($mapping['min']) && isset($mapping['max'])) { + $value = array(); + $child = $mapping['children']; + + foreach ($source as $content) { + $temp = $this->_encode_der($content, $child, null, $special); + if ($temp === false) { + return false; + } + $value[]= $temp; + } + /* "The encodings of the component values of a set-of value shall appear in ascending order, the encodings being compared + as octet strings with the shorter components being padded at their trailing end with 0-octets. + NOTE - The padding octets are for comparison purposes only and do not appear in the encodings." + + -- sec 11.6 of http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf */ + if ($mapping['type'] == FILE_ASN1_TYPE_SET) { + sort($value); + } + $value = implode($value, ''); + break; + } + + $value = ''; + foreach ($mapping['children'] as $key => $child) { + if (!array_key_exists($key, $source)) { + if (!isset($child['optional'])) { + return false; + } + continue; + } + + $temp = $this->_encode_der($source[$key], $child, $key, $special); + if ($temp === false) { + return false; + } + + // An empty child encoding means it has been optimized out. + // Else we should have at least one tag byte. + if ($temp === '') { + continue; + } + + // if isset($child['constant']) is true then isset($child['optional']) should be true as well + if (isset($child['constant'])) { + /* + From X.680-0207.pdf#page=58 (30.6): + + "The tagging construction specifies explicit tagging if any of the following holds: + ... + c) the "Tag Type" alternative is used and the value of "TagDefault" for the module is IMPLICIT TAGS or + AUTOMATIC TAGS, but the type defined by "Type" is an untagged choice type, an untagged open type, or + an untagged "DummyReference" (see ITU-T Rec. X.683 | ISO/IEC 8824-4, 8.3)." + */ + if (isset($child['explicit']) || $child['type'] == FILE_ASN1_TYPE_CHOICE) { + $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); + $temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp; + } else { + $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); + $temp = $subtag . substr($temp, 1); + } + } + $value.= $temp; + } + break; + case FILE_ASN1_TYPE_CHOICE: + $temp = false; + + foreach ($mapping['children'] as $key => $child) { + if (!isset($source[$key])) { + continue; + } + + $temp = $this->_encode_der($source[$key], $child, $key, $special); + if ($temp === false) { + return false; + } + + // An empty child encoding means it has been optimized out. + // Else we should have at least one tag byte. + if ($temp === '') { + continue; + } + + $tag = ord($temp[0]); + + // if isset($child['constant']) is true then isset($child['optional']) should be true as well + if (isset($child['constant'])) { + if (isset($child['explicit']) || $child['type'] == FILE_ASN1_TYPE_CHOICE) { + $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); + $temp = $subtag . $this->_encodeLength(strlen($temp)) . $temp; + } else { + $subtag = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); + $temp = $subtag . substr($temp, 1); + } + } + } + + if (isset($idx)) { + array_pop($this->location); + } + + if ($temp && isset($mapping['cast'])) { + $temp[0] = chr(($mapping['class'] << 6) | ($tag & 0x20) | $mapping['cast']); + } + + return $temp; + case FILE_ASN1_TYPE_INTEGER: + case FILE_ASN1_TYPE_ENUMERATED: + if (!isset($mapping['mapping'])) { + if (is_numeric($source)) { + $source = new Math_BigInteger($source); + } + $value = $source->toBytes(true); + } else { + $value = array_search($source, $mapping['mapping']); + if ($value === false) { + return false; + } + $value = new Math_BigInteger($value); + $value = $value->toBytes(true); + } + if (!strlen($value)) { + $value = chr(0); + } + break; + case FILE_ASN1_TYPE_UTC_TIME: + case FILE_ASN1_TYPE_GENERALIZED_TIME: + $format = $mapping['type'] == FILE_ASN1_TYPE_UTC_TIME ? 'y' : 'Y'; + $format.= 'mdHis'; + if (!class_exists('DateTime')) { + $value = @gmdate($format, strtotime($source)) . 'Z'; + } else { + $date = new DateTime($source, new DateTimeZone('GMT')); + $value = $date->format($format) . 'Z'; + } + break; + case FILE_ASN1_TYPE_BIT_STRING: + if (isset($mapping['mapping'])) { + $bits = array_fill(0, count($mapping['mapping']), 0); + $size = 0; + for ($i = 0; $i < count($mapping['mapping']); $i++) { + if (in_array($mapping['mapping'][$i], $source)) { + $bits[$i] = 1; + $size = $i; + } + } + + if (isset($mapping['min']) && $mapping['min'] >= 1 && $size < $mapping['min']) { + $size = $mapping['min'] - 1; + } + + $offset = 8 - (($size + 1) & 7); + $offset = $offset !== 8 ? $offset : 0; + + $value = chr($offset); + + for ($i = $size + 1; $i < count($mapping['mapping']); $i++) { + unset($bits[$i]); + } + + $bits = implode('', array_pad($bits, $size + $offset + 1, 0)); + $bytes = explode(' ', rtrim(chunk_split($bits, 8, ' '))); + foreach ($bytes as $byte) { + $value.= chr(bindec($byte)); + } + + break; + } + case FILE_ASN1_TYPE_OCTET_STRING: + /* The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, + the number of unused bits in the final subsequent octet. The number shall be in the range zero to seven. + + -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=16 */ + $value = base64_decode($source); + break; + case FILE_ASN1_TYPE_OBJECT_IDENTIFIER: + $oid = preg_match('#(?:\d+\.)+#', $source) ? $source : array_search($source, $this->oids); + if ($oid === false) { + user_error('Invalid OID'); + return false; + } + $value = ''; + $parts = explode('.', $oid); + $value = chr(40 * $parts[0] + $parts[1]); + for ($i = 2; $i < count($parts); $i++) { + $temp = ''; + if (!$parts[$i]) { + $temp = "\0"; + } else { + while ($parts[$i]) { + $temp = chr(0x80 | ($parts[$i] & 0x7F)) . $temp; + $parts[$i] >>= 7; + } + $temp[strlen($temp) - 1] = $temp[strlen($temp) - 1] & chr(0x7F); + } + $value.= $temp; + } + break; + case FILE_ASN1_TYPE_ANY: + $loc = $this->location; + if (isset($idx)) { + array_pop($this->location); + } + + switch (true) { + case !isset($source): + return $this->_encode_der(null, array('type' => FILE_ASN1_TYPE_NULL) + $mapping, null, $special); + case is_int($source): + case is_object($source) && strtolower(get_class($source)) == 'math_biginteger': + return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_INTEGER) + $mapping, null, $special); + case is_float($source): + return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_REAL) + $mapping, null, $special); + case is_bool($source): + return $this->_encode_der($source, array('type' => FILE_ASN1_TYPE_BOOLEAN) + $mapping, null, $special); + case is_array($source) && count($source) == 1: + $typename = implode('', array_keys($source)); + $outtype = array_search($typename, $this->ANYmap, true); + if ($outtype !== false) { + return $this->_encode_der($source[$typename], array('type' => $outtype) + $mapping, null, $special); + } + } + + $filters = $this->filters; + foreach ($loc as $part) { + if (!isset($filters[$part])) { + $filters = false; + break; + } + $filters = $filters[$part]; + } + if ($filters === false) { + user_error('No filters defined for ' . implode('/', $loc)); + return false; + } + return $this->_encode_der($source, $filters + $mapping, null, $special); + case FILE_ASN1_TYPE_NULL: + $value = ''; + break; + case FILE_ASN1_TYPE_NUMERIC_STRING: + case FILE_ASN1_TYPE_TELETEX_STRING: + case FILE_ASN1_TYPE_PRINTABLE_STRING: + case FILE_ASN1_TYPE_UNIVERSAL_STRING: + case FILE_ASN1_TYPE_UTF8_STRING: + case FILE_ASN1_TYPE_BMP_STRING: + case FILE_ASN1_TYPE_IA5_STRING: + case FILE_ASN1_TYPE_VISIBLE_STRING: + case FILE_ASN1_TYPE_VIDEOTEX_STRING: + case FILE_ASN1_TYPE_GRAPHIC_STRING: + case FILE_ASN1_TYPE_GENERAL_STRING: + $value = $source; + break; + case FILE_ASN1_TYPE_BOOLEAN: + $value = $source ? "\xFF" : "\x00"; + break; + default: + user_error('Mapping provides no type definition for ' . implode('/', $this->location)); + return false; + } + + if (isset($idx)) { + array_pop($this->location); + } + + if (isset($mapping['cast'])) { + if (isset($mapping['explicit']) || $mapping['type'] == FILE_ASN1_TYPE_CHOICE) { + $value = chr($tag) . $this->_encodeLength(strlen($value)) . $value; + $tag = ($mapping['class'] << 6) | 0x20 | $mapping['cast']; + } else { + $tag = ($mapping['class'] << 6) | (ord($temp[0]) & 0x20) | $mapping['cast']; + } + } + + return chr($tag) . $this->_encodeLength(strlen($value)) . $value; + } + + /** + * DER-encode the length + * + * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See + * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. + * + * @access private + * @param int $length + * @return string + */ + function _encodeLength($length) + { + if ($length <= 0x7F) { + return chr($length); + } + + $temp = ltrim(pack('N', $length), chr(0)); + return pack('Ca*', 0x80 | strlen($temp), $temp); + } + + /** + * BER-decode the time (using UNIX time) + * + * Called by _decode_ber() and in the case of implicit tags asn1map(). + * + * @access private + * @param string $content + * @param int $tag + * @return string + */ + function _decodeUnixTime($content, $tag) + { + /* UTCTime: + http://tools.ietf.org/html/rfc5280#section-4.1.2.5.1 + http://www.obj-sys.com/asn1tutorial/node15.html + + GeneralizedTime: + http://tools.ietf.org/html/rfc5280#section-4.1.2.5.2 + http://www.obj-sys.com/asn1tutorial/node14.html */ + + $pattern = $tag == FILE_ASN1_TYPE_UTC_TIME ? + '#^(..)(..)(..)(..)(..)(..)?(.*)$#' : + '#(....)(..)(..)(..)(..)(..).*([Z+-].*)$#'; + + preg_match($pattern, $content, $matches); + + list(, $year, $month, $day, $hour, $minute, $second, $timezone) = $matches; + + if ($tag == FILE_ASN1_TYPE_UTC_TIME) { + $year = $year >= 50 ? "19$year" : "20$year"; + } + + if ($timezone == 'Z') { + $mktime = 'gmmktime'; + $timezone = 0; + } elseif (preg_match('#([+-])(\d\d)(\d\d)#', $timezone, $matches)) { + $mktime = 'gmmktime'; + $timezone = 60 * $matches[3] + 3600 * $matches[2]; + if ($matches[1] == '-') { + $timezone = -$timezone; + } + } else { + $mktime = 'mktime'; + $timezone = 0; + } + + return @$mktime((int)$hour, (int)$minute, (int)$second, (int)$month, (int)$day, (int)$year) + $timezone; + } + + + /** + * BER-decode the time (using DateTime) + * + * Called by _decode_ber() and in the case of implicit tags asn1map(). + * + * @access private + * @param string $content + * @param int $tag + * @return string + */ + function _decodeDateTime($content, $tag) + { + /* UTCTime: + http://tools.ietf.org/html/rfc5280#section-4.1.2.5.1 + http://www.obj-sys.com/asn1tutorial/node15.html + + GeneralizedTime: + http://tools.ietf.org/html/rfc5280#section-4.1.2.5.2 + http://www.obj-sys.com/asn1tutorial/node14.html */ + + $format = 'YmdHis'; + + if ($tag == FILE_ASN1_TYPE_UTC_TIME) { + // https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=28 says "the seconds + // element shall always be present" but none-the-less I've seen X509 certs where it isn't and if the + // browsers parse it phpseclib ought to too + if (preg_match('#^(\d{10})(Z|[+-]\d{4})$#', $content, $matches)) { + $content = $matches[1] . '00' . $matches[2]; + } + $prefix = substr($content, 0, 2) >= 50 ? '19' : '20'; + $content = $prefix . $content; + } elseif (strpos($content, '.') !== false) { + $format.= '.u'; + } + + if ($content[strlen($content) - 1] == 'Z') { + $content = substr($content, 0, -1) . '+0000'; + } + + if (strpos($content, '-') !== false || strpos($content, '+') !== false) { + $format.= 'O'; + } + + // error supression isn't necessary as of PHP 7.0: + // http://php.net/manual/en/migration70.other-changes.php + return @DateTime::createFromFormat($format, $content); + } + + /** + * Set the time format + * + * Sets the time / date format for asn1map(). + * + * @access public + * @param string $format + */ + function setTimeFormat($format) + { + $this->format = $format; + } + + /** + * Load OIDs + * + * Load the relevant OIDs for a particular ASN.1 semantic mapping. + * + * @access public + * @param array $oids + */ + function loadOIDs($oids) + { + $this->oids = $oids; + } + + /** + * Load filters + * + * See File_X509, etc, for an example. + * + * @access public + * @param array $filters + */ + function loadFilters($filters) + { + $this->filters = $filters; + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param string $string + * @param int $index + * @return string + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * String type conversion + * + * This is a lazy conversion, dealing only with character size. + * No real conversion table is used. + * + * @param string $in + * @param int $from + * @param int $to + * @return string + * @access public + */ + function convert($in, $from = FILE_ASN1_TYPE_UTF8_STRING, $to = FILE_ASN1_TYPE_UTF8_STRING) + { + if (!isset($this->stringTypeSize[$from]) || !isset($this->stringTypeSize[$to])) { + return false; + } + $insize = $this->stringTypeSize[$from]; + $outsize = $this->stringTypeSize[$to]; + $inlength = strlen($in); + $out = ''; + + for ($i = 0; $i < $inlength;) { + if ($inlength - $i < $insize) { + return false; + } + + // Get an input character as a 32-bit value. + $c = ord($in[$i++]); + switch (true) { + case $insize == 4: + $c = ($c << 8) | ord($in[$i++]); + $c = ($c << 8) | ord($in[$i++]); + case $insize == 2: + $c = ($c << 8) | ord($in[$i++]); + case $insize == 1: + break; + case ($c & 0x80) == 0x00: + break; + case ($c & 0x40) == 0x00: + return false; + default: + $bit = 6; + do { + if ($bit > 25 || $i >= $inlength || (ord($in[$i]) & 0xC0) != 0x80) { + return false; + } + $c = ($c << 6) | (ord($in[$i++]) & 0x3F); + $bit += 5; + $mask = 1 << $bit; + } while ($c & $bit); + $c &= $mask - 1; + break; + } + + // Convert and append the character to output string. + $v = ''; + switch (true) { + case $outsize == 4: + $v .= chr($c & 0xFF); + $c >>= 8; + $v .= chr($c & 0xFF); + $c >>= 8; + case $outsize == 2: + $v .= chr($c & 0xFF); + $c >>= 8; + case $outsize == 1: + $v .= chr($c & 0xFF); + $c >>= 8; + if ($c) { + return false; + } + break; + case ($c & 0x80000000) != 0: + return false; + case $c >= 0x04000000: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x04000000; + case $c >= 0x00200000: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x00200000; + case $c >= 0x00010000: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x00010000; + case $c >= 0x00000800: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x00000800; + case $c >= 0x00000080: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x000000C0; + default: + $v .= chr($c); + break; + } + $out .= strrev($v); + } + return $out; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/File/X509.php b/rainloop/v/0.0.0/app/libraries/phpseclib/File/X509.php old mode 100644 new mode 100755 index 36a6287b9..50090818d --- a/rainloop/v/0.0.0/app/libraries/phpseclib/File/X509.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/File/X509.php @@ -1,4583 +1,5148 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include File_ASN1 - */ -if (!class_exists('File_ASN1')) { - include_once 'ASN1.php'; -} - -/** - * Flag to only accept signatures signed by certificate authorities - * - * Not really used anymore but retained all the same to suppress E_NOTICEs from old installs - * - * @access public - */ -define('FILE_X509_VALIDATE_SIGNATURE_BY_CA', 1); - -/**#@+ - * @access public - * @see File_X509::getDN() - */ -/** - * Return internal array representation - */ -define('FILE_X509_DN_ARRAY', 0); -/** - * Return string - */ -define('FILE_X509_DN_STRING', 1); -/** - * Return ASN.1 name string - */ -define('FILE_X509_DN_ASN1', 2); -/** - * Return OpenSSL compatible array - */ -define('FILE_X509_DN_OPENSSL', 3); -/** - * Return canonical ASN.1 RDNs string - */ -define('FILE_X509_DN_CANON', 4); -/** - * Return name hash for file indexing - */ -define('FILE_X509_DN_HASH', 5); -/**#@-*/ - -/**#@+ - * @access public - * @see File_X509::saveX509() - * @see File_X509::saveCSR() - * @see File_X509::saveCRL() - */ -/** - * Save as PEM - * - * ie. a base64-encoded PEM with a header and a footer - */ -define('FILE_X509_FORMAT_PEM', 0); -/** - * Save as DER - */ -define('FILE_X509_FORMAT_DER', 1); -/** - * Save as a SPKAC - * - * Only works on CSRs. Not currently supported. - */ -define('FILE_X509_FORMAT_SPKAC', 2); -/**#@-*/ - -/** - * Attribute value disposition. - * If disposition is >= 0, this is the index of the target value. - */ -define('FILE_X509_ATTR_ALL', -1); // All attribute values (array). -define('FILE_X509_ATTR_APPEND', -2); // Add a value. -define('FILE_X509_ATTR_REPLACE', -3); // Clear first, then add a value. - -/** - * Pure-PHP X.509 Parser - * - * @package File_X509 - * @author Jim Wigginton - * @access public - */ -class File_X509 -{ - /** - * ASN.1 syntax for X.509 certificates - * - * @var Array - * @access private - */ - var $Certificate; - - /**#@+ - * ASN.1 syntax for various extensions - * - * @access private - */ - var $DirectoryString; - var $PKCS9String; - var $AttributeValue; - var $Extensions; - var $KeyUsage; - var $ExtKeyUsageSyntax; - var $BasicConstraints; - var $KeyIdentifier; - var $CRLDistributionPoints; - var $AuthorityKeyIdentifier; - var $CertificatePolicies; - var $AuthorityInfoAccessSyntax; - var $SubjectAltName; - var $PrivateKeyUsagePeriod; - var $IssuerAltName; - var $PolicyMappings; - var $NameConstraints; - - var $CPSuri; - var $UserNotice; - - var $netscape_cert_type; - var $netscape_comment; - var $netscape_ca_policy_url; - - var $Name; - var $RelativeDistinguishedName; - var $CRLNumber; - var $CRLReason; - var $IssuingDistributionPoint; - var $InvalidityDate; - var $CertificateIssuer; - var $HoldInstructionCode; - var $SignedPublicKeyAndChallenge; - /**#@-*/ - - /** - * ASN.1 syntax for Certificate Signing Requests (RFC2986) - * - * @var Array - * @access private - */ - var $CertificationRequest; - - /** - * ASN.1 syntax for Certificate Revocation Lists (RFC5280) - * - * @var Array - * @access private - */ - var $CertificateList; - - /** - * Distinguished Name - * - * @var Array - * @access private - */ - var $dn; - - /** - * Public key - * - * @var String - * @access private - */ - var $publicKey; - - /** - * Private key - * - * @var String - * @access private - */ - var $privateKey; - - /** - * Object identifiers for X.509 certificates - * - * @var Array - * @access private - * @link http://en.wikipedia.org/wiki/Object_identifier - */ - var $oids; - - /** - * The certificate authorities - * - * @var Array - * @access private - */ - var $CAs; - - /** - * The currently loaded certificate - * - * @var Array - * @access private - */ - var $currentCert; - - /** - * The signature subject - * - * There's no guarantee File_X509 is going to reencode an X.509 cert in the same way it was originally - * encoded so we take save the portion of the original cert that the signature would have made for. - * - * @var String - * @access private - */ - var $signatureSubject; - - /** - * Certificate Start Date - * - * @var String - * @access private - */ - var $startDate; - - /** - * Certificate End Date - * - * @var String - * @access private - */ - var $endDate; - - /** - * Serial Number - * - * @var String - * @access private - */ - var $serialNumber; - - /** - * Key Identifier - * - * See {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.1 RFC5280#section-4.2.1.1} and - * {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.2 RFC5280#section-4.2.1.2}. - * - * @var String - * @access private - */ - var $currentKeyIdentifier; - - /** - * CA Flag - * - * @var Boolean - * @access private - */ - var $caFlag = false; - - /** - * SPKAC Challenge - * - * @var String - * @access private - */ - var $challenge; - - /** - * Default Constructor. - * - * @return File_X509 - * @access public - */ - function File_X509() - { - if (!class_exists('Math_BigInteger')) { - include_once 'Math/BigInteger.php'; - } - - // Explicitly Tagged Module, 1988 Syntax - // http://tools.ietf.org/html/rfc5280#appendix-A.1 - - $this->DirectoryString = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'teletexString' => array('type' => FILE_ASN1_TYPE_TELETEX_STRING), - 'printableString' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING), - 'universalString' => array('type' => FILE_ASN1_TYPE_UNIVERSAL_STRING), - 'utf8String' => array('type' => FILE_ASN1_TYPE_UTF8_STRING), - 'bmpString' => array('type' => FILE_ASN1_TYPE_BMP_STRING) - ) - ); - - $this->PKCS9String = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'ia5String' => array('type' => FILE_ASN1_TYPE_IA5_STRING), - 'directoryString' => $this->DirectoryString - ) - ); - - $this->AttributeValue = array('type' => FILE_ASN1_TYPE_ANY); - - $AttributeType = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); - - $AttributeTypeAndValue = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'type' => $AttributeType, - 'value'=> $this->AttributeValue - ) - ); - - /* - In practice, RDNs containing multiple name-value pairs (called "multivalued RDNs") are rare, - but they can be useful at times when either there is no unique attribute in the entry or you - want to ensure that the entry's DN contains some useful identifying information. - - - https://www.opends.org/wiki/page/DefinitionRelativeDistinguishedName - */ - $this->RelativeDistinguishedName = array( - 'type' => FILE_ASN1_TYPE_SET, - 'min' => 1, - 'max' => -1, - 'children' => $AttributeTypeAndValue - ); - - // http://tools.ietf.org/html/rfc5280#section-4.1.2.4 - $RDNSequence = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - // RDNSequence does not define a min or a max, which means it doesn't have one - 'min' => 0, - 'max' => -1, - 'children' => $this->RelativeDistinguishedName - ); - - $this->Name = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'rdnSequence' => $RDNSequence - ) - ); - - // http://tools.ietf.org/html/rfc5280#section-4.1.1.2 - $AlgorithmIdentifier = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'algorithm' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), - 'parameters' => array( - 'type' => FILE_ASN1_TYPE_ANY, - 'optional' => true - ) - ) - ); - - /* - A certificate using system MUST reject the certificate if it encounters - a critical extension it does not recognize; however, a non-critical - extension may be ignored if it is not recognized. - - http://tools.ietf.org/html/rfc5280#section-4.2 - */ - $Extension = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'extnId' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), - 'critical' => array( - 'type' => FILE_ASN1_TYPE_BOOLEAN, - 'optional' => true, - 'default' => false - ), - 'extnValue' => array('type' => FILE_ASN1_TYPE_OCTET_STRING) - ) - ); - - $this->Extensions = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - // technically, it's MAX, but we'll assume anything < 0 is MAX - 'max' => -1, - // if 'children' isn't an array then 'min' and 'max' must be defined - 'children' => $Extension - ); - - $SubjectPublicKeyInfo = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'algorithm' => $AlgorithmIdentifier, - 'subjectPublicKey' => array('type' => FILE_ASN1_TYPE_BIT_STRING) - ) - ); - - $UniqueIdentifier = array('type' => FILE_ASN1_TYPE_BIT_STRING); - - $Time = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'utcTime' => array('type' => FILE_ASN1_TYPE_UTC_TIME), - 'generalTime' => array('type' => FILE_ASN1_TYPE_GENERALIZED_TIME) - ) - ); - - // http://tools.ietf.org/html/rfc5280#section-4.1.2.5 - $Validity = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'notBefore' => $Time, - 'notAfter' => $Time - ) - ); - - $CertificateSerialNumber = array('type' => FILE_ASN1_TYPE_INTEGER); - - $Version = array( - 'type' => FILE_ASN1_TYPE_INTEGER, - 'mapping' => array('v1', 'v2', 'v3') - ); - - // assert($TBSCertificate['children']['signature'] == $Certificate['children']['signatureAlgorithm']) - $TBSCertificate = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - // technically, default implies optional, but we'll define it as being optional, none-the-less, just to - // reenforce that fact - 'version' => array( - 'constant' => 0, - 'optional' => true, - 'explicit' => true, - 'default' => 'v1' - ) + $Version, - 'serialNumber' => $CertificateSerialNumber, - 'signature' => $AlgorithmIdentifier, - 'issuer' => $this->Name, - 'validity' => $Validity, - 'subject' => $this->Name, - 'subjectPublicKeyInfo' => $SubjectPublicKeyInfo, - // implicit means that the T in the TLV structure is to be rewritten, regardless of the type - 'issuerUniqueID' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $UniqueIdentifier, - 'subjectUniqueID' => array( - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ) + $UniqueIdentifier, - // doesn't use the EXPLICIT keyword but if - // it's not IMPLICIT, it's EXPLICIT - 'extensions' => array( - 'constant' => 3, - 'optional' => true, - 'explicit' => true - ) + $this->Extensions - ) - ); - - $this->Certificate = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'tbsCertificate' => $TBSCertificate, - 'signatureAlgorithm' => $AlgorithmIdentifier, - 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) - ) - ); - - $this->KeyUsage = array( - 'type' => FILE_ASN1_TYPE_BIT_STRING, - 'mapping' => array( - 'digitalSignature', - 'nonRepudiation', - 'keyEncipherment', - 'dataEncipherment', - 'keyAgreement', - 'keyCertSign', - 'cRLSign', - 'encipherOnly', - 'decipherOnly' - ) - ); - - $this->BasicConstraints = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'cA' => array( - 'type' => FILE_ASN1_TYPE_BOOLEAN, - 'optional' => true, - 'default' => false - ), - 'pathLenConstraint' => array( - 'type' => FILE_ASN1_TYPE_INTEGER, - 'optional' => true - ) - ) - ); - - $this->KeyIdentifier = array('type' => FILE_ASN1_TYPE_OCTET_STRING); - - $OrganizationalUnitNames = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => 4, // ub-organizational-units - 'children' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) - ); - - $PersonalName = array( - 'type' => FILE_ASN1_TYPE_SET, - 'children' => array( - 'surname' => array( - 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ), - 'given-name' => array( - 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ), - 'initials' => array( - 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ), - 'generation-qualifier' => array( - 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, - 'constant' => 3, - 'optional' => true, - 'implicit' => true - ) - ) - ); - - $NumericUserIdentifier = array('type' => FILE_ASN1_TYPE_NUMERIC_STRING); - - $OrganizationName = array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING); - - $PrivateDomainName = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'numeric' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING), - 'printable' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) - ) - ); - - $TerminalIdentifier = array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING); - - $NetworkAddress = array('type' => FILE_ASN1_TYPE_NUMERIC_STRING); - - $AdministrationDomainName = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - // if class isn't present it's assumed to be FILE_ASN1_CLASS_UNIVERSAL or - // (if constant is present) FILE_ASN1_CLASS_CONTEXT_SPECIFIC - 'class' => FILE_ASN1_CLASS_APPLICATION, - 'cast' => 2, - 'children' => array( - 'numeric' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING), - 'printable' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) - ) - ); - - $CountryName = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - // if class isn't present it's assumed to be FILE_ASN1_CLASS_UNIVERSAL or - // (if constant is present) FILE_ASN1_CLASS_CONTEXT_SPECIFIC - 'class' => FILE_ASN1_CLASS_APPLICATION, - 'cast' => 1, - 'children' => array( - 'x121-dcc-code' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING), - 'iso-3166-alpha2-code' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) - ) - ); - - $AnotherName = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'type-id' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), - 'value' => array( - 'type' => FILE_ASN1_TYPE_ANY, - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ) - ) - ); - - $ExtensionAttribute = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'extension-attribute-type' => array( - 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ), - 'extension-attribute-value' => array( - 'type' => FILE_ASN1_TYPE_ANY, - 'constant' => 1, - 'optional' => true, - 'explicit' => true - ) - ) - ); - - $ExtensionAttributes = array( - 'type' => FILE_ASN1_TYPE_SET, - 'min' => 1, - 'max' => 256, // ub-extension-attributes - 'children' => $ExtensionAttribute - ); - - $BuiltInDomainDefinedAttribute = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'type' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING), - 'value' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) - ) - ); - - $BuiltInDomainDefinedAttributes = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => 4, // ub-domain-defined-attributes - 'children' => $BuiltInDomainDefinedAttribute - ); - - $BuiltInStandardAttributes = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'country-name' => array('optional' => true) + $CountryName, - 'administration-domain-name' => array('optional' => true) + $AdministrationDomainName, - 'network-address' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $NetworkAddress, - 'terminal-identifier' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $TerminalIdentifier, - 'private-domain-name' => array( - 'constant' => 2, - 'optional' => true, - 'explicit' => true - ) + $PrivateDomainName, - 'organization-name' => array( - 'constant' => 3, - 'optional' => true, - 'implicit' => true - ) + $OrganizationName, - 'numeric-user-identifier' => array( - 'constant' => 4, - 'optional' => true, - 'implicit' => true - ) + $NumericUserIdentifier, - 'personal-name' => array( - 'constant' => 5, - 'optional' => true, - 'implicit' => true - ) + $PersonalName, - 'organizational-unit-names' => array( - 'constant' => 6, - 'optional' => true, - 'implicit' => true - ) + $OrganizationalUnitNames - ) - ); - - $ORAddress = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'built-in-standard-attributes' => $BuiltInStandardAttributes, - 'built-in-domain-defined-attributes' => array('optional' => true) + $BuiltInDomainDefinedAttributes, - 'extension-attributes' => array('optional' => true) + $ExtensionAttributes - ) - ); - - $EDIPartyName = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'nameAssigner' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $this->DirectoryString, - // partyName is technically required but File_ASN1 doesn't currently support non-optional constants and - // setting it to optional gets the job done in any event. - 'partyName' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $this->DirectoryString - ) - ); - - $GeneralName = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'otherName' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $AnotherName, - 'rfc822Name' => array( - 'type' => FILE_ASN1_TYPE_IA5_STRING, - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ), - 'dNSName' => array( - 'type' => FILE_ASN1_TYPE_IA5_STRING, - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ), - 'x400Address' => array( - 'constant' => 3, - 'optional' => true, - 'implicit' => true - ) + $ORAddress, - 'directoryName' => array( - 'constant' => 4, - 'optional' => true, - 'explicit' => true - ) + $this->Name, - 'ediPartyName' => array( - 'constant' => 5, - 'optional' => true, - 'implicit' => true - ) + $EDIPartyName, - 'uniformResourceIdentifier' => array( - 'type' => FILE_ASN1_TYPE_IA5_STRING, - 'constant' => 6, - 'optional' => true, - 'implicit' => true - ), - 'iPAddress' => array( - 'type' => FILE_ASN1_TYPE_OCTET_STRING, - 'constant' => 7, - 'optional' => true, - 'implicit' => true - ), - 'registeredID' => array( - 'type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER, - 'constant' => 8, - 'optional' => true, - 'implicit' => true - ) - ) - ); - - $GeneralNames = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => $GeneralName - ); - - $this->IssuerAltName = $GeneralNames; - - $ReasonFlags = array( - 'type' => FILE_ASN1_TYPE_BIT_STRING, - 'mapping' => array( - 'unused', - 'keyCompromise', - 'cACompromise', - 'affiliationChanged', - 'superseded', - 'cessationOfOperation', - 'certificateHold', - 'privilegeWithdrawn', - 'aACompromise' - ) - ); - - $DistributionPointName = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'fullName' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $GeneralNames, - 'nameRelativeToCRLIssuer' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $this->RelativeDistinguishedName - ) - ); - - $DistributionPoint = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'distributionPoint' => array( - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ) + $DistributionPointName, - 'reasons' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $ReasonFlags, - 'cRLIssuer' => array( - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ) + $GeneralNames - ) - ); - - $this->CRLDistributionPoints = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => $DistributionPoint - ); - - $this->AuthorityKeyIdentifier = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'keyIdentifier' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $this->KeyIdentifier, - 'authorityCertIssuer' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $GeneralNames, - 'authorityCertSerialNumber' => array( - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ) + $CertificateSerialNumber - ) - ); - - $PolicyQualifierId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); - - $PolicyQualifierInfo = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'policyQualifierId' => $PolicyQualifierId, - 'qualifier' => array('type' => FILE_ASN1_TYPE_ANY) - ) - ); - - $CertPolicyId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); - - $PolicyInformation = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'policyIdentifier' => $CertPolicyId, - 'policyQualifiers' => array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 0, - 'max' => -1, - 'optional' => true, - 'children' => $PolicyQualifierInfo - ) - ) - ); - - $this->CertificatePolicies = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => $PolicyInformation - ); - - $this->PolicyMappings = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'issuerDomainPolicy' => $CertPolicyId, - 'subjectDomainPolicy' => $CertPolicyId - ) - ) - ); - - $KeyPurposeId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); - - $this->ExtKeyUsageSyntax = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => $KeyPurposeId - ); - - $AccessDescription = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'accessMethod' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), - 'accessLocation' => $GeneralName - ) - ); - - $this->AuthorityInfoAccessSyntax = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => $AccessDescription - ); - - $this->SubjectAltName = $GeneralNames; - - $this->PrivateKeyUsagePeriod = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'notBefore' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true, - 'type' => FILE_ASN1_TYPE_GENERALIZED_TIME), - 'notAfter' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true, - 'type' => FILE_ASN1_TYPE_GENERALIZED_TIME) - ) - ); - - $BaseDistance = array('type' => FILE_ASN1_TYPE_INTEGER); - - $GeneralSubtree = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'base' => $GeneralName, - 'minimum' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true, - 'default' => new Math_BigInteger(0) - ) + $BaseDistance, - 'maximum' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true, - ) + $BaseDistance - ) - ); - - $GeneralSubtrees = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => $GeneralSubtree - ); - - $this->NameConstraints = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'permittedSubtrees' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $GeneralSubtrees, - 'excludedSubtrees' => array( - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ) + $GeneralSubtrees - ) - ); - - $this->CPSuri = array('type' => FILE_ASN1_TYPE_IA5_STRING); - - $DisplayText = array( - 'type' => FILE_ASN1_TYPE_CHOICE, - 'children' => array( - 'ia5String' => array('type' => FILE_ASN1_TYPE_IA5_STRING), - 'visibleString' => array('type' => FILE_ASN1_TYPE_VISIBLE_STRING), - 'bmpString' => array('type' => FILE_ASN1_TYPE_BMP_STRING), - 'utf8String' => array('type' => FILE_ASN1_TYPE_UTF8_STRING) - ) - ); - - $NoticeReference = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'organization' => $DisplayText, - 'noticeNumbers' => array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'min' => 1, - 'max' => 200, - 'children' => array('type' => FILE_ASN1_TYPE_INTEGER) - ) - ) - ); - - $this->UserNotice = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'noticeRef' => array( - 'optional' => true, - 'implicit' => true - ) + $NoticeReference, - 'explicitText' => array( - 'optional' => true, - 'implicit' => true - ) + $DisplayText - ) - ); - - // mapping is from - $this->netscape_cert_type = array( - 'type' => FILE_ASN1_TYPE_BIT_STRING, - 'mapping' => array( - 'SSLClient', - 'SSLServer', - 'Email', - 'ObjectSigning', - 'Reserved', - 'SSLCA', - 'EmailCA', - 'ObjectSigningCA' - ) - ); - - $this->netscape_comment = array('type' => FILE_ASN1_TYPE_IA5_STRING); - $this->netscape_ca_policy_url = array('type' => FILE_ASN1_TYPE_IA5_STRING); - - // attribute is used in RFC2986 but we're using the RFC5280 definition - - $Attribute = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'type' => $AttributeType, - 'value'=> array( - 'type' => FILE_ASN1_TYPE_SET, - 'min' => 1, - 'max' => -1, - 'children' => $this->AttributeValue - ) - ) - ); - - // adapted from - - $Attributes = array( - 'type' => FILE_ASN1_TYPE_SET, - 'min' => 1, - 'max' => -1, - 'children' => $Attribute - ); - - $CertificationRequestInfo = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'version' => array( - 'type' => FILE_ASN1_TYPE_INTEGER, - 'mapping' => array('v1') - ), - 'subject' => $this->Name, - 'subjectPKInfo' => $SubjectPublicKeyInfo, - 'attributes' => array( - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ) + $Attributes, - ) - ); - - $this->CertificationRequest = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'certificationRequestInfo' => $CertificationRequestInfo, - 'signatureAlgorithm' => $AlgorithmIdentifier, - 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) - ) - ); - - $RevokedCertificate = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'userCertificate' => $CertificateSerialNumber, - 'revocationDate' => $Time, - 'crlEntryExtensions' => array( - 'optional' => true - ) + $this->Extensions - ) - ); - - $TBSCertList = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'version' => array( - 'optional' => true, - 'default' => 'v1' - ) + $Version, - 'signature' => $AlgorithmIdentifier, - 'issuer' => $this->Name, - 'thisUpdate' => $Time, - 'nextUpdate' => array( - 'optional' => true - ) + $Time, - 'revokedCertificates' => array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'optional' => true, - 'min' => 0, - 'max' => -1, - 'children' => $RevokedCertificate - ), - 'crlExtensions' => array( - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ) + $this->Extensions - ) - ); - - $this->CertificateList = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'tbsCertList' => $TBSCertList, - 'signatureAlgorithm' => $AlgorithmIdentifier, - 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) - ) - ); - - $this->CRLNumber = array('type' => FILE_ASN1_TYPE_INTEGER); - - $this->CRLReason = array('type' => FILE_ASN1_TYPE_ENUMERATED, - 'mapping' => array( - 'unspecified', - 'keyCompromise', - 'cACompromise', - 'affiliationChanged', - 'superseded', - 'cessationOfOperation', - 'certificateHold', - // Value 7 is not used. - 8 => 'removeFromCRL', - 'privilegeWithdrawn', - 'aACompromise' - ) - ); - - $this->IssuingDistributionPoint = array('type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'distributionPoint' => array( - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ) + $DistributionPointName, - 'onlyContainsUserCerts' => array( - 'type' => FILE_ASN1_TYPE_BOOLEAN, - 'constant' => 1, - 'optional' => true, - 'default' => false, - 'implicit' => true - ), - 'onlyContainsCACerts' => array( - 'type' => FILE_ASN1_TYPE_BOOLEAN, - 'constant' => 2, - 'optional' => true, - 'default' => false, - 'implicit' => true - ), - 'onlySomeReasons' => array( - 'constant' => 3, - 'optional' => true, - 'implicit' => true - ) + $ReasonFlags, - 'indirectCRL' => array( - 'type' => FILE_ASN1_TYPE_BOOLEAN, - 'constant' => 4, - 'optional' => true, - 'default' => false, - 'implicit' => true - ), - 'onlyContainsAttributeCerts' => array( - 'type' => FILE_ASN1_TYPE_BOOLEAN, - 'constant' => 5, - 'optional' => true, - 'default' => false, - 'implicit' => true - ) - ) - ); - - $this->InvalidityDate = array('type' => FILE_ASN1_TYPE_GENERALIZED_TIME); - - $this->CertificateIssuer = $GeneralNames; - - $this->HoldInstructionCode = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); - - $PublicKeyAndChallenge = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'spki' => $SubjectPublicKeyInfo, - 'challenge' => array('type' => FILE_ASN1_TYPE_IA5_STRING) - ) - ); - - $this->SignedPublicKeyAndChallenge = array( - 'type' => FILE_ASN1_TYPE_SEQUENCE, - 'children' => array( - 'publicKeyAndChallenge' => $PublicKeyAndChallenge, - 'signatureAlgorithm' => $AlgorithmIdentifier, - 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) - ) - ); - - // OIDs from RFC5280 and those RFCs mentioned in RFC5280#section-4.1.1.2 - $this->oids = array( - '1.3.6.1.5.5.7' => 'id-pkix', - '1.3.6.1.5.5.7.1' => 'id-pe', - '1.3.6.1.5.5.7.2' => 'id-qt', - '1.3.6.1.5.5.7.3' => 'id-kp', - '1.3.6.1.5.5.7.48' => 'id-ad', - '1.3.6.1.5.5.7.2.1' => 'id-qt-cps', - '1.3.6.1.5.5.7.2.2' => 'id-qt-unotice', - '1.3.6.1.5.5.7.48.1' =>'id-ad-ocsp', - '1.3.6.1.5.5.7.48.2' => 'id-ad-caIssuers', - '1.3.6.1.5.5.7.48.3' => 'id-ad-timeStamping', - '1.3.6.1.5.5.7.48.5' => 'id-ad-caRepository', - '2.5.4' => 'id-at', - '2.5.4.41' => 'id-at-name', - '2.5.4.4' => 'id-at-surname', - '2.5.4.42' => 'id-at-givenName', - '2.5.4.43' => 'id-at-initials', - '2.5.4.44' => 'id-at-generationQualifier', - '2.5.4.3' => 'id-at-commonName', - '2.5.4.7' => 'id-at-localityName', - '2.5.4.8' => 'id-at-stateOrProvinceName', - '2.5.4.10' => 'id-at-organizationName', - '2.5.4.11' => 'id-at-organizationalUnitName', - '2.5.4.12' => 'id-at-title', - '2.5.4.13' => 'id-at-description', - '2.5.4.46' => 'id-at-dnQualifier', - '2.5.4.6' => 'id-at-countryName', - '2.5.4.5' => 'id-at-serialNumber', - '2.5.4.65' => 'id-at-pseudonym', - '2.5.4.17' => 'id-at-postalCode', - '2.5.4.9' => 'id-at-streetAddress', - '2.5.4.45' => 'id-at-uniqueIdentifier', - '2.5.4.72' => 'id-at-role', - - '0.9.2342.19200300.100.1.25' => 'id-domainComponent', - '1.2.840.113549.1.9' => 'pkcs-9', - '1.2.840.113549.1.9.1' => 'pkcs-9-at-emailAddress', - '2.5.29' => 'id-ce', - '2.5.29.35' => 'id-ce-authorityKeyIdentifier', - '2.5.29.14' => 'id-ce-subjectKeyIdentifier', - '2.5.29.15' => 'id-ce-keyUsage', - '2.5.29.16' => 'id-ce-privateKeyUsagePeriod', - '2.5.29.32' => 'id-ce-certificatePolicies', - '2.5.29.32.0' => 'anyPolicy', - - '2.5.29.33' => 'id-ce-policyMappings', - '2.5.29.17' => 'id-ce-subjectAltName', - '2.5.29.18' => 'id-ce-issuerAltName', - '2.5.29.9' => 'id-ce-subjectDirectoryAttributes', - '2.5.29.19' => 'id-ce-basicConstraints', - '2.5.29.30' => 'id-ce-nameConstraints', - '2.5.29.36' => 'id-ce-policyConstraints', - '2.5.29.31' => 'id-ce-cRLDistributionPoints', - '2.5.29.37' => 'id-ce-extKeyUsage', - '2.5.29.37.0' => 'anyExtendedKeyUsage', - '1.3.6.1.5.5.7.3.1' => 'id-kp-serverAuth', - '1.3.6.1.5.5.7.3.2' => 'id-kp-clientAuth', - '1.3.6.1.5.5.7.3.3' => 'id-kp-codeSigning', - '1.3.6.1.5.5.7.3.4' => 'id-kp-emailProtection', - '1.3.6.1.5.5.7.3.8' => 'id-kp-timeStamping', - '1.3.6.1.5.5.7.3.9' => 'id-kp-OCSPSigning', - '2.5.29.54' => 'id-ce-inhibitAnyPolicy', - '2.5.29.46' => 'id-ce-freshestCRL', - '1.3.6.1.5.5.7.1.1' => 'id-pe-authorityInfoAccess', - '1.3.6.1.5.5.7.1.11' => 'id-pe-subjectInfoAccess', - '2.5.29.20' => 'id-ce-cRLNumber', - '2.5.29.28' => 'id-ce-issuingDistributionPoint', - '2.5.29.27' => 'id-ce-deltaCRLIndicator', - '2.5.29.21' => 'id-ce-cRLReasons', - '2.5.29.29' => 'id-ce-certificateIssuer', - '2.5.29.23' => 'id-ce-holdInstructionCode', - '1.2.840.10040.2' => 'holdInstruction', - '1.2.840.10040.2.1' => 'id-holdinstruction-none', - '1.2.840.10040.2.2' => 'id-holdinstruction-callissuer', - '1.2.840.10040.2.3' => 'id-holdinstruction-reject', - '2.5.29.24' => 'id-ce-invalidityDate', - - '1.2.840.113549.2.2' => 'md2', - '1.2.840.113549.2.5' => 'md5', - '1.3.14.3.2.26' => 'id-sha1', - '1.2.840.10040.4.1' => 'id-dsa', - '1.2.840.10040.4.3' => 'id-dsa-with-sha1', - '1.2.840.113549.1.1' => 'pkcs-1', - '1.2.840.113549.1.1.1' => 'rsaEncryption', - '1.2.840.113549.1.1.2' => 'md2WithRSAEncryption', - '1.2.840.113549.1.1.4' => 'md5WithRSAEncryption', - '1.2.840.113549.1.1.5' => 'sha1WithRSAEncryption', - '1.2.840.10046.2.1' => 'dhpublicnumber', - '2.16.840.1.101.2.1.1.22' => 'id-keyExchangeAlgorithm', - '1.2.840.10045' => 'ansi-X9-62', - '1.2.840.10045.4' => 'id-ecSigType', - '1.2.840.10045.4.1' => 'ecdsa-with-SHA1', - '1.2.840.10045.1' => 'id-fieldType', - '1.2.840.10045.1.1' => 'prime-field', - '1.2.840.10045.1.2' => 'characteristic-two-field', - '1.2.840.10045.1.2.3' => 'id-characteristic-two-basis', - '1.2.840.10045.1.2.3.1' => 'gnBasis', - '1.2.840.10045.1.2.3.2' => 'tpBasis', - '1.2.840.10045.1.2.3.3' => 'ppBasis', - '1.2.840.10045.2' => 'id-publicKeyType', - '1.2.840.10045.2.1' => 'id-ecPublicKey', - '1.2.840.10045.3' => 'ellipticCurve', - '1.2.840.10045.3.0' => 'c-TwoCurve', - '1.2.840.10045.3.0.1' => 'c2pnb163v1', - '1.2.840.10045.3.0.2' => 'c2pnb163v2', - '1.2.840.10045.3.0.3' => 'c2pnb163v3', - '1.2.840.10045.3.0.4' => 'c2pnb176w1', - '1.2.840.10045.3.0.5' => 'c2pnb191v1', - '1.2.840.10045.3.0.6' => 'c2pnb191v2', - '1.2.840.10045.3.0.7' => 'c2pnb191v3', - '1.2.840.10045.3.0.8' => 'c2pnb191v4', - '1.2.840.10045.3.0.9' => 'c2pnb191v5', - '1.2.840.10045.3.0.10' => 'c2pnb208w1', - '1.2.840.10045.3.0.11' => 'c2pnb239v1', - '1.2.840.10045.3.0.12' => 'c2pnb239v2', - '1.2.840.10045.3.0.13' => 'c2pnb239v3', - '1.2.840.10045.3.0.14' => 'c2pnb239v4', - '1.2.840.10045.3.0.15' => 'c2pnb239v5', - '1.2.840.10045.3.0.16' => 'c2pnb272w1', - '1.2.840.10045.3.0.17' => 'c2pnb304w1', - '1.2.840.10045.3.0.18' => 'c2pnb359v1', - '1.2.840.10045.3.0.19' => 'c2pnb368w1', - '1.2.840.10045.3.0.20' => 'c2pnb431r1', - '1.2.840.10045.3.1' => 'primeCurve', - '1.2.840.10045.3.1.1' => 'prime192v1', - '1.2.840.10045.3.1.2' => 'prime192v2', - '1.2.840.10045.3.1.3' => 'prime192v3', - '1.2.840.10045.3.1.4' => 'prime239v1', - '1.2.840.10045.3.1.5' => 'prime239v2', - '1.2.840.10045.3.1.6' => 'prime239v3', - '1.2.840.10045.3.1.7' => 'prime256v1', - '1.2.840.113549.1.1.7' => 'id-RSAES-OAEP', - '1.2.840.113549.1.1.9' => 'id-pSpecified', - '1.2.840.113549.1.1.10' => 'id-RSASSA-PSS', - '1.2.840.113549.1.1.8' => 'id-mgf1', - '1.2.840.113549.1.1.14' => 'sha224WithRSAEncryption', - '1.2.840.113549.1.1.11' => 'sha256WithRSAEncryption', - '1.2.840.113549.1.1.12' => 'sha384WithRSAEncryption', - '1.2.840.113549.1.1.13' => 'sha512WithRSAEncryption', - '2.16.840.1.101.3.4.2.4' => 'id-sha224', - '2.16.840.1.101.3.4.2.1' => 'id-sha256', - '2.16.840.1.101.3.4.2.2' => 'id-sha384', - '2.16.840.1.101.3.4.2.3' => 'id-sha512', - '1.2.643.2.2.4' => 'id-GostR3411-94-with-GostR3410-94', - '1.2.643.2.2.3' => 'id-GostR3411-94-with-GostR3410-2001', - '1.2.643.2.2.20' => 'id-GostR3410-2001', - '1.2.643.2.2.19' => 'id-GostR3410-94', - // Netscape Object Identifiers from "Netscape Certificate Extensions" - '2.16.840.1.113730' => 'netscape', - '2.16.840.1.113730.1' => 'netscape-cert-extension', - '2.16.840.1.113730.1.1' => 'netscape-cert-type', - '2.16.840.1.113730.1.13' => 'netscape-comment', - '2.16.840.1.113730.1.8' => 'netscape-ca-policy-url', - // the following are X.509 extensions not supported by phpseclib - '1.3.6.1.5.5.7.1.12' => 'id-pe-logotype', - '1.2.840.113533.7.65.0' => 'entrustVersInfo', - '2.16.840.1.113733.1.6.9' => 'verisignPrivate', - // for Certificate Signing Requests - // see http://tools.ietf.org/html/rfc2985 - '1.2.840.113549.1.9.2' => 'pkcs-9-at-unstructuredName', // PKCS #9 unstructured name - '1.2.840.113549.1.9.7' => 'pkcs-9-at-challengePassword', // Challenge password for certificate revocations - '1.2.840.113549.1.9.14' => 'pkcs-9-at-extensionRequest' // Certificate extension request - ); - } - - /** - * Load X.509 certificate - * - * Returns an associative array describing the X.509 cert or a false if the cert failed to load - * - * @param String $cert - * @access public - * @return Mixed - */ - function loadX509($cert) - { - if (is_array($cert) && isset($cert['tbsCertificate'])) { - unset($this->currentCert); - unset($this->currentKeyIdentifier); - $this->dn = $cert['tbsCertificate']['subject']; - if (!isset($this->dn)) { - return false; - } - $this->currentCert = $cert; - - $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); - $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; - - unset($this->signatureSubject); - - return $cert; - } - - $asn1 = new File_ASN1(); - - $cert = $this->_extractBER($cert); - - if ($cert === false) { - $this->currentCert = false; - return false; - } - - $asn1->loadOIDs($this->oids); - $decoded = $asn1->decodeBER($cert); - - if (!empty($decoded)) { - $x509 = $asn1->asn1map($decoded[0], $this->Certificate); - } - if (!isset($x509) || $x509 === false) { - $this->currentCert = false; - return false; - } - - $this->signatureSubject = substr($cert, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - - $this->_mapInExtensions($x509, 'tbsCertificate/extensions', $asn1); - - $key = &$x509['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']; - $key = $this->_reformatKey($x509['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], $key); - - $this->currentCert = $x509; - $this->dn = $x509['tbsCertificate']['subject']; - - $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); - $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; - - return $x509; - } - - /** - * Save X.509 certificate - * - * @param Array $cert - * @param Integer $format optional - * @access public - * @return String - */ - function saveX509($cert, $format = FILE_X509_FORMAT_PEM) - { - if (!is_array($cert) || !isset($cert['tbsCertificate'])) { - return false; - } - - switch (true) { - // "case !$a: case !$b: break; default: whatever();" is the same thing as "if ($a && $b) whatever()" - case !($algorithm = $this->_subArray($cert, 'tbsCertificate/subjectPublicKeyInfo/algorithm/algorithm')): - case is_object($cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): - break; - default: - switch ($algorithm) { - case 'rsaEncryption': - $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'] - = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']))); - } - } - - $asn1 = new File_ASN1(); - $asn1->loadOIDs($this->oids); - - $filters = array(); - $type_utf8_string = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - $filters['tbsCertificate']['signature']['parameters'] = $type_utf8_string; - $filters['tbsCertificate']['signature']['issuer']['rdnSequence']['value'] = $type_utf8_string; - $filters['tbsCertificate']['issuer']['rdnSequence']['value'] = $type_utf8_string; - $filters['tbsCertificate']['subject']['rdnSequence']['value'] = $type_utf8_string; - $filters['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['parameters'] = $type_utf8_string; - $filters['signatureAlgorithm']['parameters'] = $type_utf8_string; - $filters['authorityCertIssuer']['directoryName']['rdnSequence']['value'] = $type_utf8_string; - //$filters['policyQualifiers']['qualifier'] = $type_utf8_string; - $filters['distributionPoint']['fullName']['directoryName']['rdnSequence']['value'] = $type_utf8_string; - $filters['directoryName']['rdnSequence']['value'] = $type_utf8_string; - - /* in the case of policyQualifiers/qualifier, the type has to be FILE_ASN1_TYPE_IA5_STRING. - FILE_ASN1_TYPE_PRINTABLE_STRING will cause OpenSSL's X.509 parser to spit out random - characters. - */ - $filters['policyQualifiers']['qualifier'] - = array('type' => FILE_ASN1_TYPE_IA5_STRING); - - $asn1->loadFilters($filters); - - $this->_mapOutExtensions($cert, 'tbsCertificate/extensions', $asn1); - - $cert = $asn1->encodeDER($cert, $this->Certificate); - - switch ($format) { - case FILE_X509_FORMAT_DER: - return $cert; - // case FILE_X509_FORMAT_PEM: - default: - return "-----BEGIN CERTIFICATE-----\r\n" . chunk_split(base64_encode($cert), 64) . '-----END CERTIFICATE-----'; - } - } - - /** - * Map extension values from octet string to extension-specific internal - * format. - * - * @param Array ref $root - * @param String $path - * @param Object $asn1 - * @access private - */ - function _mapInExtensions(&$root, $path, $asn1) - { - $extensions = &$this->_subArray($root, $path); - - if (is_array($extensions)) { - for ($i = 0; $i < count($extensions); $i++) { - $id = $extensions[$i]['extnId']; - $value = &$extensions[$i]['extnValue']; - $value = base64_decode($value); - $decoded = $asn1->decodeBER($value); - /* [extnValue] contains the DER encoding of an ASN.1 value - corresponding to the extension type identified by extnID */ - $map = $this->_getMapping($id); - if (!is_bool($map)) { - $mapped = $asn1->asn1map($decoded[0], $map, array('iPAddress' => array($this, '_decodeIP'))); - $value = $mapped === false ? $decoded[0] : $mapped; - - if ($id == 'id-ce-certificatePolicies') { - for ($j = 0; $j < count($value); $j++) { - if (!isset($value[$j]['policyQualifiers'])) { - continue; - } - for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) { - $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; - $map = $this->_getMapping($subid); - $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier']; - if ($map !== false) { - $decoded = $asn1->decodeBER($subvalue); - $mapped = $asn1->asn1map($decoded[0], $map); - $subvalue = $mapped === false ? $decoded[0] : $mapped; - } - } - } - } - } elseif ($map) { - $value = base64_encode($value); - } - } - } - } - - /** - * Map extension values from extension-specific internal format to - * octet string. - * - * @param Array ref $root - * @param String $path - * @param Object $asn1 - * @access private - */ - function _mapOutExtensions(&$root, $path, $asn1) - { - $extensions = &$this->_subArray($root, $path); - - if (is_array($extensions)) { - $size = count($extensions); - for ($i = 0; $i < $size; $i++) { - $id = $extensions[$i]['extnId']; - $value = &$extensions[$i]['extnValue']; - - switch ($id) { - case 'id-ce-certificatePolicies': - for ($j = 0; $j < count($value); $j++) { - if (!isset($value[$j]['policyQualifiers'])) { - continue; - } - for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) { - $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; - $map = $this->_getMapping($subid); - $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier']; - if ($map !== false) { - // by default File_ASN1 will try to render qualifier as a FILE_ASN1_TYPE_IA5_STRING since it's - // actual type is FILE_ASN1_TYPE_ANY - $subvalue = new File_ASN1_Element($asn1->encodeDER($subvalue, $map)); - } - } - } - break; - case 'id-ce-authorityKeyIdentifier': // use 00 as the serial number instead of an empty string - if (isset($value['authorityCertSerialNumber'])) { - if ($value['authorityCertSerialNumber']->toBytes() == '') { - $temp = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 2) . "\1\0"; - $value['authorityCertSerialNumber'] = new File_ASN1_Element($temp); - } - } - } - - /* [extnValue] contains the DER encoding of an ASN.1 value - corresponding to the extension type identified by extnID */ - $map = $this->_getMapping($id); - if (is_bool($map)) { - if (!$map) { - user_error($id . ' is not a currently supported extension'); - unset($extensions[$i]); - } - } else { - $temp = $asn1->encodeDER($value, $map, array('iPAddress' => array($this, '_encodeIP'))); - $value = base64_encode($temp); - } - } - } - } - - /** - * Map attribute values from ANY type to attribute-specific internal - * format. - * - * @param Array ref $root - * @param String $path - * @param Object $asn1 - * @access private - */ - function _mapInAttributes(&$root, $path, $asn1) - { - $attributes = &$this->_subArray($root, $path); - - if (is_array($attributes)) { - for ($i = 0; $i < count($attributes); $i++) { - $id = $attributes[$i]['type']; - /* $value contains the DER encoding of an ASN.1 value - corresponding to the attribute type identified by type */ - $map = $this->_getMapping($id); - if (is_array($attributes[$i]['value'])) { - $values = &$attributes[$i]['value']; - for ($j = 0; $j < count($values); $j++) { - $value = $asn1->encodeDER($values[$j], $this->AttributeValue); - $decoded = $asn1->decodeBER($value); - if (!is_bool($map)) { - $mapped = $asn1->asn1map($decoded[0], $map); - if ($mapped !== false) { - $values[$j] = $mapped; - } - if ($id == 'pkcs-9-at-extensionRequest') { - $this->_mapInExtensions($values, $j, $asn1); - } - } elseif ($map) { - $values[$j] = base64_encode($value); - } - } - } - } - } - } - - /** - * Map attribute values from attribute-specific internal format to - * ANY type. - * - * @param Array ref $root - * @param String $path - * @param Object $asn1 - * @access private - */ - function _mapOutAttributes(&$root, $path, $asn1) - { - $attributes = &$this->_subArray($root, $path); - - if (is_array($attributes)) { - $size = count($attributes); - for ($i = 0; $i < $size; $i++) { - /* [value] contains the DER encoding of an ASN.1 value - corresponding to the attribute type identified by type */ - $id = $attributes[$i]['type']; - $map = $this->_getMapping($id); - if ($map === false) { - user_error($id . ' is not a currently supported attribute', E_USER_NOTICE); - unset($attributes[$i]); - } elseif (is_array($attributes[$i]['value'])) { - $values = &$attributes[$i]['value']; - for ($j = 0; $j < count($values); $j++) { - switch ($id) { - case 'pkcs-9-at-extensionRequest': - $this->_mapOutExtensions($values, $j, $asn1); - break; - } - - if (!is_bool($map)) { - $temp = $asn1->encodeDER($values[$j], $map); - $decoded = $asn1->decodeBER($temp); - $values[$j] = $asn1->asn1map($decoded[0], $this->AttributeValue); - } - } - } - } - } - } - - /** - * Associate an extension ID to an extension mapping - * - * @param String $extnId - * @access private - * @return Mixed - */ - function _getMapping($extnId) - { - if (!is_string($extnId)) { // eg. if it's a File_ASN1_Element object - return true; - } - - switch ($extnId) { - case 'id-ce-keyUsage': - return $this->KeyUsage; - case 'id-ce-basicConstraints': - return $this->BasicConstraints; - case 'id-ce-subjectKeyIdentifier': - return $this->KeyIdentifier; - case 'id-ce-cRLDistributionPoints': - return $this->CRLDistributionPoints; - case 'id-ce-authorityKeyIdentifier': - return $this->AuthorityKeyIdentifier; - case 'id-ce-certificatePolicies': - return $this->CertificatePolicies; - case 'id-ce-extKeyUsage': - return $this->ExtKeyUsageSyntax; - case 'id-pe-authorityInfoAccess': - return $this->AuthorityInfoAccessSyntax; - case 'id-ce-subjectAltName': - return $this->SubjectAltName; - case 'id-ce-privateKeyUsagePeriod': - return $this->PrivateKeyUsagePeriod; - case 'id-ce-issuerAltName': - return $this->IssuerAltName; - case 'id-ce-policyMappings': - return $this->PolicyMappings; - case 'id-ce-nameConstraints': - return $this->NameConstraints; - - case 'netscape-cert-type': - return $this->netscape_cert_type; - case 'netscape-comment': - return $this->netscape_comment; - case 'netscape-ca-policy-url': - return $this->netscape_ca_policy_url; - - // since id-qt-cps isn't a constructed type it will have already been decoded as a string by the time it gets - // back around to asn1map() and we don't want it decoded again. - //case 'id-qt-cps': - // return $this->CPSuri; - case 'id-qt-unotice': - return $this->UserNotice; - - // the following OIDs are unsupported but we don't want them to give notices when calling saveX509(). - case 'id-pe-logotype': // http://www.ietf.org/rfc/rfc3709.txt - case 'entrustVersInfo': - // http://support.microsoft.com/kb/287547 - case '1.3.6.1.4.1.311.20.2': // szOID_ENROLL_CERTTYPE_EXTENSION - case '1.3.6.1.4.1.311.21.1': // szOID_CERTSRV_CA_VERSION - // "SET Secure Electronic Transaction Specification" - // http://www.maithean.com/docs/set_bk3.pdf - case '2.23.42.7.0': // id-set-hashedRootKey - return true; - - // CSR attributes - case 'pkcs-9-at-unstructuredName': - return $this->PKCS9String; - case 'pkcs-9-at-challengePassword': - return $this->DirectoryString; - case 'pkcs-9-at-extensionRequest': - return $this->Extensions; - - // CRL extensions. - case 'id-ce-cRLNumber': - return $this->CRLNumber; - case 'id-ce-deltaCRLIndicator': - return $this->CRLNumber; - case 'id-ce-issuingDistributionPoint': - return $this->IssuingDistributionPoint; - case 'id-ce-freshestCRL': - return $this->CRLDistributionPoints; - case 'id-ce-cRLReasons': - return $this->CRLReason; - case 'id-ce-invalidityDate': - return $this->InvalidityDate; - case 'id-ce-certificateIssuer': - return $this->CertificateIssuer; - case 'id-ce-holdInstructionCode': - return $this->HoldInstructionCode; - } - - return false; - } - - /** - * Load an X.509 certificate as a certificate authority - * - * @param String $cert - * @access public - * @return Boolean - */ - function loadCA($cert) - { - $olddn = $this->dn; - $oldcert = $this->currentCert; - $oldsigsubj = $this->signatureSubject; - $oldkeyid = $this->currentKeyIdentifier; - - $cert = $this->loadX509($cert); - if (!$cert) { - $this->dn = $olddn; - $this->currentCert = $oldcert; - $this->signatureSubject = $oldsigsubj; - $this->currentKeyIdentifier = $oldkeyid; - - return false; - } - - /* From RFC5280 "PKIX Certificate and CRL Profile": - - If the keyUsage extension is present, then the subject public key - MUST NOT be used to verify signatures on certificates or CRLs unless - the corresponding keyCertSign or cRLSign bit is set. */ - //$keyUsage = $this->getExtension('id-ce-keyUsage'); - //if ($keyUsage && !in_array('keyCertSign', $keyUsage)) { - // return false; - //} - - /* From RFC5280 "PKIX Certificate and CRL Profile": - - The cA boolean indicates whether the certified public key may be used - to verify certificate signatures. If the cA boolean is not asserted, - then the keyCertSign bit in the key usage extension MUST NOT be - asserted. If the basic constraints extension is not present in a - version 3 certificate, or the extension is present but the cA boolean - is not asserted, then the certified public key MUST NOT be used to - verify certificate signatures. */ - //$basicConstraints = $this->getExtension('id-ce-basicConstraints'); - //if (!$basicConstraints || !$basicConstraints['cA']) { - // return false; - //} - - $this->CAs[] = $cert; - - $this->dn = $olddn; - $this->currentCert = $oldcert; - $this->signatureSubject = $oldsigsubj; - - return true; - } - - /** - * Validate an X.509 certificate against a URL - * - * From RFC2818 "HTTP over TLS": - * - * Matching is performed using the matching rules specified by - * [RFC2459]. If more than one identity of a given type is present in - * the certificate (e.g., more than one dNSName name, a match in any one - * of the set is considered acceptable.) Names may contain the wildcard - * character * which is considered to match any single domain name - * component or component fragment. E.g., *.a.com matches foo.a.com but - * not bar.foo.a.com. f*.com matches foo.com but not bar.com. - * - * @param String $url - * @access public - * @return Boolean - */ - function validateURL($url) - { - if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return false; - } - - $components = parse_url($url); - if (!isset($components['host'])) { - return false; - } - - if ($names = $this->getExtension('id-ce-subjectAltName')) { - foreach ($names as $key => $value) { - $value = str_replace(array('.', '*'), array('\.', '[^.]*'), $value); - switch ($key) { - case 'dNSName': - /* From RFC2818 "HTTP over TLS": - - If a subjectAltName extension of type dNSName is present, that MUST - be used as the identity. Otherwise, the (most specific) Common Name - field in the Subject field of the certificate MUST be used. Although - the use of the Common Name is existing practice, it is deprecated and - Certification Authorities are encouraged to use the dNSName instead. */ - if (preg_match('#^' . $value . '$#', $components['host'])) { - return true; - } - break; - case 'iPAddress': - /* From RFC2818 "HTTP over TLS": - - In some cases, the URI is specified as an IP address rather than a - hostname. In this case, the iPAddress subjectAltName must be present - in the certificate and must exactly match the IP in the URI. */ - if (preg_match('#(?:\d{1-3}\.){4}#', $components['host'] . '.') && preg_match('#^' . $value . '$#', $components['host'])) { - return true; - } - } - } - return false; - } - - if ($value = $this->getDNProp('id-at-commonName')) { - $value = str_replace(array('.', '*'), array('\.', '[^.]*'), $value[0]); - return preg_match('#^' . $value . '$#', $components['host']); - } - - return false; - } - - /** - * Validate a date - * - * If $date isn't defined it is assumed to be the current date. - * - * @param Integer $date optional - * @access public - */ - function validateDate($date = null) - { - if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return false; - } - - if (!isset($date)) { - $date = time(); - } - - $notBefore = $this->currentCert['tbsCertificate']['validity']['notBefore']; - $notBefore = isset($notBefore['generalTime']) ? $notBefore['generalTime'] : $notBefore['utcTime']; - - $notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter']; - $notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime']; - - switch (true) { - case $date < @strtotime($notBefore): - case $date > @strtotime($notAfter): - return false; - } - - return true; - } - - /** - * Validate a signature - * - * Works on X.509 certs, CSR's and CRL's. - * Returns true if the signature is verified, false if it is not correct or null on error - * - * By default returns false for self-signed certs. Call validateSignature(false) to make this support - * self-signed. - * - * The behavior of this function is inspired by {@link http://php.net/openssl-verify openssl_verify}. - * - * @param Boolean $caonly optional - * @access public - * @return Mixed - */ - function validateSignature($caonly = true) - { - if (!is_array($this->currentCert) || !isset($this->signatureSubject)) { - return null; - } - - /* TODO: - "emailAddress attribute values are not case-sensitive (e.g., "subscriber@example.com" is the same as "SUBSCRIBER@EXAMPLE.COM")." - -- http://tools.ietf.org/html/rfc5280#section-4.1.2.6 - - implement pathLenConstraint in the id-ce-basicConstraints extension */ - - switch (true) { - case isset($this->currentCert['tbsCertificate']): - // self-signed cert - if ($this->currentCert['tbsCertificate']['issuer'] === $this->currentCert['tbsCertificate']['subject']) { - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier'); - switch (true) { - case !is_array($authorityKey): - case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - $signingCert = $this->currentCert; // working cert - } - } - - if (!empty($this->CAs)) { - for ($i = 0; $i < count($this->CAs); $i++) { - // even if the cert is a self-signed one we still want to see if it's a CA; - // if not, we'll conditionally return an error - $ca = $this->CAs[$i]; - if ($this->currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']) { - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (true) { - case !is_array($authorityKey): - case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - $signingCert = $ca; // working cert - break 2; - } - } - } - if (count($this->CAs) == $i && $caonly) { - return false; - } - } elseif (!isset($signingCert) || $caonly) { - return false; - } - return $this->_validateSignature( - $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], - $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], - $this->currentCert['signatureAlgorithm']['algorithm'], - substr(base64_decode($this->currentCert['signature']), 1), - $this->signatureSubject - ); - case isset($this->currentCert['certificationRequestInfo']): - return $this->_validateSignature( - $this->currentCert['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm'], - $this->currentCert['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], - $this->currentCert['signatureAlgorithm']['algorithm'], - substr(base64_decode($this->currentCert['signature']), 1), - $this->signatureSubject - ); - case isset($this->currentCert['publicKeyAndChallenge']): - return $this->_validateSignature( - $this->currentCert['publicKeyAndChallenge']['spki']['algorithm']['algorithm'], - $this->currentCert['publicKeyAndChallenge']['spki']['subjectPublicKey'], - $this->currentCert['signatureAlgorithm']['algorithm'], - substr(base64_decode($this->currentCert['signature']), 1), - $this->signatureSubject - ); - case isset($this->currentCert['tbsCertList']): - if (!empty($this->CAs)) { - for ($i = 0; $i < count($this->CAs); $i++) { - $ca = $this->CAs[$i]; - if ($this->currentCert['tbsCertList']['issuer'] === $ca['tbsCertificate']['subject']) { - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (true) { - case !is_array($authorityKey): - case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - $signingCert = $ca; // working cert - break 2; - } - } - } - } - if (!isset($signingCert)) { - return false; - } - return $this->_validateSignature( - $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], - $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], - $this->currentCert['signatureAlgorithm']['algorithm'], - substr(base64_decode($this->currentCert['signature']), 1), - $this->signatureSubject - ); - default: - return false; - } - } - - /** - * Validates a signature - * - * Returns true if the signature is verified, false if it is not correct or null on error - * - * @param String $publicKeyAlgorithm - * @param String $publicKey - * @param String $signatureAlgorithm - * @param String $signature - * @param String $signatureSubject - * @access private - * @return Integer - */ - function _validateSignature($publicKeyAlgorithm, $publicKey, $signatureAlgorithm, $signature, $signatureSubject) - { - switch ($publicKeyAlgorithm) { - case 'rsaEncryption': - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - $rsa = new Crypt_RSA(); - $rsa->loadKey($publicKey); - - switch ($signatureAlgorithm) { - case 'md2WithRSAEncryption': - case 'md5WithRSAEncryption': - case 'sha1WithRSAEncryption': - case 'sha224WithRSAEncryption': - case 'sha256WithRSAEncryption': - case 'sha384WithRSAEncryption': - case 'sha512WithRSAEncryption': - $rsa->setHash(preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm)); - $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); - if (!@$rsa->verify($signatureSubject, $signature)) { - return false; - } - break; - default: - return null; - } - break; - default: - return null; - } - - return true; - } - - /** - * Reformat public keys - * - * Reformats a public key to a format supported by phpseclib (if applicable) - * - * @param String $algorithm - * @param String $key - * @access private - * @return String - */ - function _reformatKey($algorithm, $key) - { - switch ($algorithm) { - case 'rsaEncryption': - return - "-----BEGIN RSA PUBLIC KEY-----\r\n" . - // subjectPublicKey is stored as a bit string in X.509 certs. the first byte of a bit string represents how many bits - // in the last byte should be ignored. the following only supports non-zero stuff but as none of the X.509 certs Firefox - // uses as a cert authority actually use a non-zero bit I think it's safe to assume that none do. - chunk_split(base64_encode(substr(base64_decode($key), 1)), 64) . - '-----END RSA PUBLIC KEY-----'; - default: - return $key; - } - } - - /** - * Decodes an IP address - * - * Takes in a base64 encoded "blob" and returns a human readable IP address - * - * @param String $ip - * @access private - * @return String - */ - function _decodeIP($ip) - { - $ip = base64_decode($ip); - list(, $ip) = unpack('N', $ip); - return long2ip($ip); - } - - /** - * Encodes an IP address - * - * Takes a human readable IP address into a base64-encoded "blob" - * - * @param String $ip - * @access private - * @return String - */ - function _encodeIP($ip) - { - return base64_encode(pack('N', ip2long($ip))); - } - - /** - * "Normalizes" a Distinguished Name property - * - * @param String $propName - * @access private - * @return Mixed - */ - function _translateDNProp($propName) - { - switch (strtolower($propName)) { - case 'id-at-countryname': - case 'countryname': - case 'c': - return 'id-at-countryName'; - case 'id-at-organizationname': - case 'organizationname': - case 'o': - return 'id-at-organizationName'; - case 'id-at-dnqualifier': - case 'dnqualifier': - return 'id-at-dnQualifier'; - case 'id-at-commonname': - case 'commonname': - case 'cn': - return 'id-at-commonName'; - case 'id-at-stateorprovincename': - case 'stateorprovincename': - case 'state': - case 'province': - case 'provincename': - case 'st': - return 'id-at-stateOrProvinceName'; - case 'id-at-localityname': - case 'localityname': - case 'l': - return 'id-at-localityName'; - case 'id-emailaddress': - case 'emailaddress': - return 'pkcs-9-at-emailAddress'; - case 'id-at-serialnumber': - case 'serialnumber': - return 'id-at-serialNumber'; - case 'id-at-postalcode': - case 'postalcode': - return 'id-at-postalCode'; - case 'id-at-streetaddress': - case 'streetaddress': - return 'id-at-streetAddress'; - case 'id-at-name': - case 'name': - return 'id-at-name'; - case 'id-at-givenname': - case 'givenname': - return 'id-at-givenName'; - case 'id-at-surname': - case 'surname': - case 'sn': - return 'id-at-surname'; - case 'id-at-initials': - case 'initials': - return 'id-at-initials'; - case 'id-at-generationqualifier': - case 'generationqualifier': - return 'id-at-generationQualifier'; - case 'id-at-organizationalunitname': - case 'organizationalunitname': - case 'ou': - return 'id-at-organizationalUnitName'; - case 'id-at-pseudonym': - case 'pseudonym': - return 'id-at-pseudonym'; - case 'id-at-title': - case 'title': - return 'id-at-title'; - case 'id-at-description': - case 'description': - return 'id-at-description'; - case 'id-at-role': - case 'role': - return 'id-at-role'; - case 'id-at-uniqueidentifier': - case 'uniqueidentifier': - case 'x500uniqueidentifier': - return 'id-at-uniqueIdentifier'; - default: - return false; - } - } - - /** - * Set a Distinguished Name property - * - * @param String $propName - * @param Mixed $propValue - * @param String $type optional - * @access public - * @return Boolean - */ - function setDNProp($propName, $propValue, $type = 'utf8String') - { - if (empty($this->dn)) { - $this->dn = array('rdnSequence' => array()); - } - - if (($propName = $this->_translateDNProp($propName)) === false) { - return false; - } - - foreach ((array) $propValue as $v) { - if (!is_array($v) && isset($type)) { - $v = array($type => $v); - } - $this->dn['rdnSequence'][] = array( - array( - 'type' => $propName, - 'value'=> $v - ) - ); - } - - return true; - } - - /** - * Remove Distinguished Name properties - * - * @param String $propName - * @access public - */ - function removeDNProp($propName) - { - if (empty($this->dn)) { - return; - } - - if (($propName = $this->_translateDNProp($propName)) === false) { - return; - } - - $dn = &$this->dn['rdnSequence']; - $size = count($dn); - for ($i = 0; $i < $size; $i++) { - if ($dn[$i][0]['type'] == $propName) { - unset($dn[$i]); - } - } - - $dn = array_values($dn); - } - - /** - * Get Distinguished Name properties - * - * @param String $propName - * @param Array $dn optional - * @param Boolean $withType optional - * @return Mixed - * @access public - */ - function getDNProp($propName, $dn = null, $withType = false) - { - if (!isset($dn)) { - $dn = $this->dn; - } - - if (empty($dn)) { - return false; - } - - if (($propName = $this->_translateDNProp($propName)) === false) { - return false; - } - - $dn = $dn['rdnSequence']; - $result = array(); - $asn1 = new File_ASN1(); - for ($i = 0; $i < count($dn); $i++) { - if ($dn[$i][0]['type'] == $propName) { - $v = $dn[$i][0]['value']; - if (!$withType && is_array($v)) { - foreach ($v as $type => $s) { - $type = array_search($type, $asn1->ANYmap, true); - if ($type !== false && isset($asn1->stringTypeSize[$type])) { - $s = $asn1->convert($s, $type); - if ($s !== false) { - $v = $s; - break; - } - } - } - if (is_array($v)) { - $v = array_pop($v); // Always strip data type. - } - } - $result[] = $v; - } - } - - return $result; - } - - /** - * Set a Distinguished Name - * - * @param Mixed $dn - * @param Boolean $merge optional - * @param String $type optional - * @access public - * @return Boolean - */ - function setDN($dn, $merge = false, $type = 'utf8String') - { - if (!$merge) { - $this->dn = null; - } - - if (is_array($dn)) { - if (isset($dn['rdnSequence'])) { - $this->dn = $dn; // No merge here. - return true; - } - - // handles stuff generated by openssl_x509_parse() - foreach ($dn as $prop => $value) { - if (!$this->setDNProp($prop, $value, $type)) { - return false; - } - } - return true; - } - - // handles everything else - $results = preg_split('#((?:^|, *|/)(?:C=|O=|OU=|CN=|L=|ST=|SN=|postalCode=|streetAddress=|emailAddress=|serialNumber=|organizationalUnitName=|title=|description=|role=|x500UniqueIdentifier=))#', $dn, -1, PREG_SPLIT_DELIM_CAPTURE); - for ($i = 1; $i < count($results); $i+=2) { - $prop = trim($results[$i], ', =/'); - $value = $results[$i + 1]; - if (!$this->setDNProp($prop, $value, $type)) { - return false; - } - } - - return true; - } - - /** - * Get the Distinguished Name for a certificates subject - * - * @param Mixed $format optional - * @param Array $dn optional - * @access public - * @return Boolean - */ - function getDN($format = FILE_X509_DN_ARRAY, $dn = null) - { - if (!isset($dn)) { - $dn = isset($this->currentCert['tbsCertList']) ? $this->currentCert['tbsCertList']['issuer'] : $this->dn; - } - - switch ((int) $format) { - case FILE_X509_DN_ARRAY: - return $dn; - case FILE_X509_DN_ASN1: - $asn1 = new File_ASN1(); - $asn1->loadOIDs($this->oids); - $filters = array(); - $filters['rdnSequence']['value'] = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - $asn1->loadFilters($filters); - return $asn1->encodeDER($dn, $this->Name); - case FILE_X509_DN_OPENSSL: - $dn = $this->getDN(FILE_X509_DN_STRING, $dn); - if ($dn === false) { - return false; - } - $attrs = preg_split('#((?:^|, *|/)[a-z][a-z0-9]*=)#i', $dn, -1, PREG_SPLIT_DELIM_CAPTURE); - $dn = array(); - for ($i = 1; $i < count($attrs); $i += 2) { - $prop = trim($attrs[$i], ', =/'); - $value = $attrs[$i + 1]; - if (!isset($dn[$prop])) { - $dn[$prop] = $value; - } else { - $dn[$prop] = array_merge((array) $dn[$prop], array($value)); - } - } - return $dn; - case FILE_X509_DN_CANON: - // No SEQUENCE around RDNs and all string values normalized as - // trimmed lowercase UTF-8 with all spacing as one blank. - $asn1 = new File_ASN1(); - $asn1->loadOIDs($this->oids); - $filters = array(); - $filters['value'] = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - $asn1->loadFilters($filters); - $result = ''; - foreach ($dn['rdnSequence'] as $rdn) { - foreach ($rdn as $i=>$attr) { - $attr = &$rdn[$i]; - if (is_array($attr['value'])) { - foreach ($attr['value'] as $type => $v) { - $type = array_search($type, $asn1->ANYmap, true); - if ($type !== false && isset($asn1->stringTypeSize[$type])) { - $v = $asn1->convert($v, $type); - if ($v !== false) { - $v = preg_replace('/\s+/', ' ', $v); - $attr['value'] = strtolower(trim($v)); - break; - } - } - } - } - } - $result .= $asn1->encodeDER($rdn, $this->RelativeDistinguishedName); - } - return $result; - case FILE_X509_DN_HASH: - $dn = $this->getDN(FILE_X509_DN_CANON, $dn); - if (!class_exists('Crypt_Hash')) { - include_once 'Crypt/Hash.php'; - } - $hash = new Crypt_Hash('sha1'); - $hash = $hash->hash($dn); - extract(unpack('Vhash', $hash)); - return strtolower(bin2hex(pack('N', $hash))); - } - - // Default is to return a string. - $start = true; - $output = ''; - $asn1 = new File_ASN1(); - foreach ($dn['rdnSequence'] as $field) { - $prop = $field[0]['type']; - $value = $field[0]['value']; - - $delim = ', '; - switch ($prop) { - case 'id-at-countryName': - $desc = 'C='; - break; - case 'id-at-stateOrProvinceName': - $desc = 'ST='; - break; - case 'id-at-organizationName': - $desc = 'O='; - break; - case 'id-at-organizationalUnitName': - $desc = 'OU='; - break; - case 'id-at-commonName': - $desc = 'CN='; - break; - case 'id-at-localityName': - $desc = 'L='; - break; - case 'id-at-surname': - $desc = 'SN='; - break; - case 'id-at-uniqueIdentifier': - $delim = '/'; - $desc = 'x500UniqueIdentifier='; - break; - default: - $delim = '/'; - $desc = preg_replace('#.+-([^-]+)$#', '$1', $prop) . '='; - } - - if (!$start) { - $output.= $delim; - } - if (is_array($value)) { - foreach ($value as $type => $v) { - $type = array_search($type, $asn1->ANYmap, true); - if ($type !== false && isset($asn1->stringTypeSize[$type])) { - $v = $asn1->convert($v, $type); - if ($v !== false) { - $value = $v; - break; - } - } - } - if (is_array($value)) { - $value = array_pop($value); // Always strip data type. - } - } - $output.= $desc . $value; - $start = false; - } - - return $output; - } - - /** - * Get the Distinguished Name for a certificate/crl issuer - * - * @param Integer $format optional - * @access public - * @return Mixed - */ - function getIssuerDN($format = FILE_X509_DN_ARRAY) - { - switch (true) { - case !isset($this->currentCert) || !is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDN($format, $this->currentCert['tbsCertificate']['issuer']); - case isset($this->currentCert['tbsCertList']): - return $this->getDN($format, $this->currentCert['tbsCertList']['issuer']); - } - - return false; - } - - /** - * Get the Distinguished Name for a certificate/csr subject - * Alias of getDN() - * - * @param Integer $format optional - * @access public - * @return Mixed - */ - function getSubjectDN($format = FILE_X509_DN_ARRAY) - { - switch (true) { - case !empty($this->dn): - return $this->getDN($format); - case !isset($this->currentCert) || !is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDN($format, $this->currentCert['tbsCertificate']['subject']); - case isset($this->currentCert['certificationRequestInfo']): - return $this->getDN($format, $this->currentCert['certificationRequestInfo']['subject']); - } - - return false; - } - - /** - * Get an individual Distinguished Name property for a certificate/crl issuer - * - * @param String $propName - * @param Boolean $withType optional - * @access public - * @return Mixed - */ - function getIssuerDNProp($propName, $withType = false) - { - switch (true) { - case !isset($this->currentCert) || !is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['issuer'], $withType); - case isset($this->currentCert['tbsCertList']): - return $this->getDNProp($propName, $this->currentCert['tbsCertList']['issuer'], $withType); - } - - return false; - } - - /** - * Get an individual Distinguished Name property for a certificate/csr subject - * - * @param String $propName - * @param Boolean $withType optional - * @access public - * @return Mixed - */ - function getSubjectDNProp($propName, $withType = false) - { - switch (true) { - case !empty($this->dn): - return $this->getDNProp($propName, null, $withType); - case !isset($this->currentCert) || !is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['subject'], $withType); - case isset($this->currentCert['certificationRequestInfo']): - return $this->getDNProp($propName, $this->currentCert['certificationRequestInfo']['subject'], $withType); - } - - return false; - } - - /** - * Get the certificate chain for the current cert - * - * @access public - * @return Mixed - */ - function getChain() - { - $chain = array($this->currentCert); - - if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return false; - } - if (empty($this->CAs)) { - return $chain; - } - while (true) { - $currentCert = $chain[count($chain) - 1]; - for ($i = 0; $i < count($this->CAs); $i++) { - $ca = $this->CAs[$i]; - if ($currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']) { - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier', $currentCert); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (true) { - case !is_array($authorityKey): - case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - if ($currentCert === $ca) { - break 3; - } - $chain[] = $ca; - break 2; - } - } - } - if ($i == count($this->CAs)) { - break; - } - } - foreach ($chain as $key=>$value) { - $chain[$key] = new File_X509(); - $chain[$key]->loadX509($value); - } - return $chain; - } - - /** - * Set public key - * - * Key needs to be a Crypt_RSA object - * - * @param Object $key - * @access public - * @return Boolean - */ - function setPublicKey($key) - { - $key->setPublicKey(); - $this->publicKey = $key; - } - - /** - * Set private key - * - * Key needs to be a Crypt_RSA object - * - * @param Object $key - * @access public - */ - function setPrivateKey($key) - { - $this->privateKey = $key; - } - - /** - * Set challenge - * - * Used for SPKAC CSR's - * - * @param String $challenge - * @access public - */ - function setChallenge($challenge) - { - $this->challenge = $challenge; - } - - /** - * Gets the public key - * - * Returns a Crypt_RSA object or a false. - * - * @access public - * @return Mixed - */ - function getPublicKey() - { - if (isset($this->publicKey)) { - return $this->publicKey; - } - - if (isset($this->currentCert) && is_array($this->currentCert)) { - foreach (array('tbsCertificate/subjectPublicKeyInfo', 'certificationRequestInfo/subjectPKInfo') as $path) { - $keyinfo = $this->_subArray($this->currentCert, $path); - if (!empty($keyinfo)) { - break; - } - } - } - if (empty($keyinfo)) { - return false; - } - - $key = $keyinfo['subjectPublicKey']; - - switch ($keyinfo['algorithm']['algorithm']) { - case 'rsaEncryption': - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - $publicKey = new Crypt_RSA(); - $publicKey->loadKey($key); - $publicKey->setPublicKey(); - break; - default: - return false; - } - - return $publicKey; - } - - /** - * Load a Certificate Signing Request - * - * @param String $csr - * @access public - * @return Mixed - */ - function loadCSR($csr) - { - if (is_array($csr) && isset($csr['certificationRequestInfo'])) { - unset($this->currentCert); - unset($this->currentKeyIdentifier); - unset($this->signatureSubject); - $this->dn = $csr['certificationRequestInfo']['subject']; - if (!isset($this->dn)) { - return false; - } - - $this->currentCert = $csr; - return $csr; - } - - // see http://tools.ietf.org/html/rfc2986 - - $asn1 = new File_ASN1(); - - $csr = $this->_extractBER($csr); - $orig = $csr; - - if ($csr === false) { - $this->currentCert = false; - return false; - } - - $asn1->loadOIDs($this->oids); - $decoded = $asn1->decodeBER($csr); - - if (empty($decoded)) { - $this->currentCert = false; - return false; - } - - $csr = $asn1->asn1map($decoded[0], $this->CertificationRequest); - if (!isset($csr) || $csr === false) { - $this->currentCert = false; - return false; - } - - $this->dn = $csr['certificationRequestInfo']['subject']; - $this->_mapInAttributes($csr, 'certificationRequestInfo/attributes', $asn1); - - $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - - $algorithm = &$csr['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm']; - $key = &$csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']; - $key = $this->_reformatKey($algorithm, $key); - - switch ($algorithm) { - case 'rsaEncryption': - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - $this->publicKey = new Crypt_RSA(); - $this->publicKey->loadKey($key); - $this->publicKey->setPublicKey(); - break; - default: - $this->publicKey = null; - } - - $this->currentKeyIdentifier = null; - $this->currentCert = $csr; - - return $csr; - } - - /** - * Save CSR request - * - * @param Array $csr - * @param Integer $format optional - * @access public - * @return String - */ - function saveCSR($csr, $format = FILE_X509_FORMAT_PEM) - { - if (!is_array($csr) || !isset($csr['certificationRequestInfo'])) { - return false; - } - - switch (true) { - case !($algorithm = $this->_subArray($csr, 'certificationRequestInfo/subjectPKInfo/algorithm/algorithm')): - case is_object($csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']); - break; - default: - switch ($algorithm) { - case 'rsaEncryption': - $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'] - = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']))); - } - } - - $asn1 = new File_ASN1(); - - $asn1->loadOIDs($this->oids); - - $filters = array(); - $filters['certificationRequestInfo']['subject']['rdnSequence']['value'] - = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - - $asn1->loadFilters($filters); - - $this->_mapOutAttributes($csr, 'certificationRequestInfo/attributes', $asn1); - $csr = $asn1->encodeDER($csr, $this->CertificationRequest); - - switch ($format) { - case FILE_X509_FORMAT_DER: - return $csr; - // case FILE_X509_FORMAT_PEM: - default: - return "-----BEGIN CERTIFICATE REQUEST-----\r\n" . chunk_split(base64_encode($csr), 64) . '-----END CERTIFICATE REQUEST-----'; - } - } - - /** - * Load a SPKAC CSR - * - * SPKAC's are produced by the HTML5 keygen element: - * - * https://developer.mozilla.org/en-US/docs/HTML/Element/keygen - * - * @param String $csr - * @access public - * @return Mixed - */ - function loadSPKAC($spkac) - { - if (is_array($spkac) && isset($spkac['publicKeyAndChallenge'])) { - unset($this->currentCert); - unset($this->currentKeyIdentifier); - unset($this->signatureSubject); - $this->currentCert = $spkac; - return $spkac; - } - - // see http://www.w3.org/html/wg/drafts/html/master/forms.html#signedpublickeyandchallenge - - $asn1 = new File_ASN1(); - - // OpenSSL produces SPKAC's that are preceeded by the string SPKAC= - $temp = preg_replace('#(?:SPKAC=)|[ \r\n\\\]#', '', $spkac); - $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; - if ($temp != false) { - $spkac = $temp; - } - $orig = $spkac; - - if ($spkac === false) { - $this->currentCert = false; - return false; - } - - $asn1->loadOIDs($this->oids); - $decoded = $asn1->decodeBER($spkac); - - if (empty($decoded)) { - $this->currentCert = false; - return false; - } - - $spkac = $asn1->asn1map($decoded[0], $this->SignedPublicKeyAndChallenge); - - if (!isset($spkac) || $spkac === false) { - $this->currentCert = false; - return false; - } - - $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - - $algorithm = &$spkac['publicKeyAndChallenge']['spki']['algorithm']['algorithm']; - $key = &$spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']; - $key = $this->_reformatKey($algorithm, $key); - - switch ($algorithm) { - case 'rsaEncryption': - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - $this->publicKey = new Crypt_RSA(); - $this->publicKey->loadKey($key); - $this->publicKey->setPublicKey(); - break; - default: - $this->publicKey = null; - } - - $this->currentKeyIdentifier = null; - $this->currentCert = $spkac; - - return $spkac; - } - - /** - * Save a SPKAC CSR request - * - * @param Array $csr - * @param Integer $format optional - * @access public - * @return String - */ - function saveSPKAC($spkac, $format = FILE_X509_FORMAT_PEM) - { - if (!is_array($spkac) || !isset($spkac['publicKeyAndChallenge'])) { - return false; - } - - $algorithm = $this->_subArray($spkac, 'publicKeyAndChallenge/spki/algorithm/algorithm'); - switch (true) { - case !$algorithm: - case is_object($spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']); - break; - default: - switch ($algorithm) { - case 'rsaEncryption': - $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey'] - = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']))); - } - } - - $asn1 = new File_ASN1(); - - $asn1->loadOIDs($this->oids); - $spkac = $asn1->encodeDER($spkac, $this->SignedPublicKeyAndChallenge); - - switch ($format) { - case FILE_X509_FORMAT_DER: - return $spkac; - // case FILE_X509_FORMAT_PEM: - default: - // OpenSSL's implementation of SPKAC requires the SPKAC be preceeded by SPKAC= and since there are pretty much - // no other SPKAC decoders phpseclib will use that same format - return 'SPKAC=' . base64_encode($spkac); - } - } - - /** - * Load a Certificate Revocation List - * - * @param String $crl - * @access public - * @return Mixed - */ - function loadCRL($crl) - { - if (is_array($crl) && isset($crl['tbsCertList'])) { - $this->currentCert = $crl; - unset($this->signatureSubject); - return $crl; - } - - $asn1 = new File_ASN1(); - - $crl = $this->_extractBER($crl); - $orig = $crl; - - if ($crl === false) { - $this->currentCert = false; - return false; - } - - $asn1->loadOIDs($this->oids); - $decoded = $asn1->decodeBER($crl); - - if (empty($decoded)) { - $this->currentCert = false; - return false; - } - - $crl = $asn1->asn1map($decoded[0], $this->CertificateList); - if (!isset($crl) || $crl === false) { - $this->currentCert = false; - return false; - } - - $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - - $this->_mapInExtensions($crl, 'tbsCertList/crlExtensions', $asn1); - $rclist = &$this->_subArray($crl, 'tbsCertList/revokedCertificates'); - if (is_array($rclist)) { - foreach ($rclist as $i => $extension) { - $this->_mapInExtensions($rclist, "$i/crlEntryExtensions", $asn1); - } - } - - $this->currentKeyIdentifier = null; - $this->currentCert = $crl; - - return $crl; - } - - /** - * Save Certificate Revocation List. - * - * @param Array $crl - * @param Integer $format optional - * @access public - * @return String - */ - function saveCRL($crl, $format = FILE_X509_FORMAT_PEM) - { - if (!is_array($crl) || !isset($crl['tbsCertList'])) { - return false; - } - - $asn1 = new File_ASN1(); - - $asn1->loadOIDs($this->oids); - - $filters = array(); - $filters['tbsCertList']['issuer']['rdnSequence']['value'] - = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - $filters['tbsCertList']['signature']['parameters'] - = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - $filters['signatureAlgorithm']['parameters'] - = array('type' => FILE_ASN1_TYPE_UTF8_STRING); - - if (empty($crl['tbsCertList']['signature']['parameters'])) { - $filters['tbsCertList']['signature']['parameters'] - = array('type' => FILE_ASN1_TYPE_NULL); - } - - if (empty($crl['signatureAlgorithm']['parameters'])) { - $filters['signatureAlgorithm']['parameters'] - = array('type' => FILE_ASN1_TYPE_NULL); - } - - $asn1->loadFilters($filters); - - $this->_mapOutExtensions($crl, 'tbsCertList/crlExtensions', $asn1); - $rclist = &$this->_subArray($crl, 'tbsCertList/revokedCertificates'); - if (is_array($rclist)) { - foreach ($rclist as $i => $extension) { - $this->_mapOutExtensions($rclist, "$i/crlEntryExtensions", $asn1); - } - } - - $crl = $asn1->encodeDER($crl, $this->CertificateList); - - switch ($format) { - case FILE_X509_FORMAT_DER: - return $crl; - // case FILE_X509_FORMAT_PEM: - default: - return "-----BEGIN X509 CRL-----\r\n" . chunk_split(base64_encode($crl), 64) . '-----END X509 CRL-----'; - } - } - - /** - * Helper function to build a time field according to RFC 3280 section - * - 4.1.2.5 Validity - * - 5.1.2.4 This Update - * - 5.1.2.5 Next Update - * - 5.1.2.6 Revoked Certificates - * by choosing utcTime iff year of date given is before 2050 and generalTime else. - * - * @param String $date in format date('D, d M Y H:i:s O') - * @access private - * @return Array - */ - function _timeField($date) - { - $year = @gmdate("Y", @strtotime($date)); // the same way ASN1.php parses this - if ($year < 2050) { - return array('utcTime' => $date); - } else { - return array('generalTime' => $date); - } - } - - /** - * Sign an X.509 certificate - * - * $issuer's private key needs to be loaded. - * $subject can be either an existing X.509 cert (if you want to resign it), - * a CSR or something with the DN and public key explicitly set. - * - * @param File_X509 $issuer - * @param File_X509 $subject - * @param String $signatureAlgorithm optional - * @access public - * @return Mixed - */ - function sign($issuer, $subject, $signatureAlgorithm = 'sha1WithRSAEncryption') - { - if (!is_object($issuer->privateKey) || empty($issuer->dn)) { - return false; - } - - if (isset($subject->publicKey) && !($subjectPublicKey = $subject->_formatSubjectPublicKey())) { - return false; - } - - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null; - - if (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertificate'])) { - $this->currentCert = $subject->currentCert; - $this->currentCert['tbsCertificate']['signature']['algorithm'] = $signatureAlgorithm; - $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; - - if (!empty($this->startDate)) { - $this->currentCert['tbsCertificate']['validity']['notBefore'] = $this->_timeField($this->startDate); - } - if (!empty($this->endDate)) { - $this->currentCert['tbsCertificate']['validity']['notAfter'] = $this->_timeField($this->endDate); - } - if (!empty($this->serialNumber)) { - $this->currentCert['tbsCertificate']['serialNumber'] = $this->serialNumber; - } - if (!empty($subject->dn)) { - $this->currentCert['tbsCertificate']['subject'] = $subject->dn; - } - if (!empty($subject->publicKey)) { - $this->currentCert['tbsCertificate']['subjectPublicKeyInfo'] = $subjectPublicKey; - } - $this->removeExtension('id-ce-authorityKeyIdentifier'); - if (isset($subject->domains)) { - $this->removeExtension('id-ce-subjectAltName'); - } - } else if (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertList'])) { - return false; - } else { - if (!isset($subject->publicKey)) { - return false; - } - - $startDate = !empty($this->startDate) ? $this->startDate : @date('D, d M Y H:i:s O'); - $endDate = !empty($this->endDate) ? $this->endDate : @date('D, d M Y H:i:s O', strtotime('+1 year')); - $serialNumber = !empty($this->serialNumber) ? $this->serialNumber : new Math_BigInteger(); - - $this->currentCert = array( - 'tbsCertificate' => - array( - 'version' => 'v3', - 'serialNumber' => $serialNumber, // $this->setserialNumber() - 'signature' => array('algorithm' => $signatureAlgorithm), - 'issuer' => false, // this is going to be overwritten later - 'validity' => array( - 'notBefore' => $this->_timeField($startDate), // $this->setStartDate() - 'notAfter' => $this->_timeField($endDate) // $this->setEndDate() - ), - 'subject' => $subject->dn, - 'subjectPublicKeyInfo' => $subjectPublicKey - ), - 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), - 'signature' => false // this is going to be overwritten later - ); - - // Copy extensions from CSR. - $csrexts = $subject->getAttribute('pkcs-9-at-extensionRequest', 0); - - if (!empty($csrexts)) { - $this->currentCert['tbsCertificate']['extensions'] = $csrexts; - } - } - - $this->currentCert['tbsCertificate']['issuer'] = $issuer->dn; - - if (isset($issuer->currentKeyIdentifier)) { - $this->setExtension('id-ce-authorityKeyIdentifier', array( - //'authorityCertIssuer' => array( - // array( - // 'directoryName' => $issuer->dn - // ) - //), - 'keyIdentifier' => $issuer->currentKeyIdentifier - ) - ); - //$extensions = &$this->currentCert['tbsCertificate']['extensions']; - //if (isset($issuer->serialNumber)) { - // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; - //} - //unset($extensions); - } - - if (isset($subject->currentKeyIdentifier)) { - $this->setExtension('id-ce-subjectKeyIdentifier', $subject->currentKeyIdentifier); - } - - $altName = array(); - - if (isset($subject->domains) && count($subject->domains) > 1) { - $altName = array_map(array('File_X509', '_dnsName'), $subject->domains); - } - - if (isset($subject->ipAddresses) && count($subject->ipAddresses)) { - // should an IP address appear as the CN if no domain name is specified? idk - //$ips = count($subject->domains) ? $subject->ipAddresses : array_slice($subject->ipAddresses, 1); - $ipAddresses = array(); - foreach ($subject->ipAddresses as $ipAddress) { - $encoded = $subject->_ipAddress($ipAddress); - if ($encoded !== false) { - $ipAddresses[] = $encoded; - } - } - if (count($ipAddresses)) { - $altName = array_merge($altName, $ipAddresses); - } - } - - if (!empty($altName)) { - $this->setExtension('id-ce-subjectAltName', $altName); - } - - if ($this->caFlag) { - $keyUsage = $this->getExtension('id-ce-keyUsage'); - if (!$keyUsage) { - $keyUsage = array(); - } - - $this->setExtension('id-ce-keyUsage', - array_values(array_unique(array_merge($keyUsage, array('cRLSign', 'keyCertSign')))) - ); - - $basicConstraints = $this->getExtension('id-ce-basicConstraints'); - if (!$basicConstraints) { - $basicConstraints = array(); - } - - $this->setExtension('id-ce-basicConstraints', - array_unique(array_merge(array('cA' => true), $basicConstraints)), true); - - if (!isset($subject->currentKeyIdentifier)) { - $this->setExtension('id-ce-subjectKeyIdentifier', base64_encode($this->computeKeyIdentifier($this->currentCert)), false, false); - } - } - - // resync $this->signatureSubject - // save $tbsCertificate in case there are any File_ASN1_Element objects in it - $tbsCertificate = $this->currentCert['tbsCertificate']; - $this->loadX509($this->saveX509($this->currentCert)); - - $result = $this->_sign($issuer->privateKey, $signatureAlgorithm); - $result['tbsCertificate'] = $tbsCertificate; - - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - - return $result; - } - - /** - * Sign a CSR - * - * @access public - * @return Mixed - */ - function signCSR($signatureAlgorithm = 'sha1WithRSAEncryption') - { - if (!is_object($this->privateKey) || empty($this->dn)) { - return false; - } - - $origPublicKey = $this->publicKey; - $class = get_class($this->privateKey); - $this->publicKey = new $class(); - $this->publicKey->loadKey($this->privateKey->getPublicKey()); - $this->publicKey->setPublicKey(); - if (!($publicKey = $this->_formatSubjectPublicKey())) { - return false; - } - $this->publicKey = $origPublicKey; - - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null; - - if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['certificationRequestInfo'])) { - $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; - if (!empty($this->dn)) { - $this->currentCert['certificationRequestInfo']['subject'] = $this->dn; - } - $this->currentCert['certificationRequestInfo']['subjectPKInfo'] = $publicKey; - } else { - $this->currentCert = array( - 'certificationRequestInfo' => - array( - 'version' => 'v1', - 'subject' => $this->dn, - 'subjectPKInfo' => $publicKey - ), - 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), - 'signature' => false // this is going to be overwritten later - ); - } - - // resync $this->signatureSubject - // save $certificationRequestInfo in case there are any File_ASN1_Element objects in it - $certificationRequestInfo = $this->currentCert['certificationRequestInfo']; - $this->loadCSR($this->saveCSR($this->currentCert)); - - $result = $this->_sign($this->privateKey, $signatureAlgorithm); - $result['certificationRequestInfo'] = $certificationRequestInfo; - - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - - return $result; - } - - /** - * Sign a SPKAC - * - * @access public - * @return Mixed - */ - function signSPKAC($signatureAlgorithm = 'sha1WithRSAEncryption') - { - if (!is_object($this->privateKey)) { - return false; - } - - $origPublicKey = $this->publicKey; - $class = get_class($this->privateKey); - $this->publicKey = new $class(); - $this->publicKey->loadKey($this->privateKey->getPublicKey()); - $this->publicKey->setPublicKey(); - $publicKey = $this->_formatSubjectPublicKey(); - if (!$publicKey) { - return false; - } - $this->publicKey = $origPublicKey; - - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null; - - // re-signing a SPKAC seems silly but since everything else supports re-signing why not? - if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['publicKeyAndChallenge'])) { - $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; - $this->currentCert['publicKeyAndChallenge']['spki'] = $publicKey; - if (!empty($this->challenge)) { - // the bitwise AND ensures that the output is a valid IA5String - $this->currentCert['publicKeyAndChallenge']['challenge'] = $this->challenge & str_repeat("\x7F", strlen($this->challenge)); - } - } else { - $this->currentCert = array( - 'publicKeyAndChallenge' => - array( - 'spki' => $publicKey, - // quoting , - // "A challenge string that is submitted along with the public key. Defaults to an empty string if not specified." - // both Firefox and OpenSSL ("openssl spkac -key private.key") behave this way - // we could alternatively do this instead if we ignored the specs: - // crypt_random_string(8) & str_repeat("\x7F", 8) - 'challenge' => !empty($this->challenge) ? $this->challenge : '' - ), - 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), - 'signature' => false // this is going to be overwritten later - ); - } - - // resync $this->signatureSubject - // save $publicKeyAndChallenge in case there are any File_ASN1_Element objects in it - $publicKeyAndChallenge = $this->currentCert['publicKeyAndChallenge']; - $this->loadSPKAC($this->saveSPKAC($this->currentCert)); - - $result = $this->_sign($this->privateKey, $signatureAlgorithm); - $result['publicKeyAndChallenge'] = $publicKeyAndChallenge; - - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - - return $result; - } - - /** - * Sign a CRL - * - * $issuer's private key needs to be loaded. - * - * @param File_X509 $issuer - * @param File_X509 $crl - * @param String $signatureAlgorithm optional - * @access public - * @return Mixed - */ - function signCRL($issuer, $crl, $signatureAlgorithm = 'sha1WithRSAEncryption') - { - if (!is_object($issuer->privateKey) || empty($issuer->dn)) { - return false; - } - - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; - $thisUpdate = !empty($this->startDate) ? $this->startDate : @date('D, d M Y H:i:s O'); - - if (isset($crl->currentCert) && is_array($crl->currentCert) && isset($crl->currentCert['tbsCertList'])) { - $this->currentCert = $crl->currentCert; - $this->currentCert['tbsCertList']['signature']['algorithm'] = $signatureAlgorithm; - $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; - } else { - $this->currentCert = array( - 'tbsCertList' => - array( - 'version' => 'v2', - 'signature' => array('algorithm' => $signatureAlgorithm), - 'issuer' => false, // this is going to be overwritten later - 'thisUpdate' => $this->_timeField($thisUpdate) // $this->setStartDate() - ), - 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), - 'signature' => false // this is going to be overwritten later - ); - } - - $tbsCertList = &$this->currentCert['tbsCertList']; - $tbsCertList['issuer'] = $issuer->dn; - $tbsCertList['thisUpdate'] = $this->_timeField($thisUpdate); - - if (!empty($this->endDate)) { - $tbsCertList['nextUpdate'] = $this->_timeField($this->endDate); // $this->setEndDate() - } else { - unset($tbsCertList['nextUpdate']); - } - - if (!empty($this->serialNumber)) { - $crlNumber = $this->serialNumber; - } else { - $crlNumber = $this->getExtension('id-ce-cRLNumber'); - $crlNumber = $crlNumber !== false ? $crlNumber->add(new Math_BigInteger(1)) : null; - } - - $this->removeExtension('id-ce-authorityKeyIdentifier'); - $this->removeExtension('id-ce-issuerAltName'); - - // Be sure version >= v2 if some extension found. - $version = isset($tbsCertList['version']) ? $tbsCertList['version'] : 0; - if (!$version) { - if (!empty($tbsCertList['crlExtensions'])) { - $version = 1; // v2. - } elseif (!empty($tbsCertList['revokedCertificates'])) { - foreach ($tbsCertList['revokedCertificates'] as $cert) { - if (!empty($cert['crlEntryExtensions'])) { - $version = 1; // v2. - } - } - } - - if ($version) { - $tbsCertList['version'] = $version; - } - } - - // Store additional extensions. - if (!empty($tbsCertList['version'])) { // At least v2. - if (!empty($crlNumber)) { - $this->setExtension('id-ce-cRLNumber', $crlNumber); - } - - if (isset($issuer->currentKeyIdentifier)) { - $this->setExtension('id-ce-authorityKeyIdentifier', array( - //'authorityCertIssuer' => array( - // array( - // 'directoryName' => $issuer->dn - // ) - //), - 'keyIdentifier' => $issuer->currentKeyIdentifier - ) - ); - //$extensions = &$tbsCertList['crlExtensions']; - //if (isset($issuer->serialNumber)) { - // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; - //} - //unset($extensions); - } - - $issuerAltName = $this->getExtension('id-ce-subjectAltName', $issuer->currentCert); - - if ($issuerAltName !== false) { - $this->setExtension('id-ce-issuerAltName', $issuerAltName); - } - } - - if (empty($tbsCertList['revokedCertificates'])) { - unset($tbsCertList['revokedCertificates']); - } - - unset($tbsCertList); - - // resync $this->signatureSubject - // save $tbsCertList in case there are any File_ASN1_Element objects in it - $tbsCertList = $this->currentCert['tbsCertList']; - $this->loadCRL($this->saveCRL($this->currentCert)); - - $result = $this->_sign($issuer->privateKey, $signatureAlgorithm); - $result['tbsCertList'] = $tbsCertList; - - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - - return $result; - } - - /** - * X.509 certificate signing helper function. - * - * @param Object $key - * @param File_X509 $subject - * @param String $signatureAlgorithm - * @access public - * @return Mixed - */ - function _sign($key, $signatureAlgorithm) - { - switch (strtolower(get_class($key))) { - case 'crypt_rsa': - switch ($signatureAlgorithm) { - case 'md2WithRSAEncryption': - case 'md5WithRSAEncryption': - case 'sha1WithRSAEncryption': - case 'sha224WithRSAEncryption': - case 'sha256WithRSAEncryption': - case 'sha384WithRSAEncryption': - case 'sha512WithRSAEncryption': - $key->setHash(preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm)); - $key->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); - - $this->currentCert['signature'] = base64_encode("\0" . $key->sign($this->signatureSubject)); - return $this->currentCert; - } - default: - return false; - } - } - - /** - * Set certificate start date - * - * @param String $date - * @access public - */ - function setStartDate($date) - { - $this->startDate = @date('D, d M Y H:i:s O', @strtotime($date)); - } - - /** - * Set certificate end date - * - * @param String $date - * @access public - */ - function setEndDate($date) - { - /* - To indicate that a certificate has no well-defined expiration date, - the notAfter SHOULD be assigned the GeneralizedTime value of - 99991231235959Z. - - -- http://tools.ietf.org/html/rfc5280#section-4.1.2.5 - */ - if (strtolower($date) == 'lifetime') { - $temp = '99991231235959Z'; - $asn1 = new File_ASN1(); - $temp = chr(FILE_ASN1_TYPE_GENERALIZED_TIME) . $asn1->_encodeLength(strlen($temp)) . $temp; - $this->endDate = new File_ASN1_Element($temp); - } else { - $this->endDate = @date('D, d M Y H:i:s O', @strtotime($date)); - } - } - - /** - * Set Serial Number - * - * @param String $serial - * @param $base optional - * @access public - */ - function setSerialNumber($serial, $base = -256) - { - $this->serialNumber = new Math_BigInteger($serial, $base); - } - - /** - * Turns the certificate into a certificate authority - * - * @access public - */ - function makeCA() - { - $this->caFlag = true; - } - - /** - * Get a reference to a subarray - * - * @param array $root - * @param String $path absolute path with / as component separator - * @param Boolean $create optional - * @access private - * @return array item ref or false - */ - function &_subArray(&$root, $path, $create = false) - { - $false = false; - - if (!is_array($root)) { - return $false; - } - - foreach (explode('/', $path) as $i) { - if (!is_array($root)) { - return $false; - } - - if (!isset($root[$i])) { - if (!$create) { - return $false; - } - - $root[$i] = array(); - } - - $root = &$root[$i]; - } - - return $root; - } - - /** - * Get a reference to an extension subarray - * - * @param array $root - * @param String $path optional absolute path with / as component separator - * @param Boolean $create optional - * @access private - * @return array ref or false - */ - function &_extensions(&$root, $path = null, $create = false) - { - if (!isset($root)) { - $root = $this->currentCert; - } - - switch (true) { - case !empty($path): - case !is_array($root): - break; - case isset($root['tbsCertificate']): - $path = 'tbsCertificate/extensions'; - break; - case isset($root['tbsCertList']): - $path = 'tbsCertList/crlExtensions'; - break; - case isset($root['certificationRequestInfo']): - $pth = 'certificationRequestInfo/attributes'; - $attributes = &$this->_subArray($root, $pth, $create); - - if (is_array($attributes)) { - foreach ($attributes as $key => $value) { - if ($value['type'] == 'pkcs-9-at-extensionRequest') { - $path = "$pth/$key/value/0"; - break 2; - } - } - if ($create) { - $key = count($attributes); - $attributes[] = array('type' => 'pkcs-9-at-extensionRequest', 'value' => array()); - $path = "$pth/$key/value/0"; - } - } - break; - } - - $extensions = &$this->_subArray($root, $path, $create); - - if (!is_array($extensions)) { - $false = false; - return $false; - } - - return $extensions; - } - - /** - * Remove an Extension - * - * @param String $id - * @param String $path optional - * @access private - * @return Boolean - */ - function _removeExtension($id, $path = null) - { - $extensions = &$this->_extensions($this->currentCert, $path); - - if (!is_array($extensions)) { - return false; - } - - $result = false; - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - unset($extensions[$key]); - $result = true; - } - } - - $extensions = array_values($extensions); - return $result; - } - - /** - * Get an Extension - * - * Returns the extension if it exists and false if not - * - * @param String $id - * @param Array $cert optional - * @param String $path optional - * @access private - * @return Mixed - */ - function _getExtension($id, $cert = null, $path = null) - { - $extensions = $this->_extensions($cert, $path); - - if (!is_array($extensions)) { - return false; - } - - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - return $value['extnValue']; - } - } - - return false; - } - - /** - * Returns a list of all extensions in use - * - * @param array $cert optional - * @param String $path optional - * @access private - * @return Array - */ - function _getExtensions($cert = null, $path = null) - { - $exts = $this->_extensions($cert, $path); - $extensions = array(); - - if (is_array($exts)) { - foreach ($exts as $extension) { - $extensions[] = $extension['extnId']; - } - } - - return $extensions; - } - - /** - * Set an Extension - * - * @param String $id - * @param Mixed $value - * @param Boolean $critical optional - * @param Boolean $replace optional - * @param String $path optional - * @access private - * @return Boolean - */ - function _setExtension($id, $value, $critical = false, $replace = true, $path = null) - { - $extensions = &$this->_extensions($this->currentCert, $path, true); - - if (!is_array($extensions)) { - return false; - } - - $newext = array('extnId' => $id, 'critical' => $critical, 'extnValue' => $value); - - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - if (!$replace) { - return false; - } - - $extensions[$key] = $newext; - return true; - } - } - - $extensions[] = $newext; - return true; - } - - /** - * Remove a certificate, CSR or CRL Extension - * - * @param String $id - * @access public - * @return Boolean - */ - function removeExtension($id) - { - return $this->_removeExtension($id); - } - - /** - * Get a certificate, CSR or CRL Extension - * - * Returns the extension if it exists and false if not - * - * @param String $id - * @param Array $cert optional - * @access public - * @return Mixed - */ - function getExtension($id, $cert = null) - { - return $this->_getExtension($id, $cert); - } - - /** - * Returns a list of all extensions in use in certificate, CSR or CRL - * - * @param array $cert optional - * @access public - * @return Array - */ - function getExtensions($cert = null) - { - return $this->_getExtensions($cert); - } - - /** - * Set a certificate, CSR or CRL Extension - * - * @param String $id - * @param Mixed $value - * @param Boolean $critical optional - * @param Boolean $replace optional - * @access public - * @return Boolean - */ - function setExtension($id, $value, $critical = false, $replace = true) - { - return $this->_setExtension($id, $value, $critical, $replace); - } - - /** - * Remove a CSR attribute. - * - * @param String $id - * @param Integer $disposition optional - * @access public - * @return Boolean - */ - function removeAttribute($id, $disposition = FILE_X509_ATTR_ALL) - { - $attributes = &$this->_subArray($this->currentCert, 'certificationRequestInfo/attributes'); - - if (!is_array($attributes)) { - return false; - } - - $result = false; - foreach ($attributes as $key => $attribute) { - if ($attribute['type'] == $id) { - $n = count($attribute['value']); - switch (true) { - case $disposition == FILE_X509_ATTR_APPEND: - case $disposition == FILE_X509_ATTR_REPLACE: - return false; - case $disposition >= $n: - $disposition -= $n; - break; - case $disposition == FILE_X509_ATTR_ALL: - case $n == 1: - unset($attributes[$key]); - $result = true; - break; - default: - unset($attributes[$key]['value'][$disposition]); - $attributes[$key]['value'] = array_values($attributes[$key]['value']); - $result = true; - break; - } - if ($result && $disposition != FILE_X509_ATTR_ALL) { - break; - } - } - } - - $attributes = array_values($attributes); - return $result; - } - - /** - * Get a CSR attribute - * - * Returns the attribute if it exists and false if not - * - * @param String $id - * @param Integer $disposition optional - * @param Array $csr optional - * @access public - * @return Mixed - */ - function getAttribute($id, $disposition = FILE_X509_ATTR_ALL, $csr = null) - { - if (empty($csr)) { - $csr = $this->currentCert; - } - - $attributes = $this->_subArray($csr, 'certificationRequestInfo/attributes'); - - if (!is_array($attributes)) { - return false; - } - - foreach ($attributes as $key => $attribute) { - if ($attribute['type'] == $id) { - $n = count($attribute['value']); - switch (true) { - case $disposition == FILE_X509_ATTR_APPEND: - case $disposition == FILE_X509_ATTR_REPLACE: - return false; - case $disposition == FILE_X509_ATTR_ALL: - return $attribute['value']; - case $disposition >= $n: - $disposition -= $n; - break; - default: - return $attribute['value'][$disposition]; - } - } - } - - return false; - } - - /** - * Returns a list of all CSR attributes in use - * - * @param array $csr optional - * @access public - * @return Array - */ - function getAttributes($csr = null) - { - if (empty($csr)) { - $csr = $this->currentCert; - } - - $attributes = $this->_subArray($csr, 'certificationRequestInfo/attributes'); - $attrs = array(); - - if (is_array($attributes)) { - foreach ($attributes as $attribute) { - $attrs[] = $attribute['type']; - } - } - - return $attrs; - } - - /** - * Set a CSR attribute - * - * @param String $id - * @param Mixed $value - * @param Boolean $disposition optional - * @access public - * @return Boolean - */ - function setAttribute($id, $value, $disposition = FILE_X509_ATTR_ALL) - { - $attributes = &$this->_subArray($this->currentCert, 'certificationRequestInfo/attributes', true); - - if (!is_array($attributes)) { - return false; - } - - switch ($disposition) { - case FILE_X509_ATTR_REPLACE: - $disposition = FILE_X509_ATTR_APPEND; - case FILE_X509_ATTR_ALL: - $this->removeAttribute($id); - break; - } - - foreach ($attributes as $key => $attribute) { - if ($attribute['type'] == $id) { - $n = count($attribute['value']); - switch (true) { - case $disposition == FILE_X509_ATTR_APPEND: - $last = $key; - break; - case $disposition >= $n; - $disposition -= $n; - break; - default: - $attributes[$key]['value'][$disposition] = $value; - return true; - } - } - } - - switch (true) { - case $disposition >= 0: - return false; - case isset($last): - $attributes[$last]['value'][] = $value; - break; - default: - $attributes[] = array('type' => $id, 'value' => $disposition == FILE_X509_ATTR_ALL ? $value: array($value)); - break; - } - - return true; - } - - /** - * Sets the subject key identifier - * - * This is used by the id-ce-authorityKeyIdentifier and the id-ce-subjectKeyIdentifier extensions. - * - * @param String $value - * @access public - */ - function setKeyIdentifier($value) - { - if (empty($value)) { - unset($this->currentKeyIdentifier); - } else { - $this->currentKeyIdentifier = base64_encode($value); - } - } - - /** - * Compute a public key identifier. - * - * Although key identifiers may be set to any unique value, this function - * computes key identifiers from public key according to the two - * recommended methods (4.2.1.2 RFC 3280). - * Highly polymorphic: try to accept all possible forms of key: - * - Key object - * - File_X509 object with public or private key defined - * - Certificate or CSR array - * - File_ASN1_Element object - * - PEM or DER string - * - * @param Mixed $key optional - * @param Integer $method optional - * @access public - * @return String binary key identifier - */ - function computeKeyIdentifier($key = null, $method = 1) - { - if (is_null($key)) { - $key = $this; - } - - switch (true) { - case is_string($key): - break; - case is_array($key) && isset($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): - return $this->computeKeyIdentifier($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $method); - case is_array($key) && isset($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): - return $this->computeKeyIdentifier($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], $method); - case !is_object($key): - return false; - case strtolower(get_class($key)) == 'file_asn1_element': - // Assume the element is a bitstring-packed key. - $asn1 = new File_ASN1(); - $decoded = $asn1->decodeBER($key->element); - if (empty($decoded)) { - return false; - } - $raw = $asn1->asn1map($decoded[0], array('type' => FILE_ASN1_TYPE_BIT_STRING)); - if (empty($raw)) { - return false; - } - $raw = base64_decode($raw); - // If the key is private, compute identifier from its corresponding public key. - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - $key = new Crypt_RSA(); - if (!$key->loadKey($raw)) { - return false; // Not an unencrypted RSA key. - } - if ($key->getPrivateKey() !== false) { // If private. - return $this->computeKeyIdentifier($key, $method); - } - $key = $raw; // Is a public key. - break; - case strtolower(get_class($key)) == 'file_x509': - if (isset($key->publicKey)) { - return $this->computeKeyIdentifier($key->publicKey, $method); - } - if (isset($key->privateKey)) { - return $this->computeKeyIdentifier($key->privateKey, $method); - } - if (isset($key->currentCert['tbsCertificate']) || isset($key->currentCert['certificationRequestInfo'])) { - return $this->computeKeyIdentifier($key->currentCert, $method); - } - return false; - default: // Should be a key object (i.e.: Crypt_RSA). - $key = $key->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); - break; - } - - // If in PEM format, convert to binary. - $key = $this->_extractBER($key); - - // Now we have the key string: compute its sha-1 sum. - if (!class_exists('Crypt_Hash')) { - include_once 'Crypt/Hash.php'; - } - $hash = new Crypt_Hash('sha1'); - $hash = $hash->hash($key); - - if ($method == 2) { - $hash = substr($hash, -8); - $hash[0] = chr((ord($hash[0]) & 0x0F) | 0x40); - } - - return $hash; - } - - /** - * Format a public key as appropriate - * - * @access private - * @return Array - */ - function _formatSubjectPublicKey() - { - if (!isset($this->publicKey) || !is_object($this->publicKey)) { - return false; - } - - switch (strtolower(get_class($this->publicKey))) { - case 'crypt_rsa': - // the following two return statements do the same thing. i dunno.. i just prefer the later for some reason. - // the former is a good example of how to do fuzzing on the public key - //return new File_ASN1_Element(base64_decode(preg_replace('#-.+-|[\r\n]#', '', $this->publicKey->getPublicKey()))); - return array( - 'algorithm' => array('algorithm' => 'rsaEncryption'), - 'subjectPublicKey' => $this->publicKey->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1) - ); - default: - return false; - } - } - - /** - * Set the domain name's which the cert is to be valid for - * - * @access public - * @return Array - */ - function setDomain() - { - $this->domains = func_get_args(); - $this->removeDNProp('id-at-commonName'); - $this->setDNProp('id-at-commonName', $this->domains[0]); - } - - /** - * Set the IP Addresses's which the cert is to be valid for - * - * @access public - * @param String $ipAddress optional - */ - function setIPAddress() - { - $this->ipAddresses = func_get_args(); - /* - if (!isset($this->domains)) { - $this->removeDNProp('id-at-commonName'); - $this->setDNProp('id-at-commonName', $this->ipAddresses[0]); - } - */ - } - - /** - * Helper function to build domain array - * - * @access private - * @param String $domain - * @return Array - */ - function _dnsName($domain) - { - return array('dNSName' => $domain); - } - - /** - * Helper function to build IP Address array - * - * (IPv6 is not currently supported) - * - * @access private - * @param String $address - * @return Array - */ - function _iPAddress($address) - { - return array('iPAddress' => $address); - } - - /** - * Get the index of a revoked certificate. - * - * @param array $rclist - * @param String $serial - * @param Boolean $create optional - * @access private - * @return Integer or false - */ - function _revokedCertificate(&$rclist, $serial, $create = false) - { - $serial = new Math_BigInteger($serial); - - foreach ($rclist as $i => $rc) { - if (!($serial->compare($rc['userCertificate']))) { - return $i; - } - } - - if (!$create) { - return false; - } - - $i = count($rclist); - $rclist[] = array('userCertificate' => $serial, - 'revocationDate' => $this->_timeField(@date('D, d M Y H:i:s O'))); - return $i; - } - - /** - * Revoke a certificate. - * - * @param String $serial - * @param String $date optional - * @access public - * @return Boolean - */ - function revoke($serial, $date = null) - { - if (isset($this->currentCert['tbsCertList'])) { - if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) { - if ($this->_revokedCertificate($rclist, $serial) === false) { // If not yet revoked - if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) { - - if (!empty($date)) { - $rclist[$i]['revocationDate'] = $this->_timeField($date); - } - - return true; - } - } - } - } - - return false; - } - - /** - * Unrevoke a certificate. - * - * @param String $serial - * @access public - * @return Boolean - */ - function unrevoke($serial) - { - if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { - unset($rclist[$i]); - $rclist = array_values($rclist); - return true; - } - } - - return false; - } - - /** - * Get a revoked certificate. - * - * @param String $serial - * @access public - * @return Mixed - */ - function getRevoked($serial) - { - if (is_array($rclist = $this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { - return $rclist[$i]; - } - } - - return false; - } - - /** - * List revoked certificates - * - * @param array $crl optional - * @access public - * @return array - */ - function listRevoked($crl = null) - { - if (!isset($crl)) { - $crl = $this->currentCert; - } - - if (!isset($crl['tbsCertList'])) { - return false; - } - - $result = array(); - - if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) { - foreach ($rclist as $rc) { - $result[] = $rc['userCertificate']->toString(); - } - } - - return $result; - } - - /** - * Remove a Revoked Certificate Extension - * - * @param String $serial - * @param String $id - * @access public - * @return Boolean - */ - function removeRevokedCertificateExtension($serial, $id) - { - if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { - return $this->_removeExtension($id, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); - } - } - - return false; - } - - /** - * Get a Revoked Certificate Extension - * - * Returns the extension if it exists and false if not - * - * @param String $serial - * @param String $id - * @param Array $crl optional - * @access public - * @return Mixed - */ - function getRevokedCertificateExtension($serial, $id, $crl = null) - { - if (!isset($crl)) { - $crl = $this->currentCert; - } - - if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { - return $this->_getExtension($id, $crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); - } - } - - return false; - } - - /** - * Returns a list of all extensions in use for a given revoked certificate - * - * @param String $serial - * @param array $crl optional - * @access public - * @return Array - */ - function getRevokedCertificateExtensions($serial, $crl = null) - { - if (!isset($crl)) { - $crl = $this->currentCert; - } - - if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { - return $this->_getExtensions($crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); - } - } - - return false; - } - - /** - * Set a Revoked Certificate Extension - * - * @param String $serial - * @param String $id - * @param Mixed $value - * @param Boolean $critical optional - * @param Boolean $replace optional - * @access public - * @return Boolean - */ - function setRevokedCertificateExtension($serial, $id, $value, $critical = false, $replace = true) - { - if (isset($this->currentCert['tbsCertList'])) { - if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) { - if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) { - return $this->_setExtension($id, $value, $critical, $replace, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); - } - } - } - - return false; - } - - /** - * Extract raw BER from Base64 encoding - * - * @access private - * @param String $str - * @return String - */ - function _extractBER($str) - { - /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them - * above and beyond the ceritificate. - * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line: - * - * Bag Attributes - * localKeyID: 01 00 00 00 - * subject=/O=organization/OU=org unit/CN=common name - * issuer=/O=organization/CN=common name - */ - $temp = preg_replace('#.*?^-+[^-]+-+#ms', '', $str, 1); - // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff - $temp = preg_replace('#-+[^-]+-+#', '', $temp); - // remove new lines - $temp = str_replace(array("\r", "\n", ' '), '', $temp); - $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; - return $temp != false ? $temp : $str; - } -} + + * @copyright 2012 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include File_ASN1 + */ +if (!class_exists('File_ASN1')) { + include_once 'ASN1.php'; +} + +/** + * Flag to only accept signatures signed by certificate authorities + * + * Not really used anymore but retained all the same to suppress E_NOTICEs from old installs + * + * @access public + */ +define('FILE_X509_VALIDATE_SIGNATURE_BY_CA', 1); + +/**#@+ + * @access public + * @see self::getDN() + */ +/** + * Return internal array representation + */ +define('FILE_X509_DN_ARRAY', 0); +/** + * Return string + */ +define('FILE_X509_DN_STRING', 1); +/** + * Return ASN.1 name string + */ +define('FILE_X509_DN_ASN1', 2); +/** + * Return OpenSSL compatible array + */ +define('FILE_X509_DN_OPENSSL', 3); +/** + * Return canonical ASN.1 RDNs string + */ +define('FILE_X509_DN_CANON', 4); +/** + * Return name hash for file indexing + */ +define('FILE_X509_DN_HASH', 5); +/**#@-*/ + +/**#@+ + * @access public + * @see self::saveX509() + * @see self::saveCSR() + * @see self::saveCRL() + */ +/** + * Save as PEM + * + * ie. a base64-encoded PEM with a header and a footer + */ +define('FILE_X509_FORMAT_PEM', 0); +/** + * Save as DER + */ +define('FILE_X509_FORMAT_DER', 1); +/** + * Save as a SPKAC + * + * Only works on CSRs. Not currently supported. + */ +define('FILE_X509_FORMAT_SPKAC', 2); +/** + * Auto-detect the format + * + * Used only by the load*() functions + */ +define('FILE_X509_FORMAT_AUTO_DETECT', 3); +/**#@-*/ + +/** + * Attribute value disposition. + * If disposition is >= 0, this is the index of the target value. + */ +define('FILE_X509_ATTR_ALL', -1); // All attribute values (array). +define('FILE_X509_ATTR_APPEND', -2); // Add a value. +define('FILE_X509_ATTR_REPLACE', -3); // Clear first, then add a value. + +/** + * Pure-PHP X.509 Parser + * + * @package File_X509 + * @author Jim Wigginton + * @access public + */ +class File_X509 +{ + /** + * ASN.1 syntax for X.509 certificates + * + * @var array + * @access private + */ + var $Certificate; + + /**#@+ + * ASN.1 syntax for various extensions + * + * @access private + */ + var $DirectoryString; + var $PKCS9String; + var $AttributeValue; + var $Extensions; + var $KeyUsage; + var $ExtKeyUsageSyntax; + var $BasicConstraints; + var $KeyIdentifier; + var $CRLDistributionPoints; + var $AuthorityKeyIdentifier; + var $CertificatePolicies; + var $AuthorityInfoAccessSyntax; + var $SubjectAltName; + var $SubjectDirectoryAttributes; + var $PrivateKeyUsagePeriod; + var $IssuerAltName; + var $PolicyMappings; + var $NameConstraints; + + var $CPSuri; + var $UserNotice; + + var $netscape_cert_type; + var $netscape_comment; + var $netscape_ca_policy_url; + + var $Name; + var $RelativeDistinguishedName; + var $CRLNumber; + var $CRLReason; + var $IssuingDistributionPoint; + var $InvalidityDate; + var $CertificateIssuer; + var $HoldInstructionCode; + var $SignedPublicKeyAndChallenge; + /**#@-*/ + + /**#@+ + * ASN.1 syntax for various DN attributes + * + * @access private + */ + var $PostalAddress; + /**#@-*/ + + /** + * ASN.1 syntax for Certificate Signing Requests (RFC2986) + * + * @var array + * @access private + */ + var $CertificationRequest; + + /** + * ASN.1 syntax for Certificate Revocation Lists (RFC5280) + * + * @var array + * @access private + */ + var $CertificateList; + + /** + * Distinguished Name + * + * @var array + * @access private + */ + var $dn; + + /** + * Public key + * + * @var string + * @access private + */ + var $publicKey; + + /** + * Private key + * + * @var string + * @access private + */ + var $privateKey; + + /** + * Object identifiers for X.509 certificates + * + * @var array + * @access private + * @link http://en.wikipedia.org/wiki/Object_identifier + */ + var $oids; + + /** + * The certificate authorities + * + * @var array + * @access private + */ + var $CAs; + + /** + * The currently loaded certificate + * + * @var array + * @access private + */ + var $currentCert; + + /** + * The signature subject + * + * There's no guarantee File_X509 is going to re-encode an X.509 cert in the same way it was originally + * encoded so we take save the portion of the original cert that the signature would have made for. + * + * @var string + * @access private + */ + var $signatureSubject; + + /** + * Certificate Start Date + * + * @var string + * @access private + */ + var $startDate; + + /** + * Certificate End Date + * + * @var string + * @access private + */ + var $endDate; + + /** + * Serial Number + * + * @var string + * @access private + */ + var $serialNumber; + + /** + * Key Identifier + * + * See {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.1 RFC5280#section-4.2.1.1} and + * {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.2 RFC5280#section-4.2.1.2}. + * + * @var string + * @access private + */ + var $currentKeyIdentifier; + + /** + * CA Flag + * + * @var bool + * @access private + */ + var $caFlag = false; + + /** + * SPKAC Challenge + * + * @var string + * @access private + */ + var $challenge; + + /** + * Recursion Limit + * + * @var int + * @access private + */ + var $recur_limit = 5; + + /** + * URL fetch flag + * + * @var bool + * @access private + */ + var $disable_url_fetch = false; + + /** + * Default Constructor. + * + * @return File_X509 + * @access public + */ + function __construct() + { + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + + // Explicitly Tagged Module, 1988 Syntax + // http://tools.ietf.org/html/rfc5280#appendix-A.1 + + $this->DirectoryString = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'teletexString' => array('type' => FILE_ASN1_TYPE_TELETEX_STRING), + 'printableString' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING), + 'universalString' => array('type' => FILE_ASN1_TYPE_UNIVERSAL_STRING), + 'utf8String' => array('type' => FILE_ASN1_TYPE_UTF8_STRING), + 'bmpString' => array('type' => FILE_ASN1_TYPE_BMP_STRING) + ) + ); + + $this->PKCS9String = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'ia5String' => array('type' => FILE_ASN1_TYPE_IA5_STRING), + 'directoryString' => $this->DirectoryString + ) + ); + + $this->AttributeValue = array('type' => FILE_ASN1_TYPE_ANY); + + $AttributeType = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); + + $AttributeTypeAndValue = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'type' => $AttributeType, + 'value'=> $this->AttributeValue + ) + ); + + /* + In practice, RDNs containing multiple name-value pairs (called "multivalued RDNs") are rare, + but they can be useful at times when either there is no unique attribute in the entry or you + want to ensure that the entry's DN contains some useful identifying information. + + - https://www.opends.org/wiki/page/DefinitionRelativeDistinguishedName + */ + $this->RelativeDistinguishedName = array( + 'type' => FILE_ASN1_TYPE_SET, + 'min' => 1, + 'max' => -1, + 'children' => $AttributeTypeAndValue + ); + + // http://tools.ietf.org/html/rfc5280#section-4.1.2.4 + $RDNSequence = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + // RDNSequence does not define a min or a max, which means it doesn't have one + 'min' => 0, + 'max' => -1, + 'children' => $this->RelativeDistinguishedName + ); + + $this->Name = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'rdnSequence' => $RDNSequence + ) + ); + + // http://tools.ietf.org/html/rfc5280#section-4.1.1.2 + $AlgorithmIdentifier = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'algorithm' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), + 'parameters' => array( + 'type' => FILE_ASN1_TYPE_ANY, + 'optional' => true + ) + ) + ); + + /* + A certificate using system MUST reject the certificate if it encounters + a critical extension it does not recognize; however, a non-critical + extension may be ignored if it is not recognized. + + http://tools.ietf.org/html/rfc5280#section-4.2 + */ + $Extension = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'extnId' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), + 'critical' => array( + 'type' => FILE_ASN1_TYPE_BOOLEAN, + 'optional' => true, + 'default' => false + ), + 'extnValue' => array('type' => FILE_ASN1_TYPE_OCTET_STRING) + ) + ); + + $this->Extensions = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + // technically, it's MAX, but we'll assume anything < 0 is MAX + 'max' => -1, + // if 'children' isn't an array then 'min' and 'max' must be defined + 'children' => $Extension + ); + + $SubjectPublicKeyInfo = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'algorithm' => $AlgorithmIdentifier, + 'subjectPublicKey' => array('type' => FILE_ASN1_TYPE_BIT_STRING) + ) + ); + + $UniqueIdentifier = array('type' => FILE_ASN1_TYPE_BIT_STRING); + + $Time = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'utcTime' => array('type' => FILE_ASN1_TYPE_UTC_TIME), + 'generalTime' => array('type' => FILE_ASN1_TYPE_GENERALIZED_TIME) + ) + ); + + // http://tools.ietf.org/html/rfc5280#section-4.1.2.5 + $Validity = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'notBefore' => $Time, + 'notAfter' => $Time + ) + ); + + $CertificateSerialNumber = array('type' => FILE_ASN1_TYPE_INTEGER); + + $Version = array( + 'type' => FILE_ASN1_TYPE_INTEGER, + 'mapping' => array('v1', 'v2', 'v3') + ); + + // assert($TBSCertificate['children']['signature'] == $Certificate['children']['signatureAlgorithm']) + $TBSCertificate = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + // technically, default implies optional, but we'll define it as being optional, none-the-less, just to + // reenforce that fact + 'version' => array( + 'constant' => 0, + 'optional' => true, + 'explicit' => true, + 'default' => 'v1' + ) + $Version, + 'serialNumber' => $CertificateSerialNumber, + 'signature' => $AlgorithmIdentifier, + 'issuer' => $this->Name, + 'validity' => $Validity, + 'subject' => $this->Name, + 'subjectPublicKeyInfo' => $SubjectPublicKeyInfo, + // implicit means that the T in the TLV structure is to be rewritten, regardless of the type + 'issuerUniqueID' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $UniqueIdentifier, + 'subjectUniqueID' => array( + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ) + $UniqueIdentifier, + // doesn't use the EXPLICIT keyword but if + // it's not IMPLICIT, it's EXPLICIT + 'extensions' => array( + 'constant' => 3, + 'optional' => true, + 'explicit' => true + ) + $this->Extensions + ) + ); + + $this->Certificate = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'tbsCertificate' => $TBSCertificate, + 'signatureAlgorithm' => $AlgorithmIdentifier, + 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) + ) + ); + + $this->KeyUsage = array( + 'type' => FILE_ASN1_TYPE_BIT_STRING, + 'mapping' => array( + 'digitalSignature', + 'nonRepudiation', + 'keyEncipherment', + 'dataEncipherment', + 'keyAgreement', + 'keyCertSign', + 'cRLSign', + 'encipherOnly', + 'decipherOnly' + ) + ); + + $this->BasicConstraints = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'cA' => array( + 'type' => FILE_ASN1_TYPE_BOOLEAN, + 'optional' => true, + 'default' => false + ), + 'pathLenConstraint' => array( + 'type' => FILE_ASN1_TYPE_INTEGER, + 'optional' => true + ) + ) + ); + + $this->KeyIdentifier = array('type' => FILE_ASN1_TYPE_OCTET_STRING); + + $OrganizationalUnitNames = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => 4, // ub-organizational-units + 'children' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) + ); + + $PersonalName = array( + 'type' => FILE_ASN1_TYPE_SET, + 'children' => array( + 'surname' => array( + 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ), + 'given-name' => array( + 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ), + 'initials' => array( + 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ), + 'generation-qualifier' => array( + 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, + 'constant' => 3, + 'optional' => true, + 'implicit' => true + ) + ) + ); + + $NumericUserIdentifier = array('type' => FILE_ASN1_TYPE_NUMERIC_STRING); + + $OrganizationName = array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING); + + $PrivateDomainName = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'numeric' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING), + 'printable' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) + ) + ); + + $TerminalIdentifier = array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING); + + $NetworkAddress = array('type' => FILE_ASN1_TYPE_NUMERIC_STRING); + + $AdministrationDomainName = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + // if class isn't present it's assumed to be FILE_ASN1_CLASS_UNIVERSAL or + // (if constant is present) FILE_ASN1_CLASS_CONTEXT_SPECIFIC + 'class' => FILE_ASN1_CLASS_APPLICATION, + 'cast' => 2, + 'children' => array( + 'numeric' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING), + 'printable' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) + ) + ); + + $CountryName = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + // if class isn't present it's assumed to be FILE_ASN1_CLASS_UNIVERSAL or + // (if constant is present) FILE_ASN1_CLASS_CONTEXT_SPECIFIC + 'class' => FILE_ASN1_CLASS_APPLICATION, + 'cast' => 1, + 'children' => array( + 'x121-dcc-code' => array('type' => FILE_ASN1_TYPE_NUMERIC_STRING), + 'iso-3166-alpha2-code' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) + ) + ); + + $AnotherName = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'type-id' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), + 'value' => array( + 'type' => FILE_ASN1_TYPE_ANY, + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ) + ) + ); + + $ExtensionAttribute = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'extension-attribute-type' => array( + 'type' => FILE_ASN1_TYPE_PRINTABLE_STRING, + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ), + 'extension-attribute-value' => array( + 'type' => FILE_ASN1_TYPE_ANY, + 'constant' => 1, + 'optional' => true, + 'explicit' => true + ) + ) + ); + + $ExtensionAttributes = array( + 'type' => FILE_ASN1_TYPE_SET, + 'min' => 1, + 'max' => 256, // ub-extension-attributes + 'children' => $ExtensionAttribute + ); + + $BuiltInDomainDefinedAttribute = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'type' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING), + 'value' => array('type' => FILE_ASN1_TYPE_PRINTABLE_STRING) + ) + ); + + $BuiltInDomainDefinedAttributes = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => 4, // ub-domain-defined-attributes + 'children' => $BuiltInDomainDefinedAttribute + ); + + $BuiltInStandardAttributes = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'country-name' => array('optional' => true) + $CountryName, + 'administration-domain-name' => array('optional' => true) + $AdministrationDomainName, + 'network-address' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $NetworkAddress, + 'terminal-identifier' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $TerminalIdentifier, + 'private-domain-name' => array( + 'constant' => 2, + 'optional' => true, + 'explicit' => true + ) + $PrivateDomainName, + 'organization-name' => array( + 'constant' => 3, + 'optional' => true, + 'implicit' => true + ) + $OrganizationName, + 'numeric-user-identifier' => array( + 'constant' => 4, + 'optional' => true, + 'implicit' => true + ) + $NumericUserIdentifier, + 'personal-name' => array( + 'constant' => 5, + 'optional' => true, + 'implicit' => true + ) + $PersonalName, + 'organizational-unit-names' => array( + 'constant' => 6, + 'optional' => true, + 'implicit' => true + ) + $OrganizationalUnitNames + ) + ); + + $ORAddress = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'built-in-standard-attributes' => $BuiltInStandardAttributes, + 'built-in-domain-defined-attributes' => array('optional' => true) + $BuiltInDomainDefinedAttributes, + 'extension-attributes' => array('optional' => true) + $ExtensionAttributes + ) + ); + + $EDIPartyName = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'nameAssigner' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $this->DirectoryString, + // partyName is technically required but File_ASN1 doesn't currently support non-optional constants and + // setting it to optional gets the job done in any event. + 'partyName' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $this->DirectoryString + ) + ); + + $GeneralName = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'otherName' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $AnotherName, + 'rfc822Name' => array( + 'type' => FILE_ASN1_TYPE_IA5_STRING, + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ), + 'dNSName' => array( + 'type' => FILE_ASN1_TYPE_IA5_STRING, + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ), + 'x400Address' => array( + 'constant' => 3, + 'optional' => true, + 'implicit' => true + ) + $ORAddress, + 'directoryName' => array( + 'constant' => 4, + 'optional' => true, + 'explicit' => true + ) + $this->Name, + 'ediPartyName' => array( + 'constant' => 5, + 'optional' => true, + 'implicit' => true + ) + $EDIPartyName, + 'uniformResourceIdentifier' => array( + 'type' => FILE_ASN1_TYPE_IA5_STRING, + 'constant' => 6, + 'optional' => true, + 'implicit' => true + ), + 'iPAddress' => array( + 'type' => FILE_ASN1_TYPE_OCTET_STRING, + 'constant' => 7, + 'optional' => true, + 'implicit' => true + ), + 'registeredID' => array( + 'type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER, + 'constant' => 8, + 'optional' => true, + 'implicit' => true + ) + ) + ); + + $GeneralNames = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $GeneralName + ); + + $this->IssuerAltName = $GeneralNames; + + $ReasonFlags = array( + 'type' => FILE_ASN1_TYPE_BIT_STRING, + 'mapping' => array( + 'unused', + 'keyCompromise', + 'cACompromise', + 'affiliationChanged', + 'superseded', + 'cessationOfOperation', + 'certificateHold', + 'privilegeWithdrawn', + 'aACompromise' + ) + ); + + $DistributionPointName = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'fullName' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $GeneralNames, + 'nameRelativeToCRLIssuer' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $this->RelativeDistinguishedName + ) + ); + + $DistributionPoint = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'distributionPoint' => array( + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ) + $DistributionPointName, + 'reasons' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $ReasonFlags, + 'cRLIssuer' => array( + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ) + $GeneralNames + ) + ); + + $this->CRLDistributionPoints = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $DistributionPoint + ); + + $this->AuthorityKeyIdentifier = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'keyIdentifier' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $this->KeyIdentifier, + 'authorityCertIssuer' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $GeneralNames, + 'authorityCertSerialNumber' => array( + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ) + $CertificateSerialNumber + ) + ); + + $PolicyQualifierId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); + + $PolicyQualifierInfo = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'policyQualifierId' => $PolicyQualifierId, + 'qualifier' => array('type' => FILE_ASN1_TYPE_ANY) + ) + ); + + $CertPolicyId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); + + $PolicyInformation = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'policyIdentifier' => $CertPolicyId, + 'policyQualifiers' => array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 0, + 'max' => -1, + 'optional' => true, + 'children' => $PolicyQualifierInfo + ) + ) + ); + + $this->CertificatePolicies = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $PolicyInformation + ); + + $this->PolicyMappings = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'issuerDomainPolicy' => $CertPolicyId, + 'subjectDomainPolicy' => $CertPolicyId + ) + ) + ); + + $KeyPurposeId = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); + + $this->ExtKeyUsageSyntax = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $KeyPurposeId + ); + + $AccessDescription = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'accessMethod' => array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER), + 'accessLocation' => $GeneralName + ) + ); + + $this->AuthorityInfoAccessSyntax = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $AccessDescription + ); + + $this->SubjectAltName = $GeneralNames; + + $this->PrivateKeyUsagePeriod = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'notBefore' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true, + 'type' => FILE_ASN1_TYPE_GENERALIZED_TIME), + 'notAfter' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true, + 'type' => FILE_ASN1_TYPE_GENERALIZED_TIME) + ) + ); + + $BaseDistance = array('type' => FILE_ASN1_TYPE_INTEGER); + + $GeneralSubtree = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'base' => $GeneralName, + 'minimum' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true, + 'default' => new Math_BigInteger(0) + ) + $BaseDistance, + 'maximum' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true, + ) + $BaseDistance + ) + ); + + $GeneralSubtrees = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $GeneralSubtree + ); + + $this->NameConstraints = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'permittedSubtrees' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $GeneralSubtrees, + 'excludedSubtrees' => array( + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ) + $GeneralSubtrees + ) + ); + + $this->CPSuri = array('type' => FILE_ASN1_TYPE_IA5_STRING); + + $DisplayText = array( + 'type' => FILE_ASN1_TYPE_CHOICE, + 'children' => array( + 'ia5String' => array('type' => FILE_ASN1_TYPE_IA5_STRING), + 'visibleString' => array('type' => FILE_ASN1_TYPE_VISIBLE_STRING), + 'bmpString' => array('type' => FILE_ASN1_TYPE_BMP_STRING), + 'utf8String' => array('type' => FILE_ASN1_TYPE_UTF8_STRING) + ) + ); + + $NoticeReference = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'organization' => $DisplayText, + 'noticeNumbers' => array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => 200, + 'children' => array('type' => FILE_ASN1_TYPE_INTEGER) + ) + ) + ); + + $this->UserNotice = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'noticeRef' => array( + 'optional' => true, + 'implicit' => true + ) + $NoticeReference, + 'explicitText' => array( + 'optional' => true, + 'implicit' => true + ) + $DisplayText + ) + ); + + // mapping is from + $this->netscape_cert_type = array( + 'type' => FILE_ASN1_TYPE_BIT_STRING, + 'mapping' => array( + 'SSLClient', + 'SSLServer', + 'Email', + 'ObjectSigning', + 'Reserved', + 'SSLCA', + 'EmailCA', + 'ObjectSigningCA' + ) + ); + + $this->netscape_comment = array('type' => FILE_ASN1_TYPE_IA5_STRING); + $this->netscape_ca_policy_url = array('type' => FILE_ASN1_TYPE_IA5_STRING); + + // attribute is used in RFC2986 but we're using the RFC5280 definition + + $Attribute = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'type' => $AttributeType, + 'value'=> array( + 'type' => FILE_ASN1_TYPE_SET, + 'min' => 1, + 'max' => -1, + 'children' => $this->AttributeValue + ) + ) + ); + + $this->SubjectDirectoryAttributes = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => $Attribute + ); + + // adapted from + + $Attributes = array( + 'type' => FILE_ASN1_TYPE_SET, + 'min' => 1, + 'max' => -1, + 'children' => $Attribute + ); + + $CertificationRequestInfo = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'version' => array( + 'type' => FILE_ASN1_TYPE_INTEGER, + 'mapping' => array('v1') + ), + 'subject' => $this->Name, + 'subjectPKInfo' => $SubjectPublicKeyInfo, + 'attributes' => array( + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ) + $Attributes, + ) + ); + + $this->CertificationRequest = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'certificationRequestInfo' => $CertificationRequestInfo, + 'signatureAlgorithm' => $AlgorithmIdentifier, + 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) + ) + ); + + $RevokedCertificate = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'userCertificate' => $CertificateSerialNumber, + 'revocationDate' => $Time, + 'crlEntryExtensions' => array( + 'optional' => true + ) + $this->Extensions + ) + ); + + $TBSCertList = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'version' => array( + 'optional' => true, + 'default' => 'v1' + ) + $Version, + 'signature' => $AlgorithmIdentifier, + 'issuer' => $this->Name, + 'thisUpdate' => $Time, + 'nextUpdate' => array( + 'optional' => true + ) + $Time, + 'revokedCertificates' => array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'optional' => true, + 'min' => 0, + 'max' => -1, + 'children' => $RevokedCertificate + ), + 'crlExtensions' => array( + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ) + $this->Extensions + ) + ); + + $this->CertificateList = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'tbsCertList' => $TBSCertList, + 'signatureAlgorithm' => $AlgorithmIdentifier, + 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) + ) + ); + + $this->CRLNumber = array('type' => FILE_ASN1_TYPE_INTEGER); + + $this->CRLReason = array('type' => FILE_ASN1_TYPE_ENUMERATED, + 'mapping' => array( + 'unspecified', + 'keyCompromise', + 'cACompromise', + 'affiliationChanged', + 'superseded', + 'cessationOfOperation', + 'certificateHold', + // Value 7 is not used. + 8 => 'removeFromCRL', + 'privilegeWithdrawn', + 'aACompromise' + ) + ); + + $this->IssuingDistributionPoint = array('type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'distributionPoint' => array( + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ) + $DistributionPointName, + 'onlyContainsUserCerts' => array( + 'type' => FILE_ASN1_TYPE_BOOLEAN, + 'constant' => 1, + 'optional' => true, + 'default' => false, + 'implicit' => true + ), + 'onlyContainsCACerts' => array( + 'type' => FILE_ASN1_TYPE_BOOLEAN, + 'constant' => 2, + 'optional' => true, + 'default' => false, + 'implicit' => true + ), + 'onlySomeReasons' => array( + 'constant' => 3, + 'optional' => true, + 'implicit' => true + ) + $ReasonFlags, + 'indirectCRL' => array( + 'type' => FILE_ASN1_TYPE_BOOLEAN, + 'constant' => 4, + 'optional' => true, + 'default' => false, + 'implicit' => true + ), + 'onlyContainsAttributeCerts' => array( + 'type' => FILE_ASN1_TYPE_BOOLEAN, + 'constant' => 5, + 'optional' => true, + 'default' => false, + 'implicit' => true + ) + ) + ); + + $this->InvalidityDate = array('type' => FILE_ASN1_TYPE_GENERALIZED_TIME); + + $this->CertificateIssuer = $GeneralNames; + + $this->HoldInstructionCode = array('type' => FILE_ASN1_TYPE_OBJECT_IDENTIFIER); + + $PublicKeyAndChallenge = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'spki' => $SubjectPublicKeyInfo, + 'challenge' => array('type' => FILE_ASN1_TYPE_IA5_STRING) + ) + ); + + $this->SignedPublicKeyAndChallenge = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'children' => array( + 'publicKeyAndChallenge' => $PublicKeyAndChallenge, + 'signatureAlgorithm' => $AlgorithmIdentifier, + 'signature' => array('type' => FILE_ASN1_TYPE_BIT_STRING) + ) + ); + + $this->PostalAddress = array( + 'type' => FILE_ASN1_TYPE_SEQUENCE, + 'optional' => true, + 'min' => 1, + 'max' => -1, + 'children' => $this->DirectoryString + ); + + // OIDs from RFC5280 and those RFCs mentioned in RFC5280#section-4.1.1.2 + $this->oids = array( + '1.3.6.1.5.5.7' => 'id-pkix', + '1.3.6.1.5.5.7.1' => 'id-pe', + '1.3.6.1.5.5.7.2' => 'id-qt', + '1.3.6.1.5.5.7.3' => 'id-kp', + '1.3.6.1.5.5.7.48' => 'id-ad', + '1.3.6.1.5.5.7.2.1' => 'id-qt-cps', + '1.3.6.1.5.5.7.2.2' => 'id-qt-unotice', + '1.3.6.1.5.5.7.48.1' =>'id-ad-ocsp', + '1.3.6.1.5.5.7.48.2' => 'id-ad-caIssuers', + '1.3.6.1.5.5.7.48.3' => 'id-ad-timeStamping', + '1.3.6.1.5.5.7.48.5' => 'id-ad-caRepository', + '2.5.4' => 'id-at', + '2.5.4.41' => 'id-at-name', + '2.5.4.4' => 'id-at-surname', + '2.5.4.42' => 'id-at-givenName', + '2.5.4.43' => 'id-at-initials', + '2.5.4.44' => 'id-at-generationQualifier', + '2.5.4.3' => 'id-at-commonName', + '2.5.4.7' => 'id-at-localityName', + '2.5.4.8' => 'id-at-stateOrProvinceName', + '2.5.4.10' => 'id-at-organizationName', + '2.5.4.11' => 'id-at-organizationalUnitName', + '2.5.4.12' => 'id-at-title', + '2.5.4.13' => 'id-at-description', + '2.5.4.46' => 'id-at-dnQualifier', + '2.5.4.6' => 'id-at-countryName', + '2.5.4.5' => 'id-at-serialNumber', + '2.5.4.65' => 'id-at-pseudonym', + '2.5.4.17' => 'id-at-postalCode', + '2.5.4.9' => 'id-at-streetAddress', + '2.5.4.45' => 'id-at-uniqueIdentifier', + '2.5.4.72' => 'id-at-role', + '2.5.4.16' => 'id-at-postalAddress', + + '0.9.2342.19200300.100.1.25' => 'id-domainComponent', + '1.2.840.113549.1.9' => 'pkcs-9', + '1.2.840.113549.1.9.1' => 'pkcs-9-at-emailAddress', + '2.5.29' => 'id-ce', + '2.5.29.35' => 'id-ce-authorityKeyIdentifier', + '2.5.29.14' => 'id-ce-subjectKeyIdentifier', + '2.5.29.15' => 'id-ce-keyUsage', + '2.5.29.16' => 'id-ce-privateKeyUsagePeriod', + '2.5.29.32' => 'id-ce-certificatePolicies', + '2.5.29.32.0' => 'anyPolicy', + + '2.5.29.33' => 'id-ce-policyMappings', + '2.5.29.17' => 'id-ce-subjectAltName', + '2.5.29.18' => 'id-ce-issuerAltName', + '2.5.29.9' => 'id-ce-subjectDirectoryAttributes', + '2.5.29.19' => 'id-ce-basicConstraints', + '2.5.29.30' => 'id-ce-nameConstraints', + '2.5.29.36' => 'id-ce-policyConstraints', + '2.5.29.31' => 'id-ce-cRLDistributionPoints', + '2.5.29.37' => 'id-ce-extKeyUsage', + '2.5.29.37.0' => 'anyExtendedKeyUsage', + '1.3.6.1.5.5.7.3.1' => 'id-kp-serverAuth', + '1.3.6.1.5.5.7.3.2' => 'id-kp-clientAuth', + '1.3.6.1.5.5.7.3.3' => 'id-kp-codeSigning', + '1.3.6.1.5.5.7.3.4' => 'id-kp-emailProtection', + '1.3.6.1.5.5.7.3.8' => 'id-kp-timeStamping', + '1.3.6.1.5.5.7.3.9' => 'id-kp-OCSPSigning', + '2.5.29.54' => 'id-ce-inhibitAnyPolicy', + '2.5.29.46' => 'id-ce-freshestCRL', + '1.3.6.1.5.5.7.1.1' => 'id-pe-authorityInfoAccess', + '1.3.6.1.5.5.7.1.11' => 'id-pe-subjectInfoAccess', + '2.5.29.20' => 'id-ce-cRLNumber', + '2.5.29.28' => 'id-ce-issuingDistributionPoint', + '2.5.29.27' => 'id-ce-deltaCRLIndicator', + '2.5.29.21' => 'id-ce-cRLReasons', + '2.5.29.29' => 'id-ce-certificateIssuer', + '2.5.29.23' => 'id-ce-holdInstructionCode', + '1.2.840.10040.2' => 'holdInstruction', + '1.2.840.10040.2.1' => 'id-holdinstruction-none', + '1.2.840.10040.2.2' => 'id-holdinstruction-callissuer', + '1.2.840.10040.2.3' => 'id-holdinstruction-reject', + '2.5.29.24' => 'id-ce-invalidityDate', + + '1.2.840.113549.2.2' => 'md2', + '1.2.840.113549.2.5' => 'md5', + '1.3.14.3.2.26' => 'id-sha1', + '1.2.840.10040.4.1' => 'id-dsa', + '1.2.840.10040.4.3' => 'id-dsa-with-sha1', + '1.2.840.113549.1.1' => 'pkcs-1', + '1.2.840.113549.1.1.1' => 'rsaEncryption', + '1.2.840.113549.1.1.2' => 'md2WithRSAEncryption', + '1.2.840.113549.1.1.4' => 'md5WithRSAEncryption', + '1.2.840.113549.1.1.5' => 'sha1WithRSAEncryption', + '1.2.840.10046.2.1' => 'dhpublicnumber', + '2.16.840.1.101.2.1.1.22' => 'id-keyExchangeAlgorithm', + '1.2.840.10045' => 'ansi-X9-62', + '1.2.840.10045.4' => 'id-ecSigType', + '1.2.840.10045.4.1' => 'ecdsa-with-SHA1', + '1.2.840.10045.1' => 'id-fieldType', + '1.2.840.10045.1.1' => 'prime-field', + '1.2.840.10045.1.2' => 'characteristic-two-field', + '1.2.840.10045.1.2.3' => 'id-characteristic-two-basis', + '1.2.840.10045.1.2.3.1' => 'gnBasis', + '1.2.840.10045.1.2.3.2' => 'tpBasis', + '1.2.840.10045.1.2.3.3' => 'ppBasis', + '1.2.840.10045.2' => 'id-publicKeyType', + '1.2.840.10045.2.1' => 'id-ecPublicKey', + '1.2.840.10045.3' => 'ellipticCurve', + '1.2.840.10045.3.0' => 'c-TwoCurve', + '1.2.840.10045.3.0.1' => 'c2pnb163v1', + '1.2.840.10045.3.0.2' => 'c2pnb163v2', + '1.2.840.10045.3.0.3' => 'c2pnb163v3', + '1.2.840.10045.3.0.4' => 'c2pnb176w1', + '1.2.840.10045.3.0.5' => 'c2pnb191v1', + '1.2.840.10045.3.0.6' => 'c2pnb191v2', + '1.2.840.10045.3.0.7' => 'c2pnb191v3', + '1.2.840.10045.3.0.8' => 'c2pnb191v4', + '1.2.840.10045.3.0.9' => 'c2pnb191v5', + '1.2.840.10045.3.0.10' => 'c2pnb208w1', + '1.2.840.10045.3.0.11' => 'c2pnb239v1', + '1.2.840.10045.3.0.12' => 'c2pnb239v2', + '1.2.840.10045.3.0.13' => 'c2pnb239v3', + '1.2.840.10045.3.0.14' => 'c2pnb239v4', + '1.2.840.10045.3.0.15' => 'c2pnb239v5', + '1.2.840.10045.3.0.16' => 'c2pnb272w1', + '1.2.840.10045.3.0.17' => 'c2pnb304w1', + '1.2.840.10045.3.0.18' => 'c2pnb359v1', + '1.2.840.10045.3.0.19' => 'c2pnb368w1', + '1.2.840.10045.3.0.20' => 'c2pnb431r1', + '1.2.840.10045.3.1' => 'primeCurve', + '1.2.840.10045.3.1.1' => 'prime192v1', + '1.2.840.10045.3.1.2' => 'prime192v2', + '1.2.840.10045.3.1.3' => 'prime192v3', + '1.2.840.10045.3.1.4' => 'prime239v1', + '1.2.840.10045.3.1.5' => 'prime239v2', + '1.2.840.10045.3.1.6' => 'prime239v3', + '1.2.840.10045.3.1.7' => 'prime256v1', + '1.2.840.113549.1.1.7' => 'id-RSAES-OAEP', + '1.2.840.113549.1.1.9' => 'id-pSpecified', + '1.2.840.113549.1.1.10' => 'id-RSASSA-PSS', + '1.2.840.113549.1.1.8' => 'id-mgf1', + '1.2.840.113549.1.1.14' => 'sha224WithRSAEncryption', + '1.2.840.113549.1.1.11' => 'sha256WithRSAEncryption', + '1.2.840.113549.1.1.12' => 'sha384WithRSAEncryption', + '1.2.840.113549.1.1.13' => 'sha512WithRSAEncryption', + '2.16.840.1.101.3.4.2.4' => 'id-sha224', + '2.16.840.1.101.3.4.2.1' => 'id-sha256', + '2.16.840.1.101.3.4.2.2' => 'id-sha384', + '2.16.840.1.101.3.4.2.3' => 'id-sha512', + '1.2.643.2.2.4' => 'id-GostR3411-94-with-GostR3410-94', + '1.2.643.2.2.3' => 'id-GostR3411-94-with-GostR3410-2001', + '1.2.643.2.2.20' => 'id-GostR3410-2001', + '1.2.643.2.2.19' => 'id-GostR3410-94', + // Netscape Object Identifiers from "Netscape Certificate Extensions" + '2.16.840.1.113730' => 'netscape', + '2.16.840.1.113730.1' => 'netscape-cert-extension', + '2.16.840.1.113730.1.1' => 'netscape-cert-type', + '2.16.840.1.113730.1.13' => 'netscape-comment', + '2.16.840.1.113730.1.8' => 'netscape-ca-policy-url', + // the following are X.509 extensions not supported by phpseclib + '1.3.6.1.5.5.7.1.12' => 'id-pe-logotype', + '1.2.840.113533.7.65.0' => 'entrustVersInfo', + '2.16.840.1.113733.1.6.9' => 'verisignPrivate', + // for Certificate Signing Requests + // see http://tools.ietf.org/html/rfc2985 + '1.2.840.113549.1.9.2' => 'pkcs-9-at-unstructuredName', // PKCS #9 unstructured name + '1.2.840.113549.1.9.7' => 'pkcs-9-at-challengePassword', // Challenge password for certificate revocations + '1.2.840.113549.1.9.14' => 'pkcs-9-at-extensionRequest' // Certificate extension request + ); + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @access public + */ + function File_X509() + { + $this->__construct(); + } + + /** + * Load X.509 certificate + * + * Returns an associative array describing the X.509 cert or a false if the cert failed to load + * + * @param string $cert + * @param int $mode + * @access public + * @return mixed + */ + function loadX509($cert, $mode = FILE_X509_FORMAT_AUTO_DETECT) + { + if (is_array($cert) && isset($cert['tbsCertificate'])) { + unset($this->currentCert); + unset($this->currentKeyIdentifier); + $this->dn = $cert['tbsCertificate']['subject']; + if (!isset($this->dn)) { + return false; + } + $this->currentCert = $cert; + + $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); + $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; + + unset($this->signatureSubject); + + return $cert; + } + + $asn1 = new File_ASN1(); + + if ($mode != FILE_X509_FORMAT_DER) { + $newcert = $this->_extractBER($cert); + if ($mode == FILE_X509_FORMAT_PEM && $cert == $newcert) { + return false; + } + $cert = $newcert; + } + + if ($cert === false) { + $this->currentCert = false; + return false; + } + + $asn1->loadOIDs($this->oids); + $decoded = $asn1->decodeBER($cert); + + if (!empty($decoded)) { + $x509 = $asn1->asn1map($decoded[0], $this->Certificate); + } + if (!isset($x509) || $x509 === false) { + $this->currentCert = false; + return false; + } + + $this->signatureSubject = substr($cert, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + + if ($this->_isSubArrayValid($x509, 'tbsCertificate/extensions')) { + $this->_mapInExtensions($x509, 'tbsCertificate/extensions', $asn1); + } + $this->_mapInDNs($x509, 'tbsCertificate/issuer/rdnSequence', $asn1); + $this->_mapInDNs($x509, 'tbsCertificate/subject/rdnSequence', $asn1); + + $key = &$x509['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']; + $key = $this->_reformatKey($x509['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], $key); + + $this->currentCert = $x509; + $this->dn = $x509['tbsCertificate']['subject']; + + $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); + $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; + + return $x509; + } + + /** + * Save X.509 certificate + * + * @param array $cert + * @param int $format optional + * @access public + * @return string + */ + function saveX509($cert, $format = FILE_X509_FORMAT_PEM) + { + if (!is_array($cert) || !isset($cert['tbsCertificate'])) { + return false; + } + + switch (true) { + // "case !$a: case !$b: break; default: whatever();" is the same thing as "if ($a && $b) whatever()" + case !($algorithm = $this->_subArray($cert, 'tbsCertificate/subjectPublicKeyInfo/algorithm/algorithm')): + case is_object($cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): + break; + default: + switch ($algorithm) { + case 'rsaEncryption': + $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'] + = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']))); + /* "[For RSA keys] the parameters field MUST have ASN.1 type NULL for this algorithm identifier." + -- https://tools.ietf.org/html/rfc3279#section-2.3.1 + + given that and the fact that RSA keys appear ot be the only key type for which the parameters field can be blank, + it seems like perhaps the ASN.1 description ought not say the parameters field is OPTIONAL, but whatever. + */ + $cert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['parameters'] = null; + // https://tools.ietf.org/html/rfc3279#section-2.2.1 + $cert['signatureAlgorithm']['parameters'] = null; + $cert['tbsCertificate']['signature']['parameters'] = null; + } + } + + $asn1 = new File_ASN1(); + $asn1->loadOIDs($this->oids); + + $filters = array(); + $type_utf8_string = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + $filters['tbsCertificate']['signature']['parameters'] = $type_utf8_string; + $filters['tbsCertificate']['signature']['issuer']['rdnSequence']['value'] = $type_utf8_string; + $filters['tbsCertificate']['issuer']['rdnSequence']['value'] = $type_utf8_string; + $filters['tbsCertificate']['subject']['rdnSequence']['value'] = $type_utf8_string; + $filters['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['parameters'] = $type_utf8_string; + $filters['signatureAlgorithm']['parameters'] = $type_utf8_string; + $filters['authorityCertIssuer']['directoryName']['rdnSequence']['value'] = $type_utf8_string; + //$filters['policyQualifiers']['qualifier'] = $type_utf8_string; + $filters['distributionPoint']['fullName']['directoryName']['rdnSequence']['value'] = $type_utf8_string; + $filters['directoryName']['rdnSequence']['value'] = $type_utf8_string; + + /* in the case of policyQualifiers/qualifier, the type has to be FILE_ASN1_TYPE_IA5_STRING. + FILE_ASN1_TYPE_PRINTABLE_STRING will cause OpenSSL's X.509 parser to spit out random + characters. + */ + $filters['policyQualifiers']['qualifier'] + = array('type' => FILE_ASN1_TYPE_IA5_STRING); + + $asn1->loadFilters($filters); + + $this->_mapOutExtensions($cert, 'tbsCertificate/extensions', $asn1); + $this->_mapOutDNs($cert, 'tbsCertificate/issuer/rdnSequence', $asn1); + $this->_mapOutDNs($cert, 'tbsCertificate/subject/rdnSequence', $asn1); + + $cert = $asn1->encodeDER($cert, $this->Certificate); + + switch ($format) { + case FILE_X509_FORMAT_DER: + return $cert; + // case FILE_X509_FORMAT_PEM: + default: + return "-----BEGIN CERTIFICATE-----\r\n" . chunk_split(base64_encode($cert), 64) . '-----END CERTIFICATE-----'; + } + } + + /** + * Map extension values from octet string to extension-specific internal + * format. + * + * @param array ref $root + * @param string $path + * @param object $asn1 + * @access private + */ + function _mapInExtensions(&$root, $path, $asn1) + { + $extensions = &$this->_subArrayUnchecked($root, $path); + + if ($extensions) { + for ($i = 0; $i < count($extensions); $i++) { + $id = $extensions[$i]['extnId']; + $value = &$extensions[$i]['extnValue']; + $value = base64_decode($value); + $decoded = $asn1->decodeBER($value); + /* [extnValue] contains the DER encoding of an ASN.1 value + corresponding to the extension type identified by extnID */ + $map = $this->_getMapping($id); + if (!is_bool($map)) { + $mapped = $asn1->asn1map($decoded[0], $map, array('iPAddress' => array($this, '_decodeIP'))); + $value = $mapped === false ? $decoded[0] : $mapped; + + if ($id == 'id-ce-certificatePolicies') { + for ($j = 0; $j < count($value); $j++) { + if (!isset($value[$j]['policyQualifiers'])) { + continue; + } + for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) { + $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; + $map = $this->_getMapping($subid); + $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier']; + if ($map !== false) { + $decoded = $asn1->decodeBER($subvalue); + $mapped = $asn1->asn1map($decoded[0], $map); + $subvalue = $mapped === false ? $decoded[0] : $mapped; + } + } + } + } + } else { + $value = base64_encode($value); + } + } + } + } + + /** + * Map extension values from extension-specific internal format to + * octet string. + * + * @param array ref $root + * @param string $path + * @param object $asn1 + * @access private + */ + function _mapOutExtensions(&$root, $path, $asn1) + { + $extensions = &$this->_subArray($root, $path); + + if (is_array($extensions)) { + $size = count($extensions); + for ($i = 0; $i < $size; $i++) { + if (is_object($extensions[$i]) && strtolower(get_class($extensions[$i])) == 'file_asn1_element') { + continue; + } + + $id = $extensions[$i]['extnId']; + $value = &$extensions[$i]['extnValue']; + + switch ($id) { + case 'id-ce-certificatePolicies': + for ($j = 0; $j < count($value); $j++) { + if (!isset($value[$j]['policyQualifiers'])) { + continue; + } + for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) { + $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; + $map = $this->_getMapping($subid); + $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier']; + if ($map !== false) { + // by default File_ASN1 will try to render qualifier as a FILE_ASN1_TYPE_IA5_STRING since it's + // actual type is FILE_ASN1_TYPE_ANY + $subvalue = new File_ASN1_Element($asn1->encodeDER($subvalue, $map)); + } + } + } + break; + case 'id-ce-authorityKeyIdentifier': // use 00 as the serial number instead of an empty string + if (isset($value['authorityCertSerialNumber'])) { + if ($value['authorityCertSerialNumber']->toBytes() == '') { + $temp = chr((FILE_ASN1_CLASS_CONTEXT_SPECIFIC << 6) | 2) . "\1\0"; + $value['authorityCertSerialNumber'] = new File_ASN1_Element($temp); + } + } + } + + /* [extnValue] contains the DER encoding of an ASN.1 value + corresponding to the extension type identified by extnID */ + $map = $this->_getMapping($id); + if (is_bool($map)) { + if (!$map) { + user_error($id . ' is not a currently supported extension'); + unset($extensions[$i]); + } + } else { + $temp = $asn1->encodeDER($value, $map, array('iPAddress' => array($this, '_encodeIP'))); + $value = base64_encode($temp); + } + } + } + } + + /** + * Map attribute values from ANY type to attribute-specific internal + * format. + * + * @param array ref $root + * @param string $path + * @param object $asn1 + * @access private + */ + function _mapInAttributes(&$root, $path, $asn1) + { + $attributes = &$this->_subArray($root, $path); + + if (is_array($attributes)) { + for ($i = 0; $i < count($attributes); $i++) { + $id = $attributes[$i]['type']; + /* $value contains the DER encoding of an ASN.1 value + corresponding to the attribute type identified by type */ + $map = $this->_getMapping($id); + if (is_array($attributes[$i]['value'])) { + $values = &$attributes[$i]['value']; + for ($j = 0; $j < count($values); $j++) { + $value = $asn1->encodeDER($values[$j], $this->AttributeValue); + $decoded = $asn1->decodeBER($value); + if (!is_bool($map)) { + $mapped = $asn1->asn1map($decoded[0], $map); + if ($mapped !== false) { + $values[$j] = $mapped; + } + if ($id == 'pkcs-9-at-extensionRequest' && $this->_isSubArrayValid($values, $j)) { + $this->_mapInExtensions($values, $j, $asn1); + } + } elseif ($map) { + $values[$j] = base64_encode($value); + } + } + } + } + } + } + + /** + * Map attribute values from attribute-specific internal format to + * ANY type. + * + * @param array ref $root + * @param string $path + * @param object $asn1 + * @access private + */ + function _mapOutAttributes(&$root, $path, $asn1) + { + $attributes = &$this->_subArray($root, $path); + + if (is_array($attributes)) { + $size = count($attributes); + for ($i = 0; $i < $size; $i++) { + /* [value] contains the DER encoding of an ASN.1 value + corresponding to the attribute type identified by type */ + $id = $attributes[$i]['type']; + $map = $this->_getMapping($id); + if ($map === false) { + user_error($id . ' is not a currently supported attribute', E_USER_NOTICE); + unset($attributes[$i]); + } elseif (is_array($attributes[$i]['value'])) { + $values = &$attributes[$i]['value']; + for ($j = 0; $j < count($values); $j++) { + switch ($id) { + case 'pkcs-9-at-extensionRequest': + $this->_mapOutExtensions($values, $j, $asn1); + break; + } + + if (!is_bool($map)) { + $temp = $asn1->encodeDER($values[$j], $map); + $decoded = $asn1->decodeBER($temp); + $values[$j] = $asn1->asn1map($decoded[0], $this->AttributeValue); + } + } + } + } + } + } + + /** + * Map DN values from ANY type to DN-specific internal + * format. + * + * @param array ref $root + * @param string $path + * @param object $asn1 + * @access private + */ + function _mapInDNs(&$root, $path, $asn1) + { + $dns = &$this->_subArray($root, $path); + + if (is_array($dns)) { + for ($i = 0; $i < count($dns); $i++) { + for ($j = 0; $j < count($dns[$i]); $j++) { + $type = $dns[$i][$j]['type']; + $value = &$dns[$i][$j]['value']; + if (is_object($value) && strtolower(get_class($value)) == 'file_asn1_element') { + $map = $this->_getMapping($type); + if (!is_bool($map)) { + $decoded = $asn1->decodeBER($value); + $value = $asn1->asn1map($decoded[0], $map); + } + } + } + } + } + } + + /** + * Map DN values from DN-specific internal format to + * ANY type. + * + * @param array ref $root + * @param string $path + * @param object $asn1 + * @access private + */ + function _mapOutDNs(&$root, $path, $asn1) + { + $dns = &$this->_subArray($root, $path); + + if (is_array($dns)) { + $size = count($dns); + for ($i = 0; $i < $size; $i++) { + for ($j = 0; $j < count($dns[$i]); $j++) { + $type = $dns[$i][$j]['type']; + $value = &$dns[$i][$j]['value']; + if (is_object($value) && strtolower(get_class($value)) == 'file_asn1_element') { + continue; + } + + $map = $this->_getMapping($type); + if (!is_bool($map)) { + $value = new File_ASN1_Element($asn1->encodeDER($value, $map)); + } + } + } + } + } + + /** + * Associate an extension ID to an extension mapping + * + * @param string $extnId + * @access private + * @return mixed + */ + function _getMapping($extnId) + { + if (!is_string($extnId)) { // eg. if it's a File_ASN1_Element object + return true; + } + + switch ($extnId) { + case 'id-ce-keyUsage': + return $this->KeyUsage; + case 'id-ce-basicConstraints': + return $this->BasicConstraints; + case 'id-ce-subjectKeyIdentifier': + return $this->KeyIdentifier; + case 'id-ce-cRLDistributionPoints': + return $this->CRLDistributionPoints; + case 'id-ce-authorityKeyIdentifier': + return $this->AuthorityKeyIdentifier; + case 'id-ce-certificatePolicies': + return $this->CertificatePolicies; + case 'id-ce-extKeyUsage': + return $this->ExtKeyUsageSyntax; + case 'id-pe-authorityInfoAccess': + return $this->AuthorityInfoAccessSyntax; + case 'id-ce-subjectAltName': + return $this->SubjectAltName; + case 'id-ce-subjectDirectoryAttributes': + return $this->SubjectDirectoryAttributes; + case 'id-ce-privateKeyUsagePeriod': + return $this->PrivateKeyUsagePeriod; + case 'id-ce-issuerAltName': + return $this->IssuerAltName; + case 'id-ce-policyMappings': + return $this->PolicyMappings; + case 'id-ce-nameConstraints': + return $this->NameConstraints; + + case 'netscape-cert-type': + return $this->netscape_cert_type; + case 'netscape-comment': + return $this->netscape_comment; + case 'netscape-ca-policy-url': + return $this->netscape_ca_policy_url; + + // since id-qt-cps isn't a constructed type it will have already been decoded as a string by the time it gets + // back around to asn1map() and we don't want it decoded again. + //case 'id-qt-cps': + // return $this->CPSuri; + case 'id-qt-unotice': + return $this->UserNotice; + + // the following OIDs are unsupported but we don't want them to give notices when calling saveX509(). + case 'id-pe-logotype': // http://www.ietf.org/rfc/rfc3709.txt + case 'entrustVersInfo': + // http://support.microsoft.com/kb/287547 + case '1.3.6.1.4.1.311.20.2': // szOID_ENROLL_CERTTYPE_EXTENSION + case '1.3.6.1.4.1.311.21.1': // szOID_CERTSRV_CA_VERSION + // "SET Secure Electronic Transaction Specification" + // http://www.maithean.com/docs/set_bk3.pdf + case '2.23.42.7.0': // id-set-hashedRootKey + // "Certificate Transparency" + // https://tools.ietf.org/html/rfc6962 + case '1.3.6.1.4.1.11129.2.4.2': + // "Qualified Certificate statements" + // https://tools.ietf.org/html/rfc3739#section-3.2.6 + case '1.3.6.1.5.5.7.1.3': + return true; + + // CSR attributes + case 'pkcs-9-at-unstructuredName': + return $this->PKCS9String; + case 'pkcs-9-at-challengePassword': + return $this->DirectoryString; + case 'pkcs-9-at-extensionRequest': + return $this->Extensions; + + // CRL extensions. + case 'id-ce-cRLNumber': + return $this->CRLNumber; + case 'id-ce-deltaCRLIndicator': + return $this->CRLNumber; + case 'id-ce-issuingDistributionPoint': + return $this->IssuingDistributionPoint; + case 'id-ce-freshestCRL': + return $this->CRLDistributionPoints; + case 'id-ce-cRLReasons': + return $this->CRLReason; + case 'id-ce-invalidityDate': + return $this->InvalidityDate; + case 'id-ce-certificateIssuer': + return $this->CertificateIssuer; + case 'id-ce-holdInstructionCode': + return $this->HoldInstructionCode; + case 'id-at-postalAddress': + return $this->PostalAddress; + } + + return false; + } + + /** + * Load an X.509 certificate as a certificate authority + * + * @param string $cert + * @access public + * @return bool + */ + function loadCA($cert) + { + $olddn = $this->dn; + $oldcert = $this->currentCert; + $oldsigsubj = $this->signatureSubject; + $oldkeyid = $this->currentKeyIdentifier; + + $cert = $this->loadX509($cert); + if (!$cert) { + $this->dn = $olddn; + $this->currentCert = $oldcert; + $this->signatureSubject = $oldsigsubj; + $this->currentKeyIdentifier = $oldkeyid; + + return false; + } + + /* From RFC5280 "PKIX Certificate and CRL Profile": + + If the keyUsage extension is present, then the subject public key + MUST NOT be used to verify signatures on certificates or CRLs unless + the corresponding keyCertSign or cRLSign bit is set. */ + //$keyUsage = $this->getExtension('id-ce-keyUsage'); + //if ($keyUsage && !in_array('keyCertSign', $keyUsage)) { + // return false; + //} + + /* From RFC5280 "PKIX Certificate and CRL Profile": + + The cA boolean indicates whether the certified public key may be used + to verify certificate signatures. If the cA boolean is not asserted, + then the keyCertSign bit in the key usage extension MUST NOT be + asserted. If the basic constraints extension is not present in a + version 3 certificate, or the extension is present but the cA boolean + is not asserted, then the certified public key MUST NOT be used to + verify certificate signatures. */ + //$basicConstraints = $this->getExtension('id-ce-basicConstraints'); + //if (!$basicConstraints || !$basicConstraints['cA']) { + // return false; + //} + + $this->CAs[] = $cert; + + $this->dn = $olddn; + $this->currentCert = $oldcert; + $this->signatureSubject = $oldsigsubj; + + return true; + } + + /** + * Validate an X.509 certificate against a URL + * + * From RFC2818 "HTTP over TLS": + * + * Matching is performed using the matching rules specified by + * [RFC2459]. If more than one identity of a given type is present in + * the certificate (e.g., more than one dNSName name, a match in any one + * of the set is considered acceptable.) Names may contain the wildcard + * character * which is considered to match any single domain name + * component or component fragment. E.g., *.a.com matches foo.a.com but + * not bar.foo.a.com. f*.com matches foo.com but not bar.com. + * + * @param string $url + * @access public + * @return bool + */ + function validateURL($url) + { + if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { + return false; + } + + $components = parse_url($url); + if (!isset($components['host'])) { + return false; + } + + if ($names = $this->getExtension('id-ce-subjectAltName')) { + foreach ($names as $name) { + foreach ($name as $key => $value) { + $value = str_replace(array('.', '*'), array('\.', '[^.]*'), $value); + switch ($key) { + case 'dNSName': + /* From RFC2818 "HTTP over TLS": + + If a subjectAltName extension of type dNSName is present, that MUST + be used as the identity. Otherwise, the (most specific) Common Name + field in the Subject field of the certificate MUST be used. Although + the use of the Common Name is existing practice, it is deprecated and + Certification Authorities are encouraged to use the dNSName instead. */ + if (preg_match('#^' . $value . '$#', $components['host'])) { + return true; + } + break; + case 'iPAddress': + /* From RFC2818 "HTTP over TLS": + + In some cases, the URI is specified as an IP address rather than a + hostname. In this case, the iPAddress subjectAltName must be present + in the certificate and must exactly match the IP in the URI. */ + if (preg_match('#(?:\d{1-3}\.){4}#', $components['host'] . '.') && preg_match('#^' . $value . '$#', $components['host'])) { + return true; + } + } + } + } + return false; + } + + if ($value = $this->getDNProp('id-at-commonName')) { + $value = str_replace(array('.', '*'), array('\.', '[^.]*'), $value[0]); + return preg_match('#^' . $value . '$#', $components['host']); + } + + return false; + } + + /** + * Validate a date + * + * If $date isn't defined it is assumed to be the current date. + * + * @param \DateTime|int|string $date optional + * @access public + */ + function validateDate($date = null) + { + if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { + return false; + } + + if (!isset($date)) { + $date = class_exists('DateTime') ? + new DateTime(null, new DateTimeZone(@date_default_timezone_get())) : + time(); + } + + $notBefore = $this->currentCert['tbsCertificate']['validity']['notBefore']; + $notBefore = isset($notBefore['generalTime']) ? $notBefore['generalTime'] : $notBefore['utcTime']; + + $notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter']; + $notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime']; + + switch (true) { + case is_string($date) && class_exists('DateTime'): + $date = new DateTime($date, new DateTimeZone(@date_default_timezone_get())); + case is_object($date) && strtolower(get_class($date)) == 'datetime': + $notBefore = new DateTime($notBefore, new DateTimeZone(@date_default_timezone_get())); + $notAfter = new DateTime($notAfter, new DateTimeZone(@date_default_timezone_get())); + break; + case is_string($date): + $date = @strtotime($date); + default: + $notBefore = @strtotime($notBefore); + $notAfter = @strtotime($notAfter); + } + + switch (true) { + case $date < $notBefore: + case $date > $notAfter: + return false; + } + + return true; + } + + /** + * Fetches a URL + * + * @param string $url + * @access private + * @return bool|string + */ + function _fetchURL($url) + { + if ($this->disable_url_fetch) { + return false; + } + + $parts = parse_url($url); + $data = ''; + switch ($parts['scheme']) { + case 'http': + $fsock = @fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80); + if (!$fsock) { + return false; + } + fputs($fsock, "GET $parts[path] HTTP/1.0\r\n"); + fputs($fsock, "Host: $parts[host]\r\n\r\n"); + $line = fgets($fsock, 1024); + if (strlen($line) < 3) { + return false; + } + preg_match('#HTTP/1.\d (\d{3})#', $line, $temp); + if ($temp[1] != '200') { + return false; + } + + // skip the rest of the headers in the http response + while (!feof($fsock) && fgets($fsock, 1024) != "\r\n") { + } + + while (!feof($fsock)) { + $data.= fread($fsock, 1024); + } + + break; + //case 'ftp': + //case 'ldap': + //default: + } + + return $data; + } + + /** + * Validates an intermediate cert as identified via authority info access extension + * + * See https://tools.ietf.org/html/rfc4325 for more info + * + * @param bool $caonly + * @param int $count + * @access private + * @return bool + */ + function _testForIntermediate($caonly, $count) + { + $opts = $this->getExtension('id-pe-authorityInfoAccess'); + if (!is_array($opts)) { + return false; + } + foreach ($opts as $opt) { + if ($opt['accessMethod'] == 'id-ad-caIssuers') { + // accessLocation is a GeneralName. GeneralName fields support stuff like email addresses, IP addresses, LDAP, + // etc, but we're only supporting URI's. URI's and LDAP are the only thing https://tools.ietf.org/html/rfc4325 + // discusses + if (isset($opt['accessLocation']['uniformResourceIdentifier'])) { + $url = $opt['accessLocation']['uniformResourceIdentifier']; + break; + } + } + } + + if (!isset($url)) { + return false; + } + + $cert = $this->_fetchURL($url); + if (!is_string($cert)) { + return false; + } + + $parent = new static(); + $parent->CAs = $this->CAs; + /* + "Conforming applications that support HTTP or FTP for accessing + certificates MUST be able to accept .cer files and SHOULD be able + to accept .p7c files." -- https://tools.ietf.org/html/rfc4325 + + A .p7c file is 'a "certs-only" CMS message as specified in RFC 2797" + + These are currently unsupported + */ + if (!is_array($parent->loadX509($cert))) { + return false; + } + + if (!$parent->_validateSignatureCountable($caonly, ++$count)) { + return false; + } + + $this->CAs[] = $parent->currentCert; + //$this->loadCA($cert); + + return true; + } + + /** + * Validate a signature + * + * Works on X.509 certs, CSR's and CRL's. + * Returns true if the signature is verified, false if it is not correct or null on error + * + * By default returns false for self-signed certs. Call validateSignature(false) to make this support + * self-signed. + * + * The behavior of this function is inspired by {@link http://php.net/openssl-verify openssl_verify}. + * + * @param bool $caonly optional + * @access public + * @return mixed + */ + function validateSignature($caonly = true) + { + return $this->_validateSignatureCountable($caonly, 0); + } + + /** + * Validate a signature + * + * Performs said validation whilst keeping track of how many times validation method is called + * + * @param bool $caonly + * @param int $count + * @access private + * @return mixed + */ + function _validateSignatureCountable($caonly, $count) + { + if (!is_array($this->currentCert) || !isset($this->signatureSubject)) { + return null; + } + + if ($count == $this->recur_limit) { + return false; + } + + /* TODO: + "emailAddress attribute values are not case-sensitive (e.g., "subscriber@example.com" is the same as "SUBSCRIBER@EXAMPLE.COM")." + -- http://tools.ietf.org/html/rfc5280#section-4.1.2.6 + + implement pathLenConstraint in the id-ce-basicConstraints extension */ + + switch (true) { + case isset($this->currentCert['tbsCertificate']): + // self-signed cert + switch (true) { + case !defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertificate']['issuer'] === $this->currentCert['tbsCertificate']['subject']: + case defined('FILE_X509_IGNORE_TYPE') && $this->getIssuerDN(FILE_X509_DN_STRING) === $this->getDN(FILE_X509_DN_STRING): + $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); + $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier'); + switch (true) { + case !is_array($authorityKey): + case !$subjectKeyID: + case isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: + $signingCert = $this->currentCert; // working cert + } + } + + if (!empty($this->CAs)) { + for ($i = 0; $i < count($this->CAs); $i++) { + // even if the cert is a self-signed one we still want to see if it's a CA; + // if not, we'll conditionally return an error + $ca = $this->CAs[$i]; + switch (true) { + case !defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']: + case defined('FILE_X509_IGNORE_TYPE') && $this->getDN(FILE_X509_DN_STRING, $this->currentCert['tbsCertificate']['issuer']) === $this->getDN(FILE_X509_DN_STRING, $ca['tbsCertificate']['subject']): + $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); + $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); + switch (true) { + case !is_array($authorityKey): + case !$subjectKeyID: + case isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: + if (is_array($authorityKey) && isset($authorityKey['authorityCertSerialNumber']) && !$authorityKey['authorityCertSerialNumber']->equals($ca['tbsCertificate']['serialNumber'])) { + break 2; // serial mismatch - check other ca + } + $signingCert = $ca; // working cert + break 3; + } + } + } + if (count($this->CAs) == $i && $caonly) { + return $this->_testForIntermediate($caonly, $count) && $this->validateSignature($caonly); + } + } elseif (!isset($signingCert) || $caonly) { + return $this->_testForIntermediate($caonly, $count) && $this->validateSignature($caonly); + } + return $this->_validateSignature( + $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], + $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], + $this->currentCert['signatureAlgorithm']['algorithm'], + substr(base64_decode($this->currentCert['signature']), 1), + $this->signatureSubject + ); + case isset($this->currentCert['certificationRequestInfo']): + return $this->_validateSignature( + $this->currentCert['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm'], + $this->currentCert['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], + $this->currentCert['signatureAlgorithm']['algorithm'], + substr(base64_decode($this->currentCert['signature']), 1), + $this->signatureSubject + ); + case isset($this->currentCert['publicKeyAndChallenge']): + return $this->_validateSignature( + $this->currentCert['publicKeyAndChallenge']['spki']['algorithm']['algorithm'], + $this->currentCert['publicKeyAndChallenge']['spki']['subjectPublicKey'], + $this->currentCert['signatureAlgorithm']['algorithm'], + substr(base64_decode($this->currentCert['signature']), 1), + $this->signatureSubject + ); + case isset($this->currentCert['tbsCertList']): + if (!empty($this->CAs)) { + for ($i = 0; $i < count($this->CAs); $i++) { + $ca = $this->CAs[$i]; + switch (true) { + case !defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertList']['issuer'] === $ca['tbsCertificate']['subject']: + case defined('FILE_X509_IGNORE_TYPE') && $this->getDN(FILE_X509_DN_STRING, $this->currentCert['tbsCertList']['issuer']) === $this->getDN(FILE_X509_DN_STRING, $ca['tbsCertificate']['subject']): + $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); + $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); + switch (true) { + case !is_array($authorityKey): + case !$subjectKeyID: + case isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: + if (is_array($authorityKey) && isset($authorityKey['authorityCertSerialNumber']) && !$authorityKey['authorityCertSerialNumber']->equals($ca['tbsCertificate']['serialNumber'])) { + break 2; // serial mismatch - check other ca + } + $signingCert = $ca; // working cert + break 3; + } + } + } + } + if (!isset($signingCert)) { + return false; + } + return $this->_validateSignature( + $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], + $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], + $this->currentCert['signatureAlgorithm']['algorithm'], + substr(base64_decode($this->currentCert['signature']), 1), + $this->signatureSubject + ); + default: + return false; + } + } + + /** + * Validates a signature + * + * Returns true if the signature is verified, false if it is not correct or null on error + * + * @param string $publicKeyAlgorithm + * @param string $publicKey + * @param string $signatureAlgorithm + * @param string $signature + * @param string $signatureSubject + * @access private + * @return int + */ + function _validateSignature($publicKeyAlgorithm, $publicKey, $signatureAlgorithm, $signature, $signatureSubject) + { + switch ($publicKeyAlgorithm) { + case 'rsaEncryption': + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + $rsa = new Crypt_RSA(); + $rsa->loadKey($publicKey); + + switch ($signatureAlgorithm) { + case 'md2WithRSAEncryption': + case 'md5WithRSAEncryption': + case 'sha1WithRSAEncryption': + case 'sha224WithRSAEncryption': + case 'sha256WithRSAEncryption': + case 'sha384WithRSAEncryption': + case 'sha512WithRSAEncryption': + $rsa->setHash(preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm)); + $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); + if (!@$rsa->verify($signatureSubject, $signature)) { + return false; + } + break; + default: + return null; + } + break; + default: + return null; + } + + return true; + } + + /** + * Sets the recursion limit + * + * When validating a signature it may be necessary to download intermediate certs from URI's. + * An intermediate cert that linked to itself would result in an infinite loop so to prevent + * that we set a recursion limit. A negative number means that there is no recursion limit. + * + * @param int $count + * @access public + */ + function setRecurLimit($count) + { + $this->recur_limit = $count; + } + + /** + * Prevents URIs from being automatically retrieved + * + * @access public + */ + function disableURLFetch() + { + $this->disable_url_fetch = true; + } + + /** + * Allows URIs to be automatically retrieved + * + * @access public + */ + function enableURLFetch() + { + $this->disable_url_fetch = false; + } + + /** + * Reformat public keys + * + * Reformats a public key to a format supported by phpseclib (if applicable) + * + * @param string $algorithm + * @param string $key + * @access private + * @return string + */ + function _reformatKey($algorithm, $key) + { + switch ($algorithm) { + case 'rsaEncryption': + return + "-----BEGIN RSA PUBLIC KEY-----\r\n" . + // subjectPublicKey is stored as a bit string in X.509 certs. the first byte of a bit string represents how many bits + // in the last byte should be ignored. the following only supports non-zero stuff but as none of the X.509 certs Firefox + // uses as a cert authority actually use a non-zero bit I think it's safe to assume that none do. + chunk_split(base64_encode(substr(base64_decode($key), 1)), 64) . + '-----END RSA PUBLIC KEY-----'; + default: + return $key; + } + } + + /** + * Decodes an IP address + * + * Takes in a base64 encoded "blob" and returns a human readable IP address + * + * @param string $ip + * @access private + * @return string + */ + function _decodeIP($ip) + { + $ip = base64_decode($ip); + list(, $ip) = unpack('N', $ip); + return long2ip($ip); + } + + /** + * Encodes an IP address + * + * Takes a human readable IP address into a base64-encoded "blob" + * + * @param string $ip + * @access private + * @return string + */ + function _encodeIP($ip) + { + return base64_encode(pack('N', ip2long($ip))); + } + + /** + * "Normalizes" a Distinguished Name property + * + * @param string $propName + * @access private + * @return mixed + */ + function _translateDNProp($propName) + { + switch (strtolower($propName)) { + case 'id-at-countryname': + case 'countryname': + case 'c': + return 'id-at-countryName'; + case 'id-at-organizationname': + case 'organizationname': + case 'o': + return 'id-at-organizationName'; + case 'id-at-dnqualifier': + case 'dnqualifier': + return 'id-at-dnQualifier'; + case 'id-at-commonname': + case 'commonname': + case 'cn': + return 'id-at-commonName'; + case 'id-at-stateorprovincename': + case 'stateorprovincename': + case 'state': + case 'province': + case 'provincename': + case 'st': + return 'id-at-stateOrProvinceName'; + case 'id-at-localityname': + case 'localityname': + case 'l': + return 'id-at-localityName'; + case 'id-emailaddress': + case 'emailaddress': + return 'pkcs-9-at-emailAddress'; + case 'id-at-serialnumber': + case 'serialnumber': + return 'id-at-serialNumber'; + case 'id-at-postalcode': + case 'postalcode': + return 'id-at-postalCode'; + case 'id-at-streetaddress': + case 'streetaddress': + return 'id-at-streetAddress'; + case 'id-at-name': + case 'name': + return 'id-at-name'; + case 'id-at-givenname': + case 'givenname': + return 'id-at-givenName'; + case 'id-at-surname': + case 'surname': + case 'sn': + return 'id-at-surname'; + case 'id-at-initials': + case 'initials': + return 'id-at-initials'; + case 'id-at-generationqualifier': + case 'generationqualifier': + return 'id-at-generationQualifier'; + case 'id-at-organizationalunitname': + case 'organizationalunitname': + case 'ou': + return 'id-at-organizationalUnitName'; + case 'id-at-pseudonym': + case 'pseudonym': + return 'id-at-pseudonym'; + case 'id-at-title': + case 'title': + return 'id-at-title'; + case 'id-at-description': + case 'description': + return 'id-at-description'; + case 'id-at-role': + case 'role': + return 'id-at-role'; + case 'id-at-uniqueidentifier': + case 'uniqueidentifier': + case 'x500uniqueidentifier': + return 'id-at-uniqueIdentifier'; + case 'postaladdress': + case 'id-at-postaladdress': + return 'id-at-postalAddress'; + default: + return false; + } + } + + /** + * Set a Distinguished Name property + * + * @param string $propName + * @param mixed $propValue + * @param string $type optional + * @access public + * @return bool + */ + function setDNProp($propName, $propValue, $type = 'utf8String') + { + if (empty($this->dn)) { + $this->dn = array('rdnSequence' => array()); + } + + if (($propName = $this->_translateDNProp($propName)) === false) { + return false; + } + + foreach ((array) $propValue as $v) { + if (!is_array($v) && isset($type)) { + $v = array($type => $v); + } + $this->dn['rdnSequence'][] = array( + array( + 'type' => $propName, + 'value'=> $v + ) + ); + } + + return true; + } + + /** + * Remove Distinguished Name properties + * + * @param string $propName + * @access public + */ + function removeDNProp($propName) + { + if (empty($this->dn)) { + return; + } + + if (($propName = $this->_translateDNProp($propName)) === false) { + return; + } + + $dn = &$this->dn['rdnSequence']; + $size = count($dn); + for ($i = 0; $i < $size; $i++) { + if ($dn[$i][0]['type'] == $propName) { + unset($dn[$i]); + } + } + + $dn = array_values($dn); + // fix for https://bugs.php.net/75433 affecting PHP 7.2 + if (!isset($dn[0])) { + $dn = array_splice($dn, 0, 0); + } + } + + /** + * Get Distinguished Name properties + * + * @param string $propName + * @param array $dn optional + * @param bool $withType optional + * @return mixed + * @access public + */ + function getDNProp($propName, $dn = null, $withType = false) + { + if (!isset($dn)) { + $dn = $this->dn; + } + + if (empty($dn)) { + return false; + } + + if (($propName = $this->_translateDNProp($propName)) === false) { + return false; + } + + $asn1 = new File_ASN1(); + $asn1->loadOIDs($this->oids); + $filters = array(); + $filters['value'] = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + $asn1->loadFilters($filters); + $this->_mapOutDNs($dn, 'rdnSequence', $asn1); + $dn = $dn['rdnSequence']; + $result = array(); + for ($i = 0; $i < count($dn); $i++) { + if ($dn[$i][0]['type'] == $propName) { + $v = $dn[$i][0]['value']; + if (!$withType) { + if (is_array($v)) { + foreach ($v as $type => $s) { + $type = array_search($type, $asn1->ANYmap, true); + if ($type !== false && isset($asn1->stringTypeSize[$type])) { + $s = $asn1->convert($s, $type); + if ($s !== false) { + $v = $s; + break; + } + } + } + if (is_array($v)) { + $v = array_pop($v); // Always strip data type. + } + } elseif (is_object($v) && strtolower(get_class($v)) == 'file_asn1_element') { + $map = $this->_getMapping($propName); + if (!is_bool($map)) { + $decoded = $asn1->decodeBER($v); + $v = $asn1->asn1map($decoded[0], $map); + } + } + } + $result[] = $v; + } + } + + return $result; + } + + /** + * Set a Distinguished Name + * + * @param mixed $dn + * @param bool $merge optional + * @param string $type optional + * @access public + * @return bool + */ + function setDN($dn, $merge = false, $type = 'utf8String') + { + if (!$merge) { + $this->dn = null; + } + + if (is_array($dn)) { + if (isset($dn['rdnSequence'])) { + $this->dn = $dn; // No merge here. + return true; + } + + // handles stuff generated by openssl_x509_parse() + foreach ($dn as $prop => $value) { + if (!$this->setDNProp($prop, $value, $type)) { + return false; + } + } + return true; + } + + // handles everything else + $results = preg_split('#((?:^|, *|/)(?:C=|O=|OU=|CN=|L=|ST=|SN=|postalCode=|streetAddress=|emailAddress=|serialNumber=|organizationalUnitName=|title=|description=|role=|x500UniqueIdentifier=|postalAddress=))#', $dn, -1, PREG_SPLIT_DELIM_CAPTURE); + for ($i = 1; $i < count($results); $i+=2) { + $prop = trim($results[$i], ', =/'); + $value = $results[$i + 1]; + if (!$this->setDNProp($prop, $value, $type)) { + return false; + } + } + + return true; + } + + /** + * Get the Distinguished Name for a certificates subject + * + * @param mixed $format optional + * @param array $dn optional + * @access public + * @return bool + */ + function getDN($format = FILE_X509_DN_ARRAY, $dn = null) + { + if (!isset($dn)) { + $dn = isset($this->currentCert['tbsCertList']) ? $this->currentCert['tbsCertList']['issuer'] : $this->dn; + } + + switch ((int) $format) { + case FILE_X509_DN_ARRAY: + return $dn; + case FILE_X509_DN_ASN1: + $asn1 = new File_ASN1(); + $asn1->loadOIDs($this->oids); + $filters = array(); + $filters['rdnSequence']['value'] = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + $asn1->loadFilters($filters); + $this->_mapOutDNs($dn, 'rdnSequence', $asn1); + return $asn1->encodeDER($dn, $this->Name); + case FILE_X509_DN_CANON: + // No SEQUENCE around RDNs and all string values normalized as + // trimmed lowercase UTF-8 with all spacing as one blank. + // constructed RDNs will not be canonicalized + $asn1 = new File_ASN1(); + $asn1->loadOIDs($this->oids); + $filters = array(); + $filters['value'] = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + $asn1->loadFilters($filters); + $result = ''; + $this->_mapOutDNs($dn, 'rdnSequence', $asn1); + foreach ($dn['rdnSequence'] as $rdn) { + foreach ($rdn as $i => $attr) { + $attr = &$rdn[$i]; + if (is_array($attr['value'])) { + foreach ($attr['value'] as $type => $v) { + $type = array_search($type, $asn1->ANYmap, true); + if ($type !== false && isset($asn1->stringTypeSize[$type])) { + $v = $asn1->convert($v, $type); + if ($v !== false) { + $v = preg_replace('/\s+/', ' ', $v); + $attr['value'] = strtolower(trim($v)); + break; + } + } + } + } + } + $result .= $asn1->encodeDER($rdn, $this->RelativeDistinguishedName); + } + return $result; + case FILE_X509_DN_HASH: + $dn = $this->getDN(FILE_X509_DN_CANON, $dn); + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $hash = new Crypt_Hash('sha1'); + $hash = $hash->hash($dn); + extract(unpack('Vhash', $hash)); + return strtolower(bin2hex(pack('N', $hash))); + } + + // Default is to return a string. + $start = true; + $output = ''; + $result = array(); + $asn1 = new File_ASN1(); + $asn1->loadOIDs($this->oids); + $filters = array(); + $filters['rdnSequence']['value'] = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + $asn1->loadFilters($filters); + $this->_mapOutDNs($dn, 'rdnSequence', $asn1); + foreach ($dn['rdnSequence'] as $field) { + $prop = $field[0]['type']; + $value = $field[0]['value']; + + $delim = ', '; + switch ($prop) { + case 'id-at-countryName': + $desc = 'C'; + break; + case 'id-at-stateOrProvinceName': + $desc = 'ST'; + break; + case 'id-at-organizationName': + $desc = 'O'; + break; + case 'id-at-organizationalUnitName': + $desc = 'OU'; + break; + case 'id-at-commonName': + $desc = 'CN'; + break; + case 'id-at-localityName': + $desc = 'L'; + break; + case 'id-at-surname': + $desc = 'SN'; + break; + case 'id-at-uniqueIdentifier': + $delim = '/'; + $desc = 'x500UniqueIdentifier'; + break; + case 'id-at-postalAddress': + $delim = '/'; + $desc = 'postalAddress'; + break; + default: + $delim = '/'; + $desc = preg_replace('#.+-([^-]+)$#', '$1', $prop); + } + + if (!$start) { + $output.= $delim; + } + if (is_array($value)) { + foreach ($value as $type => $v) { + $type = array_search($type, $asn1->ANYmap, true); + if ($type !== false && isset($asn1->stringTypeSize[$type])) { + $v = $asn1->convert($v, $type); + if ($v !== false) { + $value = $v; + break; + } + } + } + if (is_array($value)) { + $value = array_pop($value); // Always strip data type. + } + } elseif (is_object($value) && strtolower(get_class($value)) == 'file_asn1_element') { + // @codingStandardsIgnoreStart + $callback = version_compare(PHP_VERSION, '5.3.0') >= 0 ? + function ($x) { return "\x" . bin2hex($x[0]); } : + create_function('$x', 'return "\x" . bin2hex($x[0]);'); + // @codingStandardsIgnoreEnd + $value = strtoupper(preg_replace_callback('#[^\x20-\x7E]#', $callback, $value->element)); + } + $output.= $desc . '=' . $value; + $result[$desc] = isset($result[$desc]) ? + array_merge((array) $result[$desc], array($value)) : + $value; + $start = false; + } + + return $format == FILE_X509_DN_OPENSSL ? $result : $output; + } + + /** + * Get the Distinguished Name for a certificate/crl issuer + * + * @param int $format optional + * @access public + * @return mixed + */ + function getIssuerDN($format = FILE_X509_DN_ARRAY) + { + switch (true) { + case !isset($this->currentCert) || !is_array($this->currentCert): + break; + case isset($this->currentCert['tbsCertificate']): + return $this->getDN($format, $this->currentCert['tbsCertificate']['issuer']); + case isset($this->currentCert['tbsCertList']): + return $this->getDN($format, $this->currentCert['tbsCertList']['issuer']); + } + + return false; + } + + /** + * Get the Distinguished Name for a certificate/csr subject + * Alias of getDN() + * + * @param int $format optional + * @access public + * @return mixed + */ + function getSubjectDN($format = FILE_X509_DN_ARRAY) + { + switch (true) { + case !empty($this->dn): + return $this->getDN($format); + case !isset($this->currentCert) || !is_array($this->currentCert): + break; + case isset($this->currentCert['tbsCertificate']): + return $this->getDN($format, $this->currentCert['tbsCertificate']['subject']); + case isset($this->currentCert['certificationRequestInfo']): + return $this->getDN($format, $this->currentCert['certificationRequestInfo']['subject']); + } + + return false; + } + + /** + * Get an individual Distinguished Name property for a certificate/crl issuer + * + * @param string $propName + * @param bool $withType optional + * @access public + * @return mixed + */ + function getIssuerDNProp($propName, $withType = false) + { + switch (true) { + case !isset($this->currentCert) || !is_array($this->currentCert): + break; + case isset($this->currentCert['tbsCertificate']): + return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['issuer'], $withType); + case isset($this->currentCert['tbsCertList']): + return $this->getDNProp($propName, $this->currentCert['tbsCertList']['issuer'], $withType); + } + + return false; + } + + /** + * Get an individual Distinguished Name property for a certificate/csr subject + * + * @param string $propName + * @param bool $withType optional + * @access public + * @return mixed + */ + function getSubjectDNProp($propName, $withType = false) + { + switch (true) { + case !empty($this->dn): + return $this->getDNProp($propName, null, $withType); + case !isset($this->currentCert) || !is_array($this->currentCert): + break; + case isset($this->currentCert['tbsCertificate']): + return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['subject'], $withType); + case isset($this->currentCert['certificationRequestInfo']): + return $this->getDNProp($propName, $this->currentCert['certificationRequestInfo']['subject'], $withType); + } + + return false; + } + + /** + * Get the certificate chain for the current cert + * + * @access public + * @return mixed + */ + function getChain() + { + $chain = array($this->currentCert); + + if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { + return false; + } + if (empty($this->CAs)) { + return $chain; + } + while (true) { + $currentCert = $chain[count($chain) - 1]; + for ($i = 0; $i < count($this->CAs); $i++) { + $ca = $this->CAs[$i]; + if ($currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']) { + $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier', $currentCert); + $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); + switch (true) { + case !is_array($authorityKey): + case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: + if ($currentCert === $ca) { + break 3; + } + $chain[] = $ca; + break 2; + } + } + } + if ($i == count($this->CAs)) { + break; + } + } + foreach ($chain as $key => $value) { + $chain[$key] = new File_X509(); + $chain[$key]->loadX509($value); + } + return $chain; + } + + /** + * Set public key + * + * Key needs to be a Crypt_RSA object + * + * @param object $key + * @access public + * @return bool + */ + function setPublicKey($key) + { + $key->setPublicKey(); + $this->publicKey = $key; + } + + /** + * Set private key + * + * Key needs to be a Crypt_RSA object + * + * @param object $key + * @access public + */ + function setPrivateKey($key) + { + $this->privateKey = $key; + } + + /** + * Set challenge + * + * Used for SPKAC CSR's + * + * @param string $challenge + * @access public + */ + function setChallenge($challenge) + { + $this->challenge = $challenge; + } + + /** + * Gets the public key + * + * Returns a Crypt_RSA object or a false. + * + * @access public + * @return mixed + */ + function getPublicKey() + { + if (isset($this->publicKey)) { + return $this->publicKey; + } + + if (isset($this->currentCert) && is_array($this->currentCert)) { + foreach (array('tbsCertificate/subjectPublicKeyInfo', 'certificationRequestInfo/subjectPKInfo') as $path) { + $keyinfo = $this->_subArray($this->currentCert, $path); + if (!empty($keyinfo)) { + break; + } + } + } + if (empty($keyinfo)) { + return false; + } + + $key = $keyinfo['subjectPublicKey']; + + switch ($keyinfo['algorithm']['algorithm']) { + case 'rsaEncryption': + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + $publicKey = new Crypt_RSA(); + $publicKey->loadKey($key); + $publicKey->setPublicKey(); + break; + default: + return false; + } + + return $publicKey; + } + + /** + * Load a Certificate Signing Request + * + * @param string $csr + * @access public + * @return mixed + */ + function loadCSR($csr, $mode = FILE_X509_FORMAT_AUTO_DETECT) + { + if (is_array($csr) && isset($csr['certificationRequestInfo'])) { + unset($this->currentCert); + unset($this->currentKeyIdentifier); + unset($this->signatureSubject); + $this->dn = $csr['certificationRequestInfo']['subject']; + if (!isset($this->dn)) { + return false; + } + + $this->currentCert = $csr; + return $csr; + } + + // see http://tools.ietf.org/html/rfc2986 + + $asn1 = new File_ASN1(); + + if ($mode != FILE_X509_FORMAT_DER) { + $newcsr = $this->_extractBER($csr); + if ($mode == FILE_X509_FORMAT_PEM && $csr == $newcsr) { + return false; + } + $csr = $newcsr; + } + $orig = $csr; + + if ($csr === false) { + $this->currentCert = false; + return false; + } + + $asn1->loadOIDs($this->oids); + $decoded = $asn1->decodeBER($csr); + + if (empty($decoded)) { + $this->currentCert = false; + return false; + } + + $csr = $asn1->asn1map($decoded[0], $this->CertificationRequest); + if (!isset($csr) || $csr === false) { + $this->currentCert = false; + return false; + } + + $this->_mapInAttributes($csr, 'certificationRequestInfo/attributes', $asn1); + $this->_mapInDNs($csr, 'certificationRequestInfo/subject/rdnSequence', $asn1); + + $this->dn = $csr['certificationRequestInfo']['subject']; + + $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + + $algorithm = &$csr['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm']; + $key = &$csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']; + $key = $this->_reformatKey($algorithm, $key); + + switch ($algorithm) { + case 'rsaEncryption': + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + $this->publicKey = new Crypt_RSA(); + $this->publicKey->loadKey($key); + $this->publicKey->setPublicKey(); + break; + default: + $this->publicKey = null; + } + + $this->currentKeyIdentifier = null; + $this->currentCert = $csr; + + return $csr; + } + + /** + * Save CSR request + * + * @param array $csr + * @param int $format optional + * @access public + * @return string + */ + function saveCSR($csr, $format = FILE_X509_FORMAT_PEM) + { + if (!is_array($csr) || !isset($csr['certificationRequestInfo'])) { + return false; + } + + switch (true) { + case !($algorithm = $this->_subArray($csr, 'certificationRequestInfo/subjectPKInfo/algorithm/algorithm')): + case is_object($csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): + break; + default: + switch ($algorithm) { + case 'rsaEncryption': + $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'] + = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']))); + $csr['certificationRequestInfo']['subjectPKInfo']['algorithm']['parameters'] = null; + $csr['signatureAlgorithm']['parameters'] = null; + $csr['certificationRequestInfo']['signature']['parameters'] = null; + } + } + + $asn1 = new File_ASN1(); + + $asn1->loadOIDs($this->oids); + + $filters = array(); + $filters['certificationRequestInfo']['subject']['rdnSequence']['value'] + = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + + $asn1->loadFilters($filters); + + $this->_mapOutDNs($csr, 'certificationRequestInfo/subject/rdnSequence', $asn1); + $this->_mapOutAttributes($csr, 'certificationRequestInfo/attributes', $asn1); + $csr = $asn1->encodeDER($csr, $this->CertificationRequest); + + switch ($format) { + case FILE_X509_FORMAT_DER: + return $csr; + // case FILE_X509_FORMAT_PEM: + default: + return "-----BEGIN CERTIFICATE REQUEST-----\r\n" . chunk_split(base64_encode($csr), 64) . '-----END CERTIFICATE REQUEST-----'; + } + } + + /** + * Load a SPKAC CSR + * + * SPKAC's are produced by the HTML5 keygen element: + * + * https://developer.mozilla.org/en-US/docs/HTML/Element/keygen + * + * @param string $csr + * @access public + * @return mixed + */ + function loadSPKAC($spkac) + { + if (is_array($spkac) && isset($spkac['publicKeyAndChallenge'])) { + unset($this->currentCert); + unset($this->currentKeyIdentifier); + unset($this->signatureSubject); + $this->currentCert = $spkac; + return $spkac; + } + + // see http://www.w3.org/html/wg/drafts/html/master/forms.html#signedpublickeyandchallenge + + $asn1 = new File_ASN1(); + + // OpenSSL produces SPKAC's that are preceded by the string SPKAC= + $temp = preg_replace('#(?:SPKAC=)|[ \r\n\\\]#', '', $spkac); + $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; + if ($temp != false) { + $spkac = $temp; + } + $orig = $spkac; + + if ($spkac === false) { + $this->currentCert = false; + return false; + } + + $asn1->loadOIDs($this->oids); + $decoded = $asn1->decodeBER($spkac); + + if (empty($decoded)) { + $this->currentCert = false; + return false; + } + + $spkac = $asn1->asn1map($decoded[0], $this->SignedPublicKeyAndChallenge); + + if (!isset($spkac) || $spkac === false) { + $this->currentCert = false; + return false; + } + + $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + + $algorithm = &$spkac['publicKeyAndChallenge']['spki']['algorithm']['algorithm']; + $key = &$spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']; + $key = $this->_reformatKey($algorithm, $key); + + switch ($algorithm) { + case 'rsaEncryption': + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + $this->publicKey = new Crypt_RSA(); + $this->publicKey->loadKey($key); + $this->publicKey->setPublicKey(); + break; + default: + $this->publicKey = null; + } + + $this->currentKeyIdentifier = null; + $this->currentCert = $spkac; + + return $spkac; + } + + /** + * Save a SPKAC CSR request + * + * @param array $csr + * @param int $format optional + * @access public + * @return string + */ + function saveSPKAC($spkac, $format = FILE_X509_FORMAT_PEM) + { + if (!is_array($spkac) || !isset($spkac['publicKeyAndChallenge'])) { + return false; + } + + $algorithm = $this->_subArray($spkac, 'publicKeyAndChallenge/spki/algorithm/algorithm'); + switch (true) { + case !$algorithm: + case is_object($spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']): + break; + default: + switch ($algorithm) { + case 'rsaEncryption': + $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey'] + = base64_encode("\0" . base64_decode(preg_replace('#-.+-|[\r\n]#', '', $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']))); + } + } + + $asn1 = new File_ASN1(); + + $asn1->loadOIDs($this->oids); + $spkac = $asn1->encodeDER($spkac, $this->SignedPublicKeyAndChallenge); + + switch ($format) { + case FILE_X509_FORMAT_DER: + return $spkac; + // case FILE_X509_FORMAT_PEM: + default: + // OpenSSL's implementation of SPKAC requires the SPKAC be preceded by SPKAC= and since there are pretty much + // no other SPKAC decoders phpseclib will use that same format + return 'SPKAC=' . base64_encode($spkac); + } + } + + /** + * Load a Certificate Revocation List + * + * @param string $crl + * @access public + * @return mixed + */ + function loadCRL($crl, $mode = FILE_X509_FORMAT_AUTO_DETECT) + { + if (is_array($crl) && isset($crl['tbsCertList'])) { + $this->currentCert = $crl; + unset($this->signatureSubject); + return $crl; + } + + $asn1 = new File_ASN1(); + + if ($mode != FILE_X509_FORMAT_DER) { + $newcrl = $this->_extractBER($crl); + if ($mode == FILE_X509_FORMAT_PEM && $crl == $newcrl) { + return false; + } + $crl = $newcrl; + } + $orig = $crl; + + if ($crl === false) { + $this->currentCert = false; + return false; + } + + $asn1->loadOIDs($this->oids); + $decoded = $asn1->decodeBER($crl); + + if (empty($decoded)) { + $this->currentCert = false; + return false; + } + + $crl = $asn1->asn1map($decoded[0], $this->CertificateList); + if (!isset($crl) || $crl === false) { + $this->currentCert = false; + return false; + } + + $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + + $this->_mapInDNs($crl, 'tbsCertList/issuer/rdnSequence', $asn1); + if ($this->_isSubArrayValid($crl, 'tbsCertList/crlExtensions')) { + $this->_mapInExtensions($crl, 'tbsCertList/crlExtensions', $asn1); + } + if ($this->_isSubArrayValid($crl, 'tbsCertList/revokedCertificates')) { + $rclist_ref = &$this->_subArrayUnchecked($crl, 'tbsCertList/revokedCertificates'); + if ($rclist_ref) { + $rclist = $crl['tbsCertList']['revokedCertificates']; + foreach ($rclist as $i => $extension) { + if ($this->_isSubArrayValid($rclist, "$i/crlEntryExtensions", $asn1)) { + $this->_mapInExtensions($rclist_ref, "$i/crlEntryExtensions", $asn1); + } + } + } + } + + $this->currentKeyIdentifier = null; + $this->currentCert = $crl; + + return $crl; + } + + /** + * Save Certificate Revocation List. + * + * @param array $crl + * @param int $format optional + * @access public + * @return string + */ + function saveCRL($crl, $format = FILE_X509_FORMAT_PEM) + { + if (!is_array($crl) || !isset($crl['tbsCertList'])) { + return false; + } + + $asn1 = new File_ASN1(); + + $asn1->loadOIDs($this->oids); + + $filters = array(); + $filters['tbsCertList']['issuer']['rdnSequence']['value'] + = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + $filters['tbsCertList']['signature']['parameters'] + = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + $filters['signatureAlgorithm']['parameters'] + = array('type' => FILE_ASN1_TYPE_UTF8_STRING); + + if (empty($crl['tbsCertList']['signature']['parameters'])) { + $filters['tbsCertList']['signature']['parameters'] + = array('type' => FILE_ASN1_TYPE_NULL); + } + + if (empty($crl['signatureAlgorithm']['parameters'])) { + $filters['signatureAlgorithm']['parameters'] + = array('type' => FILE_ASN1_TYPE_NULL); + } + + $asn1->loadFilters($filters); + + $this->_mapOutDNs($crl, 'tbsCertList/issuer/rdnSequence', $asn1); + $this->_mapOutExtensions($crl, 'tbsCertList/crlExtensions', $asn1); + $rclist = &$this->_subArray($crl, 'tbsCertList/revokedCertificates'); + if (is_array($rclist)) { + foreach ($rclist as $i => $extension) { + $this->_mapOutExtensions($rclist, "$i/crlEntryExtensions", $asn1); + } + } + + $crl = $asn1->encodeDER($crl, $this->CertificateList); + + switch ($format) { + case FILE_X509_FORMAT_DER: + return $crl; + // case FILE_X509_FORMAT_PEM: + default: + return "-----BEGIN X509 CRL-----\r\n" . chunk_split(base64_encode($crl), 64) . '-----END X509 CRL-----'; + } + } + + /** + * Helper function to build a time field according to RFC 3280 section + * - 4.1.2.5 Validity + * - 5.1.2.4 This Update + * - 5.1.2.5 Next Update + * - 5.1.2.6 Revoked Certificates + * by choosing utcTime iff year of date given is before 2050 and generalTime else. + * + * @param string $date in format date('D, d M Y H:i:s O') + * @access private + * @return array + */ + function _timeField($date) + { + if (is_object($date) && strtolower(get_class($date)) == 'file_asn1_element') { + return $date; + } + if (!class_exists('DateTime')) { + $year = @gmdate("Y", @strtotime($date)); // the same way ASN1.php parses this + } else { + $dateObj = new DateTime($date, new DateTimeZone('GMT')); + $year = $dateObj->format('Y'); + } + if ($year < 2050) { + return array('utcTime' => $date); + } else { + return array('generalTime' => $date); + } + } + + /** + * Sign an X.509 certificate + * + * $issuer's private key needs to be loaded. + * $subject can be either an existing X.509 cert (if you want to resign it), + * a CSR or something with the DN and public key explicitly set. + * + * @param File_X509 $issuer + * @param File_X509 $subject + * @param string $signatureAlgorithm optional + * @access public + * @return mixed + */ + function sign($issuer, $subject, $signatureAlgorithm = 'sha1WithRSAEncryption') + { + if (!is_object($issuer->privateKey) || empty($issuer->dn)) { + return false; + } + + if (isset($subject->publicKey) && !($subjectPublicKey = $subject->_formatSubjectPublicKey())) { + return false; + } + + $currentCert = isset($this->currentCert) ? $this->currentCert : null; + $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null; + + if (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertificate'])) { + $this->currentCert = $subject->currentCert; + $this->currentCert['tbsCertificate']['signature']['algorithm'] = $signatureAlgorithm; + $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; + + if (!empty($this->startDate)) { + $this->currentCert['tbsCertificate']['validity']['notBefore'] = $this->_timeField($this->startDate); + } + if (!empty($this->endDate)) { + $this->currentCert['tbsCertificate']['validity']['notAfter'] = $this->_timeField($this->endDate); + } + if (!empty($this->serialNumber)) { + $this->currentCert['tbsCertificate']['serialNumber'] = $this->serialNumber; + } + if (!empty($subject->dn)) { + $this->currentCert['tbsCertificate']['subject'] = $subject->dn; + } + if (!empty($subject->publicKey)) { + $this->currentCert['tbsCertificate']['subjectPublicKeyInfo'] = $subjectPublicKey; + } + $this->removeExtension('id-ce-authorityKeyIdentifier'); + if (isset($subject->domains)) { + $this->removeExtension('id-ce-subjectAltName'); + } + } elseif (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertList'])) { + return false; + } else { + if (!isset($subject->publicKey)) { + return false; + } + + if (!class_exists('DateTime')) { + $startDate = !empty($this->startDate) ? $this->startDate : @date('D, d M Y H:i:s O'); + $endDate = !empty($this->endDate) ? $this->endDate : @date('D, d M Y H:i:s O', strtotime('+1 year')); + } else { + $startDate = new DateTime('now', new DateTimeZone(@date_default_timezone_get())); + $startDate = !empty($this->startDate) ? $this->startDate : $startDate->format('D, d M Y H:i:s O'); + + $endDate = new DateTime('+1 year', new DateTimeZone(@date_default_timezone_get())); + $endDate = !empty($this->endDate) ? $this->endDate : $endDate->format('D, d M Y H:i:s O'); + } + if (!empty($this->serialNumber)) { + $serialNumber = $this->serialNumber; + } else { + if (!function_exists('crypt_random_string')) { + include_once 'Crypt/Random.php'; + } + /* "The serial number MUST be a positive integer" + "Conforming CAs MUST NOT use serialNumber values longer than 20 octets." + -- https://tools.ietf.org/html/rfc5280#section-4.1.2.2 + + for the integer to be positive the leading bit needs to be 0 hence the + application of a bitmap + */ + $serialNumber = new Math_BigInteger(crypt_random_string(20) & ("\x7F" . str_repeat("\xFF", 19)), 256); + } + + $this->currentCert = array( + 'tbsCertificate' => + array( + 'version' => 'v3', + 'serialNumber' => $serialNumber, // $this->setSerialNumber() + 'signature' => array('algorithm' => $signatureAlgorithm), + 'issuer' => false, // this is going to be overwritten later + 'validity' => array( + 'notBefore' => $this->_timeField($startDate), // $this->setStartDate() + 'notAfter' => $this->_timeField($endDate) // $this->setEndDate() + ), + 'subject' => $subject->dn, + 'subjectPublicKeyInfo' => $subjectPublicKey + ), + 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), + 'signature' => false // this is going to be overwritten later + ); + + // Copy extensions from CSR. + $csrexts = $subject->getAttribute('pkcs-9-at-extensionRequest', 0); + + if (!empty($csrexts)) { + $this->currentCert['tbsCertificate']['extensions'] = $csrexts; + } + } + + $this->currentCert['tbsCertificate']['issuer'] = $issuer->dn; + + if (isset($issuer->currentKeyIdentifier)) { + $this->setExtension('id-ce-authorityKeyIdentifier', array( + //'authorityCertIssuer' => array( + // array( + // 'directoryName' => $issuer->dn + // ) + //), + 'keyIdentifier' => $issuer->currentKeyIdentifier + )); + //$extensions = &$this->currentCert['tbsCertificate']['extensions']; + //if (isset($issuer->serialNumber)) { + // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; + //} + //unset($extensions); + } + + if (isset($subject->currentKeyIdentifier)) { + $this->setExtension('id-ce-subjectKeyIdentifier', $subject->currentKeyIdentifier); + } + + $altName = array(); + + if (isset($subject->domains) && count($subject->domains)) { + $altName = array_map(array('File_X509', '_dnsName'), $subject->domains); + } + + if (isset($subject->ipAddresses) && count($subject->ipAddresses)) { + // should an IP address appear as the CN if no domain name is specified? idk + //$ips = count($subject->domains) ? $subject->ipAddresses : array_slice($subject->ipAddresses, 1); + $ipAddresses = array(); + foreach ($subject->ipAddresses as $ipAddress) { + $encoded = $subject->_ipAddress($ipAddress); + if ($encoded !== false) { + $ipAddresses[] = $encoded; + } + } + if (count($ipAddresses)) { + $altName = array_merge($altName, $ipAddresses); + } + } + + if (!empty($altName)) { + $this->setExtension('id-ce-subjectAltName', $altName); + } + + if ($this->caFlag) { + $keyUsage = $this->getExtension('id-ce-keyUsage'); + if (!$keyUsage) { + $keyUsage = array(); + } + + $this->setExtension( + 'id-ce-keyUsage', + array_values(array_unique(array_merge($keyUsage, array('cRLSign', 'keyCertSign')))) + ); + + $basicConstraints = $this->getExtension('id-ce-basicConstraints'); + if (!$basicConstraints) { + $basicConstraints = array(); + } + + $this->setExtension( + 'id-ce-basicConstraints', + array_unique(array_merge(array('cA' => true), $basicConstraints)), + true + ); + + if (!isset($subject->currentKeyIdentifier)) { + $this->setExtension('id-ce-subjectKeyIdentifier', base64_encode($this->computeKeyIdentifier($this->currentCert)), false, false); + } + } + + // resync $this->signatureSubject + // save $tbsCertificate in case there are any File_ASN1_Element objects in it + $tbsCertificate = $this->currentCert['tbsCertificate']; + $this->loadX509($this->saveX509($this->currentCert)); + + $result = $this->_sign($issuer->privateKey, $signatureAlgorithm); + $result['tbsCertificate'] = $tbsCertificate; + + $this->currentCert = $currentCert; + $this->signatureSubject = $signatureSubject; + + return $result; + } + + /** + * Sign a CSR + * + * @access public + * @return mixed + */ + function signCSR($signatureAlgorithm = 'sha1WithRSAEncryption') + { + if (!is_object($this->privateKey) || empty($this->dn)) { + return false; + } + + $origPublicKey = $this->publicKey; + $class = get_class($this->privateKey); + $this->publicKey = new $class(); + $this->publicKey->loadKey($this->privateKey->getPublicKey()); + $this->publicKey->setPublicKey(); + if (!($publicKey = $this->_formatSubjectPublicKey())) { + return false; + } + $this->publicKey = $origPublicKey; + + $currentCert = isset($this->currentCert) ? $this->currentCert : null; + $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null; + + if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['certificationRequestInfo'])) { + $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; + if (!empty($this->dn)) { + $this->currentCert['certificationRequestInfo']['subject'] = $this->dn; + } + $this->currentCert['certificationRequestInfo']['subjectPKInfo'] = $publicKey; + } else { + $this->currentCert = array( + 'certificationRequestInfo' => + array( + 'version' => 'v1', + 'subject' => $this->dn, + 'subjectPKInfo' => $publicKey + ), + 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), + 'signature' => false // this is going to be overwritten later + ); + } + + // resync $this->signatureSubject + // save $certificationRequestInfo in case there are any File_ASN1_Element objects in it + $certificationRequestInfo = $this->currentCert['certificationRequestInfo']; + $this->loadCSR($this->saveCSR($this->currentCert)); + + $result = $this->_sign($this->privateKey, $signatureAlgorithm); + $result['certificationRequestInfo'] = $certificationRequestInfo; + + $this->currentCert = $currentCert; + $this->signatureSubject = $signatureSubject; + + return $result; + } + + /** + * Sign a SPKAC + * + * @access public + * @return mixed + */ + function signSPKAC($signatureAlgorithm = 'sha1WithRSAEncryption') + { + if (!is_object($this->privateKey)) { + return false; + } + + $origPublicKey = $this->publicKey; + $class = get_class($this->privateKey); + $this->publicKey = new $class(); + $this->publicKey->loadKey($this->privateKey->getPublicKey()); + $this->publicKey->setPublicKey(); + $publicKey = $this->_formatSubjectPublicKey(); + if (!$publicKey) { + return false; + } + $this->publicKey = $origPublicKey; + + $currentCert = isset($this->currentCert) ? $this->currentCert : null; + $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject: null; + + // re-signing a SPKAC seems silly but since everything else supports re-signing why not? + if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['publicKeyAndChallenge'])) { + $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; + $this->currentCert['publicKeyAndChallenge']['spki'] = $publicKey; + if (!empty($this->challenge)) { + // the bitwise AND ensures that the output is a valid IA5String + $this->currentCert['publicKeyAndChallenge']['challenge'] = $this->challenge & str_repeat("\x7F", strlen($this->challenge)); + } + } else { + $this->currentCert = array( + 'publicKeyAndChallenge' => + array( + 'spki' => $publicKey, + // quoting , + // "A challenge string that is submitted along with the public key. Defaults to an empty string if not specified." + // both Firefox and OpenSSL ("openssl spkac -key private.key") behave this way + // we could alternatively do this instead if we ignored the specs: + // crypt_random_string(8) & str_repeat("\x7F", 8) + 'challenge' => !empty($this->challenge) ? $this->challenge : '' + ), + 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), + 'signature' => false // this is going to be overwritten later + ); + } + + // resync $this->signatureSubject + // save $publicKeyAndChallenge in case there are any File_ASN1_Element objects in it + $publicKeyAndChallenge = $this->currentCert['publicKeyAndChallenge']; + $this->loadSPKAC($this->saveSPKAC($this->currentCert)); + + $result = $this->_sign($this->privateKey, $signatureAlgorithm); + $result['publicKeyAndChallenge'] = $publicKeyAndChallenge; + + $this->currentCert = $currentCert; + $this->signatureSubject = $signatureSubject; + + return $result; + } + + /** + * Sign a CRL + * + * $issuer's private key needs to be loaded. + * + * @param File_X509 $issuer + * @param File_X509 $crl + * @param string $signatureAlgorithm optional + * @access public + * @return mixed + */ + function signCRL($issuer, $crl, $signatureAlgorithm = 'sha1WithRSAEncryption') + { + if (!is_object($issuer->privateKey) || empty($issuer->dn)) { + return false; + } + + $currentCert = isset($this->currentCert) ? $this->currentCert : null; + $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; + if (!class_exists('DateTime')) { + $thisUpdate = !empty($this->startDate) ? $this->startDate : @date('D, d M Y H:i:s O'); + } else { + $thisUpdate = new DateTime('now', new DateTimeZone(@date_default_timezone_get())); + $thisUpdate = !empty($this->startDate) ? $this->startDate : $thisUpdate->format('D, d M Y H:i:s O'); + } + + if (isset($crl->currentCert) && is_array($crl->currentCert) && isset($crl->currentCert['tbsCertList'])) { + $this->currentCert = $crl->currentCert; + $this->currentCert['tbsCertList']['signature']['algorithm'] = $signatureAlgorithm; + $this->currentCert['signatureAlgorithm']['algorithm'] = $signatureAlgorithm; + } else { + $this->currentCert = array( + 'tbsCertList' => + array( + 'version' => 'v2', + 'signature' => array('algorithm' => $signatureAlgorithm), + 'issuer' => false, // this is going to be overwritten later + 'thisUpdate' => $this->_timeField($thisUpdate) // $this->setStartDate() + ), + 'signatureAlgorithm' => array('algorithm' => $signatureAlgorithm), + 'signature' => false // this is going to be overwritten later + ); + } + + $tbsCertList = &$this->currentCert['tbsCertList']; + $tbsCertList['issuer'] = $issuer->dn; + $tbsCertList['thisUpdate'] = $this->_timeField($thisUpdate); + + if (!empty($this->endDate)) { + $tbsCertList['nextUpdate'] = $this->_timeField($this->endDate); // $this->setEndDate() + } else { + unset($tbsCertList['nextUpdate']); + } + + if (!empty($this->serialNumber)) { + $crlNumber = $this->serialNumber; + } else { + $crlNumber = $this->getExtension('id-ce-cRLNumber'); + // "The CRL number is a non-critical CRL extension that conveys a + // monotonically increasing sequence number for a given CRL scope and + // CRL issuer. This extension allows users to easily determine when a + // particular CRL supersedes another CRL." + // -- https://tools.ietf.org/html/rfc5280#section-5.2.3 + $crlNumber = $crlNumber !== false ? $crlNumber->add(new Math_BigInteger(1)) : null; + } + + $this->removeExtension('id-ce-authorityKeyIdentifier'); + $this->removeExtension('id-ce-issuerAltName'); + + // Be sure version >= v2 if some extension found. + $version = isset($tbsCertList['version']) ? $tbsCertList['version'] : 0; + if (!$version) { + if (!empty($tbsCertList['crlExtensions'])) { + $version = 1; // v2. + } elseif (!empty($tbsCertList['revokedCertificates'])) { + foreach ($tbsCertList['revokedCertificates'] as $cert) { + if (!empty($cert['crlEntryExtensions'])) { + $version = 1; // v2. + } + } + } + + if ($version) { + $tbsCertList['version'] = $version; + } + } + + // Store additional extensions. + if (!empty($tbsCertList['version'])) { // At least v2. + if (!empty($crlNumber)) { + $this->setExtension('id-ce-cRLNumber', $crlNumber); + } + + if (isset($issuer->currentKeyIdentifier)) { + $this->setExtension('id-ce-authorityKeyIdentifier', array( + //'authorityCertIssuer' => array( + // array( + // 'directoryName' => $issuer->dn + // ) + //), + 'keyIdentifier' => $issuer->currentKeyIdentifier + )); + //$extensions = &$tbsCertList['crlExtensions']; + //if (isset($issuer->serialNumber)) { + // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; + //} + //unset($extensions); + } + + $issuerAltName = $this->getExtension('id-ce-subjectAltName', $issuer->currentCert); + + if ($issuerAltName !== false) { + $this->setExtension('id-ce-issuerAltName', $issuerAltName); + } + } + + if (empty($tbsCertList['revokedCertificates'])) { + unset($tbsCertList['revokedCertificates']); + } + + unset($tbsCertList); + + // resync $this->signatureSubject + // save $tbsCertList in case there are any File_ASN1_Element objects in it + $tbsCertList = $this->currentCert['tbsCertList']; + $this->loadCRL($this->saveCRL($this->currentCert)); + + $result = $this->_sign($issuer->privateKey, $signatureAlgorithm); + $result['tbsCertList'] = $tbsCertList; + + $this->currentCert = $currentCert; + $this->signatureSubject = $signatureSubject; + + return $result; + } + + /** + * X.509 certificate signing helper function. + * + * @param object $key + * @param File_X509 $subject + * @param string $signatureAlgorithm + * @access public + * @return mixed + */ + function _sign($key, $signatureAlgorithm) + { + switch (strtolower(get_class($key))) { + case 'crypt_rsa': + switch ($signatureAlgorithm) { + case 'md2WithRSAEncryption': + case 'md5WithRSAEncryption': + case 'sha1WithRSAEncryption': + case 'sha224WithRSAEncryption': + case 'sha256WithRSAEncryption': + case 'sha384WithRSAEncryption': + case 'sha512WithRSAEncryption': + $key->setHash(preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm)); + $key->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); + + $this->currentCert['signature'] = base64_encode("\0" . $key->sign($this->signatureSubject)); + return $this->currentCert; + } + default: + return false; + } + } + + /** + * Set certificate start date + * + * @param string $date + * @access public + */ + function setStartDate($date) + { + if (class_exists('DateTime')) { + $date = new DateTime($date, new DateTimeZone(@date_default_timezone_get())); + $this->startDate = $date->format('D, d M Y H:i:s O'); + } else { + $this->startDate = @date('D, d M Y H:i:s O', @strtotime($date)); + } + } + + /** + * Set certificate end date + * + * @param string $date + * @access public + */ + function setEndDate($date) + { + /* + To indicate that a certificate has no well-defined expiration date, + the notAfter SHOULD be assigned the GeneralizedTime value of + 99991231235959Z. + + -- http://tools.ietf.org/html/rfc5280#section-4.1.2.5 + */ + if (strtolower($date) == 'lifetime') { + $temp = '99991231235959Z'; + $asn1 = new File_ASN1(); + $temp = chr(FILE_ASN1_TYPE_GENERALIZED_TIME) . $asn1->_encodeLength(strlen($temp)) . $temp; + $this->endDate = new File_ASN1_Element($temp); + } else { + if (class_exists('DateTime')) { + $date = new DateTime($date, new DateTimeZone(@date_default_timezone_get())); + $this->endDate = $date->format('D, d M Y H:i:s O'); + } else { + $this->endDate = @date('D, d M Y H:i:s O', @strtotime($date)); + } + } + } + + /** + * Set Serial Number + * + * @param string $serial + * @param $base optional + * @access public + */ + function setSerialNumber($serial, $base = -256) + { + $this->serialNumber = new Math_BigInteger($serial, $base); + } + + /** + * Turns the certificate into a certificate authority + * + * @access public + */ + function makeCA() + { + $this->caFlag = true; + } + + /** + * Check for validity of subarray + * + * This is intended for use in conjunction with _subArrayUnchecked(), + * implementing the checks included in _subArray() but without copying + * a potentially large array by passing its reference by-value to is_array(). + * + * @param array $root + * @param string $path + * @return boolean + * @access private + */ + function _isSubArrayValid($root, $path) + { + if (!is_array($root)) { + return false; + } + + foreach (explode('/', $path) as $i) { + if (!is_array($root)) { + return false; + } + + if (!isset($root[$i])) { + return true; + } + + $root = $root[$i]; + } + + return true; + } + + /** + * Get a reference to a subarray + * + * This variant of _subArray() does no is_array() checking, + * so $root should be checked with _isSubArrayValid() first. + * + * This is here for performance reasons: + * Passing a reference (i.e. $root) by-value (i.e. to is_array()) + * creates a copy. If $root is an especially large array, this is expensive. + * + * @param array $root + * @param string $path absolute path with / as component separator + * @param bool $create optional + * @access private + * @return array|false + */ + function &_subArrayUnchecked(&$root, $path, $create = false) + { + $false = false; + + foreach (explode('/', $path) as $i) { + if (!isset($root[$i])) { + if (!$create) { + return $false; + } + + $root[$i] = array(); + } + + $root = &$root[$i]; + } + + return $root; + } + + /** + * Get a reference to a subarray + * + * @param array $root + * @param string $path absolute path with / as component separator + * @param bool $create optional + * @access private + * @return array|false + */ + function &_subArray(&$root, $path, $create = false) + { + $false = false; + + if (!is_array($root)) { + return $false; + } + + foreach (explode('/', $path) as $i) { + if (!is_array($root)) { + return $false; + } + + if (!isset($root[$i])) { + if (!$create) { + return $false; + } + + $root[$i] = array(); + } + + $root = &$root[$i]; + } + + return $root; + } + + /** + * Get a reference to an extension subarray + * + * @param array $root + * @param string $path optional absolute path with / as component separator + * @param bool $create optional + * @access private + * @return array|false + */ + function &_extensions(&$root, $path = null, $create = false) + { + if (!isset($root)) { + $root = $this->currentCert; + } + + switch (true) { + case !empty($path): + case !is_array($root): + break; + case isset($root['tbsCertificate']): + $path = 'tbsCertificate/extensions'; + break; + case isset($root['tbsCertList']): + $path = 'tbsCertList/crlExtensions'; + break; + case isset($root['certificationRequestInfo']): + $pth = 'certificationRequestInfo/attributes'; + $attributes = &$this->_subArray($root, $pth, $create); + + if (is_array($attributes)) { + foreach ($attributes as $key => $value) { + if ($value['type'] == 'pkcs-9-at-extensionRequest') { + $path = "$pth/$key/value/0"; + break 2; + } + } + if ($create) { + $key = count($attributes); + $attributes[] = array('type' => 'pkcs-9-at-extensionRequest', 'value' => array()); + $path = "$pth/$key/value/0"; + } + } + break; + } + + $extensions = &$this->_subArray($root, $path, $create); + + if (!is_array($extensions)) { + $false = false; + return $false; + } + + return $extensions; + } + + /** + * Remove an Extension + * + * @param string $id + * @param string $path optional + * @access private + * @return bool + */ + function _removeExtension($id, $path = null) + { + $extensions = &$this->_extensions($this->currentCert, $path); + + if (!is_array($extensions)) { + return false; + } + + $result = false; + foreach ($extensions as $key => $value) { + if ($value['extnId'] == $id) { + unset($extensions[$key]); + $result = true; + } + } + + $extensions = array_values($extensions); + // fix for https://bugs.php.net/75433 affecting PHP 7.2 + if (!isset($extensions[0])) { + $extensions = array_splice($extensions, 0, 0); + } + return $result; + } + + /** + * Get an Extension + * + * Returns the extension if it exists and false if not + * + * @param string $id + * @param array $cert optional + * @param string $path optional + * @access private + * @return mixed + */ + function _getExtension($id, $cert = null, $path = null) + { + $extensions = $this->_extensions($cert, $path); + + if (!is_array($extensions)) { + return false; + } + + foreach ($extensions as $key => $value) { + if ($value['extnId'] == $id) { + return $value['extnValue']; + } + } + + return false; + } + + /** + * Returns a list of all extensions in use + * + * @param array $cert optional + * @param string $path optional + * @access private + * @return array + */ + function _getExtensions($cert = null, $path = null) + { + $exts = $this->_extensions($cert, $path); + $extensions = array(); + + if (is_array($exts)) { + foreach ($exts as $extension) { + $extensions[] = $extension['extnId']; + } + } + + return $extensions; + } + + /** + * Set an Extension + * + * @param string $id + * @param mixed $value + * @param bool $critical optional + * @param bool $replace optional + * @param string $path optional + * @access private + * @return bool + */ + function _setExtension($id, $value, $critical = false, $replace = true, $path = null) + { + $extensions = &$this->_extensions($this->currentCert, $path, true); + + if (!is_array($extensions)) { + return false; + } + + $newext = array('extnId' => $id, 'critical' => $critical, 'extnValue' => $value); + + foreach ($extensions as $key => $value) { + if ($value['extnId'] == $id) { + if (!$replace) { + return false; + } + + $extensions[$key] = $newext; + return true; + } + } + + $extensions[] = $newext; + return true; + } + + /** + * Remove a certificate, CSR or CRL Extension + * + * @param string $id + * @access public + * @return bool + */ + function removeExtension($id) + { + return $this->_removeExtension($id); + } + + /** + * Get a certificate, CSR or CRL Extension + * + * Returns the extension if it exists and false if not + * + * @param string $id + * @param array $cert optional + * @access public + * @return mixed + */ + function getExtension($id, $cert = null) + { + return $this->_getExtension($id, $cert); + } + + /** + * Returns a list of all extensions in use in certificate, CSR or CRL + * + * @param array $cert optional + * @access public + * @return array + */ + function getExtensions($cert = null) + { + return $this->_getExtensions($cert); + } + + /** + * Set a certificate, CSR or CRL Extension + * + * @param string $id + * @param mixed $value + * @param bool $critical optional + * @param bool $replace optional + * @access public + * @return bool + */ + function setExtension($id, $value, $critical = false, $replace = true) + { + return $this->_setExtension($id, $value, $critical, $replace); + } + + /** + * Remove a CSR attribute. + * + * @param string $id + * @param int $disposition optional + * @access public + * @return bool + */ + function removeAttribute($id, $disposition = FILE_X509_ATTR_ALL) + { + $attributes = &$this->_subArray($this->currentCert, 'certificationRequestInfo/attributes'); + + if (!is_array($attributes)) { + return false; + } + + $result = false; + foreach ($attributes as $key => $attribute) { + if ($attribute['type'] == $id) { + $n = count($attribute['value']); + switch (true) { + case $disposition == FILE_X509_ATTR_APPEND: + case $disposition == FILE_X509_ATTR_REPLACE: + return false; + case $disposition >= $n: + $disposition -= $n; + break; + case $disposition == FILE_X509_ATTR_ALL: + case $n == 1: + unset($attributes[$key]); + $result = true; + break; + default: + unset($attributes[$key]['value'][$disposition]); + $attributes[$key]['value'] = array_values($attributes[$key]['value']); + $result = true; + break; + } + if ($result && $disposition != FILE_X509_ATTR_ALL) { + break; + } + } + } + + $attributes = array_values($attributes); + return $result; + } + + /** + * Get a CSR attribute + * + * Returns the attribute if it exists and false if not + * + * @param string $id + * @param int $disposition optional + * @param array $csr optional + * @access public + * @return mixed + */ + function getAttribute($id, $disposition = FILE_X509_ATTR_ALL, $csr = null) + { + if (empty($csr)) { + $csr = $this->currentCert; + } + + $attributes = $this->_subArray($csr, 'certificationRequestInfo/attributes'); + + if (!is_array($attributes)) { + return false; + } + + foreach ($attributes as $key => $attribute) { + if ($attribute['type'] == $id) { + $n = count($attribute['value']); + switch (true) { + case $disposition == FILE_X509_ATTR_APPEND: + case $disposition == FILE_X509_ATTR_REPLACE: + return false; + case $disposition == FILE_X509_ATTR_ALL: + return $attribute['value']; + case $disposition >= $n: + $disposition -= $n; + break; + default: + return $attribute['value'][$disposition]; + } + } + } + + return false; + } + + /** + * Returns a list of all CSR attributes in use + * + * @param array $csr optional + * @access public + * @return array + */ + function getAttributes($csr = null) + { + if (empty($csr)) { + $csr = $this->currentCert; + } + + $attributes = $this->_subArray($csr, 'certificationRequestInfo/attributes'); + $attrs = array(); + + if (is_array($attributes)) { + foreach ($attributes as $attribute) { + $attrs[] = $attribute['type']; + } + } + + return $attrs; + } + + /** + * Set a CSR attribute + * + * @param string $id + * @param mixed $value + * @param bool $disposition optional + * @access public + * @return bool + */ + function setAttribute($id, $value, $disposition = FILE_X509_ATTR_ALL) + { + $attributes = &$this->_subArray($this->currentCert, 'certificationRequestInfo/attributes', true); + + if (!is_array($attributes)) { + return false; + } + + switch ($disposition) { + case FILE_X509_ATTR_REPLACE: + $disposition = FILE_X509_ATTR_APPEND; + case FILE_X509_ATTR_ALL: + $this->removeAttribute($id); + break; + } + + foreach ($attributes as $key => $attribute) { + if ($attribute['type'] == $id) { + $n = count($attribute['value']); + switch (true) { + case $disposition == FILE_X509_ATTR_APPEND: + $last = $key; + break; + case $disposition >= $n: + $disposition -= $n; + break; + default: + $attributes[$key]['value'][$disposition] = $value; + return true; + } + } + } + + switch (true) { + case $disposition >= 0: + return false; + case isset($last): + $attributes[$last]['value'][] = $value; + break; + default: + $attributes[] = array('type' => $id, 'value' => $disposition == FILE_X509_ATTR_ALL ? $value: array($value)); + break; + } + + return true; + } + + /** + * Sets the subject key identifier + * + * This is used by the id-ce-authorityKeyIdentifier and the id-ce-subjectKeyIdentifier extensions. + * + * @param string $value + * @access public + */ + function setKeyIdentifier($value) + { + if (empty($value)) { + unset($this->currentKeyIdentifier); + } else { + $this->currentKeyIdentifier = base64_encode($value); + } + } + + /** + * Compute a public key identifier. + * + * Although key identifiers may be set to any unique value, this function + * computes key identifiers from public key according to the two + * recommended methods (4.2.1.2 RFC 3280). + * Highly polymorphic: try to accept all possible forms of key: + * - Key object + * - File_X509 object with public or private key defined + * - Certificate or CSR array + * - File_ASN1_Element object + * - PEM or DER string + * + * @param mixed $key optional + * @param int $method optional + * @access public + * @return string binary key identifier + */ + function computeKeyIdentifier($key = null, $method = 1) + { + if (is_null($key)) { + $key = $this; + } + + switch (true) { + case is_string($key): + break; + case is_array($key) && isset($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): + return $this->computeKeyIdentifier($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $method); + case is_array($key) && isset($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): + return $this->computeKeyIdentifier($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], $method); + case !is_object($key): + return false; + case strtolower(get_class($key)) == 'file_asn1_element': + // Assume the element is a bitstring-packed key. + $asn1 = new File_ASN1(); + $decoded = $asn1->decodeBER($key->element); + if (empty($decoded)) { + return false; + } + $raw = $asn1->asn1map($decoded[0], array('type' => FILE_ASN1_TYPE_BIT_STRING)); + if (empty($raw)) { + return false; + } + $raw = base64_decode($raw); + // If the key is private, compute identifier from its corresponding public key. + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + $key = new Crypt_RSA(); + if (!$key->loadKey($raw)) { + return false; // Not an unencrypted RSA key. + } + if ($key->getPrivateKey() !== false) { // If private. + return $this->computeKeyIdentifier($key, $method); + } + $key = $raw; // Is a public key. + break; + case strtolower(get_class($key)) == 'file_x509': + if (isset($key->publicKey)) { + return $this->computeKeyIdentifier($key->publicKey, $method); + } + if (isset($key->privateKey)) { + return $this->computeKeyIdentifier($key->privateKey, $method); + } + if (isset($key->currentCert['tbsCertificate']) || isset($key->currentCert['certificationRequestInfo'])) { + return $this->computeKeyIdentifier($key->currentCert, $method); + } + return false; + default: // Should be a key object (i.e.: Crypt_RSA). + $key = $key->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); + break; + } + + // If in PEM format, convert to binary. + $key = $this->_extractBER($key); + + // Now we have the key string: compute its sha-1 sum. + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + $hash = new Crypt_Hash('sha1'); + $hash = $hash->hash($key); + + if ($method == 2) { + $hash = substr($hash, -8); + $hash[0] = chr((ord($hash[0]) & 0x0F) | 0x40); + } + + return $hash; + } + + /** + * Format a public key as appropriate + * + * @access private + * @return array + */ + function _formatSubjectPublicKey() + { + if (!isset($this->publicKey) || !is_object($this->publicKey)) { + return false; + } + + switch (strtolower(get_class($this->publicKey))) { + case 'crypt_rsa': + // the following two return statements do the same thing. i dunno.. i just prefer the later for some reason. + // the former is a good example of how to do fuzzing on the public key + //return new File_ASN1_Element(base64_decode(preg_replace('#-.+-|[\r\n]#', '', $this->publicKey->getPublicKey()))); + return array( + 'algorithm' => array('algorithm' => 'rsaEncryption'), + 'subjectPublicKey' => $this->publicKey->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1) + ); + default: + return false; + } + } + + /** + * Set the domain name's which the cert is to be valid for + * + * @access public + * @return array + */ + function setDomain() + { + $this->domains = func_get_args(); + $this->removeDNProp('id-at-commonName'); + $this->setDNProp('id-at-commonName', $this->domains[0]); + } + + /** + * Set the IP Addresses's which the cert is to be valid for + * + * @access public + * @param string $ipAddress optional + */ + function setIPAddress() + { + $this->ipAddresses = func_get_args(); + /* + if (!isset($this->domains)) { + $this->removeDNProp('id-at-commonName'); + $this->setDNProp('id-at-commonName', $this->ipAddresses[0]); + } + */ + } + + /** + * Helper function to build domain array + * + * @access private + * @param string $domain + * @return array + */ + function _dnsName($domain) + { + return array('dNSName' => $domain); + } + + /** + * Helper function to build IP Address array + * + * (IPv6 is not currently supported) + * + * @access private + * @param string $address + * @return array + */ + function _iPAddress($address) + { + return array('iPAddress' => $address); + } + + /** + * Get the index of a revoked certificate. + * + * @param array $rclist + * @param string $serial + * @param bool $create optional + * @access private + * @return int|false + */ + function _revokedCertificate(&$rclist, $serial, $create = false) + { + $serial = new Math_BigInteger($serial); + + foreach ($rclist as $i => $rc) { + if (!($serial->compare($rc['userCertificate']))) { + return $i; + } + } + + if (!$create) { + return false; + } + + if (!class_exists('DateTime')) { + $revocationDate = @date('D, d M Y H:i:s O'); + } else { + $revocationDate = new DateTime('now', new DateTimeZone(@date_default_timezone_get())); + $revocationDate = $revocationDate->format('D, d M Y H:i:s O'); + } + + $i = count($rclist); + $rclist[] = array('userCertificate' => $serial, + 'revocationDate' => $this->_timeField($revocationDate)); + return $i; + } + + /** + * Revoke a certificate. + * + * @param string $serial + * @param string $date optional + * @access public + * @return bool + */ + function revoke($serial, $date = null) + { + if (isset($this->currentCert['tbsCertList'])) { + if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) { + if ($this->_revokedCertificate($rclist, $serial) === false) { // If not yet revoked + if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) { + if (!empty($date)) { + $rclist[$i]['revocationDate'] = $this->_timeField($date); + } + + return true; + } + } + } + } + + return false; + } + + /** + * Unrevoke a certificate. + * + * @param string $serial + * @access public + * @return bool + */ + function unrevoke($serial) + { + if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { + unset($rclist[$i]); + $rclist = array_values($rclist); + return true; + } + } + + return false; + } + + /** + * Get a revoked certificate. + * + * @param string $serial + * @access public + * @return mixed + */ + function getRevoked($serial) + { + if (is_array($rclist = $this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { + return $rclist[$i]; + } + } + + return false; + } + + /** + * List revoked certificates + * + * @param array $crl optional + * @access public + * @return array + */ + function listRevoked($crl = null) + { + if (!isset($crl)) { + $crl = $this->currentCert; + } + + if (!isset($crl['tbsCertList'])) { + return false; + } + + $result = array(); + + if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) { + foreach ($rclist as $rc) { + $result[] = $rc['userCertificate']->toString(); + } + } + + return $result; + } + + /** + * Remove a Revoked Certificate Extension + * + * @param string $serial + * @param string $id + * @access public + * @return bool + */ + function removeRevokedCertificateExtension($serial, $id) + { + if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { + return $this->_removeExtension($id, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); + } + } + + return false; + } + + /** + * Get a Revoked Certificate Extension + * + * Returns the extension if it exists and false if not + * + * @param string $serial + * @param string $id + * @param array $crl optional + * @access public + * @return mixed + */ + function getRevokedCertificateExtension($serial, $id, $crl = null) + { + if (!isset($crl)) { + $crl = $this->currentCert; + } + + if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { + return $this->_getExtension($id, $crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); + } + } + + return false; + } + + /** + * Returns a list of all extensions in use for a given revoked certificate + * + * @param string $serial + * @param array $crl optional + * @access public + * @return array + */ + function getRevokedCertificateExtensions($serial, $crl = null) + { + if (!isset($crl)) { + $crl = $this->currentCert; + } + + if (is_array($rclist = $this->_subArray($crl, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->_revokedCertificate($rclist, $serial)) !== false) { + return $this->_getExtensions($crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); + } + } + + return false; + } + + /** + * Set a Revoked Certificate Extension + * + * @param string $serial + * @param string $id + * @param mixed $value + * @param bool $critical optional + * @param bool $replace optional + * @access public + * @return bool + */ + function setRevokedCertificateExtension($serial, $id, $value, $critical = false, $replace = true) + { + if (isset($this->currentCert['tbsCertList'])) { + if (is_array($rclist = &$this->_subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) { + if (($i = $this->_revokedCertificate($rclist, $serial, true)) !== false) { + return $this->_setExtension($id, $value, $critical, $replace, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); + } + } + } + + return false; + } + + /** + * Extract raw BER from Base64 encoding + * + * @access private + * @param string $str + * @return string + */ + function _extractBER($str) + { + /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them + * above and beyond the ceritificate. + * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line: + * + * Bag Attributes + * localKeyID: 01 00 00 00 + * subject=/O=organization/OU=org unit/CN=common name + * issuer=/O=organization/CN=common name + */ + $temp = preg_replace('#.*?^-+[^-]+-+[\r\n ]*$#ms', '', $str, 1); + // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff + $temp = preg_replace('#-+[^-]+-+#', '', $temp); + // remove new lines + $temp = str_replace(array("\r", "\n", ' '), '', $temp); + $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false; + return $temp != false ? $temp : $str; + } + + /** + * Returns the OID corresponding to a name + * + * What's returned in the associative array returned by loadX509() (or load*()) is either a name or an OID if + * no OID to name mapping is available. The problem with this is that what may be an unmapped OID in one version + * of phpseclib may not be unmapped in the next version, so apps that are looking at this OID may not be able + * to work from version to version. + * + * This method will return the OID if a name is passed to it and if no mapping is avialable it'll assume that + * what's being passed to it already is an OID and return that instead. A few examples. + * + * getOID('2.16.840.1.101.3.4.2.1') == '2.16.840.1.101.3.4.2.1' + * getOID('id-sha256') == '2.16.840.1.101.3.4.2.1' + * getOID('zzz') == 'zzz' + * + * @access public + * @return string + */ + function getOID($name) + { + static $reverseMap; + if (!isset($reverseMap)) { + $reverseMap = array_flip($this->oids); + } + return isset($reverseMap[$name]) ? $reverseMap[$name] : $name; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Math/BigInteger.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Math/BigInteger.php old mode 100644 new mode 100755 index 8e54f741e..52858ea8a --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Math/BigInteger.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Math/BigInteger.php @@ -1,3758 +1,3812 @@ -> and << cannot be used, nor can the modulo operator %, - * which only supports integers. Although this fact will slow this library down, the fact that such a high - * base is being used should more than compensate. - * - * Numbers are stored in {@link http://en.wikipedia.org/wiki/Endianness little endian} format. ie. - * (new Math_BigInteger(pow(2, 26)))->value = array(0, 1) - * - * Useful resources are as follows: - * - * - {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf Handbook of Applied Cryptography (HAC)} - * - {@link http://math.libtomcrypt.com/files/tommath.pdf Multi-Precision Math (MPM)} - * - Java's BigInteger classes. See /j2se/src/share/classes/java/math in jdk-1_5_0-src-jrl.zip - * - * Here's an example of how to use this library: - * - * add($b); - * - * echo $c->toString(); // outputs 5 - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Math - * @package Math_BigInteger - * @author Jim Wigginton - * @copyright 2006 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -/**#@+ - * Reduction constants - * - * @access private - * @see Math_BigInteger::_reduce() - */ -/** - * @see Math_BigInteger::_montgomery() - * @see Math_BigInteger::_prepMontgomery() - */ -define('MATH_BIGINTEGER_MONTGOMERY', 0); -/** - * @see Math_BigInteger::_barrett() - */ -define('MATH_BIGINTEGER_BARRETT', 1); -/** - * @see Math_BigInteger::_mod2() - */ -define('MATH_BIGINTEGER_POWEROF2', 2); -/** - * @see Math_BigInteger::_remainder() - */ -define('MATH_BIGINTEGER_CLASSIC', 3); -/** - * @see Math_BigInteger::__clone() - */ -define('MATH_BIGINTEGER_NONE', 4); -/**#@-*/ - -/**#@+ - * Array constants - * - * Rather than create a thousands and thousands of new Math_BigInteger objects in repeated function calls to add() and - * multiply() or whatever, we'll just work directly on arrays, taking them in as parameters and returning them. - * - * @access private - */ -/** - * $result[MATH_BIGINTEGER_VALUE] contains the value. - */ -define('MATH_BIGINTEGER_VALUE', 0); -/** - * $result[MATH_BIGINTEGER_SIGN] contains the sign. - */ -define('MATH_BIGINTEGER_SIGN', 1); -/**#@-*/ - -/**#@+ - * @access private - * @see Math_BigInteger::_montgomery() - * @see Math_BigInteger::_barrett() - */ -/** - * Cache constants - * - * $cache[MATH_BIGINTEGER_VARIABLE] tells us whether or not the cached data is still valid. - */ -define('MATH_BIGINTEGER_VARIABLE', 0); -/** - * $cache[MATH_BIGINTEGER_DATA] contains the cached data. - */ -define('MATH_BIGINTEGER_DATA', 1); -/**#@-*/ - -/**#@+ - * Mode constants. - * - * @access private - * @see Math_BigInteger::Math_BigInteger() - */ -/** - * To use the pure-PHP implementation - */ -define('MATH_BIGINTEGER_MODE_INTERNAL', 1); -/** - * To use the BCMath library - * - * (if enabled; otherwise, the internal implementation will be used) - */ -define('MATH_BIGINTEGER_MODE_BCMATH', 2); -/** - * To use the GMP library - * - * (if present; otherwise, either the BCMath or the internal implementation will be used) - */ -define('MATH_BIGINTEGER_MODE_GMP', 3); -/**#@-*/ - -/** - * Karatsuba Cutoff - * - * At what point do we switch between Karatsuba multiplication and schoolbook long multiplication? - * - * @access private - */ -define('MATH_BIGINTEGER_KARATSUBA_CUTOFF', 25); - -/** - * Pure-PHP arbitrary precision integer arithmetic library. Supports base-2, base-10, base-16, and base-256 - * numbers. - * - * @package Math_BigInteger - * @author Jim Wigginton - * @access public - */ -class Math_BigInteger -{ - /** - * Holds the BigInteger's value. - * - * @var Array - * @access private - */ - var $value; - - /** - * Holds the BigInteger's magnitude. - * - * @var Boolean - * @access private - */ - var $is_negative = false; - - /** - * Random number generator function - * - * @see setRandomGenerator() - * @access private - */ - var $generator = 'mt_rand'; - - /** - * Precision - * - * @see setPrecision() - * @access private - */ - var $precision = -1; - - /** - * Precision Bitmask - * - * @see setPrecision() - * @access private - */ - var $bitmask = false; - - /** - * Mode independent value used for serialization. - * - * If the bcmath or gmp extensions are installed $this->value will be a non-serializable resource, hence the need for - * a variable that'll be serializable regardless of whether or not extensions are being used. Unlike $this->value, - * however, $this->hex is only calculated when $this->__sleep() is called. - * - * @see __sleep() - * @see __wakeup() - * @var String - * @access private - */ - var $hex; - - /** - * Converts base-2, base-10, base-16, and binary strings (base-256) to BigIntegers. - * - * If the second parameter - $base - is negative, then it will be assumed that the number's are encoded using - * two's compliment. The sole exception to this is -10, which is treated the same as 10 is. - * - * Here's an example: - * - * toString(); // outputs 50 - * ?> - * - * - * @param optional $x base-10 number or base-$base number if $base set. - * @param optional integer $base - * @return Math_BigInteger - * @access public - */ - function Math_BigInteger($x = 0, $base = 10) - { - if ( !defined('MATH_BIGINTEGER_MODE') ) { - switch (true) { - case extension_loaded('gmp'): - define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_GMP); - break; - case extension_loaded('bcmath'): - define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_BCMATH); - break; - default: - define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_INTERNAL); - } - } - - if (function_exists('openssl_public_encrypt') && !defined('MATH_BIGINTEGER_OPENSSL_DISABLE') && !defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { - // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work - ob_start(); - @phpinfo(); - $content = ob_get_contents(); - ob_end_clean(); - - preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches); - - $versions = array(); - if (!empty($matches[1])) { - for ($i = 0; $i < count($matches[1]); $i++) { - $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i]))); - - // Remove letter part in OpenSSL version - if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) { - $versions[$matches[1][$i]] = $fullVersion; - } else { - $versions[$matches[1][$i]] = $m[0]; - } - } - } - - // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+ - switch (true) { - case !isset($versions['Header']): - case !isset($versions['Library']): - case $versions['Header'] == $versions['Library']: - define('MATH_BIGINTEGER_OPENSSL_ENABLED', true); - break; - default: - define('MATH_BIGINTEGER_OPENSSL_DISABLE', true); - } - } - - if (!defined('PHP_INT_SIZE')) { - define('PHP_INT_SIZE', 4); - } - - if (!defined('MATH_BIGINTEGER_BASE') && MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_INTERNAL) { - switch (PHP_INT_SIZE) { - case 8: // use 64-bit integers if int size is 8 bytes - define('MATH_BIGINTEGER_BASE', 31); - define('MATH_BIGINTEGER_BASE_FULL', 0x80000000); - define('MATH_BIGINTEGER_MAX_DIGIT', 0x7FFFFFFF); - define('MATH_BIGINTEGER_MSB', 0x40000000); - // 10**9 is the closest we can get to 2**31 without passing it - define('MATH_BIGINTEGER_MAX10', 1000000000); - define('MATH_BIGINTEGER_MAX10_LEN', 9); - // the largest digit that may be used in addition / subtraction - define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 62)); - break; - //case 4: // use 64-bit floats if int size is 4 bytes - default: - define('MATH_BIGINTEGER_BASE', 26); - define('MATH_BIGINTEGER_BASE_FULL', 0x4000000); - define('MATH_BIGINTEGER_MAX_DIGIT', 0x3FFFFFF); - define('MATH_BIGINTEGER_MSB', 0x2000000); - // 10**7 is the closest to 2**26 without passing it - define('MATH_BIGINTEGER_MAX10', 10000000); - define('MATH_BIGINTEGER_MAX10_LEN', 7); - // the largest digit that may be used in addition / subtraction - // we do pow(2, 52) instead of using 4503599627370496 directly because some - // PHP installations will truncate 4503599627370496. - define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 52)); - } - } - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - switch (true) { - case is_resource($x) && get_resource_type($x) == 'GMP integer': - // PHP 5.6 switched GMP from using resources to objects - case is_object($x) && get_class($x) == 'GMP': - $this->value = $x; - return; - } - $this->value = gmp_init(0); - break; - case MATH_BIGINTEGER_MODE_BCMATH: - $this->value = '0'; - break; - default: - $this->value = array(); - } - - // '0' counts as empty() but when the base is 256 '0' is equal to ord('0') or 48 - // '0' is the only value like this per http://php.net/empty - if (empty($x) && (abs($base) != 256 || $x !== '0')) { - return; - } - - switch ($base) { - case -256: - if (ord($x[0]) & 0x80) { - $x = ~$x; - $this->is_negative = true; - } - case 256: - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $sign = $this->is_negative ? '-' : ''; - $this->value = gmp_init($sign . '0x' . bin2hex($x)); - break; - case MATH_BIGINTEGER_MODE_BCMATH: - // round $len to the nearest 4 (thanks, DavidMJ!) - $len = (strlen($x) + 3) & 0xFFFFFFFC; - - $x = str_pad($x, $len, chr(0), STR_PAD_LEFT); - - for ($i = 0; $i < $len; $i+= 4) { - $this->value = bcmul($this->value, '4294967296', 0); // 4294967296 == 2**32 - $this->value = bcadd($this->value, 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord($x[$i + 2]) << 8) | ord($x[$i + 3])), 0); - } - - if ($this->is_negative) { - $this->value = '-' . $this->value; - } - - break; - // converts a base-2**8 (big endian / msb) number to base-2**26 (little endian / lsb) - default: - while (strlen($x)) { - $this->value[] = $this->_bytes2int($this->_base256_rshift($x, MATH_BIGINTEGER_BASE)); - } - } - - if ($this->is_negative) { - if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) { - $this->is_negative = false; - } - $temp = $this->add(new Math_BigInteger('-1')); - $this->value = $temp->value; - } - break; - case 16: - case -16: - if ($base > 0 && $x[0] == '-') { - $this->is_negative = true; - $x = substr($x, 1); - } - - $x = preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#', '$1', $x); - - $is_negative = false; - if ($base < 0 && hexdec($x[0]) >= 8) { - $this->is_negative = $is_negative = true; - $x = bin2hex(~pack('H*', $x)); - } - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = $this->is_negative ? '-0x' . $x : '0x' . $x; - $this->value = gmp_init($temp); - $this->is_negative = false; - break; - case MATH_BIGINTEGER_MODE_BCMATH: - $x = ( strlen($x) & 1 ) ? '0' . $x : $x; - $temp = new Math_BigInteger(pack('H*', $x), 256); - $this->value = $this->is_negative ? '-' . $temp->value : $temp->value; - $this->is_negative = false; - break; - default: - $x = ( strlen($x) & 1 ) ? '0' . $x : $x; - $temp = new Math_BigInteger(pack('H*', $x), 256); - $this->value = $temp->value; - } - - if ($is_negative) { - $temp = $this->add(new Math_BigInteger('-1')); - $this->value = $temp->value; - } - break; - case 10: - case -10: - // (?value = gmp_init($x); - break; - case MATH_BIGINTEGER_MODE_BCMATH: - // explicitly casting $x to a string is necessary, here, since doing $x[0] on -1 yields different - // results then doing it on '-1' does (modInverse does $x[0]) - $this->value = $x === '-' ? '0' : (string) $x; - break; - default: - $temp = new Math_BigInteger(); - - $multiplier = new Math_BigInteger(); - $multiplier->value = array(MATH_BIGINTEGER_MAX10); - - if ($x[0] == '-') { - $this->is_negative = true; - $x = substr($x, 1); - } - - $x = str_pad($x, strlen($x) + ((MATH_BIGINTEGER_MAX10_LEN - 1) * strlen($x)) % MATH_BIGINTEGER_MAX10_LEN, 0, STR_PAD_LEFT); - while (strlen($x)) { - $temp = $temp->multiply($multiplier); - $temp = $temp->add(new Math_BigInteger($this->_int2bytes(substr($x, 0, MATH_BIGINTEGER_MAX10_LEN)), 256)); - $x = substr($x, MATH_BIGINTEGER_MAX10_LEN); - } - - $this->value = $temp->value; - } - break; - case 2: // base-2 support originally implemented by Lluis Pamies - thanks! - case -2: - if ($base > 0 && $x[0] == '-') { - $this->is_negative = true; - $x = substr($x, 1); - } - - $x = preg_replace('#^([01]*).*#', '$1', $x); - $x = str_pad($x, strlen($x) + (3 * strlen($x)) % 4, 0, STR_PAD_LEFT); - - $str = '0x'; - while (strlen($x)) { - $part = substr($x, 0, 4); - $str.= dechex(bindec($part)); - $x = substr($x, 4); - } - - if ($this->is_negative) { - $str = '-' . $str; - } - - $temp = new Math_BigInteger($str, 8 * $base); // ie. either -16 or +16 - $this->value = $temp->value; - $this->is_negative = $temp->is_negative; - - break; - default: - // base not supported, so we'll let $this == 0 - } - } - - /** - * Converts a BigInteger to a byte string (eg. base-256). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * - * Here's an example: - * - * toBytes(); // outputs chr(65) - * ?> - * - * - * @param Boolean $twos_compliment - * @return String - * @access public - * @internal Converts a base-2**26 number to base-2**8 - */ - function toBytes($twos_compliment = false) - { - if ($twos_compliment) { - $comparison = $this->compare(new Math_BigInteger()); - if ($comparison == 0) { - return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; - } - - $temp = $comparison < 0 ? $this->add(new Math_BigInteger(1)) : $this->copy(); - $bytes = $temp->toBytes(); - - if (empty($bytes)) { // eg. if the number we're trying to convert is -1 - $bytes = chr(0); - } - - if (ord($bytes[0]) & 0x80) { - $bytes = chr(0) . $bytes; - } - - return $comparison < 0 ? ~$bytes : $bytes; - } - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - if (gmp_cmp($this->value, gmp_init(0)) == 0) { - return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; - } - - $temp = gmp_strval(gmp_abs($this->value), 16); - $temp = ( strlen($temp) & 1 ) ? '0' . $temp : $temp; - $temp = pack('H*', $temp); - - return $this->precision > 0 ? - substr(str_pad($temp, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : - ltrim($temp, chr(0)); - case MATH_BIGINTEGER_MODE_BCMATH: - if ($this->value === '0') { - return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; - } - - $value = ''; - $current = $this->value; - - if ($current[0] == '-') { - $current = substr($current, 1); - } - - while (bccomp($current, '0', 0) > 0) { - $temp = bcmod($current, '16777216'); - $value = chr($temp >> 16) . chr($temp >> 8) . chr($temp) . $value; - $current = bcdiv($current, '16777216', 0); - } - - return $this->precision > 0 ? - substr(str_pad($value, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : - ltrim($value, chr(0)); - } - - if (!count($this->value)) { - return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; - } - $result = $this->_int2bytes($this->value[count($this->value) - 1]); - - $temp = $this->copy(); - - for ($i = count($temp->value) - 2; $i >= 0; --$i) { - $temp->_base256_lshift($result, MATH_BIGINTEGER_BASE); - $result = $result | str_pad($temp->_int2bytes($temp->value[$i]), strlen($result), chr(0), STR_PAD_LEFT); - } - - return $this->precision > 0 ? - str_pad(substr($result, -(($this->precision + 7) >> 3)), ($this->precision + 7) >> 3, chr(0), STR_PAD_LEFT) : - $result; - } - - /** - * Converts a BigInteger to a hex string (eg. base-16)). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * - * Here's an example: - * - * toHex(); // outputs '41' - * ?> - * - * - * @param Boolean $twos_compliment - * @return String - * @access public - * @internal Converts a base-2**26 number to base-2**8 - */ - function toHex($twos_compliment = false) - { - return bin2hex($this->toBytes($twos_compliment)); - } - - /** - * Converts a BigInteger to a bit string (eg. base-2). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * - * Here's an example: - * - * toBits(); // outputs '1000001' - * ?> - * - * - * @param Boolean $twos_compliment - * @return String - * @access public - * @internal Converts a base-2**26 number to base-2**2 - */ - function toBits($twos_compliment = false) - { - $hex = $this->toHex($twos_compliment); - $bits = ''; - for ($i = strlen($hex) - 8, $start = strlen($hex) & 7; $i >= $start; $i-=8) { - $bits = str_pad(decbin(hexdec(substr($hex, $i, 8))), 32, '0', STR_PAD_LEFT) . $bits; - } - if ($start) { // hexdec('') == 0 - $bits = str_pad(decbin(hexdec(substr($hex, 0, $start))), 8, '0', STR_PAD_LEFT) . $bits; - } - $result = $this->precision > 0 ? substr($bits, -$this->precision) : ltrim($bits, '0'); - - if ($twos_compliment && $this->compare(new Math_BigInteger()) > 0 && $this->precision <= 0) { - return '0' . $result; - } - - return $result; - } - - /** - * Converts a BigInteger to a base-10 number. - * - * Here's an example: - * - * toString(); // outputs 50 - * ?> - * - * - * @return String - * @access public - * @internal Converts a base-2**26 number to base-10**7 (which is pretty much base-10) - */ - function toString() - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - return gmp_strval($this->value); - case MATH_BIGINTEGER_MODE_BCMATH: - if ($this->value === '0') { - return '0'; - } - - return ltrim($this->value, '0'); - } - - if (!count($this->value)) { - return '0'; - } - - $temp = $this->copy(); - $temp->is_negative = false; - - $divisor = new Math_BigInteger(); - $divisor->value = array(MATH_BIGINTEGER_MAX10); - $result = ''; - while (count($temp->value)) { - list($temp, $mod) = $temp->divide($divisor); - $result = str_pad(isset($mod->value[0]) ? $mod->value[0] : '', MATH_BIGINTEGER_MAX10_LEN, '0', STR_PAD_LEFT) . $result; - } - $result = ltrim($result, '0'); - if (empty($result)) { - $result = '0'; - } - - if ($this->is_negative) { - $result = '-' . $result; - } - - return $result; - } - - /** - * Copy an object - * - * PHP5 passes objects by reference while PHP4 passes by value. As such, we need a function to guarantee - * that all objects are passed by value, when appropriate. More information can be found here: - * - * {@link http://php.net/language.oop5.basic#51624} - * - * @access public - * @see __clone() - * @return Math_BigInteger - */ - function copy() - { - $temp = new Math_BigInteger(); - $temp->value = $this->value; - $temp->is_negative = $this->is_negative; - $temp->generator = $this->generator; - $temp->precision = $this->precision; - $temp->bitmask = $this->bitmask; - return $temp; - } - - /** - * __toString() magic method - * - * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call - * toString(). - * - * @access public - * @internal Implemented per a suggestion by Techie-Michael - thanks! - */ - function __toString() - { - return $this->toString(); - } - - /** - * __clone() magic method - * - * Although you can call Math_BigInteger::__toString() directly in PHP5, you cannot call Math_BigInteger::__clone() - * directly in PHP5. You can in PHP4 since it's not a magic method, but in PHP5, you have to call it by using the PHP5 - * only syntax of $y = clone $x. As such, if you're trying to write an application that works on both PHP4 and PHP5, - * call Math_BigInteger::copy(), instead. - * - * @access public - * @see copy() - * @return Math_BigInteger - */ - function __clone() - { - return $this->copy(); - } - - /** - * __sleep() magic method - * - * Will be called, automatically, when serialize() is called on a Math_BigInteger object. - * - * @see __wakeup() - * @access public - */ - function __sleep() - { - $this->hex = $this->toHex(true); - $vars = array('hex'); - if ($this->generator != 'mt_rand') { - $vars[] = 'generator'; - } - if ($this->precision > 0) { - $vars[] = 'precision'; - } - return $vars; - - } - - /** - * __wakeup() magic method - * - * Will be called, automatically, when unserialize() is called on a Math_BigInteger object. - * - * @see __sleep() - * @access public - */ - function __wakeup() - { - $temp = new Math_BigInteger($this->hex, -16); - $this->value = $temp->value; - $this->is_negative = $temp->is_negative; - $this->setRandomGenerator($this->generator); - if ($this->precision > 0) { - // recalculate $this->bitmask - $this->setPrecision($this->precision); - } - } - - /** - * Adds two BigIntegers. - * - * Here's an example: - * - * add($b); - * - * echo $c->toString(); // outputs 30 - * ?> - * - * - * @param Math_BigInteger $y - * @return Math_BigInteger - * @access public - * @internal Performs base-2**52 addition - */ - function add($y) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_add($this->value, $y->value); - - return $this->_normalize($temp); - case MATH_BIGINTEGER_MODE_BCMATH: - $temp = new Math_BigInteger(); - $temp->value = bcadd($this->value, $y->value, 0); - - return $this->_normalize($temp); - } - - $temp = $this->_add($this->value, $this->is_negative, $y->value, $y->is_negative); - - $result = new Math_BigInteger(); - $result->value = $temp[MATH_BIGINTEGER_VALUE]; - $result->is_negative = $temp[MATH_BIGINTEGER_SIGN]; - - return $this->_normalize($result); - } - - /** - * Performs addition. - * - * @param Array $x_value - * @param Boolean $x_negative - * @param Array $y_value - * @param Boolean $y_negative - * @return Array - * @access private - */ - function _add($x_value, $x_negative, $y_value, $y_negative) - { - $x_size = count($x_value); - $y_size = count($y_value); - - if ($x_size == 0) { - return array( - MATH_BIGINTEGER_VALUE => $y_value, - MATH_BIGINTEGER_SIGN => $y_negative - ); - } else if ($y_size == 0) { - return array( - MATH_BIGINTEGER_VALUE => $x_value, - MATH_BIGINTEGER_SIGN => $x_negative - ); - } - - // subtract, if appropriate - if ( $x_negative != $y_negative ) { - if ( $x_value == $y_value ) { - return array( - MATH_BIGINTEGER_VALUE => array(), - MATH_BIGINTEGER_SIGN => false - ); - } - - $temp = $this->_subtract($x_value, false, $y_value, false); - $temp[MATH_BIGINTEGER_SIGN] = $this->_compare($x_value, false, $y_value, false) > 0 ? - $x_negative : $y_negative; - - return $temp; - } - - if ($x_size < $y_size) { - $size = $x_size; - $value = $y_value; - } else { - $size = $y_size; - $value = $x_value; - } - - $value[count($value)] = 0; // just in case the carry adds an extra digit - - $carry = 0; - for ($i = 0, $j = 1; $j < $size; $i+=2, $j+=2) { - $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] + $y_value[$j] * MATH_BIGINTEGER_BASE_FULL + $y_value[$i] + $carry; - $carry = $sum >= MATH_BIGINTEGER_MAX_DIGIT2; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 - $sum = $carry ? $sum - MATH_BIGINTEGER_MAX_DIGIT2 : $sum; - - $temp = MATH_BIGINTEGER_BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); - - $value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); // eg. a faster alternative to fmod($sum, 0x4000000) - $value[$j] = $temp; - } - - if ($j == $size) { // ie. if $y_size is odd - $sum = $x_value[$i] + $y_value[$i] + $carry; - $carry = $sum >= MATH_BIGINTEGER_BASE_FULL; - $value[$i] = $carry ? $sum - MATH_BIGINTEGER_BASE_FULL : $sum; - ++$i; // ie. let $i = $j since we've just done $value[$i] - } - - if ($carry) { - for (; $value[$i] == MATH_BIGINTEGER_MAX_DIGIT; ++$i) { - $value[$i] = 0; - } - ++$value[$i]; - } - - return array( - MATH_BIGINTEGER_VALUE => $this->_trim($value), - MATH_BIGINTEGER_SIGN => $x_negative - ); - } - - /** - * Subtracts two BigIntegers. - * - * Here's an example: - * - * subtract($b); - * - * echo $c->toString(); // outputs -10 - * ?> - * - * - * @param Math_BigInteger $y - * @return Math_BigInteger - * @access public - * @internal Performs base-2**52 subtraction - */ - function subtract($y) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_sub($this->value, $y->value); - - return $this->_normalize($temp); - case MATH_BIGINTEGER_MODE_BCMATH: - $temp = new Math_BigInteger(); - $temp->value = bcsub($this->value, $y->value, 0); - - return $this->_normalize($temp); - } - - $temp = $this->_subtract($this->value, $this->is_negative, $y->value, $y->is_negative); - - $result = new Math_BigInteger(); - $result->value = $temp[MATH_BIGINTEGER_VALUE]; - $result->is_negative = $temp[MATH_BIGINTEGER_SIGN]; - - return $this->_normalize($result); - } - - /** - * Performs subtraction. - * - * @param Array $x_value - * @param Boolean $x_negative - * @param Array $y_value - * @param Boolean $y_negative - * @return Array - * @access private - */ - function _subtract($x_value, $x_negative, $y_value, $y_negative) - { - $x_size = count($x_value); - $y_size = count($y_value); - - if ($x_size == 0) { - return array( - MATH_BIGINTEGER_VALUE => $y_value, - MATH_BIGINTEGER_SIGN => !$y_negative - ); - } else if ($y_size == 0) { - return array( - MATH_BIGINTEGER_VALUE => $x_value, - MATH_BIGINTEGER_SIGN => $x_negative - ); - } - - // add, if appropriate (ie. -$x - +$y or +$x - -$y) - if ( $x_negative != $y_negative ) { - $temp = $this->_add($x_value, false, $y_value, false); - $temp[MATH_BIGINTEGER_SIGN] = $x_negative; - - return $temp; - } - - $diff = $this->_compare($x_value, $x_negative, $y_value, $y_negative); - - if ( !$diff ) { - return array( - MATH_BIGINTEGER_VALUE => array(), - MATH_BIGINTEGER_SIGN => false - ); - } - - // switch $x and $y around, if appropriate. - if ( (!$x_negative && $diff < 0) || ($x_negative && $diff > 0) ) { - $temp = $x_value; - $x_value = $y_value; - $y_value = $temp; - - $x_negative = !$x_negative; - - $x_size = count($x_value); - $y_size = count($y_value); - } - - // at this point, $x_value should be at least as big as - if not bigger than - $y_value - - $carry = 0; - for ($i = 0, $j = 1; $j < $y_size; $i+=2, $j+=2) { - $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] - $y_value[$j] * MATH_BIGINTEGER_BASE_FULL - $y_value[$i] - $carry; - $carry = $sum < 0; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 - $sum = $carry ? $sum + MATH_BIGINTEGER_MAX_DIGIT2 : $sum; - - $temp = MATH_BIGINTEGER_BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); - - $x_value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); - $x_value[$j] = $temp; - } - - if ($j == $y_size) { // ie. if $y_size is odd - $sum = $x_value[$i] - $y_value[$i] - $carry; - $carry = $sum < 0; - $x_value[$i] = $carry ? $sum + MATH_BIGINTEGER_BASE_FULL : $sum; - ++$i; - } - - if ($carry) { - for (; !$x_value[$i]; ++$i) { - $x_value[$i] = MATH_BIGINTEGER_MAX_DIGIT; - } - --$x_value[$i]; - } - - return array( - MATH_BIGINTEGER_VALUE => $this->_trim($x_value), - MATH_BIGINTEGER_SIGN => $x_negative - ); - } - - /** - * Multiplies two BigIntegers - * - * Here's an example: - * - * multiply($b); - * - * echo $c->toString(); // outputs 200 - * ?> - * - * - * @param Math_BigInteger $x - * @return Math_BigInteger - * @access public - */ - function multiply($x) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_mul($this->value, $x->value); - - return $this->_normalize($temp); - case MATH_BIGINTEGER_MODE_BCMATH: - $temp = new Math_BigInteger(); - $temp->value = bcmul($this->value, $x->value, 0); - - return $this->_normalize($temp); - } - - $temp = $this->_multiply($this->value, $this->is_negative, $x->value, $x->is_negative); - - $product = new Math_BigInteger(); - $product->value = $temp[MATH_BIGINTEGER_VALUE]; - $product->is_negative = $temp[MATH_BIGINTEGER_SIGN]; - - return $this->_normalize($product); - } - - /** - * Performs multiplication. - * - * @param Array $x_value - * @param Boolean $x_negative - * @param Array $y_value - * @param Boolean $y_negative - * @return Array - * @access private - */ - function _multiply($x_value, $x_negative, $y_value, $y_negative) - { - //if ( $x_value == $y_value ) { - // return array( - // MATH_BIGINTEGER_VALUE => $this->_square($x_value), - // MATH_BIGINTEGER_SIGN => $x_sign != $y_value - // ); - //} - - $x_length = count($x_value); - $y_length = count($y_value); - - if ( !$x_length || !$y_length ) { // a 0 is being multiplied - return array( - MATH_BIGINTEGER_VALUE => array(), - MATH_BIGINTEGER_SIGN => false - ); - } - - return array( - MATH_BIGINTEGER_VALUE => min($x_length, $y_length) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ? - $this->_trim($this->_regularMultiply($x_value, $y_value)) : - $this->_trim($this->_karatsuba($x_value, $y_value)), - MATH_BIGINTEGER_SIGN => $x_negative != $y_negative - ); - } - - /** - * Performs long multiplication on two BigIntegers - * - * Modeled after 'multiply' in MutableBigInteger.java. - * - * @param Array $x_value - * @param Array $y_value - * @return Array - * @access private - */ - function _regularMultiply($x_value, $y_value) - { - $x_length = count($x_value); - $y_length = count($y_value); - - if ( !$x_length || !$y_length ) { // a 0 is being multiplied - return array(); - } - - if ( $x_length < $y_length ) { - $temp = $x_value; - $x_value = $y_value; - $y_value = $temp; - - $x_length = count($x_value); - $y_length = count($y_value); - } - - $product_value = $this->_array_repeat(0, $x_length + $y_length); - - // the following for loop could be removed if the for loop following it - // (the one with nested for loops) initially set $i to 0, but - // doing so would also make the result in one set of unnecessary adds, - // since on the outermost loops first pass, $product->value[$k] is going - // to always be 0 - - $carry = 0; - - for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0 - $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); - } - - $product_value[$j] = $carry; - - // the above for loop is what the previous comment was talking about. the - // following for loop is the "one with nested for loops" - for ($i = 1; $i < $y_length; ++$i) { - $carry = 0; - - for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) { - $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); - } - - $product_value[$k] = $carry; - } - - return $product_value; - } - - /** - * Performs Karatsuba multiplication on two BigIntegers - * - * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=120 MPM 5.2.3}. - * - * @param Array $x_value - * @param Array $y_value - * @return Array - * @access private - */ - function _karatsuba($x_value, $y_value) - { - $m = min(count($x_value) >> 1, count($y_value) >> 1); - - if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) { - return $this->_regularMultiply($x_value, $y_value); - } - - $x1 = array_slice($x_value, $m); - $x0 = array_slice($x_value, 0, $m); - $y1 = array_slice($y_value, $m); - $y0 = array_slice($y_value, 0, $m); - - $z2 = $this->_karatsuba($x1, $y1); - $z0 = $this->_karatsuba($x0, $y0); - - $z1 = $this->_add($x1, false, $x0, false); - $temp = $this->_add($y1, false, $y0, false); - $z1 = $this->_karatsuba($z1[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_VALUE]); - $temp = $this->_add($z2, false, $z0, false); - $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false); - - $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); - $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]); - - $xy = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]); - $xy = $this->_add($xy[MATH_BIGINTEGER_VALUE], $xy[MATH_BIGINTEGER_SIGN], $z0, false); - - return $xy[MATH_BIGINTEGER_VALUE]; - } - - /** - * Performs squaring - * - * @param Array $x - * @return Array - * @access private - */ - function _square($x = false) - { - return count($x) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ? - $this->_trim($this->_baseSquare($x)) : - $this->_trim($this->_karatsubaSquare($x)); - } - - /** - * Performs traditional squaring on two BigIntegers - * - * Squaring can be done faster than multiplying a number by itself can be. See - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=7 HAC 14.2.4} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=141 MPM 5.3} for more information. - * - * @param Array $value - * @return Array - * @access private - */ - function _baseSquare($value) - { - if ( empty($value) ) { - return array(); - } - $square_value = $this->_array_repeat(0, 2 * count($value)); - - for ($i = 0, $max_index = count($value) - 1; $i <= $max_index; ++$i) { - $i2 = $i << 1; - - $temp = $square_value[$i2] + $value[$i] * $value[$i]; - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $square_value[$i2] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); - - // note how we start from $i+1 instead of 0 as we do in multiplication. - for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) { - $temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry; - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $square_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); - } - - // the following line can yield values larger 2**15. at this point, PHP should switch - // over to floats. - $square_value[$i + $max_index + 1] = $carry; - } - - return $square_value; - } - - /** - * Performs Karatsuba "squaring" on two BigIntegers - * - * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=151 MPM 5.3.4}. - * - * @param Array $value - * @return Array - * @access private - */ - function _karatsubaSquare($value) - { - $m = count($value) >> 1; - - if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) { - return $this->_baseSquare($value); - } - - $x1 = array_slice($value, $m); - $x0 = array_slice($value, 0, $m); - - $z2 = $this->_karatsubaSquare($x1); - $z0 = $this->_karatsubaSquare($x0); - - $z1 = $this->_add($x1, false, $x0, false); - $z1 = $this->_karatsubaSquare($z1[MATH_BIGINTEGER_VALUE]); - $temp = $this->_add($z2, false, $z0, false); - $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false); - - $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); - $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]); - - $xx = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]); - $xx = $this->_add($xx[MATH_BIGINTEGER_VALUE], $xx[MATH_BIGINTEGER_SIGN], $z0, false); - - return $xx[MATH_BIGINTEGER_VALUE]; - } - - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * Here's an example: - * - * divide($b); - * - * echo $quotient->toString(); // outputs 0 - * echo "\r\n"; - * echo $remainder->toString(); // outputs 10 - * ?> - * - * - * @param Math_BigInteger $y - * @return Array - * @access public - * @internal This function is based off of {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=9 HAC 14.20}. - */ - function divide($y) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $quotient = new Math_BigInteger(); - $remainder = new Math_BigInteger(); - - list($quotient->value, $remainder->value) = gmp_div_qr($this->value, $y->value); - - if (gmp_sign($remainder->value) < 0) { - $remainder->value = gmp_add($remainder->value, gmp_abs($y->value)); - } - - return array($this->_normalize($quotient), $this->_normalize($remainder)); - case MATH_BIGINTEGER_MODE_BCMATH: - $quotient = new Math_BigInteger(); - $remainder = new Math_BigInteger(); - - $quotient->value = bcdiv($this->value, $y->value, 0); - $remainder->value = bcmod($this->value, $y->value); - - if ($remainder->value[0] == '-') { - $remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value, 0); - } - - return array($this->_normalize($quotient), $this->_normalize($remainder)); - } - - if (count($y->value) == 1) { - list($q, $r) = $this->_divide_digit($this->value, $y->value[0]); - $quotient = new Math_BigInteger(); - $remainder = new Math_BigInteger(); - $quotient->value = $q; - $remainder->value = array($r); - $quotient->is_negative = $this->is_negative != $y->is_negative; - return array($this->_normalize($quotient), $this->_normalize($remainder)); - } - - static $zero; - if ( !isset($zero) ) { - $zero = new Math_BigInteger(); - } - - $x = $this->copy(); - $y = $y->copy(); - - $x_sign = $x->is_negative; - $y_sign = $y->is_negative; - - $x->is_negative = $y->is_negative = false; - - $diff = $x->compare($y); - - if ( !$diff ) { - $temp = new Math_BigInteger(); - $temp->value = array(1); - $temp->is_negative = $x_sign != $y_sign; - return array($this->_normalize($temp), $this->_normalize(new Math_BigInteger())); - } - - if ( $diff < 0 ) { - // if $x is negative, "add" $y. - if ( $x_sign ) { - $x = $y->subtract($x); - } - return array($this->_normalize(new Math_BigInteger()), $this->_normalize($x)); - } - - // normalize $x and $y as described in HAC 14.23 / 14.24 - $msb = $y->value[count($y->value) - 1]; - for ($shift = 0; !($msb & MATH_BIGINTEGER_MSB); ++$shift) { - $msb <<= 1; - } - $x->_lshift($shift); - $y->_lshift($shift); - $y_value = &$y->value; - - $x_max = count($x->value) - 1; - $y_max = count($y->value) - 1; - - $quotient = new Math_BigInteger(); - $quotient_value = &$quotient->value; - $quotient_value = $this->_array_repeat(0, $x_max - $y_max + 1); - - static $temp, $lhs, $rhs; - if (!isset($temp)) { - $temp = new Math_BigInteger(); - $lhs = new Math_BigInteger(); - $rhs = new Math_BigInteger(); - } - $temp_value = &$temp->value; - $rhs_value = &$rhs->value; - - // $temp = $y << ($x_max - $y_max-1) in base 2**26 - $temp_value = array_merge($this->_array_repeat(0, $x_max - $y_max), $y_value); - - while ( $x->compare($temp) >= 0 ) { - // calculate the "common residue" - ++$quotient_value[$x_max - $y_max]; - $x = $x->subtract($temp); - $x_max = count($x->value) - 1; - } - - for ($i = $x_max; $i >= $y_max + 1; --$i) { - $x_value = &$x->value; - $x_window = array( - isset($x_value[$i]) ? $x_value[$i] : 0, - isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0, - isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0 - ); - $y_window = array( - $y_value[$y_max], - ( $y_max > 0 ) ? $y_value[$y_max - 1] : 0 - ); - - $q_index = $i - $y_max - 1; - if ($x_window[0] == $y_window[0]) { - $quotient_value[$q_index] = MATH_BIGINTEGER_MAX_DIGIT; - } else { - $quotient_value[$q_index] = $this->_safe_divide( - $x_window[0] * MATH_BIGINTEGER_BASE_FULL + $x_window[1], - $y_window[0] - ); - } - - $temp_value = array($y_window[1], $y_window[0]); - - $lhs->value = array($quotient_value[$q_index]); - $lhs = $lhs->multiply($temp); - - $rhs_value = array($x_window[2], $x_window[1], $x_window[0]); - - while ( $lhs->compare($rhs) > 0 ) { - --$quotient_value[$q_index]; - - $lhs->value = array($quotient_value[$q_index]); - $lhs = $lhs->multiply($temp); - } - - $adjust = $this->_array_repeat(0, $q_index); - $temp_value = array($quotient_value[$q_index]); - $temp = $temp->multiply($y); - $temp_value = &$temp->value; - $temp_value = array_merge($adjust, $temp_value); - - $x = $x->subtract($temp); - - if ($x->compare($zero) < 0) { - $temp_value = array_merge($adjust, $y_value); - $x = $x->add($temp); - - --$quotient_value[$q_index]; - } - - $x_max = count($x_value) - 1; - } - - // unnormalize the remainder - $x->_rshift($shift); - - $quotient->is_negative = $x_sign != $y_sign; - - // calculate the "common residue", if appropriate - if ( $x_sign ) { - $y->_rshift($shift); - $x = $y->subtract($x); - } - - return array($this->_normalize($quotient), $this->_normalize($x)); - } - - /** - * Divides a BigInteger by a regular integer - * - * abc / x = a00 / x + b0 / x + c / x - * - * @param Array $dividend - * @param Array $divisor - * @return Array - * @access private - */ - function _divide_digit($dividend, $divisor) - { - $carry = 0; - $result = array(); - - for ($i = count($dividend) - 1; $i >= 0; --$i) { - $temp = MATH_BIGINTEGER_BASE_FULL * $carry + $dividend[$i]; - $result[$i] = $this->_safe_divide($temp, $divisor); - $carry = (int) ($temp - $divisor * $result[$i]); - } - - return array($result, $carry); - } - - /** - * Performs modular exponentiation. - * - * Here's an example: - * - * modPow($b, $c); - * - * echo $c->toString(); // outputs 10 - * ?> - * - * - * @param Math_BigInteger $e - * @param Math_BigInteger $n - * @return Math_BigInteger - * @access public - * @internal The most naive approach to modular exponentiation has very unreasonable requirements, and - * and although the approach involving repeated squaring does vastly better, it, too, is impractical - * for our purposes. The reason being that division - by far the most complicated and time-consuming - * of the basic operations (eg. +,-,*,/) - occurs multiple times within it. - * - * Modular reductions resolve this issue. Although an individual modular reduction takes more time - * then an individual division, when performed in succession (with the same modulo), they're a lot faster. - * - * The two most commonly used modular reductions are Barrett and Montgomery reduction. Montgomery reduction, - * although faster, only works when the gcd of the modulo and of the base being used is 1. In RSA, when the - * base is a power of two, the modulo - a product of two primes - is always going to have a gcd of 1 (because - * the product of two odd numbers is odd), but what about when RSA isn't used? - * - * In contrast, Barrett reduction has no such constraint. As such, some bigint implementations perform a - * Barrett reduction after every operation in the modpow function. Others perform Barrett reductions when the - * modulo is even and Montgomery reductions when the modulo is odd. BigInteger.java's modPow method, however, - * uses a trick involving the Chinese Remainder Theorem to factor the even modulo into two numbers - one odd and - * the other, a power of two - and recombine them, later. This is the method that this modPow function uses. - * {@link http://islab.oregonstate.edu/papers/j34monex.pdf Montgomery Reduction with Even Modulus} elaborates. - */ - function modPow($e, $n) - { - $n = $this->bitmask !== false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs(); - - if ($e->compare(new Math_BigInteger()) < 0) { - $e = $e->abs(); - - $temp = $this->modInverse($n); - if ($temp === false) { - return false; - } - - return $this->_normalize($temp->modPow($e, $n)); - } - - if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP ) { - $temp = new Math_BigInteger(); - $temp->value = gmp_powm($this->value, $e->value, $n->value); - - return $this->_normalize($temp); - } - - if ($this->compare(new Math_BigInteger()) < 0 || $this->compare($n) > 0) { - list(, $temp) = $this->divide($n); - return $temp->modPow($e, $n); - } - - if (defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { - $components = array( - 'modulus' => $n->toBytes(true), - 'publicExponent' => $e->toBytes(true) - ); - - $components = array( - 'modulus' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['modulus'])), $components['modulus']), - 'publicExponent' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['publicExponent'])), $components['publicExponent']) - ); - - $RSAPublicKey = pack('Ca*a*a*', - 48, $this->_encodeASN1Length(strlen($components['modulus']) + strlen($components['publicExponent'])), - $components['modulus'], $components['publicExponent'] - ); - - $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA - $RSAPublicKey = chr(0) . $RSAPublicKey; - $RSAPublicKey = chr(3) . $this->_encodeASN1Length(strlen($RSAPublicKey)) . $RSAPublicKey; - - $encapsulated = pack('Ca*a*', - 48, $this->_encodeASN1Length(strlen($rsaOID . $RSAPublicKey)), $rsaOID . $RSAPublicKey - ); - - $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . - chunk_split(base64_encode($encapsulated)) . - '-----END PUBLIC KEY-----'; - - $plaintext = str_pad($this->toBytes(), strlen($n->toBytes(true)) - 1, "\0", STR_PAD_LEFT); - - if (openssl_public_encrypt($plaintext, $result, $RSAPublicKey, OPENSSL_NO_PADDING)) { - return new Math_BigInteger($result, 256); - } - } - - if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) { - $temp = new Math_BigInteger(); - $temp->value = bcpowmod($this->value, $e->value, $n->value, 0); - - return $this->_normalize($temp); - } - - if ( empty($e->value) ) { - $temp = new Math_BigInteger(); - $temp->value = array(1); - return $this->_normalize($temp); - } - - if ( $e->value == array(1) ) { - list(, $temp) = $this->divide($n); - return $this->_normalize($temp); - } - - if ( $e->value == array(2) ) { - $temp = new Math_BigInteger(); - $temp->value = $this->_square($this->value); - list(, $temp) = $temp->divide($n); - return $this->_normalize($temp); - } - - return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_BARRETT)); - - // the following code, although not callable, can be run independently of the above code - // although the above code performed better in my benchmarks the following could might - // perform better under different circumstances. in lieu of deleting it it's just been - // made uncallable - - // is the modulo odd? - if ( $n->value[0] & 1 ) { - return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_MONTGOMERY)); - } - // if it's not, it's even - - // find the lowest set bit (eg. the max pow of 2 that divides $n) - for ($i = 0; $i < count($n->value); ++$i) { - if ( $n->value[$i] ) { - $temp = decbin($n->value[$i]); - $j = strlen($temp) - strrpos($temp, '1') - 1; - $j+= 26 * $i; - break; - } - } - // at this point, 2^$j * $n/(2^$j) == $n - - $mod1 = $n->copy(); - $mod1->_rshift($j); - $mod2 = new Math_BigInteger(); - $mod2->value = array(1); - $mod2->_lshift($j); - - $part1 = ( $mod1->value != array(1) ) ? $this->_slidingWindow($e, $mod1, MATH_BIGINTEGER_MONTGOMERY) : new Math_BigInteger(); - $part2 = $this->_slidingWindow($e, $mod2, MATH_BIGINTEGER_POWEROF2); - - $y1 = $mod2->modInverse($mod1); - $y2 = $mod1->modInverse($mod2); - - $result = $part1->multiply($mod2); - $result = $result->multiply($y1); - - $temp = $part2->multiply($mod1); - $temp = $temp->multiply($y2); - - $result = $result->add($temp); - list(, $result) = $result->divide($n); - - return $this->_normalize($result); - } - - /** - * Performs modular exponentiation. - * - * Alias for Math_BigInteger::modPow() - * - * @param Math_BigInteger $e - * @param Math_BigInteger $n - * @return Math_BigInteger - * @access public - */ - function powMod($e, $n) - { - return $this->modPow($e, $n); - } - - /** - * Sliding Window k-ary Modular Exponentiation - * - * Based on {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=27 HAC 14.85} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=210 MPM 7.7}. In a departure from those algorithims, - * however, this function performs a modular reduction after every multiplication and squaring operation. - * As such, this function has the same preconditions that the reductions being used do. - * - * @param Math_BigInteger $e - * @param Math_BigInteger $n - * @param Integer $mode - * @return Math_BigInteger - * @access private - */ - function _slidingWindow($e, $n, $mode) - { - static $window_ranges = array(7, 25, 81, 241, 673, 1793); // from BigInteger.java's oddModPow function - //static $window_ranges = array(0, 7, 36, 140, 450, 1303, 3529); // from MPM 7.3.1 - - $e_value = $e->value; - $e_length = count($e_value) - 1; - $e_bits = decbin($e_value[$e_length]); - for ($i = $e_length - 1; $i >= 0; --$i) { - $e_bits.= str_pad(decbin($e_value[$i]), MATH_BIGINTEGER_BASE, '0', STR_PAD_LEFT); - } - - $e_length = strlen($e_bits); - - // calculate the appropriate window size. - // $window_size == 3 if $window_ranges is between 25 and 81, for example. - for ($i = 0, $window_size = 1; $e_length > $window_ranges[$i] && $i < count($window_ranges); ++$window_size, ++$i); - - $n_value = $n->value; - - // precompute $this^0 through $this^$window_size - $powers = array(); - $powers[1] = $this->_prepareReduce($this->value, $n_value, $mode); - $powers[2] = $this->_squareReduce($powers[1], $n_value, $mode); - - // we do every other number since substr($e_bits, $i, $j+1) (see below) is supposed to end - // in a 1. ie. it's supposed to be odd. - $temp = 1 << ($window_size - 1); - for ($i = 1; $i < $temp; ++$i) { - $i2 = $i << 1; - $powers[$i2 + 1] = $this->_multiplyReduce($powers[$i2 - 1], $powers[2], $n_value, $mode); - } - - $result = array(1); - $result = $this->_prepareReduce($result, $n_value, $mode); - - for ($i = 0; $i < $e_length; ) { - if ( !$e_bits[$i] ) { - $result = $this->_squareReduce($result, $n_value, $mode); - ++$i; - } else { - for ($j = $window_size - 1; $j > 0; --$j) { - if ( !empty($e_bits[$i + $j]) ) { - break; - } - } - - for ($k = 0; $k <= $j; ++$k) {// eg. the length of substr($e_bits, $i, $j+1) - $result = $this->_squareReduce($result, $n_value, $mode); - } - - $result = $this->_multiplyReduce($result, $powers[bindec(substr($e_bits, $i, $j + 1))], $n_value, $mode); - - $i+=$j + 1; - } - } - - $temp = new Math_BigInteger(); - $temp->value = $this->_reduce($result, $n_value, $mode); - - return $temp; - } - - /** - * Modular reduction - * - * For most $modes this will return the remainder. - * - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $n - * @param Integer $mode - * @return Array - */ - function _reduce($x, $n, $mode) - { - switch ($mode) { - case MATH_BIGINTEGER_MONTGOMERY: - return $this->_montgomery($x, $n); - case MATH_BIGINTEGER_BARRETT: - return $this->_barrett($x, $n); - case MATH_BIGINTEGER_POWEROF2: - $lhs = new Math_BigInteger(); - $lhs->value = $x; - $rhs = new Math_BigInteger(); - $rhs->value = $n; - return $x->_mod2($n); - case MATH_BIGINTEGER_CLASSIC: - $lhs = new Math_BigInteger(); - $lhs->value = $x; - $rhs = new Math_BigInteger(); - $rhs->value = $n; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - case MATH_BIGINTEGER_NONE: - return $x; - default: - // an invalid $mode was provided - } - } - - /** - * Modular reduction preperation - * - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $n - * @param Integer $mode - * @return Array - */ - function _prepareReduce($x, $n, $mode) - { - if ($mode == MATH_BIGINTEGER_MONTGOMERY) { - return $this->_prepMontgomery($x, $n); - } - return $this->_reduce($x, $n, $mode); - } - - /** - * Modular multiply - * - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $y - * @param Array $n - * @param Integer $mode - * @return Array - */ - function _multiplyReduce($x, $y, $n, $mode) - { - if ($mode == MATH_BIGINTEGER_MONTGOMERY) { - return $this->_montgomeryMultiply($x, $y, $n); - } - $temp = $this->_multiply($x, false, $y, false); - return $this->_reduce($temp[MATH_BIGINTEGER_VALUE], $n, $mode); - } - - /** - * Modular square - * - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $n - * @param Integer $mode - * @return Array - */ - function _squareReduce($x, $n, $mode) - { - if ($mode == MATH_BIGINTEGER_MONTGOMERY) { - return $this->_montgomeryMultiply($x, $x, $n); - } - return $this->_reduce($this->_square($x), $n, $mode); - } - - /** - * Modulos for Powers of Two - * - * Calculates $x%$n, where $n = 2**$e, for some $e. Since this is basically the same as doing $x & ($n-1), - * we'll just use this function as a wrapper for doing that. - * - * @see _slidingWindow() - * @access private - * @param Math_BigInteger - * @return Math_BigInteger - */ - function _mod2($n) - { - $temp = new Math_BigInteger(); - $temp->value = array(1); - return $this->bitwise_and($n->subtract($temp)); - } - - /** - * Barrett Modular Reduction - * - * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information. Modified slightly, - * so as not to require negative numbers (initially, this script didn't support negative numbers). - * - * Employs "folding", as described at - * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}. To quote from - * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x." - * - * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that - * usable on account of (1) its not using reasonable radix points as discussed in - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable - * radix points, it only works when there are an even number of digits in the denominator. The reason for (2) is that - * (x >> 1) + (x >> 1) != x / 2 + x / 2. If x is even, they're the same, but if x is odd, they're not. See the in-line - * comments for details. - * - * @see _slidingWindow() - * @access private - * @param Array $n - * @param Array $m - * @return Array - */ - function _barrett($n, $m) - { - static $cache = array( - MATH_BIGINTEGER_VARIABLE => array(), - MATH_BIGINTEGER_DATA => array() - ); - - $m_length = count($m); - - // if ($this->_compare($n, $this->_square($m)) >= 0) { - if (count($n) > 2 * $m_length) { - $lhs = new Math_BigInteger(); - $rhs = new Math_BigInteger(); - $lhs->value = $n; - $rhs->value = $m; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - - // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced - if ($m_length < 5) { - return $this->_regularBarrett($n, $m); - } - - // n = 2 * m.length - - if ( ($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) { - $key = count($cache[MATH_BIGINTEGER_VARIABLE]); - $cache[MATH_BIGINTEGER_VARIABLE][] = $m; - - $lhs = new Math_BigInteger(); - $lhs_value = &$lhs->value; - $lhs_value = $this->_array_repeat(0, $m_length + ($m_length >> 1)); - $lhs_value[] = 1; - $rhs = new Math_BigInteger(); - $rhs->value = $m; - - list($u, $m1) = $lhs->divide($rhs); - $u = $u->value; - $m1 = $m1->value; - - $cache[MATH_BIGINTEGER_DATA][] = array( - 'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1) - 'm1'=> $m1 // m.length - ); - } else { - extract($cache[MATH_BIGINTEGER_DATA][$key]); - } - - $cutoff = $m_length + ($m_length >> 1); - $lsd = array_slice($n, 0, $cutoff); // m.length + (m.length >> 1) - $msd = array_slice($n, $cutoff); // m.length >> 1 - $lsd = $this->_trim($lsd); - $temp = $this->_multiply($msd, false, $m1, false); - $n = $this->_add($lsd, false, $temp[MATH_BIGINTEGER_VALUE], false); // m.length + (m.length >> 1) + 1 - - if ($m_length & 1) { - return $this->_regularBarrett($n[MATH_BIGINTEGER_VALUE], $m); - } - - // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2 - $temp = array_slice($n[MATH_BIGINTEGER_VALUE], $m_length - 1); - // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2 - // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1 - $temp = $this->_multiply($temp, false, $u, false); - // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1 - // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) - $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], ($m_length >> 1) + 1); - // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1 - // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1) - $temp = $this->_multiply($temp, false, $m, false); - - // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit - // number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop - // following this comment would loop a lot (hence our calling _regularBarrett() in that situation). - - $result = $this->_subtract($n[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false); - - while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false) >= 0) { - $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false); - } - - return $result[MATH_BIGINTEGER_VALUE]; - } - - /** - * (Regular) Barrett Modular Reduction - * - * For numbers with more than four digits Math_BigInteger::_barrett() is faster. The difference between that and this - * is that this function does not fold the denominator into a smaller form. - * - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $n - * @return Array - */ - function _regularBarrett($x, $n) - { - static $cache = array( - MATH_BIGINTEGER_VARIABLE => array(), - MATH_BIGINTEGER_DATA => array() - ); - - $n_length = count($n); - - if (count($x) > 2 * $n_length) { - $lhs = new Math_BigInteger(); - $rhs = new Math_BigInteger(); - $lhs->value = $x; - $rhs->value = $n; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - - if ( ($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) { - $key = count($cache[MATH_BIGINTEGER_VARIABLE]); - $cache[MATH_BIGINTEGER_VARIABLE][] = $n; - $lhs = new Math_BigInteger(); - $lhs_value = &$lhs->value; - $lhs_value = $this->_array_repeat(0, 2 * $n_length); - $lhs_value[] = 1; - $rhs = new Math_BigInteger(); - $rhs->value = $n; - list($temp, ) = $lhs->divide($rhs); // m.length - $cache[MATH_BIGINTEGER_DATA][] = $temp->value; - } - - // 2 * m.length - (m.length - 1) = m.length + 1 - $temp = array_slice($x, $n_length - 1); - // (m.length + 1) + m.length = 2 * m.length + 1 - $temp = $this->_multiply($temp, false, $cache[MATH_BIGINTEGER_DATA][$key], false); - // (2 * m.length + 1) - (m.length - 1) = m.length + 2 - $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], $n_length + 1); - - // m.length + 1 - $result = array_slice($x, 0, $n_length + 1); - // m.length + 1 - $temp = $this->_multiplyLower($temp, false, $n, false, $n_length + 1); - // $temp == array_slice($temp->_multiply($temp, false, $n, false)->value, 0, $n_length + 1) - - if ($this->_compare($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]) < 0) { - $corrector_value = $this->_array_repeat(0, $n_length + 1); - $corrector_value[count($corrector_value)] = 1; - $result = $this->_add($result, false, $corrector_value, false); - $result = $result[MATH_BIGINTEGER_VALUE]; - } - - // at this point, we're subtracting a number with m.length + 1 digits from another number with m.length + 1 digits - $result = $this->_subtract($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]); - while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false) > 0) { - $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false); - } - - return $result[MATH_BIGINTEGER_VALUE]; - } - - /** - * Performs long multiplication up to $stop digits - * - * If you're going to be doing array_slice($product->value, 0, $stop), some cycles can be saved. - * - * @see _regularBarrett() - * @param Array $x_value - * @param Boolean $x_negative - * @param Array $y_value - * @param Boolean $y_negative - * @param Integer $stop - * @return Array - * @access private - */ - function _multiplyLower($x_value, $x_negative, $y_value, $y_negative, $stop) - { - $x_length = count($x_value); - $y_length = count($y_value); - - if ( !$x_length || !$y_length ) { // a 0 is being multiplied - return array( - MATH_BIGINTEGER_VALUE => array(), - MATH_BIGINTEGER_SIGN => false - ); - } - - if ( $x_length < $y_length ) { - $temp = $x_value; - $x_value = $y_value; - $y_value = $temp; - - $x_length = count($x_value); - $y_length = count($y_value); - } - - $product_value = $this->_array_repeat(0, $x_length + $y_length); - - // the following for loop could be removed if the for loop following it - // (the one with nested for loops) initially set $i to 0, but - // doing so would also make the result in one set of unnecessary adds, - // since on the outermost loops first pass, $product->value[$k] is going - // to always be 0 - - $carry = 0; - - for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0, $k = $i - $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); - } - - if ($j < $stop) { - $product_value[$j] = $carry; - } - - // the above for loop is what the previous comment was talking about. the - // following for loop is the "one with nested for loops" - - for ($i = 1; $i < $y_length; ++$i) { - $carry = 0; - - for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) { - $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); - } - - if ($k < $stop) { - $product_value[$k] = $carry; - } - } - - return array( - MATH_BIGINTEGER_VALUE => $this->_trim($product_value), - MATH_BIGINTEGER_SIGN => $x_negative != $y_negative - ); - } - - /** - * Montgomery Modular Reduction - * - * ($x->_prepMontgomery($n))->_montgomery($n) yields $x % $n. - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=170 MPM 6.3} provides insights on how this can be - * improved upon (basically, by using the comba method). gcd($n, 2) must be equal to one for this function - * to work correctly. - * - * @see _prepMontgomery() - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $n - * @return Array - */ - function _montgomery($x, $n) - { - static $cache = array( - MATH_BIGINTEGER_VARIABLE => array(), - MATH_BIGINTEGER_DATA => array() - ); - - if ( ($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) { - $key = count($cache[MATH_BIGINTEGER_VARIABLE]); - $cache[MATH_BIGINTEGER_VARIABLE][] = $x; - $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($n); - } - - $k = count($n); - - $result = array(MATH_BIGINTEGER_VALUE => $x); - - for ($i = 0; $i < $k; ++$i) { - $temp = $result[MATH_BIGINTEGER_VALUE][$i] * $cache[MATH_BIGINTEGER_DATA][$key]; - $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); - $temp = $this->_regularMultiply(array($temp), $n); - $temp = array_merge($this->_array_repeat(0, $i), $temp); - $result = $this->_add($result[MATH_BIGINTEGER_VALUE], false, $temp, false); - } - - $result[MATH_BIGINTEGER_VALUE] = array_slice($result[MATH_BIGINTEGER_VALUE], $k); - - if ($this->_compare($result, false, $n, false) >= 0) { - $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], false, $n, false); - } - - return $result[MATH_BIGINTEGER_VALUE]; - } - - /** - * Montgomery Multiply - * - * Interleaves the montgomery reduction and long multiplication algorithms together as described in - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36} - * - * @see _prepMontgomery() - * @see _montgomery() - * @access private - * @param Array $x - * @param Array $y - * @param Array $m - * @return Array - */ - function _montgomeryMultiply($x, $y, $m) - { - $temp = $this->_multiply($x, false, $y, false); - return $this->_montgomery($temp[MATH_BIGINTEGER_VALUE], $m); - - // the following code, although not callable, can be run independently of the above code - // although the above code performed better in my benchmarks the following could might - // perform better under different circumstances. in lieu of deleting it it's just been - // made uncallable - - static $cache = array( - MATH_BIGINTEGER_VARIABLE => array(), - MATH_BIGINTEGER_DATA => array() - ); - - if ( ($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false ) { - $key = count($cache[MATH_BIGINTEGER_VARIABLE]); - $cache[MATH_BIGINTEGER_VARIABLE][] = $m; - $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($m); - } - - $n = max(count($x), count($y), count($m)); - $x = array_pad($x, $n, 0); - $y = array_pad($y, $n, 0); - $m = array_pad($m, $n, 0); - $a = array(MATH_BIGINTEGER_VALUE => $this->_array_repeat(0, $n + 1)); - for ($i = 0; $i < $n; ++$i) { - $temp = $a[MATH_BIGINTEGER_VALUE][0] + $x[$i] * $y[0]; - $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); - $temp = $temp * $cache[MATH_BIGINTEGER_DATA][$key]; - $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); - $temp = $this->_add($this->_regularMultiply(array($x[$i]), $y), false, $this->_regularMultiply(array($temp), $m), false); - $a = $this->_add($a[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false); - $a[MATH_BIGINTEGER_VALUE] = array_slice($a[MATH_BIGINTEGER_VALUE], 1); - } - if ($this->_compare($a[MATH_BIGINTEGER_VALUE], false, $m, false) >= 0) { - $a = $this->_subtract($a[MATH_BIGINTEGER_VALUE], false, $m, false); - } - return $a[MATH_BIGINTEGER_VALUE]; - } - - /** - * Prepare a number for use in Montgomery Modular Reductions - * - * @see _montgomery() - * @see _slidingWindow() - * @access private - * @param Array $x - * @param Array $n - * @return Array - */ - function _prepMontgomery($x, $n) - { - $lhs = new Math_BigInteger(); - $lhs->value = array_merge($this->_array_repeat(0, count($n)), $x); - $rhs = new Math_BigInteger(); - $rhs->value = $n; - - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - - /** - * Modular Inverse of a number mod 2**26 (eg. 67108864) - * - * Based off of the bnpInvDigit function implemented and justified in the following URL: - * - * {@link http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js} - * - * The following URL provides more info: - * - * {@link http://groups.google.com/group/sci.crypt/msg/7a137205c1be7d85} - * - * As for why we do all the bitmasking... strange things can happen when converting from floats to ints. For - * instance, on some computers, var_dump((int) -4294967297) yields int(-1) and on others, it yields - * int(-2147483648). To avoid problems stemming from this, we use bitmasks to guarantee that ints aren't - * auto-converted to floats. The outermost bitmask is present because without it, there's no guarantee that - * the "residue" returned would be the so-called "common residue". We use fmod, in the last step, because the - * maximum possible $x is 26 bits and the maximum $result is 16 bits. Thus, we have to be able to handle up to - * 40 bits, which only 64-bit floating points will support. - * - * Thanks to Pedro Gimeno Fortea for input! - * - * @see _montgomery() - * @access private - * @param Array $x - * @return Integer - */ - function _modInverse67108864($x) // 2**26 == 67,108,864 - { - $x = -$x[0]; - $result = $x & 0x3; // x**-1 mod 2**2 - $result = ($result * (2 - $x * $result)) & 0xF; // x**-1 mod 2**4 - $result = ($result * (2 - ($x & 0xFF) * $result)) & 0xFF; // x**-1 mod 2**8 - $result = ($result * ((2 - ($x & 0xFFFF) * $result) & 0xFFFF)) & 0xFFFF; // x**-1 mod 2**16 - $result = fmod($result * (2 - fmod($x * $result, MATH_BIGINTEGER_BASE_FULL)), MATH_BIGINTEGER_BASE_FULL); // x**-1 mod 2**26 - return $result & MATH_BIGINTEGER_MAX_DIGIT; - } - - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * - * Here's an example: - * - * modInverse($b); - * echo $c->toString(); // outputs 4 - * - * echo "\r\n"; - * - * $d = $a->multiply($c); - * list(, $d) = $d->divide($b); - * echo $d; // outputs 1 (as per the definition of modular inverse) - * ?> - * - * - * @param Math_BigInteger $n - * @return mixed false, if no modular inverse exists, Math_BigInteger, otherwise. - * @access public - * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=21 HAC 14.64} for more information. - */ - function modInverse($n) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_invert($this->value, $n->value); - - return ( $temp->value === false ) ? false : $this->_normalize($temp); - } - - static $zero, $one; - if (!isset($zero)) { - $zero = new Math_BigInteger(); - $one = new Math_BigInteger(1); - } - - // $x mod -$n == $x mod $n. - $n = $n->abs(); - - if ($this->compare($zero) < 0) { - $temp = $this->abs(); - $temp = $temp->modInverse($n); - return $this->_normalize($n->subtract($temp)); - } - - extract($this->extendedGCD($n)); - - if (!$gcd->equals($one)) { - return false; - } - - $x = $x->compare($zero) < 0 ? $x->add($n) : $x; - - return $this->compare($zero) < 0 ? $this->_normalize($n->subtract($x)) : $this->_normalize($x); - } - - /** - * Calculates the greatest common divisor and Bezout's identity. - * - * Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that - * 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which - * combination is returned is dependant upon which mode is in use. See - * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information. - * - * Here's an example: - * - * extendedGCD($b)); - * - * echo $gcd->toString() . "\r\n"; // outputs 21 - * echo $a->toString() * $x->toString() + $b->toString() * $y->toString(); // outputs 21 - * ?> - * - * - * @param Math_BigInteger $n - * @return Math_BigInteger - * @access public - * @internal Calculates the GCD using the binary xGCD algorithim described in - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=19 HAC 14.61}. As the text above 14.61 notes, - * the more traditional algorithim requires "relatively costly multiple-precision divisions". - */ - function extendedGCD($n) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - extract(gmp_gcdext($this->value, $n->value)); - - return array( - 'gcd' => $this->_normalize(new Math_BigInteger($g)), - 'x' => $this->_normalize(new Math_BigInteger($s)), - 'y' => $this->_normalize(new Math_BigInteger($t)) - ); - case MATH_BIGINTEGER_MODE_BCMATH: - // it might be faster to use the binary xGCD algorithim here, as well, but (1) that algorithim works - // best when the base is a power of 2 and (2) i don't think it'd make much difference, anyway. as is, - // the basic extended euclidean algorithim is what we're using. - - $u = $this->value; - $v = $n->value; - - $a = '1'; - $b = '0'; - $c = '0'; - $d = '1'; - - while (bccomp($v, '0', 0) != 0) { - $q = bcdiv($u, $v, 0); - - $temp = $u; - $u = $v; - $v = bcsub($temp, bcmul($v, $q, 0), 0); - - $temp = $a; - $a = $c; - $c = bcsub($temp, bcmul($a, $q, 0), 0); - - $temp = $b; - $b = $d; - $d = bcsub($temp, bcmul($b, $q, 0), 0); - } - - return array( - 'gcd' => $this->_normalize(new Math_BigInteger($u)), - 'x' => $this->_normalize(new Math_BigInteger($a)), - 'y' => $this->_normalize(new Math_BigInteger($b)) - ); - } - - $y = $n->copy(); - $x = $this->copy(); - $g = new Math_BigInteger(); - $g->value = array(1); - - while ( !(($x->value[0] & 1)|| ($y->value[0] & 1)) ) { - $x->_rshift(1); - $y->_rshift(1); - $g->_lshift(1); - } - - $u = $x->copy(); - $v = $y->copy(); - - $a = new Math_BigInteger(); - $b = new Math_BigInteger(); - $c = new Math_BigInteger(); - $d = new Math_BigInteger(); - - $a->value = $d->value = $g->value = array(1); - $b->value = $c->value = array(); - - while ( !empty($u->value) ) { - while ( !($u->value[0] & 1) ) { - $u->_rshift(1); - if ( (!empty($a->value) && ($a->value[0] & 1)) || (!empty($b->value) && ($b->value[0] & 1)) ) { - $a = $a->add($y); - $b = $b->subtract($x); - } - $a->_rshift(1); - $b->_rshift(1); - } - - while ( !($v->value[0] & 1) ) { - $v->_rshift(1); - if ( (!empty($d->value) && ($d->value[0] & 1)) || (!empty($c->value) && ($c->value[0] & 1)) ) { - $c = $c->add($y); - $d = $d->subtract($x); - } - $c->_rshift(1); - $d->_rshift(1); - } - - if ($u->compare($v) >= 0) { - $u = $u->subtract($v); - $a = $a->subtract($c); - $b = $b->subtract($d); - } else { - $v = $v->subtract($u); - $c = $c->subtract($a); - $d = $d->subtract($b); - } - } - - return array( - 'gcd' => $this->_normalize($g->multiply($v)), - 'x' => $this->_normalize($c), - 'y' => $this->_normalize($d) - ); - } - - /** - * Calculates the greatest common divisor - * - * Say you have 693 and 609. The GCD is 21. - * - * Here's an example: - * - * extendedGCD($b); - * - * echo $gcd->toString() . "\r\n"; // outputs 21 - * ?> - * - * - * @param Math_BigInteger $n - * @return Math_BigInteger - * @access public - */ - function gcd($n) - { - extract($this->extendedGCD($n)); - return $gcd; - } - - /** - * Absolute value. - * - * @return Math_BigInteger - * @access public - */ - function abs() - { - $temp = new Math_BigInteger(); - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp->value = gmp_abs($this->value); - break; - case MATH_BIGINTEGER_MODE_BCMATH: - $temp->value = (bccomp($this->value, '0', 0) < 0) ? substr($this->value, 1) : $this->value; - break; - default: - $temp->value = $this->value; - } - - return $temp; - } - - /** - * Compares two numbers. - * - * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this is - * demonstrated thusly: - * - * $x > $y: $x->compare($y) > 0 - * $x < $y: $x->compare($y) < 0 - * $x == $y: $x->compare($y) == 0 - * - * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). - * - * @param Math_BigInteger $y - * @return Integer < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. - * @access public - * @see equals() - * @internal Could return $this->subtract($x), but that's not as fast as what we do do. - */ - function compare($y) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - return gmp_cmp($this->value, $y->value); - case MATH_BIGINTEGER_MODE_BCMATH: - return bccomp($this->value, $y->value, 0); - } - - return $this->_compare($this->value, $this->is_negative, $y->value, $y->is_negative); - } - - /** - * Compares two numbers. - * - * @param Array $x_value - * @param Boolean $x_negative - * @param Array $y_value - * @param Boolean $y_negative - * @return Integer - * @see compare() - * @access private - */ - function _compare($x_value, $x_negative, $y_value, $y_negative) - { - if ( $x_negative != $y_negative ) { - return ( !$x_negative && $y_negative ) ? 1 : -1; - } - - $result = $x_negative ? -1 : 1; - - if ( count($x_value) != count($y_value) ) { - return ( count($x_value) > count($y_value) ) ? $result : -$result; - } - $size = max(count($x_value), count($y_value)); - - $x_value = array_pad($x_value, $size, 0); - $y_value = array_pad($y_value, $size, 0); - - for ($i = count($x_value) - 1; $i >= 0; --$i) { - if ($x_value[$i] != $y_value[$i]) { - return ( $x_value[$i] > $y_value[$i] ) ? $result : -$result; - } - } - - return 0; - } - - /** - * Tests the equality of two numbers. - * - * If you need to see if one number is greater than or less than another number, use Math_BigInteger::compare() - * - * @param Math_BigInteger $x - * @return Boolean - * @access public - * @see compare() - */ - function equals($x) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - return gmp_cmp($this->value, $x->value) == 0; - default: - return $this->value === $x->value && $this->is_negative == $x->is_negative; - } - } - - /** - * Set Precision - * - * Some bitwise operations give different results depending on the precision being used. Examples include left - * shift, not, and rotates. - * - * @param Integer $bits - * @access public - */ - function setPrecision($bits) - { - $this->precision = $bits; - if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ) { - $this->bitmask = new Math_BigInteger(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256); - } else { - $this->bitmask = new Math_BigInteger(bcpow('2', $bits, 0)); - } - - $temp = $this->_normalize($this); - $this->value = $temp->value; - } - - /** - * Logical And - * - * @param Math_BigInteger $x - * @access public - * @internal Implemented per a request by Lluis Pamies i Juarez - * @return Math_BigInteger - */ - function bitwise_and($x) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_and($this->value, $x->value); - - return $this->_normalize($temp); - case MATH_BIGINTEGER_MODE_BCMATH: - $left = $this->toBytes(); - $right = $x->toBytes(); - - $length = max(strlen($left), strlen($right)); - - $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); - $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); - - return $this->_normalize(new Math_BigInteger($left & $right, 256)); - } - - $result = $this->copy(); - - $length = min(count($x->value), count($this->value)); - - $result->value = array_slice($result->value, 0, $length); - - for ($i = 0; $i < $length; ++$i) { - $result->value[$i]&= $x->value[$i]; - } - - return $this->_normalize($result); - } - - /** - * Logical Or - * - * @param Math_BigInteger $x - * @access public - * @internal Implemented per a request by Lluis Pamies i Juarez - * @return Math_BigInteger - */ - function bitwise_or($x) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_or($this->value, $x->value); - - return $this->_normalize($temp); - case MATH_BIGINTEGER_MODE_BCMATH: - $left = $this->toBytes(); - $right = $x->toBytes(); - - $length = max(strlen($left), strlen($right)); - - $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); - $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); - - return $this->_normalize(new Math_BigInteger($left | $right, 256)); - } - - $length = max(count($this->value), count($x->value)); - $result = $this->copy(); - $result->value = array_pad($result->value, $length, 0); - $x->value = array_pad($x->value, $length, 0); - - for ($i = 0; $i < $length; ++$i) { - $result->value[$i]|= $x->value[$i]; - } - - return $this->_normalize($result); - } - - /** - * Logical Exclusive-Or - * - * @param Math_BigInteger $x - * @access public - * @internal Implemented per a request by Lluis Pamies i Juarez - * @return Math_BigInteger - */ - function bitwise_xor($x) - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - $temp = new Math_BigInteger(); - $temp->value = gmp_xor($this->value, $x->value); - - return $this->_normalize($temp); - case MATH_BIGINTEGER_MODE_BCMATH: - $left = $this->toBytes(); - $right = $x->toBytes(); - - $length = max(strlen($left), strlen($right)); - - $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); - $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); - - return $this->_normalize(new Math_BigInteger($left ^ $right, 256)); - } - - $length = max(count($this->value), count($x->value)); - $result = $this->copy(); - $result->value = array_pad($result->value, $length, 0); - $x->value = array_pad($x->value, $length, 0); - - for ($i = 0; $i < $length; ++$i) { - $result->value[$i]^= $x->value[$i]; - } - - return $this->_normalize($result); - } - - /** - * Logical Not - * - * @access public - * @internal Implemented per a request by Lluis Pamies i Juarez - * @return Math_BigInteger - */ - function bitwise_not() - { - // calculuate "not" without regard to $this->precision - // (will always result in a smaller number. ie. ~1 isn't 1111 1110 - it's 0) - $temp = $this->toBytes(); - $pre_msb = decbin(ord($temp[0])); - $temp = ~$temp; - $msb = decbin(ord($temp[0])); - if (strlen($msb) == 8) { - $msb = substr($msb, strpos($msb, '0')); - } - $temp[0] = chr(bindec($msb)); - - // see if we need to add extra leading 1's - $current_bits = strlen($pre_msb) + 8 * strlen($temp) - 8; - $new_bits = $this->precision - $current_bits; - if ($new_bits <= 0) { - return $this->_normalize(new Math_BigInteger($temp, 256)); - } - - // generate as many leading 1's as we need to. - $leading_ones = chr((1 << ($new_bits & 0x7)) - 1) . str_repeat(chr(0xFF), $new_bits >> 3); - $this->_base256_lshift($leading_ones, $current_bits); - - $temp = str_pad($temp, strlen($leading_ones), chr(0), STR_PAD_LEFT); - - return $this->_normalize(new Math_BigInteger($leading_ones | $temp, 256)); - } - - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. - * - * @param Integer $shift - * @return Math_BigInteger - * @access public - * @internal The only version that yields any speed increases is the internal version. - */ - function bitwise_rightShift($shift) - { - $temp = new Math_BigInteger(); - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - static $two; - - if (!isset($two)) { - $two = gmp_init('2'); - } - - $temp->value = gmp_div_q($this->value, gmp_pow($two, $shift)); - - break; - case MATH_BIGINTEGER_MODE_BCMATH: - $temp->value = bcdiv($this->value, bcpow('2', $shift, 0), 0); - - break; - default: // could just replace _lshift with this, but then all _lshift() calls would need to be rewritten - // and I don't want to do that... - $temp->value = $this->value; - $temp->_rshift($shift); - } - - return $this->_normalize($temp); - } - - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. - * - * @param Integer $shift - * @return Math_BigInteger - * @access public - * @internal The only version that yields any speed increases is the internal version. - */ - function bitwise_leftShift($shift) - { - $temp = new Math_BigInteger(); - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - static $two; - - if (!isset($two)) { - $two = gmp_init('2'); - } - - $temp->value = gmp_mul($this->value, gmp_pow($two, $shift)); - - break; - case MATH_BIGINTEGER_MODE_BCMATH: - $temp->value = bcmul($this->value, bcpow('2', $shift, 0), 0); - - break; - default: // could just replace _rshift with this, but then all _lshift() calls would need to be rewritten - // and I don't want to do that... - $temp->value = $this->value; - $temp->_lshift($shift); - } - - return $this->_normalize($temp); - } - - /** - * Logical Left Rotate - * - * Instead of the top x bits being dropped they're appended to the shifted bit string. - * - * @param Integer $shift - * @return Math_BigInteger - * @access public - */ - function bitwise_leftRotate($shift) - { - $bits = $this->toBytes(); - - if ($this->precision > 0) { - $precision = $this->precision; - if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) { - $mask = $this->bitmask->subtract(new Math_BigInteger(1)); - $mask = $mask->toBytes(); - } else { - $mask = $this->bitmask->toBytes(); - } - } else { - $temp = ord($bits[0]); - for ($i = 0; $temp >> $i; ++$i); - $precision = 8 * strlen($bits) - 8 + $i; - $mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3); - } - - if ($shift < 0) { - $shift+= $precision; - } - $shift%= $precision; - - if (!$shift) { - return $this->copy(); - } - - $left = $this->bitwise_leftShift($shift); - $left = $left->bitwise_and(new Math_BigInteger($mask, 256)); - $right = $this->bitwise_rightShift($precision - $shift); - $result = MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ? $left->bitwise_or($right) : $left->add($right); - return $this->_normalize($result); - } - - /** - * Logical Right Rotate - * - * Instead of the bottom x bits being dropped they're prepended to the shifted bit string. - * - * @param Integer $shift - * @return Math_BigInteger - * @access public - */ - function bitwise_rightRotate($shift) - { - return $this->bitwise_leftRotate(-$shift); - } - - /** - * Set random number generator function - * - * This function is deprecated. - * - * @param String $generator - * @access public - */ - function setRandomGenerator($generator) - { - } - - /** - * Generates a random BigInteger - * - * Byte length is equal to $length. Uses crypt_random if it's loaded and mt_rand if it's not. - * - * @param Integer $length - * @return Math_BigInteger - * @access private - */ - function _random_number_helper($size) - { - if (function_exists('crypt_random_string')) { - $random = crypt_random_string($size); - } else { - $random = ''; - - if ($size & 1) { - $random.= chr(mt_rand(0, 255)); - } - - $blocks = $size >> 1; - for ($i = 0; $i < $blocks; ++$i) { - // mt_rand(-2147483648, 0x7FFFFFFF) always produces -2147483648 on some systems - $random.= pack('n', mt_rand(0, 0xFFFF)); - } - } - - return new Math_BigInteger($random, 256); - } - - /** - * Generate a random number - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * $min->random($max) - * $max->random($min) - * - * @param Math_BigInteger $arg1 - * @param optional Math_BigInteger $arg2 - * @return Math_BigInteger - * @access public - * @internal The API for creating random numbers used to be $a->random($min, $max), where $a was a Math_BigInteger object. - * That method is still supported for BC purposes. - */ - function random($arg1, $arg2 = false) - { - if ($arg1 === false) { - return false; - } - - if ($arg2 === false) { - $max = $arg1; - $min = $this; - } else { - $min = $arg1; - $max = $arg2; - } - - $compare = $max->compare($min); - - if (!$compare) { - return $this->_normalize($min); - } else if ($compare < 0) { - // if $min is bigger then $max, swap $min and $max - $temp = $max; - $max = $min; - $min = $temp; - } - - static $one; - if (!isset($one)) { - $one = new Math_BigInteger(1); - } - - $max = $max->subtract($min->subtract($one)); - $size = strlen(ltrim($max->toBytes(), chr(0))); - - /* - doing $random % $max doesn't work because some numbers will be more likely to occur than others. - eg. if $max is 140 and $random's max is 255 then that'd mean both $random = 5 and $random = 145 - would produce 5 whereas the only value of random that could produce 139 would be 139. ie. - not all numbers would be equally likely. some would be more likely than others. - - creating a whole new random number until you find one that is within the range doesn't work - because, for sufficiently small ranges, the likelihood that you'd get a number within that range - would be pretty small. eg. with $random's max being 255 and if your $max being 1 the probability - would be pretty high that $random would be greater than $max. - - phpseclib works around this using the technique described here: - - http://crypto.stackexchange.com/questions/5708/creating-a-small-number-from-a-cryptographically-secure-random-string - */ - $random_max = new Math_BigInteger(chr(1) . str_repeat("\0", $size), 256); - $random = $this->_random_number_helper($size); - - list($max_multiple) = $random_max->divide($max); - $max_multiple = $max_multiple->multiply($max); - - while ($random->compare($max_multiple) >= 0) { - $random = $random->subtract($max_multiple); - $random_max = $random_max->subtract($max_multiple); - $random = $random->bitwise_leftShift(8); - $random = $random->add($this->_random_number_helper(1)); - $random_max = $random_max->bitwise_leftShift(8); - list($max_multiple) = $random_max->divide($max); - $max_multiple = $max_multiple->multiply($max); - } - list(, $random) = $random->divide($max); - - return $this->_normalize($random->add($min)); - } - - /** - * Generate a random prime number. - * - * If there's not a prime within the given range, false will be returned. If more than $timeout seconds have elapsed, - * give up and return false. - * - * @param Math_BigInteger $arg1 - * @param optional Math_BigInteger $arg2 - * @param optional Integer $timeout - * @return Mixed - * @access public - * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=15 HAC 4.44}. - */ - function randomPrime($arg1, $arg2 = false, $timeout = false) - { - if ($arg1 === false) { - return false; - } - - if ($arg2 === false) { - $max = $arg1; - $min = $this; - } else { - $min = $arg1; - $max = $arg2; - } - - $compare = $max->compare($min); - - if (!$compare) { - return $min->isPrime() ? $min : false; - } else if ($compare < 0) { - // if $min is bigger then $max, swap $min and $max - $temp = $max; - $max = $min; - $min = $temp; - } - - static $one, $two; - if (!isset($one)) { - $one = new Math_BigInteger(1); - $two = new Math_BigInteger(2); - } - - $start = time(); - - $x = $this->random($min, $max); - - // gmp_nextprime() requires PHP 5 >= 5.2.0 per . - if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP && function_exists('gmp_nextprime') ) { - $p = new Math_BigInteger(); - $p->value = gmp_nextprime($x->value); - - if ($p->compare($max) <= 0) { - return $p; - } - - if (!$min->equals($x)) { - $x = $x->subtract($one); - } - - return $x->randomPrime($min, $x); - } - - if ($x->equals($two)) { - return $x; - } - - $x->_make_odd(); - if ($x->compare($max) > 0) { - // if $x > $max then $max is even and if $min == $max then no prime number exists between the specified range - if ($min->equals($max)) { - return false; - } - $x = $min->copy(); - $x->_make_odd(); - } - - $initial_x = $x->copy(); - - while (true) { - if ($timeout !== false && time() - $start > $timeout) { - return false; - } - - if ($x->isPrime()) { - return $x; - } - - $x = $x->add($two); - - if ($x->compare($max) > 0) { - $x = $min->copy(); - if ($x->equals($two)) { - return $x; - } - $x->_make_odd(); - } - - if ($x->equals($initial_x)) { - return false; - } - } - } - - /** - * Make the current number odd - * - * If the current number is odd it'll be unchanged. If it's even, one will be added to it. - * - * @see randomPrime() - * @access private - */ - function _make_odd() - { - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - gmp_setbit($this->value, 0); - break; - case MATH_BIGINTEGER_MODE_BCMATH: - if ($this->value[strlen($this->value) - 1] % 2 == 0) { - $this->value = bcadd($this->value, '1'); - } - break; - default: - $this->value[0] |= 1; - } - } - - /** - * Checks a numer to see if it's prime - * - * Assuming the $t parameter is not set, this function has an error rate of 2**-80. The main motivation for the - * $t parameter is distributability. Math_BigInteger::randomPrime() can be distributed across multiple pageloads - * on a website instead of just one. - * - * @param optional Math_BigInteger $t - * @return Boolean - * @access public - * @internal Uses the - * {@link http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Miller-Rabin primality test}. See - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=8 HAC 4.24}. - */ - function isPrime($t = false) - { - $length = strlen($this->toBytes()); - - if (!$t) { - // see HAC 4.49 "Note (controlling the error probability)" - // @codingStandardsIgnoreStart - if ($length >= 163) { $t = 2; } // floor(1300 / 8) - else if ($length >= 106) { $t = 3; } // floor( 850 / 8) - else if ($length >= 81 ) { $t = 4; } // floor( 650 / 8) - else if ($length >= 68 ) { $t = 5; } // floor( 550 / 8) - else if ($length >= 56 ) { $t = 6; } // floor( 450 / 8) - else if ($length >= 50 ) { $t = 7; } // floor( 400 / 8) - else if ($length >= 43 ) { $t = 8; } // floor( 350 / 8) - else if ($length >= 37 ) { $t = 9; } // floor( 300 / 8) - else if ($length >= 31 ) { $t = 12; } // floor( 250 / 8) - else if ($length >= 25 ) { $t = 15; } // floor( 200 / 8) - else if ($length >= 18 ) { $t = 18; } // floor( 150 / 8) - else { $t = 27; } - // @codingStandardsIgnoreEnd - } - - // ie. gmp_testbit($this, 0) - // ie. isEven() or !isOdd() - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - return gmp_prob_prime($this->value, $t) != 0; - case MATH_BIGINTEGER_MODE_BCMATH: - if ($this->value === '2') { - return true; - } - if ($this->value[strlen($this->value) - 1] % 2 == 0) { - return false; - } - break; - default: - if ($this->value == array(2)) { - return true; - } - if (~$this->value[0] & 1) { - return false; - } - } - - static $primes, $zero, $one, $two; - - if (!isset($primes)) { - $primes = array( - 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, - 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, - 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, - 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, - 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, - 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, - 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, - 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, - 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, - 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, - 953, 967, 971, 977, 983, 991, 997 - ); - - if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL ) { - for ($i = 0; $i < count($primes); ++$i) { - $primes[$i] = new Math_BigInteger($primes[$i]); - } - } - - $zero = new Math_BigInteger(); - $one = new Math_BigInteger(1); - $two = new Math_BigInteger(2); - } - - if ($this->equals($one)) { - return false; - } - - // see HAC 4.4.1 "Random search for probable primes" - if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL ) { - foreach ($primes as $prime) { - list(, $r) = $this->divide($prime); - if ($r->equals($zero)) { - return $this->equals($prime); - } - } - } else { - $value = $this->value; - foreach ($primes as $prime) { - list(, $r) = $this->_divide_digit($value, $prime); - if (!$r) { - return count($value) == 1 && $value[0] == $prime; - } - } - } - - $n = $this->copy(); - $n_1 = $n->subtract($one); - $n_2 = $n->subtract($two); - - $r = $n_1->copy(); - $r_value = $r->value; - // ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); - if ( MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH ) { - $s = 0; - // if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals($one) check earlier - while ($r->value[strlen($r->value) - 1] % 2 == 0) { - $r->value = bcdiv($r->value, '2', 0); - ++$s; - } - } else { - for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) { - $temp = ~$r_value[$i] & 0xFFFFFF; - for ($j = 1; ($temp >> $j) & 1; ++$j); - if ($j != 25) { - break; - } - } - $s = 26 * $i + $j - 1; - $r->_rshift($s); - } - - for ($i = 0; $i < $t; ++$i) { - $a = $this->random($two, $n_2); - $y = $a->modPow($r, $n); - - if (!$y->equals($one) && !$y->equals($n_1)) { - for ($j = 1; $j < $s && !$y->equals($n_1); ++$j) { - $y = $y->modPow($two, $n); - if ($y->equals($one)) { - return false; - } - } - - if (!$y->equals($n_1)) { - return false; - } - } - } - return true; - } - - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits. - * - * @param Integer $shift - * @access private - */ - function _lshift($shift) - { - if ( $shift == 0 ) { - return; - } - - $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE); - $shift %= MATH_BIGINTEGER_BASE; - $shift = 1 << $shift; - - $carry = 0; - - for ($i = 0; $i < count($this->value); ++$i) { - $temp = $this->value[$i] * $shift + $carry; - $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $this->value[$i] = (int) ($temp - $carry * MATH_BIGINTEGER_BASE_FULL); - } - - if ( $carry ) { - $this->value[count($this->value)] = $carry; - } - - while ($num_digits--) { - array_unshift($this->value, 0); - } - } - - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits. - * - * @param Integer $shift - * @access private - */ - function _rshift($shift) - { - if ($shift == 0) { - return; - } - - $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE); - $shift %= MATH_BIGINTEGER_BASE; - $carry_shift = MATH_BIGINTEGER_BASE - $shift; - $carry_mask = (1 << $shift) - 1; - - if ( $num_digits ) { - $this->value = array_slice($this->value, $num_digits); - } - - $carry = 0; - - for ($i = count($this->value) - 1; $i >= 0; --$i) { - $temp = $this->value[$i] >> $shift | $carry; - $carry = ($this->value[$i] & $carry_mask) << $carry_shift; - $this->value[$i] = $temp; - } - - $this->value = $this->_trim($this->value); - } - - /** - * Normalize - * - * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision - * - * @param Math_BigInteger - * @return Math_BigInteger - * @see _trim() - * @access private - */ - function _normalize($result) - { - $result->precision = $this->precision; - $result->bitmask = $this->bitmask; - - switch ( MATH_BIGINTEGER_MODE ) { - case MATH_BIGINTEGER_MODE_GMP: - if (!empty($result->bitmask->value)) { - $result->value = gmp_and($result->value, $result->bitmask->value); - } - - return $result; - case MATH_BIGINTEGER_MODE_BCMATH: - if (!empty($result->bitmask->value)) { - $result->value = bcmod($result->value, $result->bitmask->value); - } - - return $result; - } - - $value = &$result->value; - - if ( !count($value) ) { - return $result; - } - - $value = $this->_trim($value); - - if (!empty($result->bitmask->value)) { - $length = min(count($value), count($this->bitmask->value)); - $value = array_slice($value, 0, $length); - - for ($i = 0; $i < $length; ++$i) { - $value[$i] = $value[$i] & $this->bitmask->value[$i]; - } - } - - return $result; - } - - /** - * Trim - * - * Removes leading zeros - * - * @param Array $value - * @return Math_BigInteger - * @access private - */ - function _trim($value) - { - for ($i = count($value) - 1; $i >= 0; --$i) { - if ( $value[$i] ) { - break; - } - unset($value[$i]); - } - - return $value; - } - - /** - * Array Repeat - * - * @param $input Array - * @param $multiplier mixed - * @return Array - * @access private - */ - function _array_repeat($input, $multiplier) - { - return ($multiplier) ? array_fill(0, $multiplier, $input) : array(); - } - - /** - * Logical Left Shift - * - * Shifts binary strings $shift bits, essentially multiplying by 2**$shift. - * - * @param $x String - * @param $shift Integer - * @return String - * @access private - */ - function _base256_lshift(&$x, $shift) - { - if ($shift == 0) { - return; - } - - $num_bytes = $shift >> 3; // eg. floor($shift/8) - $shift &= 7; // eg. $shift % 8 - - $carry = 0; - for ($i = strlen($x) - 1; $i >= 0; --$i) { - $temp = ord($x[$i]) << $shift | $carry; - $x[$i] = chr($temp); - $carry = $temp >> 8; - } - $carry = ($carry != 0) ? chr($carry) : ''; - $x = $carry . $x . str_repeat(chr(0), $num_bytes); - } - - /** - * Logical Right Shift - * - * Shifts binary strings $shift bits, essentially dividing by 2**$shift and returning the remainder. - * - * @param $x String - * @param $shift Integer - * @return String - * @access private - */ - function _base256_rshift(&$x, $shift) - { - if ($shift == 0) { - $x = ltrim($x, chr(0)); - return ''; - } - - $num_bytes = $shift >> 3; // eg. floor($shift/8) - $shift &= 7; // eg. $shift % 8 - - $remainder = ''; - if ($num_bytes) { - $start = $num_bytes > strlen($x) ? -strlen($x) : -$num_bytes; - $remainder = substr($x, $start); - $x = substr($x, 0, -$num_bytes); - } - - $carry = 0; - $carry_shift = 8 - $shift; - for ($i = 0; $i < strlen($x); ++$i) { - $temp = (ord($x[$i]) >> $shift) | $carry; - $carry = (ord($x[$i]) << $carry_shift) & 0xFF; - $x[$i] = chr($temp); - } - $x = ltrim($x, chr(0)); - - $remainder = chr($carry >> $carry_shift) . $remainder; - - return ltrim($remainder, chr(0)); - } - - // one quirk about how the following functions are implemented is that PHP defines N to be an unsigned long - // at 32-bits, while java's longs are 64-bits. - - /** - * Converts 32-bit integers to bytes. - * - * @param Integer $x - * @return String - * @access private - */ - function _int2bytes($x) - { - return ltrim(pack('N', $x), chr(0)); - } - - /** - * Converts bytes to 32-bit integers - * - * @param String $x - * @return Integer - * @access private - */ - function _bytes2int($x) - { - $temp = unpack('Nint', str_pad($x, 4, chr(0), STR_PAD_LEFT)); - return $temp['int']; - } - - /** - * DER-encode an integer - * - * The ability to DER-encode integers is needed to create RSA public keys for use with OpenSSL - * - * @see modPow() - * @access private - * @param Integer $length - * @return String - */ - function _encodeASN1Length($length) - { - if ($length <= 0x7F) { - return chr($length); - } - - $temp = ltrim(pack('N', $length), chr(0)); - return pack('Ca*', 0x80 | strlen($temp), $temp); - } - - /** - * Single digit division - * - * Even if int64 is being used the division operator will return a float64 value - * if the dividend is not evenly divisible by the divisor. Since a float64 doesn't - * have the precision of int64 this is a problem so, when int64 is being used, - * we'll guarantee that the dividend is divisible by first subtracting the remainder. - * - * @access private - * @param Integer $x - * @param Integer $y - * @return Integer - */ - function _safe_divide($x, $y) - { - if (MATH_BIGINTEGER_BASE === 26) { - return (int) ($x / $y); - } - - // MATH_BIGINTEGER_BASE === 31 - return ($x - ($x % $y)) / $y; - } -} +> and << cannot be used, nor can the modulo operator %, + * which only supports integers. Although this fact will slow this library down, the fact that such a high + * base is being used should more than compensate. + * + * Numbers are stored in {@link http://en.wikipedia.org/wiki/Endianness little endian} format. ie. + * (new Math_BigInteger(pow(2, 26)))->value = array(0, 1) + * + * Useful resources are as follows: + * + * - {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf Handbook of Applied Cryptography (HAC)} + * - {@link http://math.libtomcrypt.com/files/tommath.pdf Multi-Precision Math (MPM)} + * - Java's BigInteger classes. See /j2se/src/share/classes/java/math in jdk-1_5_0-src-jrl.zip + * + * Here's an example of how to use this library: + * + * add($b); + * + * echo $c->toString(); // outputs 5 + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Math + * @package Math_BigInteger + * @author Jim Wigginton + * @copyright 2006 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + */ + +/**#@+ + * Reduction constants + * + * @access private + * @see self::_reduce() + */ +/** + * @see self::_montgomery() + * @see self::_prepMontgomery() + */ +define('MATH_BIGINTEGER_MONTGOMERY', 0); +/** + * @see self::_barrett() + */ +define('MATH_BIGINTEGER_BARRETT', 1); +/** + * @see self::_mod2() + */ +define('MATH_BIGINTEGER_POWEROF2', 2); +/** + * @see self::_remainder() + */ +define('MATH_BIGINTEGER_CLASSIC', 3); +/** + * @see self::__clone() + */ +define('MATH_BIGINTEGER_NONE', 4); +/**#@-*/ + +/**#@+ + * Array constants + * + * Rather than create a thousands and thousands of new Math_BigInteger objects in repeated function calls to add() and + * multiply() or whatever, we'll just work directly on arrays, taking them in as parameters and returning them. + * + * @access private + */ +/** + * $result[MATH_BIGINTEGER_VALUE] contains the value. + */ +define('MATH_BIGINTEGER_VALUE', 0); +/** + * $result[MATH_BIGINTEGER_SIGN] contains the sign. + */ +define('MATH_BIGINTEGER_SIGN', 1); +/**#@-*/ + +/**#@+ + * @access private + * @see self::_montgomery() + * @see self::_barrett() + */ +/** + * Cache constants + * + * $cache[MATH_BIGINTEGER_VARIABLE] tells us whether or not the cached data is still valid. + */ +define('MATH_BIGINTEGER_VARIABLE', 0); +/** + * $cache[MATH_BIGINTEGER_DATA] contains the cached data. + */ +define('MATH_BIGINTEGER_DATA', 1); +/**#@-*/ + +/**#@+ + * Mode constants. + * + * @access private + * @see self::Math_BigInteger() + */ +/** + * To use the pure-PHP implementation + */ +define('MATH_BIGINTEGER_MODE_INTERNAL', 1); +/** + * To use the BCMath library + * + * (if enabled; otherwise, the internal implementation will be used) + */ +define('MATH_BIGINTEGER_MODE_BCMATH', 2); +/** + * To use the GMP library + * + * (if present; otherwise, either the BCMath or the internal implementation will be used) + */ +define('MATH_BIGINTEGER_MODE_GMP', 3); +/**#@-*/ + +/** + * Karatsuba Cutoff + * + * At what point do we switch between Karatsuba multiplication and schoolbook long multiplication? + * + * @access private + */ +define('MATH_BIGINTEGER_KARATSUBA_CUTOFF', 25); + +/** + * Pure-PHP arbitrary precision integer arithmetic library. Supports base-2, base-10, base-16, and base-256 + * numbers. + * + * @package Math_BigInteger + * @author Jim Wigginton + * @access public + */ +class Math_BigInteger +{ + /** + * Holds the BigInteger's value. + * + * @var array + * @access private + */ + var $value; + + /** + * Holds the BigInteger's magnitude. + * + * @var bool + * @access private + */ + var $is_negative = false; + + /** + * Precision + * + * @see self::setPrecision() + * @access private + */ + var $precision = -1; + + /** + * Precision Bitmask + * + * @see self::setPrecision() + * @access private + */ + var $bitmask = false; + + /** + * Mode independent value used for serialization. + * + * If the bcmath or gmp extensions are installed $this->value will be a non-serializable resource, hence the need for + * a variable that'll be serializable regardless of whether or not extensions are being used. Unlike $this->value, + * however, $this->hex is only calculated when $this->__sleep() is called. + * + * @see self::__sleep() + * @see self::__wakeup() + * @var string + * @access private + */ + var $hex; + + /** + * Converts base-2, base-10, base-16, and binary strings (base-256) to BigIntegers. + * + * If the second parameter - $base - is negative, then it will be assumed that the number's are encoded using + * two's compliment. The sole exception to this is -10, which is treated the same as 10 is. + * + * Here's an example: + * + * toString(); // outputs 50 + * ?> + * + * + * @param $x base-10 number or base-$base number if $base set. + * @param int $base + * @return Math_BigInteger + * @access public + */ + function __construct($x = 0, $base = 10) + { + if (!defined('MATH_BIGINTEGER_MODE')) { + switch (true) { + case extension_loaded('gmp'): + define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_GMP); + break; + case extension_loaded('bcmath'): + define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_BCMATH); + break; + default: + define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_INTERNAL); + } + } + + if (extension_loaded('openssl') && !defined('MATH_BIGINTEGER_OPENSSL_DISABLE') && !defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work + ob_start(); + @phpinfo(); + $content = ob_get_contents(); + ob_end_clean(); + + preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches); + + $versions = array(); + if (!empty($matches[1])) { + for ($i = 0; $i < count($matches[1]); $i++) { + $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i]))); + + // Remove letter part in OpenSSL version + if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) { + $versions[$matches[1][$i]] = $fullVersion; + } else { + $versions[$matches[1][$i]] = $m[0]; + } + } + } + + // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+ + switch (true) { + case !isset($versions['Header']): + case !isset($versions['Library']): + case $versions['Header'] == $versions['Library']: + case version_compare($versions['Header'], '1.0.0') >= 0 && version_compare($versions['Library'], '1.0.0') >= 0: + define('MATH_BIGINTEGER_OPENSSL_ENABLED', true); + break; + default: + define('MATH_BIGINTEGER_OPENSSL_DISABLE', true); + } + } + + if (!defined('PHP_INT_SIZE')) { + define('PHP_INT_SIZE', 4); + } + + if (!defined('MATH_BIGINTEGER_BASE') && MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_INTERNAL) { + switch (PHP_INT_SIZE) { + case 8: // use 64-bit integers if int size is 8 bytes + define('MATH_BIGINTEGER_BASE', 31); + define('MATH_BIGINTEGER_BASE_FULL', 0x80000000); + define('MATH_BIGINTEGER_MAX_DIGIT', 0x7FFFFFFF); + define('MATH_BIGINTEGER_MSB', 0x40000000); + // 10**9 is the closest we can get to 2**31 without passing it + define('MATH_BIGINTEGER_MAX10', 1000000000); + define('MATH_BIGINTEGER_MAX10_LEN', 9); + // the largest digit that may be used in addition / subtraction + define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 62)); + break; + //case 4: // use 64-bit floats if int size is 4 bytes + default: + define('MATH_BIGINTEGER_BASE', 26); + define('MATH_BIGINTEGER_BASE_FULL', 0x4000000); + define('MATH_BIGINTEGER_MAX_DIGIT', 0x3FFFFFF); + define('MATH_BIGINTEGER_MSB', 0x2000000); + // 10**7 is the closest to 2**26 without passing it + define('MATH_BIGINTEGER_MAX10', 10000000); + define('MATH_BIGINTEGER_MAX10_LEN', 7); + // the largest digit that may be used in addition / subtraction + // we do pow(2, 52) instead of using 4503599627370496 directly because some + // PHP installations will truncate 4503599627370496. + define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 52)); + } + } + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + switch (true) { + case is_resource($x) && get_resource_type($x) == 'GMP integer': + // PHP 5.6 switched GMP from using resources to objects + case is_object($x) && get_class($x) == 'GMP': + $this->value = $x; + return; + } + $this->value = gmp_init(0); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $this->value = '0'; + break; + default: + $this->value = array(); + } + + // '0' counts as empty() but when the base is 256 '0' is equal to ord('0') or 48 + // '0' is the only value like this per http://php.net/empty + if (empty($x) && (abs($base) != 256 || $x !== '0')) { + return; + } + + switch ($base) { + case -256: + if (ord($x[0]) & 0x80) { + $x = ~$x; + $this->is_negative = true; + } + case 256: + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $this->value = function_exists('gmp_import') ? + gmp_import($x) : + gmp_init('0x' . bin2hex($x)); + if ($this->is_negative) { + $this->value = gmp_neg($this->value); + } + break; + case MATH_BIGINTEGER_MODE_BCMATH: + // round $len to the nearest 4 (thanks, DavidMJ!) + $len = (strlen($x) + 3) & 0xFFFFFFFC; + + $x = str_pad($x, $len, chr(0), STR_PAD_LEFT); + + for ($i = 0; $i < $len; $i+= 4) { + $this->value = bcmul($this->value, '4294967296', 0); // 4294967296 == 2**32 + $this->value = bcadd($this->value, 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord($x[$i + 2]) << 8) | ord($x[$i + 3])), 0); + } + + if ($this->is_negative) { + $this->value = '-' . $this->value; + } + + break; + // converts a base-2**8 (big endian / msb) number to base-2**26 (little endian / lsb) + default: + while (strlen($x)) { + $this->value[] = $this->_bytes2int($this->_base256_rshift($x, MATH_BIGINTEGER_BASE)); + } + } + + if ($this->is_negative) { + if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) { + $this->is_negative = false; + } + $temp = $this->add(new Math_BigInteger('-1')); + $this->value = $temp->value; + } + break; + case 16: + case -16: + if ($base > 0 && $x[0] == '-') { + $this->is_negative = true; + $x = substr($x, 1); + } + + $x = preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#', '$1', $x); + + $is_negative = false; + if ($base < 0 && hexdec($x[0]) >= 8) { + $this->is_negative = $is_negative = true; + $x = bin2hex(~pack('H*', $x)); + } + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = $this->is_negative ? '-0x' . $x : '0x' . $x; + $this->value = gmp_init($temp); + $this->is_negative = false; + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $x = (strlen($x) & 1) ? '0' . $x : $x; + $temp = new Math_BigInteger(pack('H*', $x), 256); + $this->value = $this->is_negative ? '-' . $temp->value : $temp->value; + $this->is_negative = false; + break; + default: + $x = (strlen($x) & 1) ? '0' . $x : $x; + $temp = new Math_BigInteger(pack('H*', $x), 256); + $this->value = $temp->value; + } + + if ($is_negative) { + $temp = $this->add(new Math_BigInteger('-1')); + $this->value = $temp->value; + } + break; + case 10: + case -10: + // (?value = gmp_init($x); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + // explicitly casting $x to a string is necessary, here, since doing $x[0] on -1 yields different + // results then doing it on '-1' does (modInverse does $x[0]) + $this->value = $x === '-' ? '0' : (string) $x; + break; + default: + $temp = new Math_BigInteger(); + + $multiplier = new Math_BigInteger(); + $multiplier->value = array(MATH_BIGINTEGER_MAX10); + + if ($x[0] == '-') { + $this->is_negative = true; + $x = substr($x, 1); + } + + $x = str_pad($x, strlen($x) + ((MATH_BIGINTEGER_MAX10_LEN - 1) * strlen($x)) % MATH_BIGINTEGER_MAX10_LEN, 0, STR_PAD_LEFT); + while (strlen($x)) { + $temp = $temp->multiply($multiplier); + $temp = $temp->add(new Math_BigInteger($this->_int2bytes(substr($x, 0, MATH_BIGINTEGER_MAX10_LEN)), 256)); + $x = substr($x, MATH_BIGINTEGER_MAX10_LEN); + } + + $this->value = $temp->value; + } + break; + case 2: // base-2 support originally implemented by Lluis Pamies - thanks! + case -2: + if ($base > 0 && $x[0] == '-') { + $this->is_negative = true; + $x = substr($x, 1); + } + + $x = preg_replace('#^([01]*).*#', '$1', $x); + $x = str_pad($x, strlen($x) + (3 * strlen($x)) % 4, 0, STR_PAD_LEFT); + + $str = '0x'; + while (strlen($x)) { + $part = substr($x, 0, 4); + $str.= dechex(bindec($part)); + $x = substr($x, 4); + } + + if ($this->is_negative) { + $str = '-' . $str; + } + + $temp = new Math_BigInteger($str, 8 * $base); // ie. either -16 or +16 + $this->value = $temp->value; + $this->is_negative = $temp->is_negative; + + break; + default: + // base not supported, so we'll let $this == 0 + } + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param $x base-10 number or base-$base number if $base set. + * @param int $base + * @access public + */ + function Math_BigInteger($x = 0, $base = 10) + { + $this->__construct($x, $base); + } + + /** + * Converts a BigInteger to a byte string (eg. base-256). + * + * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're + * saved as two's compliment. + * + * Here's an example: + * + * toBytes(); // outputs chr(65) + * ?> + * + * + * @param bool $twos_compliment + * @return string + * @access public + * @internal Converts a base-2**26 number to base-2**8 + */ + function toBytes($twos_compliment = false) + { + if ($twos_compliment) { + $comparison = $this->compare(new Math_BigInteger()); + if ($comparison == 0) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + + $temp = $comparison < 0 ? $this->add(new Math_BigInteger(1)) : $this->copy(); + $bytes = $temp->toBytes(); + + if (!strlen($bytes)) { // eg. if the number we're trying to convert is -1 + $bytes = chr(0); + } + + if (ord($bytes[0]) & 0x80) { + $bytes = chr(0) . $bytes; + } + + return $comparison < 0 ? ~$bytes : $bytes; + } + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + if (gmp_cmp($this->value, gmp_init(0)) == 0) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + + if (function_exists('gmp_export')) { + $temp = gmp_export($this->value); + } else { + $temp = gmp_strval(gmp_abs($this->value), 16); + $temp = (strlen($temp) & 1) ? '0' . $temp : $temp; + $temp = pack('H*', $temp); + } + + return $this->precision > 0 ? + substr(str_pad($temp, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : + ltrim($temp, chr(0)); + case MATH_BIGINTEGER_MODE_BCMATH: + if ($this->value === '0') { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + + $value = ''; + $current = $this->value; + + if ($current[0] == '-') { + $current = substr($current, 1); + } + + while (bccomp($current, '0', 0) > 0) { + $temp = bcmod($current, '16777216'); + $value = chr($temp >> 16) . chr($temp >> 8) . chr($temp) . $value; + $current = bcdiv($current, '16777216', 0); + } + + return $this->precision > 0 ? + substr(str_pad($value, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : + ltrim($value, chr(0)); + } + + if (!count($this->value)) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; + } + $result = $this->_int2bytes($this->value[count($this->value) - 1]); + + $temp = $this->copy(); + + for ($i = count($temp->value) - 2; $i >= 0; --$i) { + $temp->_base256_lshift($result, MATH_BIGINTEGER_BASE); + $result = $result | str_pad($temp->_int2bytes($temp->value[$i]), strlen($result), chr(0), STR_PAD_LEFT); + } + + return $this->precision > 0 ? + str_pad(substr($result, -(($this->precision + 7) >> 3)), ($this->precision + 7) >> 3, chr(0), STR_PAD_LEFT) : + $result; + } + + /** + * Converts a BigInteger to a hex string (eg. base-16)). + * + * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're + * saved as two's compliment. + * + * Here's an example: + * + * toHex(); // outputs '41' + * ?> + * + * + * @param bool $twos_compliment + * @return string + * @access public + * @internal Converts a base-2**26 number to base-2**8 + */ + function toHex($twos_compliment = false) + { + return bin2hex($this->toBytes($twos_compliment)); + } + + /** + * Converts a BigInteger to a bit string (eg. base-2). + * + * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're + * saved as two's compliment. + * + * Here's an example: + * + * toBits(); // outputs '1000001' + * ?> + * + * + * @param bool $twos_compliment + * @return string + * @access public + * @internal Converts a base-2**26 number to base-2**2 + */ + function toBits($twos_compliment = false) + { + $hex = $this->toHex($twos_compliment); + $bits = ''; + for ($i = strlen($hex) - 8, $start = strlen($hex) & 7; $i >= $start; $i-=8) { + $bits = str_pad(decbin(hexdec(substr($hex, $i, 8))), 32, '0', STR_PAD_LEFT) . $bits; + } + if ($start) { // hexdec('') == 0 + $bits = str_pad(decbin(hexdec(substr($hex, 0, $start))), 8, '0', STR_PAD_LEFT) . $bits; + } + $result = $this->precision > 0 ? substr($bits, -$this->precision) : ltrim($bits, '0'); + + if ($twos_compliment && $this->compare(new Math_BigInteger()) > 0 && $this->precision <= 0) { + return '0' . $result; + } + + return $result; + } + + /** + * Converts a BigInteger to a base-10 number. + * + * Here's an example: + * + * toString(); // outputs 50 + * ?> + * + * + * @return string + * @access public + * @internal Converts a base-2**26 number to base-10**7 (which is pretty much base-10) + */ + function toString() + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + return gmp_strval($this->value); + case MATH_BIGINTEGER_MODE_BCMATH: + if ($this->value === '0') { + return '0'; + } + + return ltrim($this->value, '0'); + } + + if (!count($this->value)) { + return '0'; + } + + $temp = $this->copy(); + $temp->is_negative = false; + + $divisor = new Math_BigInteger(); + $divisor->value = array(MATH_BIGINTEGER_MAX10); + $result = ''; + while (count($temp->value)) { + list($temp, $mod) = $temp->divide($divisor); + $result = str_pad(isset($mod->value[0]) ? $mod->value[0] : '', MATH_BIGINTEGER_MAX10_LEN, '0', STR_PAD_LEFT) . $result; + } + $result = ltrim($result, '0'); + if (empty($result)) { + $result = '0'; + } + + if ($this->is_negative) { + $result = '-' . $result; + } + + return $result; + } + + /** + * Copy an object + * + * PHP5 passes objects by reference while PHP4 passes by value. As such, we need a function to guarantee + * that all objects are passed by value, when appropriate. More information can be found here: + * + * {@link http://php.net/language.oop5.basic#51624} + * + * @access public + * @see self::__clone() + * @return Math_BigInteger + */ + function copy() + { + $temp = new Math_BigInteger(); + $temp->value = $this->value; + $temp->is_negative = $this->is_negative; + $temp->precision = $this->precision; + $temp->bitmask = $this->bitmask; + return $temp; + } + + /** + * __toString() magic method + * + * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call + * toString(). + * + * @access public + * @internal Implemented per a suggestion by Techie-Michael - thanks! + */ + function __toString() + { + return $this->toString(); + } + + /** + * __clone() magic method + * + * Although you can call Math_BigInteger::__toString() directly in PHP5, you cannot call Math_BigInteger::__clone() + * directly in PHP5. You can in PHP4 since it's not a magic method, but in PHP5, you have to call it by using the PHP5 + * only syntax of $y = clone $x. As such, if you're trying to write an application that works on both PHP4 and PHP5, + * call Math_BigInteger::copy(), instead. + * + * @access public + * @see self::copy() + * @return Math_BigInteger + */ + function __clone() + { + return $this->copy(); + } + + /** + * __sleep() magic method + * + * Will be called, automatically, when serialize() is called on a Math_BigInteger object. + * + * @see self::__wakeup() + * @access public + */ + function __sleep() + { + $this->hex = $this->toHex(true); + $vars = array('hex'); + if ($this->precision > 0) { + $vars[] = 'precision'; + } + return $vars; + } + + /** + * __wakeup() magic method + * + * Will be called, automatically, when unserialize() is called on a Math_BigInteger object. + * + * @see self::__sleep() + * @access public + */ + function __wakeup() + { + $temp = new Math_BigInteger($this->hex, -16); + $this->value = $temp->value; + $this->is_negative = $temp->is_negative; + if ($this->precision > 0) { + // recalculate $this->bitmask + $this->setPrecision($this->precision); + } + } + + /** + * __debugInfo() magic method + * + * Will be called, automatically, when print_r() or var_dump() are called + * + * @access public + */ + function __debugInfo() + { + $opts = array(); + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $engine = 'gmp'; + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $engine = 'bcmath'; + break; + case MATH_BIGINTEGER_MODE_INTERNAL: + $engine = 'internal'; + $opts[] = PHP_INT_SIZE == 8 ? '64-bit' : '32-bit'; + } + if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_GMP && defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + $opts[] = 'OpenSSL'; + } + if (!empty($opts)) { + $engine.= ' (' . implode($opts, ', ') . ')'; + } + return array( + 'value' => '0x' . $this->toHex(true), + 'engine' => $engine + ); + } + + /** + * Adds two BigIntegers. + * + * Here's an example: + * + * add($b); + * + * echo $c->toString(); // outputs 30 + * ?> + * + * + * @param Math_BigInteger $y + * @return Math_BigInteger + * @access public + * @internal Performs base-2**52 addition + */ + function add($y) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_add($this->value, $y->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $temp = new Math_BigInteger(); + $temp->value = bcadd($this->value, $y->value, 0); + + return $this->_normalize($temp); + } + + $temp = $this->_add($this->value, $this->is_negative, $y->value, $y->is_negative); + + $result = new Math_BigInteger(); + $result->value = $temp[MATH_BIGINTEGER_VALUE]; + $result->is_negative = $temp[MATH_BIGINTEGER_SIGN]; + + return $this->_normalize($result); + } + + /** + * Performs addition. + * + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @return array + * @access private + */ + function _add($x_value, $x_negative, $y_value, $y_negative) + { + $x_size = count($x_value); + $y_size = count($y_value); + + if ($x_size == 0) { + return array( + MATH_BIGINTEGER_VALUE => $y_value, + MATH_BIGINTEGER_SIGN => $y_negative + ); + } elseif ($y_size == 0) { + return array( + MATH_BIGINTEGER_VALUE => $x_value, + MATH_BIGINTEGER_SIGN => $x_negative + ); + } + + // subtract, if appropriate + if ($x_negative != $y_negative) { + if ($x_value == $y_value) { + return array( + MATH_BIGINTEGER_VALUE => array(), + MATH_BIGINTEGER_SIGN => false + ); + } + + $temp = $this->_subtract($x_value, false, $y_value, false); + $temp[MATH_BIGINTEGER_SIGN] = $this->_compare($x_value, false, $y_value, false) > 0 ? + $x_negative : $y_negative; + + return $temp; + } + + if ($x_size < $y_size) { + $size = $x_size; + $value = $y_value; + } else { + $size = $y_size; + $value = $x_value; + } + + $value[count($value)] = 0; // just in case the carry adds an extra digit + + $carry = 0; + for ($i = 0, $j = 1; $j < $size; $i+=2, $j+=2) { + $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] + $y_value[$j] * MATH_BIGINTEGER_BASE_FULL + $y_value[$i] + $carry; + $carry = $sum >= MATH_BIGINTEGER_MAX_DIGIT2; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 + $sum = $carry ? $sum - MATH_BIGINTEGER_MAX_DIGIT2 : $sum; + + $temp = MATH_BIGINTEGER_BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); + + $value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); // eg. a faster alternative to fmod($sum, 0x4000000) + $value[$j] = $temp; + } + + if ($j == $size) { // ie. if $y_size is odd + $sum = $x_value[$i] + $y_value[$i] + $carry; + $carry = $sum >= MATH_BIGINTEGER_BASE_FULL; + $value[$i] = $carry ? $sum - MATH_BIGINTEGER_BASE_FULL : $sum; + ++$i; // ie. let $i = $j since we've just done $value[$i] + } + + if ($carry) { + for (; $value[$i] == MATH_BIGINTEGER_MAX_DIGIT; ++$i) { + $value[$i] = 0; + } + ++$value[$i]; + } + + return array( + MATH_BIGINTEGER_VALUE => $this->_trim($value), + MATH_BIGINTEGER_SIGN => $x_negative + ); + } + + /** + * Subtracts two BigIntegers. + * + * Here's an example: + * + * subtract($b); + * + * echo $c->toString(); // outputs -10 + * ?> + * + * + * @param Math_BigInteger $y + * @return Math_BigInteger + * @access public + * @internal Performs base-2**52 subtraction + */ + function subtract($y) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_sub($this->value, $y->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $temp = new Math_BigInteger(); + $temp->value = bcsub($this->value, $y->value, 0); + + return $this->_normalize($temp); + } + + $temp = $this->_subtract($this->value, $this->is_negative, $y->value, $y->is_negative); + + $result = new Math_BigInteger(); + $result->value = $temp[MATH_BIGINTEGER_VALUE]; + $result->is_negative = $temp[MATH_BIGINTEGER_SIGN]; + + return $this->_normalize($result); + } + + /** + * Performs subtraction. + * + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @return array + * @access private + */ + function _subtract($x_value, $x_negative, $y_value, $y_negative) + { + $x_size = count($x_value); + $y_size = count($y_value); + + if ($x_size == 0) { + return array( + MATH_BIGINTEGER_VALUE => $y_value, + MATH_BIGINTEGER_SIGN => !$y_negative + ); + } elseif ($y_size == 0) { + return array( + MATH_BIGINTEGER_VALUE => $x_value, + MATH_BIGINTEGER_SIGN => $x_negative + ); + } + + // add, if appropriate (ie. -$x - +$y or +$x - -$y) + if ($x_negative != $y_negative) { + $temp = $this->_add($x_value, false, $y_value, false); + $temp[MATH_BIGINTEGER_SIGN] = $x_negative; + + return $temp; + } + + $diff = $this->_compare($x_value, $x_negative, $y_value, $y_negative); + + if (!$diff) { + return array( + MATH_BIGINTEGER_VALUE => array(), + MATH_BIGINTEGER_SIGN => false + ); + } + + // switch $x and $y around, if appropriate. + if ((!$x_negative && $diff < 0) || ($x_negative && $diff > 0)) { + $temp = $x_value; + $x_value = $y_value; + $y_value = $temp; + + $x_negative = !$x_negative; + + $x_size = count($x_value); + $y_size = count($y_value); + } + + // at this point, $x_value should be at least as big as - if not bigger than - $y_value + + $carry = 0; + for ($i = 0, $j = 1; $j < $y_size; $i+=2, $j+=2) { + $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] - $y_value[$j] * MATH_BIGINTEGER_BASE_FULL - $y_value[$i] - $carry; + $carry = $sum < 0; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 + $sum = $carry ? $sum + MATH_BIGINTEGER_MAX_DIGIT2 : $sum; + + $temp = MATH_BIGINTEGER_BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); + + $x_value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); + $x_value[$j] = $temp; + } + + if ($j == $y_size) { // ie. if $y_size is odd + $sum = $x_value[$i] - $y_value[$i] - $carry; + $carry = $sum < 0; + $x_value[$i] = $carry ? $sum + MATH_BIGINTEGER_BASE_FULL : $sum; + ++$i; + } + + if ($carry) { + for (; !$x_value[$i]; ++$i) { + $x_value[$i] = MATH_BIGINTEGER_MAX_DIGIT; + } + --$x_value[$i]; + } + + return array( + MATH_BIGINTEGER_VALUE => $this->_trim($x_value), + MATH_BIGINTEGER_SIGN => $x_negative + ); + } + + /** + * Multiplies two BigIntegers + * + * Here's an example: + * + * multiply($b); + * + * echo $c->toString(); // outputs 200 + * ?> + * + * + * @param Math_BigInteger $x + * @return Math_BigInteger + * @access public + */ + function multiply($x) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_mul($this->value, $x->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $temp = new Math_BigInteger(); + $temp->value = bcmul($this->value, $x->value, 0); + + return $this->_normalize($temp); + } + + $temp = $this->_multiply($this->value, $this->is_negative, $x->value, $x->is_negative); + + $product = new Math_BigInteger(); + $product->value = $temp[MATH_BIGINTEGER_VALUE]; + $product->is_negative = $temp[MATH_BIGINTEGER_SIGN]; + + return $this->_normalize($product); + } + + /** + * Performs multiplication. + * + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @return array + * @access private + */ + function _multiply($x_value, $x_negative, $y_value, $y_negative) + { + //if ( $x_value == $y_value ) { + // return array( + // MATH_BIGINTEGER_VALUE => $this->_square($x_value), + // MATH_BIGINTEGER_SIGN => $x_sign != $y_value + // ); + //} + + $x_length = count($x_value); + $y_length = count($y_value); + + if (!$x_length || !$y_length) { // a 0 is being multiplied + return array( + MATH_BIGINTEGER_VALUE => array(), + MATH_BIGINTEGER_SIGN => false + ); + } + + return array( + MATH_BIGINTEGER_VALUE => min($x_length, $y_length) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ? + $this->_trim($this->_regularMultiply($x_value, $y_value)) : + $this->_trim($this->_karatsuba($x_value, $y_value)), + MATH_BIGINTEGER_SIGN => $x_negative != $y_negative + ); + } + + /** + * Performs long multiplication on two BigIntegers + * + * Modeled after 'multiply' in MutableBigInteger.java. + * + * @param array $x_value + * @param array $y_value + * @return array + * @access private + */ + function _regularMultiply($x_value, $y_value) + { + $x_length = count($x_value); + $y_length = count($y_value); + + if (!$x_length || !$y_length) { // a 0 is being multiplied + return array(); + } + + if ($x_length < $y_length) { + $temp = $x_value; + $x_value = $y_value; + $y_value = $temp; + + $x_length = count($x_value); + $y_length = count($y_value); + } + + $product_value = $this->_array_repeat(0, $x_length + $y_length); + + // the following for loop could be removed if the for loop following it + // (the one with nested for loops) initially set $i to 0, but + // doing so would also make the result in one set of unnecessary adds, + // since on the outermost loops first pass, $product->value[$k] is going + // to always be 0 + + $carry = 0; + + for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0 + $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + $product_value[$j] = $carry; + + // the above for loop is what the previous comment was talking about. the + // following for loop is the "one with nested for loops" + for ($i = 1; $i < $y_length; ++$i) { + $carry = 0; + + for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) { + $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + $product_value[$k] = $carry; + } + + return $product_value; + } + + /** + * Performs Karatsuba multiplication on two BigIntegers + * + * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=120 MPM 5.2.3}. + * + * @param array $x_value + * @param array $y_value + * @return array + * @access private + */ + function _karatsuba($x_value, $y_value) + { + $m = min(count($x_value) >> 1, count($y_value) >> 1); + + if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) { + return $this->_regularMultiply($x_value, $y_value); + } + + $x1 = array_slice($x_value, $m); + $x0 = array_slice($x_value, 0, $m); + $y1 = array_slice($y_value, $m); + $y0 = array_slice($y_value, 0, $m); + + $z2 = $this->_karatsuba($x1, $y1); + $z0 = $this->_karatsuba($x0, $y0); + + $z1 = $this->_add($x1, false, $x0, false); + $temp = $this->_add($y1, false, $y0, false); + $z1 = $this->_karatsuba($z1[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_VALUE]); + $temp = $this->_add($z2, false, $z0, false); + $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false); + + $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); + $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]); + + $xy = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]); + $xy = $this->_add($xy[MATH_BIGINTEGER_VALUE], $xy[MATH_BIGINTEGER_SIGN], $z0, false); + + return $xy[MATH_BIGINTEGER_VALUE]; + } + + /** + * Performs squaring + * + * @param array $x + * @return array + * @access private + */ + function _square($x = false) + { + return count($x) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ? + $this->_trim($this->_baseSquare($x)) : + $this->_trim($this->_karatsubaSquare($x)); + } + + /** + * Performs traditional squaring on two BigIntegers + * + * Squaring can be done faster than multiplying a number by itself can be. See + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=7 HAC 14.2.4} / + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=141 MPM 5.3} for more information. + * + * @param array $value + * @return array + * @access private + */ + function _baseSquare($value) + { + if (empty($value)) { + return array(); + } + $square_value = $this->_array_repeat(0, 2 * count($value)); + + for ($i = 0, $max_index = count($value) - 1; $i <= $max_index; ++$i) { + $i2 = $i << 1; + + $temp = $square_value[$i2] + $value[$i] * $value[$i]; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $square_value[$i2] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + + // note how we start from $i+1 instead of 0 as we do in multiplication. + for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) { + $temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $square_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + // the following line can yield values larger 2**15. at this point, PHP should switch + // over to floats. + $square_value[$i + $max_index + 1] = $carry; + } + + return $square_value; + } + + /** + * Performs Karatsuba "squaring" on two BigIntegers + * + * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=151 MPM 5.3.4}. + * + * @param array $value + * @return array + * @access private + */ + function _karatsubaSquare($value) + { + $m = count($value) >> 1; + + if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) { + return $this->_baseSquare($value); + } + + $x1 = array_slice($value, $m); + $x0 = array_slice($value, 0, $m); + + $z2 = $this->_karatsubaSquare($x1); + $z0 = $this->_karatsubaSquare($x0); + + $z1 = $this->_add($x1, false, $x0, false); + $z1 = $this->_karatsubaSquare($z1[MATH_BIGINTEGER_VALUE]); + $temp = $this->_add($z2, false, $z0, false); + $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false); + + $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); + $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]); + + $xx = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]); + $xx = $this->_add($xx[MATH_BIGINTEGER_VALUE], $xx[MATH_BIGINTEGER_SIGN], $z0, false); + + return $xx[MATH_BIGINTEGER_VALUE]; + } + + /** + * Divides two BigIntegers. + * + * Returns an array whose first element contains the quotient and whose second element contains the + * "common residue". If the remainder would be positive, the "common residue" and the remainder are the + * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder + * and the divisor (basically, the "common residue" is the first positive modulo). + * + * Here's an example: + * + * divide($b); + * + * echo $quotient->toString(); // outputs 0 + * echo "\r\n"; + * echo $remainder->toString(); // outputs 10 + * ?> + * + * + * @param Math_BigInteger $y + * @return array + * @access public + * @internal This function is based off of {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=9 HAC 14.20}. + */ + function divide($y) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $quotient = new Math_BigInteger(); + $remainder = new Math_BigInteger(); + + list($quotient->value, $remainder->value) = gmp_div_qr($this->value, $y->value); + + if (gmp_sign($remainder->value) < 0) { + $remainder->value = gmp_add($remainder->value, gmp_abs($y->value)); + } + + return array($this->_normalize($quotient), $this->_normalize($remainder)); + case MATH_BIGINTEGER_MODE_BCMATH: + $quotient = new Math_BigInteger(); + $remainder = new Math_BigInteger(); + + $quotient->value = bcdiv($this->value, $y->value, 0); + $remainder->value = bcmod($this->value, $y->value); + + if ($remainder->value[0] == '-') { + $remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value, 0); + } + + return array($this->_normalize($quotient), $this->_normalize($remainder)); + } + + if (count($y->value) == 1) { + list($q, $r) = $this->_divide_digit($this->value, $y->value[0]); + $quotient = new Math_BigInteger(); + $remainder = new Math_BigInteger(); + $quotient->value = $q; + $remainder->value = array($r); + $quotient->is_negative = $this->is_negative != $y->is_negative; + return array($this->_normalize($quotient), $this->_normalize($remainder)); + } + + static $zero; + if (!isset($zero)) { + $zero = new Math_BigInteger(); + } + + $x = $this->copy(); + $y = $y->copy(); + + $x_sign = $x->is_negative; + $y_sign = $y->is_negative; + + $x->is_negative = $y->is_negative = false; + + $diff = $x->compare($y); + + if (!$diff) { + $temp = new Math_BigInteger(); + $temp->value = array(1); + $temp->is_negative = $x_sign != $y_sign; + return array($this->_normalize($temp), $this->_normalize(new Math_BigInteger())); + } + + if ($diff < 0) { + // if $x is negative, "add" $y. + if ($x_sign) { + $x = $y->subtract($x); + } + return array($this->_normalize(new Math_BigInteger()), $this->_normalize($x)); + } + + // normalize $x and $y as described in HAC 14.23 / 14.24 + $msb = $y->value[count($y->value) - 1]; + for ($shift = 0; !($msb & MATH_BIGINTEGER_MSB); ++$shift) { + $msb <<= 1; + } + $x->_lshift($shift); + $y->_lshift($shift); + $y_value = &$y->value; + + $x_max = count($x->value) - 1; + $y_max = count($y->value) - 1; + + $quotient = new Math_BigInteger(); + $quotient_value = &$quotient->value; + $quotient_value = $this->_array_repeat(0, $x_max - $y_max + 1); + + static $temp, $lhs, $rhs; + if (!isset($temp)) { + $temp = new Math_BigInteger(); + $lhs = new Math_BigInteger(); + $rhs = new Math_BigInteger(); + } + $temp_value = &$temp->value; + $rhs_value = &$rhs->value; + + // $temp = $y << ($x_max - $y_max-1) in base 2**26 + $temp_value = array_merge($this->_array_repeat(0, $x_max - $y_max), $y_value); + + while ($x->compare($temp) >= 0) { + // calculate the "common residue" + ++$quotient_value[$x_max - $y_max]; + $x = $x->subtract($temp); + $x_max = count($x->value) - 1; + } + + for ($i = $x_max; $i >= $y_max + 1; --$i) { + $x_value = &$x->value; + $x_window = array( + isset($x_value[$i]) ? $x_value[$i] : 0, + isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0, + isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0 + ); + $y_window = array( + $y_value[$y_max], + ($y_max > 0) ? $y_value[$y_max - 1] : 0 + ); + + $q_index = $i - $y_max - 1; + if ($x_window[0] == $y_window[0]) { + $quotient_value[$q_index] = MATH_BIGINTEGER_MAX_DIGIT; + } else { + $quotient_value[$q_index] = $this->_safe_divide( + $x_window[0] * MATH_BIGINTEGER_BASE_FULL + $x_window[1], + $y_window[0] + ); + } + + $temp_value = array($y_window[1], $y_window[0]); + + $lhs->value = array($quotient_value[$q_index]); + $lhs = $lhs->multiply($temp); + + $rhs_value = array($x_window[2], $x_window[1], $x_window[0]); + + while ($lhs->compare($rhs) > 0) { + --$quotient_value[$q_index]; + + $lhs->value = array($quotient_value[$q_index]); + $lhs = $lhs->multiply($temp); + } + + $adjust = $this->_array_repeat(0, $q_index); + $temp_value = array($quotient_value[$q_index]); + $temp = $temp->multiply($y); + $temp_value = &$temp->value; + $temp_value = array_merge($adjust, $temp_value); + + $x = $x->subtract($temp); + + if ($x->compare($zero) < 0) { + $temp_value = array_merge($adjust, $y_value); + $x = $x->add($temp); + + --$quotient_value[$q_index]; + } + + $x_max = count($x_value) - 1; + } + + // unnormalize the remainder + $x->_rshift($shift); + + $quotient->is_negative = $x_sign != $y_sign; + + // calculate the "common residue", if appropriate + if ($x_sign) { + $y->_rshift($shift); + $x = $y->subtract($x); + } + + return array($this->_normalize($quotient), $this->_normalize($x)); + } + + /** + * Divides a BigInteger by a regular integer + * + * abc / x = a00 / x + b0 / x + c / x + * + * @param array $dividend + * @param array $divisor + * @return array + * @access private + */ + function _divide_digit($dividend, $divisor) + { + $carry = 0; + $result = array(); + + for ($i = count($dividend) - 1; $i >= 0; --$i) { + $temp = MATH_BIGINTEGER_BASE_FULL * $carry + $dividend[$i]; + $result[$i] = $this->_safe_divide($temp, $divisor); + $carry = (int) ($temp - $divisor * $result[$i]); + } + + return array($result, $carry); + } + + /** + * Performs modular exponentiation. + * + * Here's an example: + * + * modPow($b, $c); + * + * echo $c->toString(); // outputs 10 + * ?> + * + * + * @param Math_BigInteger $e + * @param Math_BigInteger $n + * @return Math_BigInteger + * @access public + * @internal The most naive approach to modular exponentiation has very unreasonable requirements, and + * and although the approach involving repeated squaring does vastly better, it, too, is impractical + * for our purposes. The reason being that division - by far the most complicated and time-consuming + * of the basic operations (eg. +,-,*,/) - occurs multiple times within it. + * + * Modular reductions resolve this issue. Although an individual modular reduction takes more time + * then an individual division, when performed in succession (with the same modulo), they're a lot faster. + * + * The two most commonly used modular reductions are Barrett and Montgomery reduction. Montgomery reduction, + * although faster, only works when the gcd of the modulo and of the base being used is 1. In RSA, when the + * base is a power of two, the modulo - a product of two primes - is always going to have a gcd of 1 (because + * the product of two odd numbers is odd), but what about when RSA isn't used? + * + * In contrast, Barrett reduction has no such constraint. As such, some bigint implementations perform a + * Barrett reduction after every operation in the modpow function. Others perform Barrett reductions when the + * modulo is even and Montgomery reductions when the modulo is odd. BigInteger.java's modPow method, however, + * uses a trick involving the Chinese Remainder Theorem to factor the even modulo into two numbers - one odd and + * the other, a power of two - and recombine them, later. This is the method that this modPow function uses. + * {@link http://islab.oregonstate.edu/papers/j34monex.pdf Montgomery Reduction with Even Modulus} elaborates. + */ + function modPow($e, $n) + { + $n = $this->bitmask !== false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs(); + + if ($e->compare(new Math_BigInteger()) < 0) { + $e = $e->abs(); + + $temp = $this->modInverse($n); + if ($temp === false) { + return false; + } + + return $this->_normalize($temp->modPow($e, $n)); + } + + if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP) { + $temp = new Math_BigInteger(); + $temp->value = gmp_powm($this->value, $e->value, $n->value); + + return $this->_normalize($temp); + } + + if ($this->compare(new Math_BigInteger()) < 0 || $this->compare($n) > 0) { + list(, $temp) = $this->divide($n); + return $temp->modPow($e, $n); + } + + if (defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { + $components = array( + 'modulus' => $n->toBytes(true), + 'publicExponent' => $e->toBytes(true) + ); + + $components = array( + 'modulus' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['modulus'])), $components['modulus']), + 'publicExponent' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['publicExponent'])), $components['publicExponent']) + ); + + $RSAPublicKey = pack( + 'Ca*a*a*', + 48, + $this->_encodeASN1Length(strlen($components['modulus']) + strlen($components['publicExponent'])), + $components['modulus'], + $components['publicExponent'] + ); + + $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $RSAPublicKey = chr(0) . $RSAPublicKey; + $RSAPublicKey = chr(3) . $this->_encodeASN1Length(strlen($RSAPublicKey)) . $RSAPublicKey; + + $encapsulated = pack( + 'Ca*a*', + 48, + $this->_encodeASN1Length(strlen($rsaOID . $RSAPublicKey)), + $rsaOID . $RSAPublicKey + ); + + $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($encapsulated)) . + '-----END PUBLIC KEY-----'; + + $plaintext = str_pad($this->toBytes(), strlen($n->toBytes(true)) - 1, "\0", STR_PAD_LEFT); + + if (openssl_public_encrypt($plaintext, $result, $RSAPublicKey, OPENSSL_NO_PADDING)) { + return new Math_BigInteger($result, 256); + } + } + + if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH) { + $temp = new Math_BigInteger(); + $temp->value = bcpowmod($this->value, $e->value, $n->value, 0); + + return $this->_normalize($temp); + } + + if (empty($e->value)) { + $temp = new Math_BigInteger(); + $temp->value = array(1); + return $this->_normalize($temp); + } + + if ($e->value == array(1)) { + list(, $temp) = $this->divide($n); + return $this->_normalize($temp); + } + + if ($e->value == array(2)) { + $temp = new Math_BigInteger(); + $temp->value = $this->_square($this->value); + list(, $temp) = $temp->divide($n); + return $this->_normalize($temp); + } + + return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_BARRETT)); + + // the following code, although not callable, can be run independently of the above code + // although the above code performed better in my benchmarks the following could might + // perform better under different circumstances. in lieu of deleting it it's just been + // made uncallable + + // is the modulo odd? + if ($n->value[0] & 1) { + return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_MONTGOMERY)); + } + // if it's not, it's even + + // find the lowest set bit (eg. the max pow of 2 that divides $n) + for ($i = 0; $i < count($n->value); ++$i) { + if ($n->value[$i]) { + $temp = decbin($n->value[$i]); + $j = strlen($temp) - strrpos($temp, '1') - 1; + $j+= 26 * $i; + break; + } + } + // at this point, 2^$j * $n/(2^$j) == $n + + $mod1 = $n->copy(); + $mod1->_rshift($j); + $mod2 = new Math_BigInteger(); + $mod2->value = array(1); + $mod2->_lshift($j); + + $part1 = ($mod1->value != array(1)) ? $this->_slidingWindow($e, $mod1, MATH_BIGINTEGER_MONTGOMERY) : new Math_BigInteger(); + $part2 = $this->_slidingWindow($e, $mod2, MATH_BIGINTEGER_POWEROF2); + + $y1 = $mod2->modInverse($mod1); + $y2 = $mod1->modInverse($mod2); + + $result = $part1->multiply($mod2); + $result = $result->multiply($y1); + + $temp = $part2->multiply($mod1); + $temp = $temp->multiply($y2); + + $result = $result->add($temp); + list(, $result) = $result->divide($n); + + return $this->_normalize($result); + } + + /** + * Performs modular exponentiation. + * + * Alias for Math_BigInteger::modPow() + * + * @param Math_BigInteger $e + * @param Math_BigInteger $n + * @return Math_BigInteger + * @access public + */ + function powMod($e, $n) + { + return $this->modPow($e, $n); + } + + /** + * Sliding Window k-ary Modular Exponentiation + * + * Based on {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=27 HAC 14.85} / + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=210 MPM 7.7}. In a departure from those algorithims, + * however, this function performs a modular reduction after every multiplication and squaring operation. + * As such, this function has the same preconditions that the reductions being used do. + * + * @param Math_BigInteger $e + * @param Math_BigInteger $n + * @param int $mode + * @return Math_BigInteger + * @access private + */ + function _slidingWindow($e, $n, $mode) + { + static $window_ranges = array(7, 25, 81, 241, 673, 1793); // from BigInteger.java's oddModPow function + //static $window_ranges = array(0, 7, 36, 140, 450, 1303, 3529); // from MPM 7.3.1 + + $e_value = $e->value; + $e_length = count($e_value) - 1; + $e_bits = decbin($e_value[$e_length]); + for ($i = $e_length - 1; $i >= 0; --$i) { + $e_bits.= str_pad(decbin($e_value[$i]), MATH_BIGINTEGER_BASE, '0', STR_PAD_LEFT); + } + + $e_length = strlen($e_bits); + + // calculate the appropriate window size. + // $window_size == 3 if $window_ranges is between 25 and 81, for example. + for ($i = 0, $window_size = 1; $i < count($window_ranges) && $e_length > $window_ranges[$i]; ++$window_size, ++$i) { + } + + $n_value = $n->value; + + // precompute $this^0 through $this^$window_size + $powers = array(); + $powers[1] = $this->_prepareReduce($this->value, $n_value, $mode); + $powers[2] = $this->_squareReduce($powers[1], $n_value, $mode); + + // we do every other number since substr($e_bits, $i, $j+1) (see below) is supposed to end + // in a 1. ie. it's supposed to be odd. + $temp = 1 << ($window_size - 1); + for ($i = 1; $i < $temp; ++$i) { + $i2 = $i << 1; + $powers[$i2 + 1] = $this->_multiplyReduce($powers[$i2 - 1], $powers[2], $n_value, $mode); + } + + $result = array(1); + $result = $this->_prepareReduce($result, $n_value, $mode); + + for ($i = 0; $i < $e_length;) { + if (!$e_bits[$i]) { + $result = $this->_squareReduce($result, $n_value, $mode); + ++$i; + } else { + for ($j = $window_size - 1; $j > 0; --$j) { + if (!empty($e_bits[$i + $j])) { + break; + } + } + + // eg. the length of substr($e_bits, $i, $j + 1) + for ($k = 0; $k <= $j; ++$k) { + $result = $this->_squareReduce($result, $n_value, $mode); + } + + $result = $this->_multiplyReduce($result, $powers[bindec(substr($e_bits, $i, $j + 1))], $n_value, $mode); + + $i += $j + 1; + } + } + + $temp = new Math_BigInteger(); + $temp->value = $this->_reduce($result, $n_value, $mode); + + return $temp; + } + + /** + * Modular reduction + * + * For most $modes this will return the remainder. + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @param int $mode + * @return array + */ + function _reduce($x, $n, $mode) + { + switch ($mode) { + case MATH_BIGINTEGER_MONTGOMERY: + return $this->_montgomery($x, $n); + case MATH_BIGINTEGER_BARRETT: + return $this->_barrett($x, $n); + case MATH_BIGINTEGER_POWEROF2: + $lhs = new Math_BigInteger(); + $lhs->value = $x; + $rhs = new Math_BigInteger(); + $rhs->value = $n; + return $x->_mod2($n); + case MATH_BIGINTEGER_CLASSIC: + $lhs = new Math_BigInteger(); + $lhs->value = $x; + $rhs = new Math_BigInteger(); + $rhs->value = $n; + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + case MATH_BIGINTEGER_NONE: + return $x; + default: + // an invalid $mode was provided + } + } + + /** + * Modular reduction preperation + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @param int $mode + * @return array + */ + function _prepareReduce($x, $n, $mode) + { + if ($mode == MATH_BIGINTEGER_MONTGOMERY) { + return $this->_prepMontgomery($x, $n); + } + return $this->_reduce($x, $n, $mode); + } + + /** + * Modular multiply + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $y + * @param array $n + * @param int $mode + * @return array + */ + function _multiplyReduce($x, $y, $n, $mode) + { + if ($mode == MATH_BIGINTEGER_MONTGOMERY) { + return $this->_montgomeryMultiply($x, $y, $n); + } + $temp = $this->_multiply($x, false, $y, false); + return $this->_reduce($temp[MATH_BIGINTEGER_VALUE], $n, $mode); + } + + /** + * Modular square + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @param int $mode + * @return array + */ + function _squareReduce($x, $n, $mode) + { + if ($mode == MATH_BIGINTEGER_MONTGOMERY) { + return $this->_montgomeryMultiply($x, $x, $n); + } + return $this->_reduce($this->_square($x), $n, $mode); + } + + /** + * Modulos for Powers of Two + * + * Calculates $x%$n, where $n = 2**$e, for some $e. Since this is basically the same as doing $x & ($n-1), + * we'll just use this function as a wrapper for doing that. + * + * @see self::_slidingWindow() + * @access private + * @param Math_BigInteger + * @return Math_BigInteger + */ + function _mod2($n) + { + $temp = new Math_BigInteger(); + $temp->value = array(1); + return $this->bitwise_and($n->subtract($temp)); + } + + /** + * Barrett Modular Reduction + * + * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} / + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information. Modified slightly, + * so as not to require negative numbers (initially, this script didn't support negative numbers). + * + * Employs "folding", as described at + * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}. To quote from + * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x." + * + * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that + * usable on account of (1) its not using reasonable radix points as discussed in + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable + * radix points, it only works when there are an even number of digits in the denominator. The reason for (2) is that + * (x >> 1) + (x >> 1) != x / 2 + x / 2. If x is even, they're the same, but if x is odd, they're not. See the in-line + * comments for details. + * + * @see self::_slidingWindow() + * @access private + * @param array $n + * @param array $m + * @return array + */ + function _barrett($n, $m) + { + static $cache = array( + MATH_BIGINTEGER_VARIABLE => array(), + MATH_BIGINTEGER_DATA => array() + ); + + $m_length = count($m); + + // if ($this->_compare($n, $this->_square($m)) >= 0) { + if (count($n) > 2 * $m_length) { + $lhs = new Math_BigInteger(); + $rhs = new Math_BigInteger(); + $lhs->value = $n; + $rhs->value = $m; + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + } + + // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced + if ($m_length < 5) { + return $this->_regularBarrett($n, $m); + } + + // n = 2 * m.length + + if (($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false) { + $key = count($cache[MATH_BIGINTEGER_VARIABLE]); + $cache[MATH_BIGINTEGER_VARIABLE][] = $m; + + $lhs = new Math_BigInteger(); + $lhs_value = &$lhs->value; + $lhs_value = $this->_array_repeat(0, $m_length + ($m_length >> 1)); + $lhs_value[] = 1; + $rhs = new Math_BigInteger(); + $rhs->value = $m; + + list($u, $m1) = $lhs->divide($rhs); + $u = $u->value; + $m1 = $m1->value; + + $cache[MATH_BIGINTEGER_DATA][] = array( + 'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1) + 'm1'=> $m1 // m.length + ); + } else { + extract($cache[MATH_BIGINTEGER_DATA][$key]); + } + + $cutoff = $m_length + ($m_length >> 1); + $lsd = array_slice($n, 0, $cutoff); // m.length + (m.length >> 1) + $msd = array_slice($n, $cutoff); // m.length >> 1 + $lsd = $this->_trim($lsd); + $temp = $this->_multiply($msd, false, $m1, false); + $n = $this->_add($lsd, false, $temp[MATH_BIGINTEGER_VALUE], false); // m.length + (m.length >> 1) + 1 + + if ($m_length & 1) { + return $this->_regularBarrett($n[MATH_BIGINTEGER_VALUE], $m); + } + + // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2 + $temp = array_slice($n[MATH_BIGINTEGER_VALUE], $m_length - 1); + // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2 + // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1 + $temp = $this->_multiply($temp, false, $u, false); + // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1 + // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], ($m_length >> 1) + 1); + // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1 + // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1) + $temp = $this->_multiply($temp, false, $m, false); + + // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit + // number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop + // following this comment would loop a lot (hence our calling _regularBarrett() in that situation). + + $result = $this->_subtract($n[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false); + + while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false) >= 0) { + $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false); + } + + return $result[MATH_BIGINTEGER_VALUE]; + } + + /** + * (Regular) Barrett Modular Reduction + * + * For numbers with more than four digits Math_BigInteger::_barrett() is faster. The difference between that and this + * is that this function does not fold the denominator into a smaller form. + * + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @return array + */ + function _regularBarrett($x, $n) + { + static $cache = array( + MATH_BIGINTEGER_VARIABLE => array(), + MATH_BIGINTEGER_DATA => array() + ); + + $n_length = count($n); + + if (count($x) > 2 * $n_length) { + $lhs = new Math_BigInteger(); + $rhs = new Math_BigInteger(); + $lhs->value = $x; + $rhs->value = $n; + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + } + + if (($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false) { + $key = count($cache[MATH_BIGINTEGER_VARIABLE]); + $cache[MATH_BIGINTEGER_VARIABLE][] = $n; + $lhs = new Math_BigInteger(); + $lhs_value = &$lhs->value; + $lhs_value = $this->_array_repeat(0, 2 * $n_length); + $lhs_value[] = 1; + $rhs = new Math_BigInteger(); + $rhs->value = $n; + list($temp, ) = $lhs->divide($rhs); // m.length + $cache[MATH_BIGINTEGER_DATA][] = $temp->value; + } + + // 2 * m.length - (m.length - 1) = m.length + 1 + $temp = array_slice($x, $n_length - 1); + // (m.length + 1) + m.length = 2 * m.length + 1 + $temp = $this->_multiply($temp, false, $cache[MATH_BIGINTEGER_DATA][$key], false); + // (2 * m.length + 1) - (m.length - 1) = m.length + 2 + $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], $n_length + 1); + + // m.length + 1 + $result = array_slice($x, 0, $n_length + 1); + // m.length + 1 + $temp = $this->_multiplyLower($temp, false, $n, false, $n_length + 1); + // $temp == array_slice($temp->_multiply($temp, false, $n, false)->value, 0, $n_length + 1) + + if ($this->_compare($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]) < 0) { + $corrector_value = $this->_array_repeat(0, $n_length + 1); + $corrector_value[count($corrector_value)] = 1; + $result = $this->_add($result, false, $corrector_value, false); + $result = $result[MATH_BIGINTEGER_VALUE]; + } + + // at this point, we're subtracting a number with m.length + 1 digits from another number with m.length + 1 digits + $result = $this->_subtract($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]); + while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false) > 0) { + $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false); + } + + return $result[MATH_BIGINTEGER_VALUE]; + } + + /** + * Performs long multiplication up to $stop digits + * + * If you're going to be doing array_slice($product->value, 0, $stop), some cycles can be saved. + * + * @see self::_regularBarrett() + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @param int $stop + * @return array + * @access private + */ + function _multiplyLower($x_value, $x_negative, $y_value, $y_negative, $stop) + { + $x_length = count($x_value); + $y_length = count($y_value); + + if (!$x_length || !$y_length) { // a 0 is being multiplied + return array( + MATH_BIGINTEGER_VALUE => array(), + MATH_BIGINTEGER_SIGN => false + ); + } + + if ($x_length < $y_length) { + $temp = $x_value; + $x_value = $y_value; + $y_value = $temp; + + $x_length = count($x_value); + $y_length = count($y_value); + } + + $product_value = $this->_array_repeat(0, $x_length + $y_length); + + // the following for loop could be removed if the for loop following it + // (the one with nested for loops) initially set $i to 0, but + // doing so would also make the result in one set of unnecessary adds, + // since on the outermost loops first pass, $product->value[$k] is going + // to always be 0 + + $carry = 0; + + for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0, $k = $i + $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + if ($j < $stop) { + $product_value[$j] = $carry; + } + + // the above for loop is what the previous comment was talking about. the + // following for loop is the "one with nested for loops" + + for ($i = 1; $i < $y_length; ++$i) { + $carry = 0; + + for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) { + $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry); + } + + if ($k < $stop) { + $product_value[$k] = $carry; + } + } + + return array( + MATH_BIGINTEGER_VALUE => $this->_trim($product_value), + MATH_BIGINTEGER_SIGN => $x_negative != $y_negative + ); + } + + /** + * Montgomery Modular Reduction + * + * ($x->_prepMontgomery($n))->_montgomery($n) yields $x % $n. + * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=170 MPM 6.3} provides insights on how this can be + * improved upon (basically, by using the comba method). gcd($n, 2) must be equal to one for this function + * to work correctly. + * + * @see self::_prepMontgomery() + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @return array + */ + function _montgomery($x, $n) + { + static $cache = array( + MATH_BIGINTEGER_VARIABLE => array(), + MATH_BIGINTEGER_DATA => array() + ); + + if (($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false) { + $key = count($cache[MATH_BIGINTEGER_VARIABLE]); + $cache[MATH_BIGINTEGER_VARIABLE][] = $x; + $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($n); + } + + $k = count($n); + + $result = array(MATH_BIGINTEGER_VALUE => $x); + + for ($i = 0; $i < $k; ++$i) { + $temp = $result[MATH_BIGINTEGER_VALUE][$i] * $cache[MATH_BIGINTEGER_DATA][$key]; + $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $this->_regularMultiply(array($temp), $n); + $temp = array_merge($this->_array_repeat(0, $i), $temp); + $result = $this->_add($result[MATH_BIGINTEGER_VALUE], false, $temp, false); + } + + $result[MATH_BIGINTEGER_VALUE] = array_slice($result[MATH_BIGINTEGER_VALUE], $k); + + if ($this->_compare($result, false, $n, false) >= 0) { + $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], false, $n, false); + } + + return $result[MATH_BIGINTEGER_VALUE]; + } + + /** + * Montgomery Multiply + * + * Interleaves the montgomery reduction and long multiplication algorithms together as described in + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36} + * + * @see self::_prepMontgomery() + * @see self::_montgomery() + * @access private + * @param array $x + * @param array $y + * @param array $m + * @return array + */ + function _montgomeryMultiply($x, $y, $m) + { + $temp = $this->_multiply($x, false, $y, false); + return $this->_montgomery($temp[MATH_BIGINTEGER_VALUE], $m); + + // the following code, although not callable, can be run independently of the above code + // although the above code performed better in my benchmarks the following could might + // perform better under different circumstances. in lieu of deleting it it's just been + // made uncallable + + static $cache = array( + MATH_BIGINTEGER_VARIABLE => array(), + MATH_BIGINTEGER_DATA => array() + ); + + if (($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false) { + $key = count($cache[MATH_BIGINTEGER_VARIABLE]); + $cache[MATH_BIGINTEGER_VARIABLE][] = $m; + $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($m); + } + + $n = max(count($x), count($y), count($m)); + $x = array_pad($x, $n, 0); + $y = array_pad($y, $n, 0); + $m = array_pad($m, $n, 0); + $a = array(MATH_BIGINTEGER_VALUE => $this->_array_repeat(0, $n + 1)); + for ($i = 0; $i < $n; ++$i) { + $temp = $a[MATH_BIGINTEGER_VALUE][0] + $x[$i] * $y[0]; + $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $temp * $cache[MATH_BIGINTEGER_DATA][$key]; + $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $this->_add($this->_regularMultiply(array($x[$i]), $y), false, $this->_regularMultiply(array($temp), $m), false); + $a = $this->_add($a[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false); + $a[MATH_BIGINTEGER_VALUE] = array_slice($a[MATH_BIGINTEGER_VALUE], 1); + } + if ($this->_compare($a[MATH_BIGINTEGER_VALUE], false, $m, false) >= 0) { + $a = $this->_subtract($a[MATH_BIGINTEGER_VALUE], false, $m, false); + } + return $a[MATH_BIGINTEGER_VALUE]; + } + + /** + * Prepare a number for use in Montgomery Modular Reductions + * + * @see self::_montgomery() + * @see self::_slidingWindow() + * @access private + * @param array $x + * @param array $n + * @return array + */ + function _prepMontgomery($x, $n) + { + $lhs = new Math_BigInteger(); + $lhs->value = array_merge($this->_array_repeat(0, count($n)), $x); + $rhs = new Math_BigInteger(); + $rhs->value = $n; + + list(, $temp) = $lhs->divide($rhs); + return $temp->value; + } + + /** + * Modular Inverse of a number mod 2**26 (eg. 67108864) + * + * Based off of the bnpInvDigit function implemented and justified in the following URL: + * + * {@link http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js} + * + * The following URL provides more info: + * + * {@link http://groups.google.com/group/sci.crypt/msg/7a137205c1be7d85} + * + * As for why we do all the bitmasking... strange things can happen when converting from floats to ints. For + * instance, on some computers, var_dump((int) -4294967297) yields int(-1) and on others, it yields + * int(-2147483648). To avoid problems stemming from this, we use bitmasks to guarantee that ints aren't + * auto-converted to floats. The outermost bitmask is present because without it, there's no guarantee that + * the "residue" returned would be the so-called "common residue". We use fmod, in the last step, because the + * maximum possible $x is 26 bits and the maximum $result is 16 bits. Thus, we have to be able to handle up to + * 40 bits, which only 64-bit floating points will support. + * + * Thanks to Pedro Gimeno Fortea for input! + * + * @see self::_montgomery() + * @access private + * @param array $x + * @return int + */ + function _modInverse67108864($x) // 2**26 == 67,108,864 + { + $x = -$x[0]; + $result = $x & 0x3; // x**-1 mod 2**2 + $result = ($result * (2 - $x * $result)) & 0xF; // x**-1 mod 2**4 + $result = ($result * (2 - ($x & 0xFF) * $result)) & 0xFF; // x**-1 mod 2**8 + $result = ($result * ((2 - ($x & 0xFFFF) * $result) & 0xFFFF)) & 0xFFFF; // x**-1 mod 2**16 + $result = fmod($result * (2 - fmod($x * $result, MATH_BIGINTEGER_BASE_FULL)), MATH_BIGINTEGER_BASE_FULL); // x**-1 mod 2**26 + return $result & MATH_BIGINTEGER_MAX_DIGIT; + } + + /** + * Calculates modular inverses. + * + * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. + * + * Here's an example: + * + * modInverse($b); + * echo $c->toString(); // outputs 4 + * + * echo "\r\n"; + * + * $d = $a->multiply($c); + * list(, $d) = $d->divide($b); + * echo $d; // outputs 1 (as per the definition of modular inverse) + * ?> + * + * + * @param Math_BigInteger $n + * @return Math_BigInteger|false + * @access public + * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=21 HAC 14.64} for more information. + */ + function modInverse($n) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_invert($this->value, $n->value); + + return ($temp->value === false) ? false : $this->_normalize($temp); + } + + static $zero, $one; + if (!isset($zero)) { + $zero = new Math_BigInteger(); + $one = new Math_BigInteger(1); + } + + // $x mod -$n == $x mod $n. + $n = $n->abs(); + + if ($this->compare($zero) < 0) { + $temp = $this->abs(); + $temp = $temp->modInverse($n); + return $this->_normalize($n->subtract($temp)); + } + + extract($this->extendedGCD($n)); + + if (!$gcd->equals($one)) { + return false; + } + + $x = $x->compare($zero) < 0 ? $x->add($n) : $x; + + return $this->compare($zero) < 0 ? $this->_normalize($n->subtract($x)) : $this->_normalize($x); + } + + /** + * Calculates the greatest common divisor and Bezout's identity. + * + * Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that + * 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which + * combination is returned is dependent upon which mode is in use. See + * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information. + * + * Here's an example: + * + * extendedGCD($b)); + * + * echo $gcd->toString() . "\r\n"; // outputs 21 + * echo $a->toString() * $x->toString() + $b->toString() * $y->toString(); // outputs 21 + * ?> + * + * + * @param Math_BigInteger $n + * @return Math_BigInteger + * @access public + * @internal Calculates the GCD using the binary xGCD algorithim described in + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=19 HAC 14.61}. As the text above 14.61 notes, + * the more traditional algorithim requires "relatively costly multiple-precision divisions". + */ + function extendedGCD($n) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + extract(gmp_gcdext($this->value, $n->value)); + + return array( + 'gcd' => $this->_normalize(new Math_BigInteger($g)), + 'x' => $this->_normalize(new Math_BigInteger($s)), + 'y' => $this->_normalize(new Math_BigInteger($t)) + ); + case MATH_BIGINTEGER_MODE_BCMATH: + // it might be faster to use the binary xGCD algorithim here, as well, but (1) that algorithim works + // best when the base is a power of 2 and (2) i don't think it'd make much difference, anyway. as is, + // the basic extended euclidean algorithim is what we're using. + + $u = $this->value; + $v = $n->value; + + $a = '1'; + $b = '0'; + $c = '0'; + $d = '1'; + + while (bccomp($v, '0', 0) != 0) { + $q = bcdiv($u, $v, 0); + + $temp = $u; + $u = $v; + $v = bcsub($temp, bcmul($v, $q, 0), 0); + + $temp = $a; + $a = $c; + $c = bcsub($temp, bcmul($a, $q, 0), 0); + + $temp = $b; + $b = $d; + $d = bcsub($temp, bcmul($b, $q, 0), 0); + } + + return array( + 'gcd' => $this->_normalize(new Math_BigInteger($u)), + 'x' => $this->_normalize(new Math_BigInteger($a)), + 'y' => $this->_normalize(new Math_BigInteger($b)) + ); + } + + $y = $n->copy(); + $x = $this->copy(); + $g = new Math_BigInteger(); + $g->value = array(1); + + while (!(($x->value[0] & 1)|| ($y->value[0] & 1))) { + $x->_rshift(1); + $y->_rshift(1); + $g->_lshift(1); + } + + $u = $x->copy(); + $v = $y->copy(); + + $a = new Math_BigInteger(); + $b = new Math_BigInteger(); + $c = new Math_BigInteger(); + $d = new Math_BigInteger(); + + $a->value = $d->value = $g->value = array(1); + $b->value = $c->value = array(); + + while (!empty($u->value)) { + while (!($u->value[0] & 1)) { + $u->_rshift(1); + if ((!empty($a->value) && ($a->value[0] & 1)) || (!empty($b->value) && ($b->value[0] & 1))) { + $a = $a->add($y); + $b = $b->subtract($x); + } + $a->_rshift(1); + $b->_rshift(1); + } + + while (!($v->value[0] & 1)) { + $v->_rshift(1); + if ((!empty($d->value) && ($d->value[0] & 1)) || (!empty($c->value) && ($c->value[0] & 1))) { + $c = $c->add($y); + $d = $d->subtract($x); + } + $c->_rshift(1); + $d->_rshift(1); + } + + if ($u->compare($v) >= 0) { + $u = $u->subtract($v); + $a = $a->subtract($c); + $b = $b->subtract($d); + } else { + $v = $v->subtract($u); + $c = $c->subtract($a); + $d = $d->subtract($b); + } + } + + return array( + 'gcd' => $this->_normalize($g->multiply($v)), + 'x' => $this->_normalize($c), + 'y' => $this->_normalize($d) + ); + } + + /** + * Calculates the greatest common divisor + * + * Say you have 693 and 609. The GCD is 21. + * + * Here's an example: + * + * extendedGCD($b); + * + * echo $gcd->toString() . "\r\n"; // outputs 21 + * ?> + * + * + * @param Math_BigInteger $n + * @return Math_BigInteger + * @access public + */ + function gcd($n) + { + extract($this->extendedGCD($n)); + return $gcd; + } + + /** + * Absolute value. + * + * @return Math_BigInteger + * @access public + */ + function abs() + { + $temp = new Math_BigInteger(); + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp->value = gmp_abs($this->value); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $temp->value = (bccomp($this->value, '0', 0) < 0) ? substr($this->value, 1) : $this->value; + break; + default: + $temp->value = $this->value; + } + + return $temp; + } + + /** + * Compares two numbers. + * + * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this is + * demonstrated thusly: + * + * $x > $y: $x->compare($y) > 0 + * $x < $y: $x->compare($y) < 0 + * $x == $y: $x->compare($y) == 0 + * + * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). + * + * @param Math_BigInteger $y + * @return int < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. + * @access public + * @see self::equals() + * @internal Could return $this->subtract($x), but that's not as fast as what we do do. + */ + function compare($y) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + return gmp_cmp($this->value, $y->value); + case MATH_BIGINTEGER_MODE_BCMATH: + return bccomp($this->value, $y->value, 0); + } + + return $this->_compare($this->value, $this->is_negative, $y->value, $y->is_negative); + } + + /** + * Compares two numbers. + * + * @param array $x_value + * @param bool $x_negative + * @param array $y_value + * @param bool $y_negative + * @return int + * @see self::compare() + * @access private + */ + function _compare($x_value, $x_negative, $y_value, $y_negative) + { + if ($x_negative != $y_negative) { + return (!$x_negative && $y_negative) ? 1 : -1; + } + + $result = $x_negative ? -1 : 1; + + if (count($x_value) != count($y_value)) { + return (count($x_value) > count($y_value)) ? $result : -$result; + } + $size = max(count($x_value), count($y_value)); + + $x_value = array_pad($x_value, $size, 0); + $y_value = array_pad($y_value, $size, 0); + + for ($i = count($x_value) - 1; $i >= 0; --$i) { + if ($x_value[$i] != $y_value[$i]) { + return ($x_value[$i] > $y_value[$i]) ? $result : -$result; + } + } + + return 0; + } + + /** + * Tests the equality of two numbers. + * + * If you need to see if one number is greater than or less than another number, use Math_BigInteger::compare() + * + * @param Math_BigInteger $x + * @return bool + * @access public + * @see self::compare() + */ + function equals($x) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + return gmp_cmp($this->value, $x->value) == 0; + default: + return $this->value === $x->value && $this->is_negative == $x->is_negative; + } + } + + /** + * Set Precision + * + * Some bitwise operations give different results depending on the precision being used. Examples include left + * shift, not, and rotates. + * + * @param int $bits + * @access public + */ + function setPrecision($bits) + { + $this->precision = $bits; + if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH) { + $this->bitmask = new Math_BigInteger(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256); + } else { + $this->bitmask = new Math_BigInteger(bcpow('2', $bits, 0)); + } + + $temp = $this->_normalize($this); + $this->value = $temp->value; + } + + /** + * Logical And + * + * @param Math_BigInteger $x + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return Math_BigInteger + */ + function bitwise_and($x) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_and($this->value, $x->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $left = $this->toBytes(); + $right = $x->toBytes(); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + + return $this->_normalize(new Math_BigInteger($left & $right, 256)); + } + + $result = $this->copy(); + + $length = min(count($x->value), count($this->value)); + + $result->value = array_slice($result->value, 0, $length); + + for ($i = 0; $i < $length; ++$i) { + $result->value[$i]&= $x->value[$i]; + } + + return $this->_normalize($result); + } + + /** + * Logical Or + * + * @param Math_BigInteger $x + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return Math_BigInteger + */ + function bitwise_or($x) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_or($this->value, $x->value); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $left = $this->toBytes(); + $right = $x->toBytes(); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + + return $this->_normalize(new Math_BigInteger($left | $right, 256)); + } + + $length = max(count($this->value), count($x->value)); + $result = $this->copy(); + $result->value = array_pad($result->value, $length, 0); + $x->value = array_pad($x->value, $length, 0); + + for ($i = 0; $i < $length; ++$i) { + $result->value[$i]|= $x->value[$i]; + } + + return $this->_normalize($result); + } + + /** + * Logical Exclusive-Or + * + * @param Math_BigInteger $x + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return Math_BigInteger + */ + function bitwise_xor($x) + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + $temp = new Math_BigInteger(); + $temp->value = gmp_xor(gmp_abs($this->value), gmp_abs($x->value)); + + return $this->_normalize($temp); + case MATH_BIGINTEGER_MODE_BCMATH: + $left = $this->toBytes(); + $right = $x->toBytes(); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + + return $this->_normalize(new Math_BigInteger($left ^ $right, 256)); + } + + $length = max(count($this->value), count($x->value)); + $result = $this->copy(); + $result->is_negative = false; + $result->value = array_pad($result->value, $length, 0); + $x->value = array_pad($x->value, $length, 0); + + for ($i = 0; $i < $length; ++$i) { + $result->value[$i]^= $x->value[$i]; + } + + return $this->_normalize($result); + } + + /** + * Logical Not + * + * @access public + * @internal Implemented per a request by Lluis Pamies i Juarez + * @return Math_BigInteger + */ + function bitwise_not() + { + // calculuate "not" without regard to $this->precision + // (will always result in a smaller number. ie. ~1 isn't 1111 1110 - it's 0) + $temp = $this->toBytes(); + if ($temp == '') { + return $this->_normalize(new Math_BigInteger()); + } + $pre_msb = decbin(ord($temp[0])); + $temp = ~$temp; + $msb = decbin(ord($temp[0])); + if (strlen($msb) == 8) { + $msb = substr($msb, strpos($msb, '0')); + } + $temp[0] = chr(bindec($msb)); + + // see if we need to add extra leading 1's + $current_bits = strlen($pre_msb) + 8 * strlen($temp) - 8; + $new_bits = $this->precision - $current_bits; + if ($new_bits <= 0) { + return $this->_normalize(new Math_BigInteger($temp, 256)); + } + + // generate as many leading 1's as we need to. + $leading_ones = chr((1 << ($new_bits & 0x7)) - 1) . str_repeat(chr(0xFF), $new_bits >> 3); + $this->_base256_lshift($leading_ones, $current_bits); + + $temp = str_pad($temp, strlen($leading_ones), chr(0), STR_PAD_LEFT); + + return $this->_normalize(new Math_BigInteger($leading_ones | $temp, 256)); + } + + /** + * Logical Right Shift + * + * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. + * + * @param int $shift + * @return Math_BigInteger + * @access public + * @internal The only version that yields any speed increases is the internal version. + */ + function bitwise_rightShift($shift) + { + $temp = new Math_BigInteger(); + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + static $two; + + if (!isset($two)) { + $two = gmp_init('2'); + } + + $temp->value = gmp_div_q($this->value, gmp_pow($two, $shift)); + + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $temp->value = bcdiv($this->value, bcpow('2', $shift, 0), 0); + + break; + default: // could just replace _lshift with this, but then all _lshift() calls would need to be rewritten + // and I don't want to do that... + $temp->value = $this->value; + $temp->_rshift($shift); + } + + return $this->_normalize($temp); + } + + /** + * Logical Left Shift + * + * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. + * + * @param int $shift + * @return Math_BigInteger + * @access public + * @internal The only version that yields any speed increases is the internal version. + */ + function bitwise_leftShift($shift) + { + $temp = new Math_BigInteger(); + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + static $two; + + if (!isset($two)) { + $two = gmp_init('2'); + } + + $temp->value = gmp_mul($this->value, gmp_pow($two, $shift)); + + break; + case MATH_BIGINTEGER_MODE_BCMATH: + $temp->value = bcmul($this->value, bcpow('2', $shift, 0), 0); + + break; + default: // could just replace _rshift with this, but then all _lshift() calls would need to be rewritten + // and I don't want to do that... + $temp->value = $this->value; + $temp->_lshift($shift); + } + + return $this->_normalize($temp); + } + + /** + * Logical Left Rotate + * + * Instead of the top x bits being dropped they're appended to the shifted bit string. + * + * @param int $shift + * @return Math_BigInteger + * @access public + */ + function bitwise_leftRotate($shift) + { + $bits = $this->toBytes(); + + if ($this->precision > 0) { + $precision = $this->precision; + if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH) { + $mask = $this->bitmask->subtract(new Math_BigInteger(1)); + $mask = $mask->toBytes(); + } else { + $mask = $this->bitmask->toBytes(); + } + } else { + $temp = ord($bits[0]); + for ($i = 0; $temp >> $i; ++$i) { + } + $precision = 8 * strlen($bits) - 8 + $i; + $mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3); + } + + if ($shift < 0) { + $shift+= $precision; + } + $shift%= $precision; + + if (!$shift) { + return $this->copy(); + } + + $left = $this->bitwise_leftShift($shift); + $left = $left->bitwise_and(new Math_BigInteger($mask, 256)); + $right = $this->bitwise_rightShift($precision - $shift); + $result = MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ? $left->bitwise_or($right) : $left->add($right); + return $this->_normalize($result); + } + + /** + * Logical Right Rotate + * + * Instead of the bottom x bits being dropped they're prepended to the shifted bit string. + * + * @param int $shift + * @return Math_BigInteger + * @access public + */ + function bitwise_rightRotate($shift) + { + return $this->bitwise_leftRotate(-$shift); + } + + /** + * Set random number generator function + * + * This function is deprecated. + * + * @param string $generator + * @access public + */ + function setRandomGenerator($generator) + { + } + + /** + * Generates a random BigInteger + * + * Byte length is equal to $length. Uses crypt_random if it's loaded and mt_rand if it's not. + * + * @param int $length + * @return Math_BigInteger + * @access private + */ + function _random_number_helper($size) + { + if (function_exists('crypt_random_string')) { + $random = crypt_random_string($size); + } else { + $random = ''; + + if ($size & 1) { + $random.= chr(mt_rand(0, 255)); + } + + $blocks = $size >> 1; + for ($i = 0; $i < $blocks; ++$i) { + // mt_rand(-2147483648, 0x7FFFFFFF) always produces -2147483648 on some systems + $random.= pack('n', mt_rand(0, 0xFFFF)); + } + } + + return new Math_BigInteger($random, 256); + } + + /** + * Generate a random number + * + * Returns a random number between $min and $max where $min and $max + * can be defined using one of the two methods: + * + * $min->random($max) + * $max->random($min) + * + * @param Math_BigInteger $arg1 + * @param Math_BigInteger $arg2 + * @return Math_BigInteger + * @access public + * @internal The API for creating random numbers used to be $a->random($min, $max), where $a was a Math_BigInteger object. + * That method is still supported for BC purposes. + */ + function random($arg1, $arg2 = false) + { + if ($arg1 === false) { + return false; + } + + if ($arg2 === false) { + $max = $arg1; + $min = $this; + } else { + $min = $arg1; + $max = $arg2; + } + + $compare = $max->compare($min); + + if (!$compare) { + return $this->_normalize($min); + } elseif ($compare < 0) { + // if $min is bigger then $max, swap $min and $max + $temp = $max; + $max = $min; + $min = $temp; + } + + static $one; + if (!isset($one)) { + $one = new Math_BigInteger(1); + } + + $max = $max->subtract($min->subtract($one)); + $size = strlen(ltrim($max->toBytes(), chr(0))); + + /* + doing $random % $max doesn't work because some numbers will be more likely to occur than others. + eg. if $max is 140 and $random's max is 255 then that'd mean both $random = 5 and $random = 145 + would produce 5 whereas the only value of random that could produce 139 would be 139. ie. + not all numbers would be equally likely. some would be more likely than others. + + creating a whole new random number until you find one that is within the range doesn't work + because, for sufficiently small ranges, the likelihood that you'd get a number within that range + would be pretty small. eg. with $random's max being 255 and if your $max being 1 the probability + would be pretty high that $random would be greater than $max. + + phpseclib works around this using the technique described here: + + http://crypto.stackexchange.com/questions/5708/creating-a-small-number-from-a-cryptographically-secure-random-string + */ + $random_max = new Math_BigInteger(chr(1) . str_repeat("\0", $size), 256); + $random = $this->_random_number_helper($size); + + list($max_multiple) = $random_max->divide($max); + $max_multiple = $max_multiple->multiply($max); + + while ($random->compare($max_multiple) >= 0) { + $random = $random->subtract($max_multiple); + $random_max = $random_max->subtract($max_multiple); + $random = $random->bitwise_leftShift(8); + $random = $random->add($this->_random_number_helper(1)); + $random_max = $random_max->bitwise_leftShift(8); + list($max_multiple) = $random_max->divide($max); + $max_multiple = $max_multiple->multiply($max); + } + list(, $random) = $random->divide($max); + + return $this->_normalize($random->add($min)); + } + + /** + * Generate a random prime number. + * + * If there's not a prime within the given range, false will be returned. + * If more than $timeout seconds have elapsed, give up and return false. + * + * @param Math_BigInteger $arg1 + * @param Math_BigInteger $arg2 + * @param int $timeout + * @return Math_BigInteger|false + * @access public + * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=15 HAC 4.44}. + */ + function randomPrime($arg1, $arg2 = false, $timeout = false) + { + if ($arg1 === false) { + return false; + } + + if ($arg2 === false) { + $max = $arg1; + $min = $this; + } else { + $min = $arg1; + $max = $arg2; + } + + $compare = $max->compare($min); + + if (!$compare) { + return $min->isPrime() ? $min : false; + } elseif ($compare < 0) { + // if $min is bigger then $max, swap $min and $max + $temp = $max; + $max = $min; + $min = $temp; + } + + static $one, $two; + if (!isset($one)) { + $one = new Math_BigInteger(1); + $two = new Math_BigInteger(2); + } + + $start = time(); + + $x = $this->random($min, $max); + + // gmp_nextprime() requires PHP 5 >= 5.2.0 per . + if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP && extension_loaded('gmp') && version_compare(PHP_VERSION, '5.2.0', '>=')) { + $p = new Math_BigInteger(); + $p->value = gmp_nextprime($x->value); + + if ($p->compare($max) <= 0) { + return $p; + } + + if (!$min->equals($x)) { + $x = $x->subtract($one); + } + + return $x->randomPrime($min, $x); + } + + if ($x->equals($two)) { + return $x; + } + + $x->_make_odd(); + if ($x->compare($max) > 0) { + // if $x > $max then $max is even and if $min == $max then no prime number exists between the specified range + if ($min->equals($max)) { + return false; + } + $x = $min->copy(); + $x->_make_odd(); + } + + $initial_x = $x->copy(); + + while (true) { + if ($timeout !== false && time() - $start > $timeout) { + return false; + } + + if ($x->isPrime()) { + return $x; + } + + $x = $x->add($two); + + if ($x->compare($max) > 0) { + $x = $min->copy(); + if ($x->equals($two)) { + return $x; + } + $x->_make_odd(); + } + + if ($x->equals($initial_x)) { + return false; + } + } + } + + /** + * Make the current number odd + * + * If the current number is odd it'll be unchanged. If it's even, one will be added to it. + * + * @see self::randomPrime() + * @access private + */ + function _make_odd() + { + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + gmp_setbit($this->value, 0); + break; + case MATH_BIGINTEGER_MODE_BCMATH: + if ($this->value[strlen($this->value) - 1] % 2 == 0) { + $this->value = bcadd($this->value, '1'); + } + break; + default: + $this->value[0] |= 1; + } + } + + /** + * Checks a numer to see if it's prime + * + * Assuming the $t parameter is not set, this function has an error rate of 2**-80. The main motivation for the + * $t parameter is distributability. Math_BigInteger::randomPrime() can be distributed across multiple pageloads + * on a website instead of just one. + * + * @param Math_BigInteger $t + * @return bool + * @access public + * @internal Uses the + * {@link http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Miller-Rabin primality test}. See + * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=8 HAC 4.24}. + */ + function isPrime($t = false) + { + $length = strlen($this->toBytes()); + + if (!$t) { + // see HAC 4.49 "Note (controlling the error probability)" + // @codingStandardsIgnoreStart + if ($length >= 163) { $t = 2; } // floor(1300 / 8) + else if ($length >= 106) { $t = 3; } // floor( 850 / 8) + else if ($length >= 81 ) { $t = 4; } // floor( 650 / 8) + else if ($length >= 68 ) { $t = 5; } // floor( 550 / 8) + else if ($length >= 56 ) { $t = 6; } // floor( 450 / 8) + else if ($length >= 50 ) { $t = 7; } // floor( 400 / 8) + else if ($length >= 43 ) { $t = 8; } // floor( 350 / 8) + else if ($length >= 37 ) { $t = 9; } // floor( 300 / 8) + else if ($length >= 31 ) { $t = 12; } // floor( 250 / 8) + else if ($length >= 25 ) { $t = 15; } // floor( 200 / 8) + else if ($length >= 18 ) { $t = 18; } // floor( 150 / 8) + else { $t = 27; } + // @codingStandardsIgnoreEnd + } + + // ie. gmp_testbit($this, 0) + // ie. isEven() or !isOdd() + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + return gmp_prob_prime($this->value, $t) != 0; + case MATH_BIGINTEGER_MODE_BCMATH: + if ($this->value === '2') { + return true; + } + if ($this->value[strlen($this->value) - 1] % 2 == 0) { + return false; + } + break; + default: + if ($this->value == array(2)) { + return true; + } + if (~$this->value[0] & 1) { + return false; + } + } + + static $primes, $zero, $one, $two; + + if (!isset($primes)) { + $primes = array( + 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, + 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, + 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, + 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, + 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, + 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, + 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, + 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, + 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, + 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, + 953, 967, 971, 977, 983, 991, 997 + ); + + if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) { + for ($i = 0; $i < count($primes); ++$i) { + $primes[$i] = new Math_BigInteger($primes[$i]); + } + } + + $zero = new Math_BigInteger(); + $one = new Math_BigInteger(1); + $two = new Math_BigInteger(2); + } + + if ($this->equals($one)) { + return false; + } + + // see HAC 4.4.1 "Random search for probable primes" + if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) { + foreach ($primes as $prime) { + list(, $r) = $this->divide($prime); + if ($r->equals($zero)) { + return $this->equals($prime); + } + } + } else { + $value = $this->value; + foreach ($primes as $prime) { + list(, $r) = $this->_divide_digit($value, $prime); + if (!$r) { + return count($value) == 1 && $value[0] == $prime; + } + } + } + + $n = $this->copy(); + $n_1 = $n->subtract($one); + $n_2 = $n->subtract($two); + + $r = $n_1->copy(); + $r_value = $r->value; + // ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); + if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH) { + $s = 0; + // if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals($one) check earlier + while ($r->value[strlen($r->value) - 1] % 2 == 0) { + $r->value = bcdiv($r->value, '2', 0); + ++$s; + } + } else { + for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) { + $temp = ~$r_value[$i] & 0xFFFFFF; + for ($j = 1; ($temp >> $j) & 1; ++$j) { + } + if ($j != 25) { + break; + } + } + $s = 26 * $i + $j; + $r->_rshift($s); + } + + for ($i = 0; $i < $t; ++$i) { + $a = $this->random($two, $n_2); + $y = $a->modPow($r, $n); + + if (!$y->equals($one) && !$y->equals($n_1)) { + for ($j = 1; $j < $s && !$y->equals($n_1); ++$j) { + $y = $y->modPow($two, $n); + if ($y->equals($one)) { + return false; + } + } + + if (!$y->equals($n_1)) { + return false; + } + } + } + return true; + } + + /** + * Logical Left Shift + * + * Shifts BigInteger's by $shift bits. + * + * @param int $shift + * @access private + */ + function _lshift($shift) + { + if ($shift == 0) { + return; + } + + $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE); + $shift %= MATH_BIGINTEGER_BASE; + $shift = 1 << $shift; + + $carry = 0; + + for ($i = 0; $i < count($this->value); ++$i) { + $temp = $this->value[$i] * $shift + $carry; + $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $this->value[$i] = (int) ($temp - $carry * MATH_BIGINTEGER_BASE_FULL); + } + + if ($carry) { + $this->value[count($this->value)] = $carry; + } + + while ($num_digits--) { + array_unshift($this->value, 0); + } + } + + /** + * Logical Right Shift + * + * Shifts BigInteger's by $shift bits. + * + * @param int $shift + * @access private + */ + function _rshift($shift) + { + if ($shift == 0) { + return; + } + + $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE); + $shift %= MATH_BIGINTEGER_BASE; + $carry_shift = MATH_BIGINTEGER_BASE - $shift; + $carry_mask = (1 << $shift) - 1; + + if ($num_digits) { + $this->value = array_slice($this->value, $num_digits); + } + + $carry = 0; + + for ($i = count($this->value) - 1; $i >= 0; --$i) { + $temp = $this->value[$i] >> $shift | $carry; + $carry = ($this->value[$i] & $carry_mask) << $carry_shift; + $this->value[$i] = $temp; + } + + $this->value = $this->_trim($this->value); + } + + /** + * Normalize + * + * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision + * + * @param Math_BigInteger + * @return Math_BigInteger + * @see self::_trim() + * @access private + */ + function _normalize($result) + { + $result->precision = $this->precision; + $result->bitmask = $this->bitmask; + + switch (MATH_BIGINTEGER_MODE) { + case MATH_BIGINTEGER_MODE_GMP: + if ($this->bitmask !== false) { + $result->value = gmp_and($result->value, $result->bitmask->value); + } + + return $result; + case MATH_BIGINTEGER_MODE_BCMATH: + if (!empty($result->bitmask->value)) { + $result->value = bcmod($result->value, $result->bitmask->value); + } + + return $result; + } + + $value = &$result->value; + + if (!count($value)) { + return $result; + } + + $value = $this->_trim($value); + + if (!empty($result->bitmask->value)) { + $length = min(count($value), count($this->bitmask->value)); + $value = array_slice($value, 0, $length); + + for ($i = 0; $i < $length; ++$i) { + $value[$i] = $value[$i] & $this->bitmask->value[$i]; + } + } + + return $result; + } + + /** + * Trim + * + * Removes leading zeros + * + * @param array $value + * @return Math_BigInteger + * @access private + */ + function _trim($value) + { + for ($i = count($value) - 1; $i >= 0; --$i) { + if ($value[$i]) { + break; + } + unset($value[$i]); + } + + return $value; + } + + /** + * Array Repeat + * + * @param $input Array + * @param $multiplier mixed + * @return array + * @access private + */ + function _array_repeat($input, $multiplier) + { + return ($multiplier) ? array_fill(0, $multiplier, $input) : array(); + } + + /** + * Logical Left Shift + * + * Shifts binary strings $shift bits, essentially multiplying by 2**$shift. + * + * @param $x String + * @param $shift Integer + * @return string + * @access private + */ + function _base256_lshift(&$x, $shift) + { + if ($shift == 0) { + return; + } + + $num_bytes = $shift >> 3; // eg. floor($shift/8) + $shift &= 7; // eg. $shift % 8 + + $carry = 0; + for ($i = strlen($x) - 1; $i >= 0; --$i) { + $temp = ord($x[$i]) << $shift | $carry; + $x[$i] = chr($temp); + $carry = $temp >> 8; + } + $carry = ($carry != 0) ? chr($carry) : ''; + $x = $carry . $x . str_repeat(chr(0), $num_bytes); + } + + /** + * Logical Right Shift + * + * Shifts binary strings $shift bits, essentially dividing by 2**$shift and returning the remainder. + * + * @param $x String + * @param $shift Integer + * @return string + * @access private + */ + function _base256_rshift(&$x, $shift) + { + if ($shift == 0) { + $x = ltrim($x, chr(0)); + return ''; + } + + $num_bytes = $shift >> 3; // eg. floor($shift/8) + $shift &= 7; // eg. $shift % 8 + + $remainder = ''; + if ($num_bytes) { + $start = $num_bytes > strlen($x) ? -strlen($x) : -$num_bytes; + $remainder = substr($x, $start); + $x = substr($x, 0, -$num_bytes); + } + + $carry = 0; + $carry_shift = 8 - $shift; + for ($i = 0; $i < strlen($x); ++$i) { + $temp = (ord($x[$i]) >> $shift) | $carry; + $carry = (ord($x[$i]) << $carry_shift) & 0xFF; + $x[$i] = chr($temp); + } + $x = ltrim($x, chr(0)); + + $remainder = chr($carry >> $carry_shift) . $remainder; + + return ltrim($remainder, chr(0)); + } + + // one quirk about how the following functions are implemented is that PHP defines N to be an unsigned long + // at 32-bits, while java's longs are 64-bits. + + /** + * Converts 32-bit integers to bytes. + * + * @param int $x + * @return string + * @access private + */ + function _int2bytes($x) + { + return ltrim(pack('N', $x), chr(0)); + } + + /** + * Converts bytes to 32-bit integers + * + * @param string $x + * @return int + * @access private + */ + function _bytes2int($x) + { + $temp = unpack('Nint', str_pad($x, 4, chr(0), STR_PAD_LEFT)); + return $temp['int']; + } + + /** + * DER-encode an integer + * + * The ability to DER-encode integers is needed to create RSA public keys for use with OpenSSL + * + * @see self::modPow() + * @access private + * @param int $length + * @return string + */ + function _encodeASN1Length($length) + { + if ($length <= 0x7F) { + return chr($length); + } + + $temp = ltrim(pack('N', $length), chr(0)); + return pack('Ca*', 0x80 | strlen($temp), $temp); + } + + /** + * Single digit division + * + * Even if int64 is being used the division operator will return a float64 value + * if the dividend is not evenly divisible by the divisor. Since a float64 doesn't + * have the precision of int64 this is a problem so, when int64 is being used, + * we'll guarantee that the dividend is divisible by first subtracting the remainder. + * + * @access private + * @param int $x + * @param int $y + * @return int + */ + function _safe_divide($x, $y) + { + if (MATH_BIGINTEGER_BASE === 26) { + return (int) ($x / $y); + } + + // MATH_BIGINTEGER_BASE === 31 + return ($x - ($x % $y)) / $y; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SCP.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SCP.php old mode 100644 new mode 100755 index b5cd2f55d..410368700 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SCP.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SCP.php @@ -1,360 +1,378 @@ - - * login('username', 'password')) { - * exit('bad login'); - * } - - * $scp = new Net_SCP($ssh); - * $scp->put('abcd', str_repeat('x', 1024*1024)); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Net - * @package Net_SCP - * @author Jim Wigginton - * @copyright 2010 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/**#@+ - * @access public - * @see Net_SCP::put() - */ -/** - * Reads data from a local file. - */ -define('NET_SCP_LOCAL_FILE', 1); -/** - * Reads data from a string. - */ -define('NET_SCP_STRING', 2); -/**#@-*/ - -/**#@+ - * @access private - * @see Net_SCP::_send() - * @see Net_SCP::_receive() - */ -/** - * SSH1 is being used. - */ -define('NET_SCP_SSH1', 1); -/** - * SSH2 is being used. - */ -define('NET_SCP_SSH2', 2); -/**#@-*/ - -/** - * Pure-PHP implementations of SCP. - * - * @package Net_SCP - * @author Jim Wigginton - * @access public - */ -class Net_SCP -{ - /** - * SSH Object - * - * @var Object - * @access private - */ - var $ssh; - - /** - * Packet Size - * - * @var Integer - * @access private - */ - var $packet_size; - - /** - * Mode - * - * @var Integer - * @access private - */ - var $mode; - - /** - * Default Constructor. - * - * Connects to an SSH server - * - * @param String $host - * @param optional Integer $port - * @param optional Integer $timeout - * @return Net_SCP - * @access public - */ - function Net_SCP($ssh) - { - if (!is_object($ssh)) { - return; - } - - switch (strtolower(get_class($ssh))) { - case 'net_ssh2': - $this->mode = NET_SCP_SSH2; - break; - case 'net_ssh1': - $this->packet_size = 50000; - $this->mode = NET_SCP_SSH1; - break; - default: - return; - } - - $this->ssh = $ssh; - } - - /** - * Uploads a file to the SCP server. - * - * By default, Net_SCP::put() does not read from the local filesystem. $data is dumped directly into $remote_file. - * So, for example, if you set $data to 'filename.ext' and then do Net_SCP::get(), you will get a file, twelve bytes - * long, containing 'filename.ext' as its contents. - * - * Setting $mode to NET_SCP_LOCAL_FILE will change the above behavior. With NET_SCP_LOCAL_FILE, $remote_file will - * contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how - * large $remote_file will be, as well. - * - * Currently, only binary mode is supported. As such, if the line endings need to be adjusted, you will need to take - * care of that, yourself. - * - * @param String $remote_file - * @param String $data - * @param optional Integer $mode - * @param optional Callable $callback - * @return Boolean - * @access public - */ - function put($remote_file, $data, $mode = NET_SCP_STRING, $callback = null) - { - if (!isset($this->ssh)) { - return false; - } - - if (!$this->ssh->exec('scp -t ' . escapeshellarg($remote_file), false)) { // -t = to - return false; - } - - $temp = $this->_receive(); - if ($temp !== chr(0)) { - return false; - } - - if ($this->mode == NET_SCP_SSH2) { - $this->packet_size = $this->ssh->packet_size_client_to_server[NET_SSH2_CHANNEL_EXEC] - 4; - } - - $remote_file = basename($remote_file); - - if ($mode == NET_SCP_STRING) { - $size = strlen($data); - } else { - if (!is_file($data)) { - user_error("$data is not a valid file", E_USER_NOTICE); - return false; - } - - $fp = @fopen($data, 'rb'); - if (!$fp) { - return false; - } - $size = filesize($data); - } - - $this->_send('C0644 ' . $size . ' ' . $remote_file . "\n"); - - $temp = $this->_receive(); - if ($temp !== chr(0)) { - return false; - } - - $sent = 0; - while ($sent < $size) { - $temp = $mode & NET_SCP_STRING ? substr($data, $sent, $this->packet_size) : fread($fp, $this->packet_size); - $this->_send($temp); - $sent+= strlen($temp); - - if (is_callable($callback)) { - call_user_func($callback, $sent); - } - } - $this->_close(); - - if ($mode != NET_SCP_STRING) { - fclose($fp); - } - - return true; - } - - /** - * Downloads a file from the SCP server. - * - * Returns a string containing the contents of $remote_file if $local_file is left undefined or a boolean false if - * the operation was unsuccessful. If $local_file is defined, returns true or false depending on the success of the - * operation - * - * @param String $remote_file - * @param optional String $local_file - * @return Mixed - * @access public - */ - function get($remote_file, $local_file = false) - { - if (!isset($this->ssh)) { - return false; - } - - if (!$this->ssh->exec('scp -f ' . escapeshellarg($remote_file), false)) { // -f = from - return false; - } - - $this->_send("\0"); - - if (!preg_match('#(?[^ ]+) (?\d+) (?.+)#', rtrim($this->_receive()), $info)) { - return false; - } - - $this->_send("\0"); - - $size = 0; - - if ($local_file !== false) { - $fp = @fopen($local_file, 'wb'); - if (!$fp) { - return false; - } - } - - $content = ''; - while ($size < $info['size']) { - $data = $this->_receive(); - // SCP usually seems to split stuff out into 16k chunks - $size+= strlen($data); - - if ($local_file === false) { - $content.= $data; - } else { - fputs($fp, $data); - } - } - - $this->_close(); - - if ($local_file !== false) { - fclose($fp); - return true; - } - - return $content; - } - - /** - * Sends a packet to an SSH server - * - * @param String $data - * @access private - */ - function _send($data) - { - switch ($this->mode) { - case NET_SCP_SSH2: - $this->ssh->_send_channel_packet(NET_SSH2_CHANNEL_EXEC, $data); - break; - case NET_SCP_SSH1: - $data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($data), $data); - $this->ssh->_send_binary_packet($data); - } - } - - /** - * Receives a packet from an SSH server - * - * @return String - * @access private - */ - function _receive() - { - switch ($this->mode) { - case NET_SCP_SSH2: - return $this->ssh->_get_channel_packet(NET_SSH2_CHANNEL_EXEC, true); - case NET_SCP_SSH1: - if (!$this->ssh->bitmap) { - return false; - } - while (true) { - $response = $this->ssh->_get_binary_packet(); - switch ($response[NET_SSH1_RESPONSE_TYPE]) { - case NET_SSH1_SMSG_STDOUT_DATA: - extract(unpack('Nlength', $response[NET_SSH1_RESPONSE_DATA])); - return $this->ssh->_string_shift($response[NET_SSH1_RESPONSE_DATA], $length); - case NET_SSH1_SMSG_STDERR_DATA: - break; - case NET_SSH1_SMSG_EXITSTATUS: - $this->ssh->_send_binary_packet(chr(NET_SSH1_CMSG_EXIT_CONFIRMATION)); - fclose($this->ssh->fsock); - $this->ssh->bitmap = 0; - return false; - default: - user_error('Unknown packet received', E_USER_NOTICE); - return false; - } - } - } - } - - /** - * Closes the connection to an SSH server - * - * @access private - */ - function _close() - { - switch ($this->mode) { - case NET_SCP_SSH2: - $this->ssh->_close_channel(NET_SSH2_CHANNEL_EXEC, true); - break; - case NET_SCP_SSH1: - $this->ssh->disconnect(); - } - } -} + + * login('username', 'password')) { + * exit('bad login'); + * } + * + * $scp = new Net_SCP($ssh); + * $scp->put('abcd', str_repeat('x', 1024*1024)); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Net + * @package Net_SCP + * @author Jim Wigginton + * @copyright 2010 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * @access public + * @see self::put() + */ +/** + * Reads data from a local file. + */ +define('NET_SCP_LOCAL_FILE', 1); +/** + * Reads data from a string. + */ +define('NET_SCP_STRING', 2); +/**#@-*/ + +/**#@+ + * @access private + * @see self::_send() + * @see self::_receive() + */ +/** + * SSH1 is being used. + */ +define('NET_SCP_SSH1', 1); +/** + * SSH2 is being used. + */ +define('NET_SCP_SSH2', 2); +/**#@-*/ + +/** + * Pure-PHP implementations of SCP. + * + * @package Net_SCP + * @author Jim Wigginton + * @access public + */ +class Net_SCP +{ + /** + * SSH Object + * + * @var object + * @access private + */ + var $ssh; + + /** + * Packet Size + * + * @var int + * @access private + */ + var $packet_size; + + /** + * Mode + * + * @var int + * @access private + */ + var $mode; + + /** + * Default Constructor. + * + * Connects to an SSH server + * + * @param Net_SSH1|Net_SSH2 $ssh + * @return Net_SCP + * @access public + */ + function __construct($ssh) + { + if (!is_object($ssh)) { + return; + } + + switch (strtolower(get_class($ssh))) { + case 'net_ssh2': + $this->mode = NET_SCP_SSH2; + break; + case 'net_ssh1': + $this->packet_size = 50000; + $this->mode = NET_SCP_SSH1; + break; + default: + return; + } + + $this->ssh = $ssh; + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param Net_SSH1|Net_SSH2 $ssh + * @access public + */ + function Net_SCP($ssh) + { + $this->__construct($ssh); + } + + /** + * Uploads a file to the SCP server. + * + * By default, Net_SCP::put() does not read from the local filesystem. $data is dumped directly into $remote_file. + * So, for example, if you set $data to 'filename.ext' and then do Net_SCP::get(), you will get a file, twelve bytes + * long, containing 'filename.ext' as its contents. + * + * Setting $mode to NET_SCP_LOCAL_FILE will change the above behavior. With NET_SCP_LOCAL_FILE, $remote_file will + * contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how + * large $remote_file will be, as well. + * + * Currently, only binary mode is supported. As such, if the line endings need to be adjusted, you will need to take + * care of that, yourself. + * + * @param string $remote_file + * @param string $data + * @param int $mode + * @param callable $callback + * @return bool + * @access public + */ + function put($remote_file, $data, $mode = NET_SCP_STRING, $callback = null) + { + if (!isset($this->ssh)) { + return false; + } + + if (empty($remote_file)) { + user_error('remote_file cannot be blank', E_USER_NOTICE); + return false; + } + + if (!$this->ssh->exec('scp -t ' . escapeshellarg($remote_file), false)) { // -t = to + return false; + } + + $temp = $this->_receive(); + if ($temp !== chr(0)) { + return false; + } + + if ($this->mode == NET_SCP_SSH2) { + $this->packet_size = $this->ssh->packet_size_client_to_server[NET_SSH2_CHANNEL_EXEC] - 4; + } + + $remote_file = basename($remote_file); + + if ($mode == NET_SCP_STRING) { + $size = strlen($data); + } else { + if (!is_file($data)) { + user_error("$data is not a valid file", E_USER_NOTICE); + return false; + } + + $fp = @fopen($data, 'rb'); + if (!$fp) { + return false; + } + $size = filesize($data); + } + + $this->_send('C0644 ' . $size . ' ' . $remote_file . "\n"); + + $temp = $this->_receive(); + if ($temp !== chr(0)) { + return false; + } + + $sent = 0; + while ($sent < $size) { + $temp = $mode & NET_SCP_STRING ? substr($data, $sent, $this->packet_size) : fread($fp, $this->packet_size); + $this->_send($temp); + $sent+= strlen($temp); + + if (is_callable($callback)) { + call_user_func($callback, $sent); + } + } + $this->_close(); + + if ($mode != NET_SCP_STRING) { + fclose($fp); + } + + return true; + } + + /** + * Downloads a file from the SCP server. + * + * Returns a string containing the contents of $remote_file if $local_file is left undefined or a boolean false if + * the operation was unsuccessful. If $local_file is defined, returns true or false depending on the success of the + * operation + * + * @param string $remote_file + * @param string $local_file + * @return mixed + * @access public + */ + function get($remote_file, $local_file = false) + { + if (!isset($this->ssh)) { + return false; + } + + if (!$this->ssh->exec('scp -f ' . escapeshellarg($remote_file), false)) { // -f = from + return false; + } + + $this->_send("\0"); + + if (!preg_match('#(?[^ ]+) (?\d+) (?.+)#', rtrim($this->_receive()), $info)) { + return false; + } + + $this->_send("\0"); + + $size = 0; + + if ($local_file !== false) { + $fp = @fopen($local_file, 'wb'); + if (!$fp) { + return false; + } + } + + $content = ''; + while ($size < $info['size']) { + $data = $this->_receive(); + // SCP usually seems to split stuff out into 16k chunks + $size+= strlen($data); + + if ($local_file === false) { + $content.= $data; + } else { + fputs($fp, $data); + } + } + + $this->_close(); + + if ($local_file !== false) { + fclose($fp); + return true; + } + + return $content; + } + + /** + * Sends a packet to an SSH server + * + * @param string $data + * @access private + */ + function _send($data) + { + switch ($this->mode) { + case NET_SCP_SSH2: + $this->ssh->_send_channel_packet(NET_SSH2_CHANNEL_EXEC, $data); + break; + case NET_SCP_SSH1: + $data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($data), $data); + $this->ssh->_send_binary_packet($data); + } + } + + /** + * Receives a packet from an SSH server + * + * @return string + * @access private + */ + function _receive() + { + switch ($this->mode) { + case NET_SCP_SSH2: + return $this->ssh->_get_channel_packet(NET_SSH2_CHANNEL_EXEC, true); + case NET_SCP_SSH1: + if (!$this->ssh->bitmap) { + return false; + } + while (true) { + $response = $this->ssh->_get_binary_packet(); + switch ($response[NET_SSH1_RESPONSE_TYPE]) { + case NET_SSH1_SMSG_STDOUT_DATA: + if (strlen($response[NET_SSH1_RESPONSE_DATA]) < 4) { + return false; + } + extract(unpack('Nlength', $response[NET_SSH1_RESPONSE_DATA])); + return $this->ssh->_string_shift($response[NET_SSH1_RESPONSE_DATA], $length); + case NET_SSH1_SMSG_STDERR_DATA: + break; + case NET_SSH1_SMSG_EXITSTATUS: + $this->ssh->_send_binary_packet(chr(NET_SSH1_CMSG_EXIT_CONFIRMATION)); + fclose($this->ssh->fsock); + $this->ssh->bitmap = 0; + return false; + default: + user_error('Unknown packet received', E_USER_NOTICE); + return false; + } + } + } + } + + /** + * Closes the connection to an SSH server + * + * @access private + */ + function _close() + { + switch ($this->mode) { + case NET_SCP_SSH2: + $this->ssh->_close_channel(NET_SSH2_CHANNEL_EXEC, true); + break; + case NET_SCP_SSH1: + $this->ssh->disconnect(); + } + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SFTP.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SFTP.php old mode 100644 new mode 100755 index 5f7d3666e..582704dc9 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SFTP.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SFTP.php @@ -1,2778 +1,3197 @@ - - * login('username', 'password')) { - * exit('Login Failed'); - * } - * - * echo $sftp->pwd() . "\r\n"; - * $sftp->put('filename.ext', 'hello, world!'); - * print_r($sftp->nlist()); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Net - * @package Net_SFTP - * @author Jim Wigginton - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * Include Net_SSH2 - */ -if (!class_exists('Net_SSH2')) { - include_once 'SSH2.php'; -} - -/**#@+ - * @access public - * @see Net_SFTP::getLog() - */ -/** - * Returns the message numbers - */ -define('NET_SFTP_LOG_SIMPLE', NET_SSH2_LOG_SIMPLE); -/** - * Returns the message content - */ -define('NET_SFTP_LOG_COMPLEX', NET_SSH2_LOG_COMPLEX); -/** - * Outputs the message content in real-time. - */ -define('NET_SFTP_LOG_REALTIME', 3); -/**#@-*/ - -/** - * SFTP channel constant - * - * Net_SSH2::exec() uses 0 and Net_SSH2::read() / Net_SSH2::write() use 1. - * - * @see Net_SSH2::_send_channel_packet() - * @see Net_SSH2::_get_channel_packet() - * @access private - */ -define('NET_SFTP_CHANNEL', 0x100); - -/**#@+ - * @access public - * @see Net_SFTP::put() - */ -/** - * Reads data from a local file. - */ -define('NET_SFTP_LOCAL_FILE', 1); -/** - * Reads data from a string. - */ -// this value isn't really used anymore but i'm keeping it reserved for historical reasons -define('NET_SFTP_STRING', 2); -/** - * Resumes an upload - */ -define('NET_SFTP_RESUME', 4); -/** - * Append a local file to an already existing remote file - */ -define('NET_SFTP_RESUME_START', 8); -/**#@-*/ - -/** - * Pure-PHP implementations of SFTP. - * - * @package Net_SFTP - * @author Jim Wigginton - * @access public - */ -class Net_SFTP extends Net_SSH2 -{ - /** - * Packet Types - * - * @see Net_SFTP::Net_SFTP() - * @var Array - * @access private - */ - var $packet_types = array(); - - /** - * Status Codes - * - * @see Net_SFTP::Net_SFTP() - * @var Array - * @access private - */ - var $status_codes = array(); - - /** - * The Request ID - * - * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support - * concurrent actions, so it's somewhat academic, here. - * - * @var Integer - * @see Net_SFTP::_send_sftp_packet() - * @access private - */ - var $request_id = false; - - /** - * The Packet Type - * - * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support - * concurrent actions, so it's somewhat academic, here. - * - * @var Integer - * @see Net_SFTP::_get_sftp_packet() - * @access private - */ - var $packet_type = -1; - - /** - * Packet Buffer - * - * @var String - * @see Net_SFTP::_get_sftp_packet() - * @access private - */ - var $packet_buffer = ''; - - /** - * Extensions supported by the server - * - * @var Array - * @see Net_SFTP::_initChannel() - * @access private - */ - var $extensions = array(); - - /** - * Server SFTP version - * - * @var Integer - * @see Net_SFTP::_initChannel() - * @access private - */ - var $version; - - /** - * Current working directory - * - * @var String - * @see Net_SFTP::_realpath() - * @see Net_SFTP::chdir() - * @access private - */ - var $pwd = false; - - /** - * Packet Type Log - * - * @see Net_SFTP::getLog() - * @var Array - * @access private - */ - var $packet_type_log = array(); - - /** - * Packet Log - * - * @see Net_SFTP::getLog() - * @var Array - * @access private - */ - var $packet_log = array(); - - /** - * Error information - * - * @see Net_SFTP::getSFTPErrors() - * @see Net_SFTP::getLastSFTPError() - * @var String - * @access private - */ - var $sftp_errors = array(); - - /** - * Stat Cache - * - * Rather than always having to open a directory and close it immediately there after to see if a file is a directory - * we'll cache the results. - * - * @see Net_SFTP::_update_stat_cache() - * @see Net_SFTP::_remove_from_stat_cache() - * @see Net_SFTP::_query_stat_cache() - * @var Array - * @access private - */ - var $stat_cache = array(); - - /** - * Max SFTP Packet Size - * - * @see Net_SFTP::Net_SFTP() - * @see Net_SFTP::get() - * @var Array - * @access private - */ - var $max_sftp_packet; - - /** - * Stat Cache Flag - * - * @see Net_SFTP::disableStatCache() - * @see Net_SFTP::enableStatCache() - * @var Boolean - * @access private - */ - var $use_stat_cache = true; - - /** - * Sort Options - * - * @see Net_SFTP::_comparator() - * @see Net_SFTP::setListOrder() - * @var Array - * @access private - */ - var $sortOptions = array(); - - /** - * Default Constructor. - * - * Connects to an SFTP server - * - * @param String $host - * @param optional Integer $port - * @param optional Integer $timeout - * @return Net_SFTP - * @access public - */ - function Net_SFTP($host, $port = 22, $timeout = 10) - { - parent::Net_SSH2($host, $port, $timeout); - - $this->max_sftp_packet = 1 << 15; - - $this->packet_types = array( - 1 => 'NET_SFTP_INIT', - 2 => 'NET_SFTP_VERSION', - /* the format of SSH_FXP_OPEN changed between SFTPv4 and SFTPv5+: - SFTPv5+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.1 - pre-SFTPv5 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3 */ - 3 => 'NET_SFTP_OPEN', - 4 => 'NET_SFTP_CLOSE', - 5 => 'NET_SFTP_READ', - 6 => 'NET_SFTP_WRITE', - 7 => 'NET_SFTP_LSTAT', - 9 => 'NET_SFTP_SETSTAT', - 11 => 'NET_SFTP_OPENDIR', - 12 => 'NET_SFTP_READDIR', - 13 => 'NET_SFTP_REMOVE', - 14 => 'NET_SFTP_MKDIR', - 15 => 'NET_SFTP_RMDIR', - 16 => 'NET_SFTP_REALPATH', - 17 => 'NET_SFTP_STAT', - /* the format of SSH_FXP_RENAME changed between SFTPv4 and SFTPv5+: - SFTPv5+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 - pre-SFTPv5 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.5 */ - 18 => 'NET_SFTP_RENAME', - 19 => 'NET_SFTP_READLINK', - 20 => 'NET_SFTP_SYMLINK', - - 101=> 'NET_SFTP_STATUS', - 102=> 'NET_SFTP_HANDLE', - /* the format of SSH_FXP_NAME changed between SFTPv3 and SFTPv4+: - SFTPv4+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.4 - pre-SFTPv4 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-7 */ - 103=> 'NET_SFTP_DATA', - 104=> 'NET_SFTP_NAME', - 105=> 'NET_SFTP_ATTRS', - - 200=> 'NET_SFTP_EXTENDED' - ); - $this->status_codes = array( - 0 => 'NET_SFTP_STATUS_OK', - 1 => 'NET_SFTP_STATUS_EOF', - 2 => 'NET_SFTP_STATUS_NO_SUCH_FILE', - 3 => 'NET_SFTP_STATUS_PERMISSION_DENIED', - 4 => 'NET_SFTP_STATUS_FAILURE', - 5 => 'NET_SFTP_STATUS_BAD_MESSAGE', - 6 => 'NET_SFTP_STATUS_NO_CONNECTION', - 7 => 'NET_SFTP_STATUS_CONNECTION_LOST', - 8 => 'NET_SFTP_STATUS_OP_UNSUPPORTED', - 9 => 'NET_SFTP_STATUS_INVALID_HANDLE', - 10 => 'NET_SFTP_STATUS_NO_SUCH_PATH', - 11 => 'NET_SFTP_STATUS_FILE_ALREADY_EXISTS', - 12 => 'NET_SFTP_STATUS_WRITE_PROTECT', - 13 => 'NET_SFTP_STATUS_NO_MEDIA', - 14 => 'NET_SFTP_STATUS_NO_SPACE_ON_FILESYSTEM', - 15 => 'NET_SFTP_STATUS_QUOTA_EXCEEDED', - 16 => 'NET_SFTP_STATUS_UNKNOWN_PRINCIPAL', - 17 => 'NET_SFTP_STATUS_LOCK_CONFLICT', - 18 => 'NET_SFTP_STATUS_DIR_NOT_EMPTY', - 19 => 'NET_SFTP_STATUS_NOT_A_DIRECTORY', - 20 => 'NET_SFTP_STATUS_INVALID_FILENAME', - 21 => 'NET_SFTP_STATUS_LINK_LOOP', - 22 => 'NET_SFTP_STATUS_CANNOT_DELETE', - 23 => 'NET_SFTP_STATUS_INVALID_PARAMETER', - 24 => 'NET_SFTP_STATUS_FILE_IS_A_DIRECTORY', - 25 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_CONFLICT', - 26 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_REFUSED', - 27 => 'NET_SFTP_STATUS_DELETE_PENDING', - 28 => 'NET_SFTP_STATUS_FILE_CORRUPT', - 29 => 'NET_SFTP_STATUS_OWNER_INVALID', - 30 => 'NET_SFTP_STATUS_GROUP_INVALID', - 31 => 'NET_SFTP_STATUS_NO_MATCHING_BYTE_RANGE_LOCK' - ); - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-7.1 - // the order, in this case, matters quite a lot - see Net_SFTP::_parseAttributes() to understand why - $this->attributes = array( - 0x00000001 => 'NET_SFTP_ATTR_SIZE', - 0x00000002 => 'NET_SFTP_ATTR_UIDGID', // defined in SFTPv3, removed in SFTPv4+ - 0x00000004 => 'NET_SFTP_ATTR_PERMISSIONS', - 0x00000008 => 'NET_SFTP_ATTR_ACCESSTIME', - // 0x80000000 will yield a floating point on 32-bit systems and converting floating points to integers - // yields inconsistent behavior depending on how php is compiled. so we left shift -1 (which, in - // two's compliment, consists of all 1 bits) by 31. on 64-bit systems this'll yield 0xFFFFFFFF80000000. - // that's not a problem, however, and 'anded' and a 32-bit number, as all the leading 1 bits are ignored. - -1 << 31 => 'NET_SFTP_ATTR_EXTENDED' - ); - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3 - // the flag definitions change somewhat in SFTPv5+. if SFTPv5+ support is added to this library, maybe name - // the array for that $this->open5_flags and similarily alter the constant names. - $this->open_flags = array( - 0x00000001 => 'NET_SFTP_OPEN_READ', - 0x00000002 => 'NET_SFTP_OPEN_WRITE', - 0x00000004 => 'NET_SFTP_OPEN_APPEND', - 0x00000008 => 'NET_SFTP_OPEN_CREATE', - 0x00000010 => 'NET_SFTP_OPEN_TRUNCATE', - 0x00000020 => 'NET_SFTP_OPEN_EXCL' - ); - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 - // see Net_SFTP::_parseLongname() for an explanation - $this->file_types = array( - 1 => 'NET_SFTP_TYPE_REGULAR', - 2 => 'NET_SFTP_TYPE_DIRECTORY', - 3 => 'NET_SFTP_TYPE_SYMLINK', - 4 => 'NET_SFTP_TYPE_SPECIAL', - 5 => 'NET_SFTP_TYPE_UNKNOWN', - // the followin types were first defined for use in SFTPv5+ - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 - 6 => 'NET_SFTP_TYPE_SOCKET', - 7 => 'NET_SFTP_TYPE_CHAR_DEVICE', - 8 => 'NET_SFTP_TYPE_BLOCK_DEVICE', - 9 => 'NET_SFTP_TYPE_FIFO' - ); - $this->_define_array( - $this->packet_types, - $this->status_codes, - $this->attributes, - $this->open_flags, - $this->file_types - ); - - if (!defined('NET_SFTP_QUEUE_SIZE')) { - define('NET_SFTP_QUEUE_SIZE', 50); - } - } - - /** - * Login - * - * @param String $username - * @param optional String $password - * @return Boolean - * @access public - */ - function login($username) - { - $args = func_get_args(); - if (!call_user_func_array(array(&$this, '_login'), $args)) { - return false; - } - - $this->window_size_server_to_client[NET_SFTP_CHANNEL] = $this->window_size; - - $packet = pack('CNa*N3', - NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SFTP_CHANNEL, $this->window_size, 0x4000); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_OPEN; - - $response = $this->_get_channel_packet(NET_SFTP_CHANNEL); - if ($response === false) { - return false; - } - - $packet = pack('CNNa*CNa*', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SFTP_CHANNEL], strlen('subsystem'), 'subsystem', 1, strlen('sftp'), 'sftp'); - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->_get_channel_packet(NET_SFTP_CHANNEL); - if ($response === false) { - // from PuTTY's psftp.exe - $command = "test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n" . - "test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n" . - "exec sftp-server"; - // we don't do $this->exec($command, false) because exec() operates on a different channel and plus the SSH_MSG_CHANNEL_OPEN that exec() does - // is redundant - $packet = pack('CNNa*CNa*', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SFTP_CHANNEL], strlen('exec'), 'exec', 1, strlen($command), $command); - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->_get_channel_packet(NET_SFTP_CHANNEL); - if ($response === false) { - return false; - } - } - - $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_DATA; - - if (!$this->_send_sftp_packet(NET_SFTP_INIT, "\0\0\0\3")) { - return false; - } - - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_VERSION) { - user_error('Expected SSH_FXP_VERSION'); - return false; - } - - extract(unpack('Nversion', $this->_string_shift($response, 4))); - $this->version = $version; - while (!empty($response)) { - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $key = $this->_string_shift($response, $length); - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $value = $this->_string_shift($response, $length); - $this->extensions[$key] = $value; - } - - /* - SFTPv4+ defines a 'newline' extension. SFTPv3 seems to have unofficial support for it via 'newline@vandyke.com', - however, I'm not sure what 'newline@vandyke.com' is supposed to do (the fact that it's unofficial means that it's - not in the official SFTPv3 specs) and 'newline@vandyke.com' / 'newline' are likely not drop-in substitutes for - one another due to the fact that 'newline' comes with a SSH_FXF_TEXT bitmask whereas it seems unlikely that - 'newline@vandyke.com' would. - */ - /* - if (isset($this->extensions['newline@vandyke.com'])) { - $this->extensions['newline'] = $this->extensions['newline@vandyke.com']; - unset($this->extensions['newline@vandyke.com']); - } - */ - - $this->request_id = 1; - - /* - A Note on SFTPv4/5/6 support: - states the following: - - "If the client wishes to interoperate with servers that support noncontiguous version - numbers it SHOULD send '3'" - - Given that the server only sends its version number after the client has already done so, the above - seems to be suggesting that v3 should be the default version. This makes sense given that v3 is the - most popular. - - states the following; - - "If the server did not send the "versions" extension, or the version-from-list was not included, the - server MAY send a status response describing the failure, but MUST then close the channel without - processing any further requests." - - So what do you do if you have a client whose initial SSH_FXP_INIT packet says it implements v3 and - a server whose initial SSH_FXP_VERSION reply says it implements v4 and only v4? If it only implements - v4, the "versions" extension is likely not going to have been sent so version re-negotiation as discussed - in draft-ietf-secsh-filexfer-13 would be quite impossible. As such, what Net_SFTP would do is close the - channel and reopen it with a new and updated SSH_FXP_INIT packet. - */ - switch ($this->version) { - case 2: - case 3: - break; - default: - return false; - } - - $this->pwd = $this->_realpath('.'); - - $this->_update_stat_cache($this->pwd, array()); - - return true; - } - - /** - * Disable the stat cache - * - * @access public - */ - function disableStatCache() - { - $this->use_stat_cache = false; - } - - /** - * Enable the stat cache - * - * @access public - */ - function enableStatCache() - { - $this->use_stat_cache = true; - } - - /** - * Clear the stat cache - * - * @access public - */ - function clearStatCache() - { - $this->stat_cache = array(); - } - - /** - * Returns the current directory name - * - * @return Mixed - * @access public - */ - function pwd() - { - return $this->pwd; - } - - /** - * Logs errors - * - * @param String $response - * @param optional Integer $status - * @access public - */ - function _logError($response, $status = -1) - { - if ($status == -1) { - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - } - - $error = $this->status_codes[$status]; - - if ($this->version > 2) { - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->sftp_errors[] = $error . ': ' . $this->_string_shift($response, $length); - } else { - $this->sftp_errors[] = $error; - } - } - - /** - * Canonicalize the Server-Side Path Name - * - * SFTP doesn't provide a mechanism by which the current working directory can be changed, so we'll emulate it. Returns - * the absolute (canonicalized) path. - * - * @see Net_SFTP::chdir() - * @param String $path - * @return Mixed - * @access private - */ - function _realpath($path) - { - if ($this->pwd === false) { - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.9 - if (!$this->_send_sftp_packet(NET_SFTP_REALPATH, pack('Na*', strlen($path), $path))) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_NAME: - // although SSH_FXP_NAME is implemented differently in SFTPv3 than it is in SFTPv4+, the following - // should work on all SFTP versions since the only part of the SSH_FXP_NAME packet the following looks - // at is the first part and that part is defined the same in SFTP versions 3 through 6. - $this->_string_shift($response, 4); // skip over the count - it should be 1, anyway - extract(unpack('Nlength', $this->_string_shift($response, 4))); - return $this->_string_shift($response, $length); - case NET_SFTP_STATUS: - $this->_logError($response); - return false; - default: - user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS'); - return false; - } - } - - if ($path[0] != '/') { - $path = $this->pwd . '/' . $path; - } - - $path = explode('/', $path); - $new = array(); - foreach ($path as $dir) { - if (!strlen($dir)) { - continue; - } - switch ($dir) { - case '..': - array_pop($new); - case '.': - break; - default: - $new[] = $dir; - } - } - - return '/' . implode('/', $new); - } - - /** - * Changes the current directory - * - * @param String $dir - * @return Boolean - * @access public - */ - function chdir($dir) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - // assume current dir if $dir is empty - if ($dir === '') { - $dir = './'; - // suffix a slash if needed - } elseif ($dir[strlen($dir) - 1] != '/') { - $dir.= '/'; - } - - $dir = $this->_realpath($dir); - - // confirm that $dir is, in fact, a valid directory - if ($this->use_stat_cache && is_array($this->_query_stat_cache($dir))) { - $this->pwd = $dir; - return true; - } - - // we could do a stat on the alleged $dir to see if it's a directory but that doesn't tell us - // the currently logged in user has the appropriate permissions or not. maybe you could see if - // the file's uid / gid match the currently logged in user's uid / gid but how there's no easy - // way to get those with SFTP - - if (!$this->_send_sftp_packet(NET_SFTP_OPENDIR, pack('Na*', strlen($dir), $dir))) { - return false; - } - - // see Net_SFTP::nlist() for a more thorough explanation of the following - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $handle = substr($response, 4); - break; - case NET_SFTP_STATUS: - $this->_logError($response); - return false; - default: - user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); - return false; - } - - if (!$this->_close_handle($handle)) { - return false; - } - - $this->_update_stat_cache($dir, array()); - - $this->pwd = $dir; - return true; - } - - /** - * Returns a list of files in the given directory - * - * @param optional String $dir - * @param optional Boolean $recursive - * @return Mixed - * @access public - */ - function nlist($dir = '.', $recursive = false) - { - return $this->_nlist_helper($dir, $recursive, ''); - } - - /** - * Helper method for nlist - * - * @param String $dir - * @param Boolean $recursive - * @param String $relativeDir - * @return Mixed - * @access private - */ - function _nlist_helper($dir, $recursive, $relativeDir) - { - $files = $this->_list($dir, false); - - if (!$recursive) { - return $files; - } - - $result = array(); - foreach ($files as $value) { - if ($value == '.' || $value == '..') { - if ($relativeDir == '') { - $result[] = $value; - } - continue; - } - if (is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $value)))) { - $temp = $this->_nlist_helper($dir . '/' . $value, true, $relativeDir . $value . '/'); - $result = array_merge($result, $temp); - } else { - $result[] = $relativeDir . $value; - } - } - - return $result; - } - - /** - * Returns a detailed list of files in the given directory - * - * @param optional String $dir - * @param optional Boolean $recursive - * @return Mixed - * @access public - */ - function rawlist($dir = '.', $recursive = false) - { - $files = $this->_list($dir, true); - if (!$recursive || $files === false) { - return $files; - } - - static $depth = 0; - - foreach ($files as $key=>$value) { - if ($depth != 0 && $key == '..') { - unset($files[$key]); - continue; - } - if ($key != '.' && $key != '..' && is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key)))) { - $depth++; - $files[$key] = $this->rawlist($dir . '/' . $key, true); - $depth--; - } else { - $files[$key] = (object) $value; - } - } - - return $files; - } - - /** - * Reads a list, be it detailed or not, of files in the given directory - * - * @param String $dir - * @param optional Boolean $raw - * @return Mixed - * @access private - */ - function _list($dir, $raw = true) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $dir = $this->_realpath($dir . '/'); - if ($dir === false) { - return false; - } - - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.2 - if (!$this->_send_sftp_packet(NET_SFTP_OPENDIR, pack('Na*', strlen($dir), $dir))) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.2 - // since 'handle' is the last field in the SSH_FXP_HANDLE packet, we'll just remove the first four bytes that - // represent the length of the string and leave it at that - $handle = substr($response, 4); - break; - case NET_SFTP_STATUS: - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - $this->_logError($response); - return false; - default: - user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); - return false; - } - - $this->_update_stat_cache($dir, array()); - - $contents = array(); - while (true) { - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.2 - // why multiple SSH_FXP_READDIR packets would be sent when the response to a single one can span arbitrarily many - // SSH_MSG_CHANNEL_DATA messages is not known to me. - if (!$this->_send_sftp_packet(NET_SFTP_READDIR, pack('Na*', strlen($handle), $handle))) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_NAME: - extract(unpack('Ncount', $this->_string_shift($response, 4))); - for ($i = 0; $i < $count; $i++) { - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $shortname = $this->_string_shift($response, $length); - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $longname = $this->_string_shift($response, $length); - $attributes = $this->_parseAttributes($response); - if (!isset($attributes['type'])) { - $fileType = $this->_parseLongname($longname); - if ($fileType) { - $attributes['type'] = $fileType; - } - } - $contents[$shortname] = $attributes + array('filename' => $shortname); - - if (isset($attributes['type']) && $attributes['type'] == NET_SFTP_TYPE_DIRECTORY && ($shortname != '.' && $shortname != '..')) { - $this->_update_stat_cache($dir . '/' . $shortname, array()); - } else { - if ($shortname == '..') { - $temp = $this->_realpath($dir . '/..') . '/.'; - } else { - $temp = $dir . '/' . $shortname; - } - $this->_update_stat_cache($temp, (object) $attributes); - } - // SFTPv6 has an optional boolean end-of-list field, but we'll ignore that, since the - // final SSH_FXP_STATUS packet should tell us that, already. - } - break; - case NET_SFTP_STATUS: - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_EOF) { - $this->_logError($response, $status); - return false; - } - break 2; - default: - user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS'); - return false; - } - } - - if (!$this->_close_handle($handle)) { - return false; - } - - if (count($this->sortOptions)) { - uasort($contents, array(&$this, '_comparator')); - } - - return $raw ? $contents : array_keys($contents); - } - - /** - * Compares two rawlist entries using parameters set by setListOrder() - * - * Intended for use with uasort() - * - * @param Array $a - * @param Array $b - * @return Integer - * @access private - */ - function _comparator($a, $b) - { - switch (true) { - case $a['filename'] === '.' || $b['filename'] === '.': - if ($a['filename'] === $b['filename']) { - return 0; - } - return $a['filename'] === '.' ? -1 : 1; - case $a['filename'] === '..' || $b['filename'] === '..': - if ($a['filename'] === $b['filename']) { - return 0; - } - return $a['filename'] === '..' ? -1 : 1; - case isset($a['type']) && $a['type'] === NET_SFTP_TYPE_DIRECTORY: - if (!isset($b['type'])) { - return 1; - } - if ($b['type'] !== $a['type']) { - return -1; - } - break; - case isset($b['type']) && $b['type'] === NET_SFTP_TYPE_DIRECTORY: - return 1; - } - foreach ($this->sortOptions as $sort => $order) { - if (!isset($a[$sort]) || !isset($b[$sort])) { - if (isset($a[$sort])) { - return -1; - } - if (isset($b[$sort])) { - return 1; - } - return 0; - } - switch ($sort) { - case 'filename': - $result = strcasecmp($a['filename'], $b['filename']); - if ($result) { - return $order === SORT_DESC ? -$result : $result; - } - break; - case 'permissions': - case 'mode': - $a[$sort]&= 07777; - $b[$sort]&= 07777; - default: - if ($a[$sort] === $b[$sort]) { - break; - } - return $order === SORT_ASC ? $a[$sort] - $b[$sort] : $b[$sort] - $a[$sort]; - } - } - } - - /** - * Defines how nlist() and rawlist() will be sorted - if at all. - * - * If sorting is enabled directories and files will be sorted independently with - * directories appearing before files in the resultant array that is returned. - * - * Any parameter returned by stat is a valid sort parameter for this function. - * Filename comparisons are case insensitive. - * - * Examples: - * - * $sftp->setListOrder('filename', SORT_ASC); - * $sftp->setListOrder('size', SORT_DESC, 'filename', SORT_ASC); - * $sftp->setListOrder(true); - * Separates directories from files but doesn't do any sorting beyond that - * $sftp->setListOrder(); - * Don't do any sort of sorting - * - * @access public - */ - function setListOrder() - { - $this->sortOptions = array(); - $args = func_get_args(); - if (empty($args)) { - return; - } - $len = count($args) & 0x7FFFFFFE; - for ($i = 0; $i < $len; $i+=2) { - $this->sortOptions[$args[$i]] = $args[$i + 1]; - } - if (!count($this->sortOptions)) { - $this->sortOptions = array('bogus' => true); - } - } - - /** - * Returns the file size, in bytes, or false, on failure - * - * Files larger than 4GB will show up as being exactly 4GB. - * - * @param String $filename - * @return Mixed - * @access public - */ - function size($filename) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $result = $this->stat($filename); - if ($result === false) { - return false; - } - return isset($result['size']) ? $result['size'] : -1; - } - - /** - * Save files / directories to cache - * - * @param String $path - * @param Mixed $value - * @access private - */ - function _update_stat_cache($path, $value) - { - // preg_replace('#^/|/(?=/)|/$#', '', $dir) == str_replace('//', '/', trim($path, '/')) - $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); - - $temp = &$this->stat_cache; - $max = count($dirs) - 1; - foreach ($dirs as $i=>$dir) { - if (!isset($temp[$dir])) { - $temp[$dir] = array(); - } - if ($i === $max) { - $temp[$dir] = $value; - break; - } - $temp = &$temp[$dir]; - } - } - - /** - * Remove files / directories from cache - * - * @param String $path - * @return Boolean - * @access private - */ - function _remove_from_stat_cache($path) - { - $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); - - $temp = &$this->stat_cache; - $max = count($dirs) - 1; - foreach ($dirs as $i=>$dir) { - if ($i === $max) { - unset($temp[$dir]); - return true; - } - if (!isset($temp[$dir])) { - return false; - } - $temp = &$temp[$dir]; - } - } - - /** - * Checks cache for path - * - * Mainly used by file_exists - * - * @param String $dir - * @return Mixed - * @access private - */ - function _query_stat_cache($path) - { - $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); - - $temp = &$this->stat_cache; - foreach ($dirs as $dir) { - if (!isset($temp[$dir])) { - return null; - } - $temp = &$temp[$dir]; - } - return $temp; - } - - /** - * Returns general information about a file. - * - * Returns an array on success and false otherwise. - * - * @param String $filename - * @return Mixed - * @access public - */ - function stat($filename) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $filename = $this->_realpath($filename); - if ($filename === false) { - return false; - } - - if ($this->use_stat_cache) { - $result = $this->_query_stat_cache($filename); - if (is_array($result) && isset($result['.'])) { - return (array) $result['.']; - } - if (is_object($result)) { - return (array) $result; - } - } - - $stat = $this->_stat($filename, NET_SFTP_STAT); - if ($stat === false) { - $this->_remove_from_stat_cache($filename); - return false; - } - if (isset($stat['type'])) { - if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename.= '/.'; - } - $this->_update_stat_cache($filename, (object) $stat); - return $stat; - } - - $pwd = $this->pwd; - $stat['type'] = $this->chdir($filename) ? - NET_SFTP_TYPE_DIRECTORY : - NET_SFTP_TYPE_REGULAR; - $this->pwd = $pwd; - - if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename.= '/.'; - } - $this->_update_stat_cache($filename, (object) $stat); - - return $stat; - } - - /** - * Returns general information about a file or symbolic link. - * - * Returns an array on success and false otherwise. - * - * @param String $filename - * @return Mixed - * @access public - */ - function lstat($filename) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $filename = $this->_realpath($filename); - if ($filename === false) { - return false; - } - - if ($this->use_stat_cache) { - $result = $this->_query_stat_cache($filename); - if (is_array($result) && isset($result['.'])) { - return (array) $result['.']; - } - if (is_object($result)) { - return (array) $result; - } - } - - $lstat = $this->_stat($filename, NET_SFTP_LSTAT); - if ($lstat === false) { - $this->_remove_from_stat_cache($filename); - return false; - } - if (isset($lstat['type'])) { - if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename.= '/.'; - } - $this->_update_stat_cache($filename, (object) $lstat); - return $lstat; - } - - $stat = $this->_stat($filename, NET_SFTP_STAT); - - if ($lstat != $stat) { - $lstat = array_merge($lstat, array('type' => NET_SFTP_TYPE_SYMLINK)); - $this->_update_stat_cache($filename, (object) $lstat); - return $stat; - } - - $pwd = $this->pwd; - $lstat['type'] = $this->chdir($filename) ? - NET_SFTP_TYPE_DIRECTORY : - NET_SFTP_TYPE_REGULAR; - $this->pwd = $pwd; - - if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename.= '/.'; - } - $this->_update_stat_cache($filename, (object) $lstat); - - return $lstat; - } - - /** - * Returns general information about a file or symbolic link - * - * Determines information without calling Net_SFTP::_realpath(). - * The second parameter can be either NET_SFTP_STAT or NET_SFTP_LSTAT. - * - * @param String $filename - * @param Integer $type - * @return Mixed - * @access private - */ - function _stat($filename, $type) - { - // SFTPv4+ adds an additional 32-bit integer field - flags - to the following: - $packet = pack('Na*', strlen($filename), $filename); - if (!$this->_send_sftp_packet($type, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_ATTRS: - return $this->_parseAttributes($response); - case NET_SFTP_STATUS: - $this->_logError($response); - return false; - } - - user_error('Expected SSH_FXP_ATTRS or SSH_FXP_STATUS'); - return false; - } - - /** - * Truncates a file to a given length - * - * @param String $filename - * @param Integer $new_size - * @return Boolean - * @access public - */ - function truncate($filename, $new_size) - { - $attr = pack('N3', NET_SFTP_ATTR_SIZE, $new_size / 4294967296, $new_size); // 4294967296 == 0x100000000 == 1<<32 - - return $this->_setstat($filename, $attr, false); - } - - /** - * Sets access and modification time of file. - * - * If the file does not exist, it will be created. - * - * @param String $filename - * @param optional Integer $time - * @param optional Integer $atime - * @return Boolean - * @access public - */ - function touch($filename, $time = null, $atime = null) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $filename = $this->_realpath($filename); - if ($filename === false) { - return false; - } - - if (!isset($time)) { - $time = time(); - } - if (!isset($atime)) { - $atime = $time; - } - - $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE | NET_SFTP_OPEN_EXCL; - $attr = pack('N3', NET_SFTP_ATTR_ACCESSTIME, $time, $atime); - $packet = pack('Na*Na*', strlen($filename), $filename, $flags, $attr); - if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - return $this->_close_handle(substr($response, 4)); - case NET_SFTP_STATUS: - $this->_logError($response); - break; - default: - user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); - return false; - } - - return $this->_setstat($filename, $attr, false); - } - - /** - * Changes file or directory owner - * - * Returns true on success or false on error. - * - * @param String $filename - * @param Integer $uid - * @param optional Boolean $recursive - * @return Boolean - * @access public - */ - function chown($filename, $uid, $recursive = false) - { - // quoting from , - // "if the owner or group is specified as -1, then that ID is not changed" - $attr = pack('N3', NET_SFTP_ATTR_UIDGID, $uid, -1); - - return $this->_setstat($filename, $attr, $recursive); - } - - /** - * Changes file or directory group - * - * Returns true on success or false on error. - * - * @param String $filename - * @param Integer $gid - * @param optional Boolean $recursive - * @return Boolean - * @access public - */ - function chgrp($filename, $gid, $recursive = false) - { - $attr = pack('N3', NET_SFTP_ATTR_UIDGID, -1, $gid); - - return $this->_setstat($filename, $attr, $recursive); - } - - /** - * Set permissions on a file. - * - * Returns the new file permissions on success or false on error. - * If $recursive is true than this just returns true or false. - * - * @param Integer $mode - * @param String $filename - * @param optional Boolean $recursive - * @return Mixed - * @access public - */ - function chmod($mode, $filename, $recursive = false) - { - if (is_string($mode) && is_int($filename)) { - $temp = $mode; - $mode = $filename; - $filename = $temp; - } - - $attr = pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); - if (!$this->_setstat($filename, $attr, $recursive)) { - return false; - } - if ($recursive) { - return true; - } - - // rather than return what the permissions *should* be, we'll return what they actually are. this will also - // tell us if the file actually exists. - // incidentally, SFTPv4+ adds an additional 32-bit integer field - flags - to the following: - $packet = pack('Na*', strlen($filename), $filename); - if (!$this->_send_sftp_packet(NET_SFTP_STAT, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_ATTRS: - $attrs = $this->_parseAttributes($response); - return $attrs['permissions']; - case NET_SFTP_STATUS: - $this->_logError($response); - return false; - } - - user_error('Expected SSH_FXP_ATTRS or SSH_FXP_STATUS'); - return false; - } - - /** - * Sets information about a file - * - * @param String $filename - * @param String $attr - * @param Boolean $recursive - * @return Boolean - * @access private - */ - function _setstat($filename, $attr, $recursive) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $filename = $this->_realpath($filename); - if ($filename === false) { - return false; - } - - $this->_remove_from_stat_cache($filename); - - if ($recursive) { - $i = 0; - $result = $this->_setstat_recursive($filename, $attr, $i); - $this->_read_put_responses($i); - return $result; - } - - // SFTPv4+ has an additional byte field - type - that would need to be sent, as well. setting it to - // SSH_FILEXFER_TYPE_UNKNOWN might work. if not, we'd have to do an SSH_FXP_STAT before doing an SSH_FXP_SETSTAT. - if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($filename), $filename, $attr))) { - return false; - } - - /* - "Because some systems must use separate system calls to set various attributes, it is possible that a failure - response will be returned, but yet some of the attributes may be have been successfully modified. If possible, - servers SHOULD avoid this situation; however, clients MUST be aware that this is possible." - - -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.6 - */ - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - return false; - } - - return true; - } - - /** - * Recursively sets information on directories on the SFTP server - * - * Minimizes directory lookups and SSH_FXP_STATUS requests for speed. - * - * @param String $path - * @param String $attr - * @param Integer $i - * @return Boolean - * @access private - */ - function _setstat_recursive($path, $attr, &$i) - { - if (!$this->_read_put_responses($i)) { - return false; - } - $i = 0; - $entries = $this->_list($path, true); - - if ($entries === false) { - return $this->_setstat($path, $attr, false); - } - - // normally $entries would have at least . and .. but it might not if the directories - // permissions didn't allow reading - if (empty($entries)) { - return false; - } - - unset($entries['.'], $entries['..']); - foreach ($entries as $filename=>$props) { - if (!isset($props['type'])) { - return false; - } - - $temp = $path . '/' . $filename; - if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { - if (!$this->_setstat_recursive($temp, $attr, $i)) { - return false; - } - } else { - if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($temp), $temp, $attr))) { - return false; - } - - $i++; - - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->_read_put_responses($i)) { - return false; - } - $i = 0; - } - } - } - - if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($path), $path, $attr))) { - return false; - } - - $i++; - - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->_read_put_responses($i)) { - return false; - } - $i = 0; - } - - return true; - } - - /** - * Return the target of a symbolic link - * - * @param String $link - * @return Mixed - * @access public - */ - function readlink($link) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $link = $this->_realpath($link); - - if (!$this->_send_sftp_packet(NET_SFTP_READLINK, pack('Na*', strlen($link), $link))) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_NAME: - break; - case NET_SFTP_STATUS: - $this->_logError($response); - return false; - default: - user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Ncount', $this->_string_shift($response, 4))); - // the file isn't a symlink - if (!$count) { - return false; - } - - extract(unpack('Nlength', $this->_string_shift($response, 4))); - return $this->_string_shift($response, $length); - } - - /** - * Create a symlink - * - * symlink() creates a symbolic link to the existing target with the specified name link. - * - * @param String $target - * @param String $link - * @return Boolean - * @access public - */ - function symlink($target, $link) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $target = $this->_realpath($target); - $link = $this->_realpath($link); - - $packet = pack('Na*Na*', strlen($target), $target, strlen($link), $link); - if (!$this->_send_sftp_packet(NET_SFTP_SYMLINK, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - return false; - } - - return true; - } - - /** - * Creates a directory. - * - * @param String $dir - * @return Boolean - * @access public - */ - function mkdir($dir, $mode = -1, $recursive = false) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $dir = $this->_realpath($dir); - // by not providing any permissions, hopefully the server will use the logged in users umask - their - // default permissions. - $attr = $mode == -1 ? "\0\0\0\0" : pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); - - if ($recursive) { - $dirs = explode('/', preg_replace('#/(?=/)|/$#', '', $dir)); - if (empty($dirs[0])) { - array_shift($dirs); - $dirs[0] = '/' . $dirs[0]; - } - for ($i = 0; $i < count($dirs); $i++) { - $temp = array_slice($dirs, 0, $i + 1); - $temp = implode('/', $temp); - $result = $this->_mkdir_helper($temp, $attr); - } - return $result; - } - - return $this->_mkdir_helper($dir, $attr); - } - - /** - * Helper function for directory creation - * - * @param String $dir - * @return Boolean - * @access private - */ - function _mkdir_helper($dir, $attr) - { - if (!$this->_send_sftp_packet(NET_SFTP_MKDIR, pack('Na*a*', strlen($dir), $dir, $attr))) { - return false; - } - - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - return false; - } - - return true; - } - - /** - * Removes a directory. - * - * @param String $dir - * @return Boolean - * @access public - */ - function rmdir($dir) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $dir = $this->_realpath($dir); - if ($dir === false) { - return false; - } - - if (!$this->_send_sftp_packet(NET_SFTP_RMDIR, pack('Na*', strlen($dir), $dir))) { - return false; - } - - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED? - $this->_logError($response, $status); - return false; - } - - $this->_remove_from_stat_cache($dir); - // the following will do a soft delete, which would be useful if you deleted a file - // and then tried to do a stat on the deleted file. the above, in contrast, does - // a hard delete - //$this->_update_stat_cache($dir, false); - - return true; - } - - /** - * Uploads a file to the SFTP server. - * - * By default, Net_SFTP::put() does not read from the local filesystem. $data is dumped directly into $remote_file. - * So, for example, if you set $data to 'filename.ext' and then do Net_SFTP::get(), you will get a file, twelve bytes - * long, containing 'filename.ext' as its contents. - * - * Setting $mode to NET_SFTP_LOCAL_FILE will change the above behavior. With NET_SFTP_LOCAL_FILE, $remote_file will - * contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how - * large $remote_file will be, as well. - * - * If $data is a resource then it'll be used as a resource instead. - * - * Currently, only binary mode is supported. As such, if the line endings need to be adjusted, you will need to take - * care of that, yourself. - * - * $mode can take an additional two parameters - NET_SFTP_RESUME and NET_SFTP_RESUME_START. These are bitwise AND'd with - * $mode. So if you want to resume upload of a 300mb file on the local file system you'd set $mode to the following: - * - * NET_SFTP_LOCAL_FILE | NET_SFTP_RESUME - * - * If you wanted to simply append the full contents of a local file to the full contents of a remote file you'd replace - * NET_SFTP_RESUME with NET_SFTP_RESUME_START. - * - * If $mode & (NET_SFTP_RESUME | NET_SFTP_RESUME_START) then NET_SFTP_RESUME_START will be assumed. - * - * $start and $local_start give you more fine grained control over this process and take precident over NET_SFTP_RESUME - * when they're non-negative. ie. $start could let you write at the end of a file (like NET_SFTP_RESUME) or in the middle - * of one. $local_start could let you start your reading from the end of a file (like NET_SFTP_RESUME_START) or in the - * middle of one. - * - * Setting $local_start to > 0 or $mode | NET_SFTP_RESUME_START doesn't do anything unless $mode | NET_SFTP_LOCAL_FILE. - * - * @param String $remote_file - * @param String|resource $data - * @param optional Integer $mode - * @param optional Integer $start - * @param optional Integer $local_start - * @return Boolean - * @access public - * @internal ASCII mode for SFTPv4/5/6 can be supported by adding a new function - Net_SFTP::setMode(). - */ - function put($remote_file, $data, $mode = NET_SFTP_STRING, $start = -1, $local_start = -1) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $remote_file = $this->_realpath($remote_file); - if ($remote_file === false) { - return false; - } - - $this->_remove_from_stat_cache($remote_file); - - $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE; - // according to the SFTP specs, NET_SFTP_OPEN_APPEND should "force all writes to append data at the end of the file." - // in practice, it doesn't seem to do that. - //$flags|= ($mode & NET_SFTP_RESUME) ? NET_SFTP_OPEN_APPEND : NET_SFTP_OPEN_TRUNCATE; - - if ($start >= 0) { - $offset = $start; - } elseif ($mode & NET_SFTP_RESUME) { - // if NET_SFTP_OPEN_APPEND worked as it should _size() wouldn't need to be called - $size = $this->size($remote_file); - $offset = $size !== false ? $size : 0; - } else { - $offset = 0; - $flags|= NET_SFTP_OPEN_TRUNCATE; - } - - $packet = pack('Na*N2', strlen($remote_file), $remote_file, $flags, 0); - if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $handle = substr($response, 4); - break; - case NET_SFTP_STATUS: - $this->_logError($response); - return false; - default: - user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); - return false; - } - - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.3 - switch (true) { - case is_resource($data): - $mode = $mode & ~NET_SFTP_LOCAL_FILE; - $fp = $data; - break; - case $mode & NET_SFTP_LOCAL_FILE: - if (!is_file($data)) { - user_error("$data is not a valid file"); - return false; - } - $fp = @fopen($data, 'rb'); - if (!$fp) { - return false; - } - } - - if (isset($fp)) { - $stat = fstat($fp); - $size = $stat['size']; - - if ($local_start >= 0) { - fseek($fp, $local_start); - } elseif ($mode & NET_SFTP_RESUME_START) { - // do nothing - } else { - fseek($fp, $offset); - } - } else { - $size = strlen($data); - } - - $sent = 0; - $size = $size < 0 ? ($size & 0x7FFFFFFF) + 0x80000000 : $size; - - $sftp_packet_size = 4096; // PuTTY uses 4096 - // make the SFTP packet be exactly 4096 bytes by including the bytes in the NET_SFTP_WRITE packets "header" - $sftp_packet_size-= strlen($handle) + 25; - $i = 0; - while ($sent < $size) { - $temp = isset($fp) ? fread($fp, $sftp_packet_size) : substr($data, $sent, $sftp_packet_size); - $subtemp = $offset + $sent; - $packet = pack('Na*N3a*', strlen($handle), $handle, $subtemp / 4294967296, $subtemp, strlen($temp), $temp); - if (!$this->_send_sftp_packet(NET_SFTP_WRITE, $packet)) { - if ($mode & NET_SFTP_LOCAL_FILE) { - fclose($fp); - } - return false; - } - $sent+= strlen($temp); - - $i++; - - if ($i == NET_SFTP_QUEUE_SIZE) { - if (!$this->_read_put_responses($i)) { - $i = 0; - break; - } - $i = 0; - } - } - - if (!$this->_read_put_responses($i)) { - if ($mode & NET_SFTP_LOCAL_FILE) { - fclose($fp); - } - $this->_close_handle($handle); - return false; - } - - if ($mode & NET_SFTP_LOCAL_FILE) { - fclose($fp); - } - - return $this->_close_handle($handle); - } - - /** - * Reads multiple successive SSH_FXP_WRITE responses - * - * Sending an SSH_FXP_WRITE packet and immediately reading its response isn't as efficient as blindly sending out $i - * SSH_FXP_WRITEs, in succession, and then reading $i responses. - * - * @param Integer $i - * @return Boolean - * @access private - */ - function _read_put_responses($i) - { - while ($i--) { - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - break; - } - } - - return $i < 0; - } - - /** - * Close handle - * - * @param String $handle - * @return Boolean - * @access private - */ - function _close_handle($handle) - { - if (!$this->_send_sftp_packet(NET_SFTP_CLOSE, pack('Na*', strlen($handle), $handle))) { - return false; - } - - // "The client MUST release all resources associated with the handle regardless of the status." - // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.3 - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - return false; - } - - return true; - } - - /** - * Downloads a file from the SFTP server. - * - * Returns a string containing the contents of $remote_file if $local_file is left undefined or a boolean false if - * the operation was unsuccessful. If $local_file is defined, returns true or false depending on the success of the - * operation. - * - * $offset and $length can be used to download files in chunks. - * - * @param String $remote_file - * @param optional String $local_file - * @param optional Integer $offset - * @param optional Integer $length - * @return Mixed - * @access public - */ - function get($remote_file, $local_file = false, $offset = 0, $length = -1) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $remote_file = $this->_realpath($remote_file); - if ($remote_file === false) { - return false; - } - - $packet = pack('Na*N2', strlen($remote_file), $remote_file, NET_SFTP_OPEN_READ, 0); - if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $handle = substr($response, 4); - break; - case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - $this->_logError($response); - return false; - default: - user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); - return false; - } - - if (is_resource($local_file)) { - $fp = $local_file; - $stat = fstat($fp); - $res_offset = $stat['size']; - } else { - $res_offset = 0; - if ($local_file !== false) { - $fp = fopen($local_file, 'wb'); - if (!$fp) { - return false; - } - } else { - $content = ''; - } - } - - $fclose_check = $local_file !== false && !is_resource($local_file); - - $start = $offset; - $size = $this->max_sftp_packet < $length || $length < 0 ? $this->max_sftp_packet : $length; - while (true) { - $packet = pack('Na*N3', strlen($handle), $handle, $offset / 4294967296, $offset, $size); - if (!$this->_send_sftp_packet(NET_SFTP_READ, $packet)) { - if ($fclose_check) { - fclose($fp); - } - return false; - } - - $response = $this->_get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_DATA: - $temp = substr($response, 4); - $offset+= strlen($temp); - if ($local_file === false) { - $content.= $temp; - } else { - fputs($fp, $temp); - } - break; - case NET_SFTP_STATUS: - // could, in theory, return false if !strlen($content) but we'll hold off for the time being - $this->_logError($response); - break 2; - default: - user_error('Expected SSH_FXP_DATA or SSH_FXP_STATUS'); - if ($fclose_check) { - fclose($fp); - } - return false; - } - - if ($length > 0 && $length <= $offset - $start) { - break; - } - } - - if ($length > 0 && $length <= $offset - $start) { - if ($local_file === false) { - $content = substr($content, 0, $length); - } else { - ftruncate($fp, $length + $res_offset); - } - } - - if ($fclose_check) { - fclose($fp); - } - - if (!$this->_close_handle($handle)) { - return false; - } - - // if $content isn't set that means a file was written to - return isset($content) ? $content : true; - } - - /** - * Deletes a file on the SFTP server. - * - * @param String $path - * @param Boolean $recursive - * @return Boolean - * @access public - */ - function delete($path, $recursive = true) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $path = $this->_realpath($path); - if ($path === false) { - return false; - } - - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 - if (!$this->_send_sftp_packet(NET_SFTP_REMOVE, pack('Na*', strlen($path), $path))) { - return false; - } - - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - if (!$recursive) { - return false; - } - $i = 0; - $result = $this->_delete_recursive($path, $i); - $this->_read_put_responses($i); - return $result; - } - - $this->_remove_from_stat_cache($path); - - return true; - } - - /** - * Recursively deletes directories on the SFTP server - * - * Minimizes directory lookups and SSH_FXP_STATUS requests for speed. - * - * @param String $path - * @param Integer $i - * @return Boolean - * @access private - */ - function _delete_recursive($path, &$i) - { - if (!$this->_read_put_responses($i)) { - return false; - } - $i = 0; - $entries = $this->_list($path, true); - - // normally $entries would have at least . and .. but it might not if the directories - // permissions didn't allow reading - if (empty($entries)) { - return false; - } - - unset($entries['.'], $entries['..']); - foreach ($entries as $filename=>$props) { - if (!isset($props['type'])) { - return false; - } - - $temp = $path . '/' . $filename; - if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { - if (!$this->_delete_recursive($temp, $i)) { - return false; - } - } else { - if (!$this->_send_sftp_packet(NET_SFTP_REMOVE, pack('Na*', strlen($temp), $temp))) { - return false; - } - - $i++; - - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->_read_put_responses($i)) { - return false; - } - $i = 0; - } - } - $this->_remove_from_stat_cache($path); - } - - if (!$this->_send_sftp_packet(NET_SFTP_RMDIR, pack('Na*', strlen($path), $path))) { - return false; - } - - $i++; - - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->_read_put_responses($i)) { - return false; - } - $i = 0; - } - - return true; - } - - /** - * Checks whether a file or directory exists - * - * @param String $path - * @return Boolean - * @access public - */ - function file_exists($path) - { - if ($this->use_stat_cache) { - $path = $this->_realpath($path); - - $result = $this->_query_stat_cache($path); - - if (isset($result)) { - // return true if $result is an array or if it's an stdClass object - return $result !== false; - } - } - - return $this->stat($path) !== false; - } - - /** - * Tells whether the filename is a directory - * - * @param String $path - * @return Boolean - * @access public - */ - function is_dir($path) - { - $result = $this->_get_stat_cache_prop($path, 'type'); - if ($result === false) { - return false; - } - return $result === NET_SFTP_TYPE_DIRECTORY; - } - - /** - * Tells whether the filename is a regular file - * - * @param String $path - * @return Boolean - * @access public - */ - function is_file($path) - { - $result = $this->_get_stat_cache_prop($path, 'type'); - if ($result === false) { - return false; - } - return $result === NET_SFTP_TYPE_REGULAR; - } - - /** - * Tells whether the filename is a symbolic link - * - * @param String $path - * @return Boolean - * @access public - */ - function is_link($path) - { - $result = $this->_get_stat_cache_prop($path, 'type'); - if ($result === false) { - return false; - } - return $result === NET_SFTP_TYPE_SYMLINK; - } - - /** - * Gets last access time of file - * - * @param String $path - * @return Mixed - * @access public - */ - function fileatime($path) - { - return $this->_get_stat_cache_prop($path, 'atime'); - } - - /** - * Gets file modification time - * - * @param String $path - * @return Mixed - * @access public - */ - function filemtime($path) - { - return $this->_get_stat_cache_prop($path, 'mtime'); - } - - /** - * Gets file permissions - * - * @param String $path - * @return Mixed - * @access public - */ - function fileperms($path) - { - return $this->_get_stat_cache_prop($path, 'permissions'); - } - - /** - * Gets file owner - * - * @param String $path - * @return Mixed - * @access public - */ - function fileowner($path) - { - return $this->_get_stat_cache_prop($path, 'uid'); - } - - /** - * Gets file group - * - * @param String $path - * @return Mixed - * @access public - */ - function filegroup($path) - { - return $this->_get_stat_cache_prop($path, 'gid'); - } - - /** - * Gets file size - * - * @param String $path - * @return Mixed - * @access public - */ - function filesize($path) - { - return $this->_get_stat_cache_prop($path, 'size'); - } - - /** - * Gets file type - * - * @param String $path - * @return Mixed - * @access public - */ - function filetype($path) - { - $type = $this->_get_stat_cache_prop($path, 'type'); - if ($type === false) { - return false; - } - - switch ($type) { - case NET_SFTP_TYPE_BLOCK_DEVICE: return 'block'; - case NET_SFTP_TYPE_CHAR_DEVICE: return 'char'; - case NET_SFTP_TYPE_DIRECTORY: return 'dir'; - case NET_SFTP_TYPE_FIFO: return 'fifo'; - case NET_SFTP_TYPE_REGULAR: return 'file'; - case NET_SFTP_TYPE_SYMLINK: return 'link'; - default: return false; - } - } - - /** - * Return a stat properity - * - * Uses cache if appropriate. - * - * @param String $path - * @param String $prop - * @return Mixed - * @access private - */ - function _get_stat_cache_prop($path, $prop) - { - if ($this->use_stat_cache) { - $path = $this->_realpath($path); - - $result = $this->_query_stat_cache($path); - - if (is_object($result) && isset($result->$prop)) { - return $result->$prop; - } - } - - $result = $this->stat($path); - - if ($result === false || !isset($result[$prop])) { - return false; - } - - return $result[$prop]; - } - - /** - * Renames a file or a directory on the SFTP server - * - * @param String $oldname - * @param String $newname - * @return Boolean - * @access public - */ - function rename($oldname, $newname) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - $oldname = $this->_realpath($oldname); - $newname = $this->_realpath($newname); - if ($oldname === false || $newname === false) { - return false; - } - - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 - $packet = pack('Na*Na*', strlen($oldname), $oldname, strlen($newname), $newname); - if (!$this->_send_sftp_packet(NET_SFTP_RENAME, $packet)) { - return false; - } - - $response = $this->_get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - user_error('Expected SSH_FXP_STATUS'); - return false; - } - - // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - extract(unpack('Nstatus', $this->_string_shift($response, 4))); - if ($status != NET_SFTP_STATUS_OK) { - $this->_logError($response, $status); - return false; - } - - // don't move the stat cache entry over since this operation could very well change the - // atime and mtime attributes - //$this->_update_stat_cache($newname, $this->_query_stat_cache($oldname)); - $this->_remove_from_stat_cache($oldname); - $this->_remove_from_stat_cache($newname); - - return true; - } - - /** - * Parse Attributes - * - * See '7. File Attributes' of draft-ietf-secsh-filexfer-13 for more info. - * - * @param String $response - * @return Array - * @access private - */ - function _parseAttributes(&$response) - { - $attr = array(); - extract(unpack('Nflags', $this->_string_shift($response, 4))); - // SFTPv4+ have a type field (a byte) that follows the above flag field - foreach ($this->attributes as $key => $value) { - switch ($flags & $key) { - case NET_SFTP_ATTR_SIZE: // 0x00000001 - // The size attribute is defined as an unsigned 64-bit integer. - // The following will use floats on 32-bit platforms, if necessary. - // As can be seen in the BigInteger class, floats are generally - // IEEE 754 binary64 "double precision" on such platforms and - // as such can represent integers of at least 2^50 without loss - // of precision. Interpreted in filesize, 2^50 bytes = 1024 TiB. - $attr['size'] = hexdec(bin2hex($this->_string_shift($response, 8))); - break; - case NET_SFTP_ATTR_UIDGID: // 0x00000002 (SFTPv3 only) - $attr+= unpack('Nuid/Ngid', $this->_string_shift($response, 8)); - break; - case NET_SFTP_ATTR_PERMISSIONS: // 0x00000004 - $attr+= unpack('Npermissions', $this->_string_shift($response, 4)); - // mode == permissions; permissions was the original array key and is retained for bc purposes. - // mode was added because that's the more industry standard terminology - $attr+= array('mode' => $attr['permissions']); - $fileType = $this->_parseMode($attr['permissions']); - if ($fileType !== false) { - $attr+= array('type' => $fileType); - } - break; - case NET_SFTP_ATTR_ACCESSTIME: // 0x00000008 - $attr+= unpack('Natime/Nmtime', $this->_string_shift($response, 8)); - break; - case NET_SFTP_ATTR_EXTENDED: // 0x80000000 - extract(unpack('Ncount', $this->_string_shift($response, 4))); - for ($i = 0; $i < $count; $i++) { - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $key = $this->_string_shift($response, $length); - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $attr[$key] = $this->_string_shift($response, $length); - } - } - } - return $attr; - } - - /** - * Attempt to identify the file type - * - * Quoting the SFTP RFC, "Implementations MUST NOT send bits that are not defined" but they seem to anyway - * - * @param Integer $mode - * @return Integer - * @access private - */ - function _parseMode($mode) - { - // values come from http://lxr.free-electrons.com/source/include/uapi/linux/stat.h#L12 - // see, also, http://linux.die.net/man/2/stat - switch ($mode & 0170000) {// ie. 1111 0000 0000 0000 - case 0000000: // no file type specified - figure out the file type using alternative means - return false; - case 0040000: - return NET_SFTP_TYPE_DIRECTORY; - case 0100000: - return NET_SFTP_TYPE_REGULAR; - case 0120000: - return NET_SFTP_TYPE_SYMLINK; - // new types introduced in SFTPv5+ - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 - case 0010000: // named pipe (fifo) - return NET_SFTP_TYPE_FIFO; - case 0020000: // character special - return NET_SFTP_TYPE_CHAR_DEVICE; - case 0060000: // block special - return NET_SFTP_TYPE_BLOCK_DEVICE; - case 0140000: // socket - return NET_SFTP_TYPE_SOCKET; - case 0160000: // whiteout - // "SPECIAL should be used for files that are of - // a known type which cannot be expressed in the protocol" - return NET_SFTP_TYPE_SPECIAL; - default: - return NET_SFTP_TYPE_UNKNOWN; - } - } - - /** - * Parse Longname - * - * SFTPv3 doesn't provide any easy way of identifying a file type. You could try to open - * a file as a directory and see if an error is returned or you could try to parse the - * SFTPv3-specific longname field of the SSH_FXP_NAME packet. That's what this function does. - * The result is returned using the - * {@link http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 SFTPv4 type constants}. - * - * If the longname is in an unrecognized format bool(false) is returned. - * - * @param String $longname - * @return Mixed - * @access private - */ - function _parseLongname($longname) - { - // http://en.wikipedia.org/wiki/Unix_file_types - // http://en.wikipedia.org/wiki/Filesystem_permissions#Notation_of_traditional_Unix_permissions - if (preg_match('#^[^/]([r-][w-][xstST-]){3}#', $longname)) { - switch ($longname[0]) { - case '-': - return NET_SFTP_TYPE_REGULAR; - case 'd': - return NET_SFTP_TYPE_DIRECTORY; - case 'l': - return NET_SFTP_TYPE_SYMLINK; - default: - return NET_SFTP_TYPE_SPECIAL; - } - } - - return false; - } - - /** - * Sends SFTP Packets - * - * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info. - * - * @param Integer $type - * @param String $data - * @see Net_SFTP::_get_sftp_packet() - * @see Net_SSH2::_send_channel_packet() - * @return Boolean - * @access private - */ - function _send_sftp_packet($type, $data) - { - $packet = $this->request_id !== false ? - pack('NCNa*', strlen($data) + 5, $type, $this->request_id, $data) : - pack('NCa*', strlen($data) + 1, $type, $data); - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $result = $this->_send_channel_packet(NET_SFTP_CHANNEL, $packet); - $stop = strtok(microtime(), ' ') + strtok(''); - - if (defined('NET_SFTP_LOGGING')) { - $packet_type = '-> ' . $this->packet_types[$type] . - ' (' . round($stop - $start, 4) . 's)'; - if (NET_SFTP_LOGGING == NET_SFTP_LOG_REALTIME) { - echo "
      \r\n" . $this->_format_log(array($data), array($packet_type)) . "\r\n
      \r\n"; - flush(); - ob_flush(); - } else { - $this->packet_type_log[] = $packet_type; - if (NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX) { - $this->packet_log[] = $data; - } - } - } - - return $result; - } - - /** - * Receives SFTP Packets - * - * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info. - * - * Incidentally, the number of SSH_MSG_CHANNEL_DATA messages has no bearing on the number of SFTP packets present. - * There can be one SSH_MSG_CHANNEL_DATA messages containing two SFTP packets or there can be two SSH_MSG_CHANNEL_DATA - * messages containing one SFTP packet. - * - * @see Net_SFTP::_send_sftp_packet() - * @return String - * @access private - */ - function _get_sftp_packet() - { - $this->curTimeout = false; - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - - // SFTP packet length - while (strlen($this->packet_buffer) < 4) { - $temp = $this->_get_channel_packet(NET_SFTP_CHANNEL); - if (is_bool($temp)) { - $this->packet_type = false; - $this->packet_buffer = ''; - return false; - } - $this->packet_buffer.= $temp; - } - extract(unpack('Nlength', $this->_string_shift($this->packet_buffer, 4))); - $tempLength = $length; - $tempLength-= strlen($this->packet_buffer); - - // SFTP packet type and data payload - while ($tempLength > 0) { - $temp = $this->_get_channel_packet(NET_SFTP_CHANNEL); - if (is_bool($temp)) { - $this->packet_type = false; - $this->packet_buffer = ''; - return false; - } - $this->packet_buffer.= $temp; - $tempLength-= strlen($temp); - } - - $stop = strtok(microtime(), ' ') + strtok(''); - - $this->packet_type = ord($this->_string_shift($this->packet_buffer)); - - if ($this->request_id !== false) { - $this->_string_shift($this->packet_buffer, 4); // remove the request id - $length-= 5; // account for the request id and the packet type - } else { - $length-= 1; // account for the packet type - } - - $packet = $this->_string_shift($this->packet_buffer, $length); - - if (defined('NET_SFTP_LOGGING')) { - $packet_type = '<- ' . $this->packet_types[$this->packet_type] . - ' (' . round($stop - $start, 4) . 's)'; - if (NET_SFTP_LOGGING == NET_SFTP_LOG_REALTIME) { - echo "
      \r\n" . $this->_format_log(array($packet), array($packet_type)) . "\r\n
      \r\n"; - flush(); - ob_flush(); - } else { - $this->packet_type_log[] = $packet_type; - if (NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX) { - $this->packet_log[] = $packet; - } - } - } - - return $packet; - } - - /** - * Returns a log of the packets that have been sent and received. - * - * Returns a string if NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX, an array if NET_SFTP_LOGGING == NET_SFTP_LOG_SIMPLE and false if !defined('NET_SFTP_LOGGING') - * - * @access public - * @return String or Array - */ - function getSFTPLog() - { - if (!defined('NET_SFTP_LOGGING')) { - return false; - } - - switch (NET_SFTP_LOGGING) { - case NET_SFTP_LOG_COMPLEX: - return $this->_format_log($this->packet_log, $this->packet_type_log); - break; - //case NET_SFTP_LOG_SIMPLE: - default: - return $this->packet_type_log; - } - } - - /** - * Returns all errors - * - * @return String - * @access public - */ - function getSFTPErrors() - { - return $this->sftp_errors; - } - - /** - * Returns the last error - * - * @return String - * @access public - */ - function getLastSFTPError() - { - return count($this->sftp_errors) ? $this->sftp_errors[count($this->sftp_errors) - 1] : ''; - } - - /** - * Get supported SFTP versions - * - * @return Array - * @access public - */ - function getSupportedVersions() - { - $temp = array('version' => $this->version); - if (isset($this->extensions['versions'])) { - $temp['extensions'] = $this->extensions['versions']; - } - return $temp; - } - - /** - * Disconnect - * - * @param Integer $reason - * @return Boolean - * @access private - */ - function _disconnect($reason) - { - $this->pwd = false; - parent::_disconnect($reason); - } -} + + * login('username', 'password')) { + * exit('Login Failed'); + * } + * + * echo $sftp->pwd() . "\r\n"; + * $sftp->put('filename.ext', 'hello, world!'); + * print_r($sftp->nlist()); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Net + * @package Net_SFTP + * @author Jim Wigginton + * @copyright 2009 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * Include Net_SSH2 + */ +if (!class_exists('Net_SSH2')) { + include_once 'SSH2.php'; +} + +/**#@+ + * @access public + * @see self::getLog() + */ +/** + * Returns the message numbers + */ +define('NET_SFTP_LOG_SIMPLE', NET_SSH2_LOG_SIMPLE); +/** + * Returns the message content + */ +define('NET_SFTP_LOG_COMPLEX', NET_SSH2_LOG_COMPLEX); +/** + * Outputs the message content in real-time. + */ +define('NET_SFTP_LOG_REALTIME', 3); +/**#@-*/ + +/** + * SFTP channel constant + * + * Net_SSH2::exec() uses 0 and Net_SSH2::read() / Net_SSH2::write() use 1. + * + * @see Net_SSH2::_send_channel_packet() + * @see Net_SSH2::_get_channel_packet() + * @access private + */ +define('NET_SFTP_CHANNEL', 0x100); + +/**#@+ + * @access public + * @see self::put() + */ +/** + * Reads data from a local file. + */ +define('NET_SFTP_LOCAL_FILE', 1); +/** + * Reads data from a string. + */ +// this value isn't really used anymore but i'm keeping it reserved for historical reasons +define('NET_SFTP_STRING', 2); +/** + * Reads data from callback: + * function callback($length) returns string to proceed, null for EOF + */ +define('NET_SFTP_CALLBACK', 16); +/** + * Resumes an upload + */ +define('NET_SFTP_RESUME', 4); +/** + * Append a local file to an already existing remote file + */ +define('NET_SFTP_RESUME_START', 8); +/**#@-*/ + +/** + * Pure-PHP implementations of SFTP. + * + * @package Net_SFTP + * @author Jim Wigginton + * @access public + */ +class Net_SFTP extends Net_SSH2 +{ + /** + * Packet Types + * + * @see self::Net_SFTP() + * @var array + * @access private + */ + var $packet_types = array(); + + /** + * Status Codes + * + * @see self::Net_SFTP() + * @var array + * @access private + */ + var $status_codes = array(); + + /** + * The Request ID + * + * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support + * concurrent actions, so it's somewhat academic, here. + * + * @var boolean + * @see self::_send_sftp_packet() + * @access private + */ + var $use_request_id = false; + + /** + * The Packet Type + * + * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support + * concurrent actions, so it's somewhat academic, here. + * + * @var int + * @see self::_get_sftp_packet() + * @access private + */ + var $packet_type = -1; + + /** + * Packet Buffer + * + * @var string + * @see self::_get_sftp_packet() + * @access private + */ + var $packet_buffer = ''; + + /** + * Extensions supported by the server + * + * @var array + * @see self::_initChannel() + * @access private + */ + var $extensions = array(); + + /** + * Server SFTP version + * + * @var int + * @see self::_initChannel() + * @access private + */ + var $version; + + /** + * Current working directory + * + * @var string + * @see self::realpath() + * @see self::chdir() + * @access private + */ + var $pwd = false; + + /** + * Packet Type Log + * + * @see self::getLog() + * @var array + * @access private + */ + var $packet_type_log = array(); + + /** + * Packet Log + * + * @see self::getLog() + * @var array + * @access private + */ + var $packet_log = array(); + + /** + * Error information + * + * @see self::getSFTPErrors() + * @see self::getLastSFTPError() + * @var array + * @access private + */ + var $sftp_errors = array(); + + /** + * Stat Cache + * + * Rather than always having to open a directory and close it immediately there after to see if a file is a directory + * we'll cache the results. + * + * @see self::_update_stat_cache() + * @see self::_remove_from_stat_cache() + * @see self::_query_stat_cache() + * @var array + * @access private + */ + var $stat_cache = array(); + + /** + * Max SFTP Packet Size + * + * @see self::Net_SFTP() + * @see self::get() + * @var array + * @access private + */ + var $max_sftp_packet; + + /** + * Stat Cache Flag + * + * @see self::disableStatCache() + * @see self::enableStatCache() + * @var bool + * @access private + */ + var $use_stat_cache = true; + + /** + * Sort Options + * + * @see self::_comparator() + * @see self::setListOrder() + * @var array + * @access private + */ + var $sortOptions = array(); + + /** + * Canonicalization Flag + * + * Determines whether or not paths should be canonicalized before being + * passed on to the remote server. + * + * @see self::enablePathCanonicalization() + * @see self::disablePathCanonicalization() + * @see self::realpath() + * @var bool + * @access private + */ + var $canonicalize_paths = true; + + /** + * Request Buffers + * + * @see self::_get_sftp_packet() + * @var array + * @access private + */ + var $requestBuffer = array(); + + /** + * Default Constructor. + * + * Connects to an SFTP server + * + * @param string $host + * @param int $port + * @param int $timeout + * @return Net_SFTP + * @access public + */ + function __construct($host, $port = 22, $timeout = 10) + { + parent::__construct($host, $port, $timeout); + + $this->max_sftp_packet = 1 << 15; + + $this->packet_types = array( + 1 => 'NET_SFTP_INIT', + 2 => 'NET_SFTP_VERSION', + /* the format of SSH_FXP_OPEN changed between SFTPv4 and SFTPv5+: + SFTPv5+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.1 + pre-SFTPv5 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3 */ + 3 => 'NET_SFTP_OPEN', + 4 => 'NET_SFTP_CLOSE', + 5 => 'NET_SFTP_READ', + 6 => 'NET_SFTP_WRITE', + 7 => 'NET_SFTP_LSTAT', + 9 => 'NET_SFTP_SETSTAT', + 11 => 'NET_SFTP_OPENDIR', + 12 => 'NET_SFTP_READDIR', + 13 => 'NET_SFTP_REMOVE', + 14 => 'NET_SFTP_MKDIR', + 15 => 'NET_SFTP_RMDIR', + 16 => 'NET_SFTP_REALPATH', + 17 => 'NET_SFTP_STAT', + /* the format of SSH_FXP_RENAME changed between SFTPv4 and SFTPv5+: + SFTPv5+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 + pre-SFTPv5 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.5 */ + 18 => 'NET_SFTP_RENAME', + 19 => 'NET_SFTP_READLINK', + 20 => 'NET_SFTP_SYMLINK', + + 101=> 'NET_SFTP_STATUS', + 102=> 'NET_SFTP_HANDLE', + /* the format of SSH_FXP_NAME changed between SFTPv3 and SFTPv4+: + SFTPv4+: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.4 + pre-SFTPv4 : http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-7 */ + 103=> 'NET_SFTP_DATA', + 104=> 'NET_SFTP_NAME', + 105=> 'NET_SFTP_ATTRS', + + 200=> 'NET_SFTP_EXTENDED' + ); + $this->status_codes = array( + 0 => 'NET_SFTP_STATUS_OK', + 1 => 'NET_SFTP_STATUS_EOF', + 2 => 'NET_SFTP_STATUS_NO_SUCH_FILE', + 3 => 'NET_SFTP_STATUS_PERMISSION_DENIED', + 4 => 'NET_SFTP_STATUS_FAILURE', + 5 => 'NET_SFTP_STATUS_BAD_MESSAGE', + 6 => 'NET_SFTP_STATUS_NO_CONNECTION', + 7 => 'NET_SFTP_STATUS_CONNECTION_LOST', + 8 => 'NET_SFTP_STATUS_OP_UNSUPPORTED', + 9 => 'NET_SFTP_STATUS_INVALID_HANDLE', + 10 => 'NET_SFTP_STATUS_NO_SUCH_PATH', + 11 => 'NET_SFTP_STATUS_FILE_ALREADY_EXISTS', + 12 => 'NET_SFTP_STATUS_WRITE_PROTECT', + 13 => 'NET_SFTP_STATUS_NO_MEDIA', + 14 => 'NET_SFTP_STATUS_NO_SPACE_ON_FILESYSTEM', + 15 => 'NET_SFTP_STATUS_QUOTA_EXCEEDED', + 16 => 'NET_SFTP_STATUS_UNKNOWN_PRINCIPAL', + 17 => 'NET_SFTP_STATUS_LOCK_CONFLICT', + 18 => 'NET_SFTP_STATUS_DIR_NOT_EMPTY', + 19 => 'NET_SFTP_STATUS_NOT_A_DIRECTORY', + 20 => 'NET_SFTP_STATUS_INVALID_FILENAME', + 21 => 'NET_SFTP_STATUS_LINK_LOOP', + 22 => 'NET_SFTP_STATUS_CANNOT_DELETE', + 23 => 'NET_SFTP_STATUS_INVALID_PARAMETER', + 24 => 'NET_SFTP_STATUS_FILE_IS_A_DIRECTORY', + 25 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_CONFLICT', + 26 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_REFUSED', + 27 => 'NET_SFTP_STATUS_DELETE_PENDING', + 28 => 'NET_SFTP_STATUS_FILE_CORRUPT', + 29 => 'NET_SFTP_STATUS_OWNER_INVALID', + 30 => 'NET_SFTP_STATUS_GROUP_INVALID', + 31 => 'NET_SFTP_STATUS_NO_MATCHING_BYTE_RANGE_LOCK' + ); + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-7.1 + // the order, in this case, matters quite a lot - see Net_SFTP::_parseAttributes() to understand why + $this->attributes = array( + 0x00000001 => 'NET_SFTP_ATTR_SIZE', + 0x00000002 => 'NET_SFTP_ATTR_UIDGID', // defined in SFTPv3, removed in SFTPv4+ + 0x00000004 => 'NET_SFTP_ATTR_PERMISSIONS', + 0x00000008 => 'NET_SFTP_ATTR_ACCESSTIME', + // 0x80000000 will yield a floating point on 32-bit systems and converting floating points to integers + // yields inconsistent behavior depending on how php is compiled. so we left shift -1 (which, in + // two's compliment, consists of all 1 bits) by 31. on 64-bit systems this'll yield 0xFFFFFFFF80000000. + // that's not a problem, however, and 'anded' and a 32-bit number, as all the leading 1 bits are ignored. + (-1 << 31) & 0xFFFFFFFF => 'NET_SFTP_ATTR_EXTENDED' + ); + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3 + // the flag definitions change somewhat in SFTPv5+. if SFTPv5+ support is added to this library, maybe name + // the array for that $this->open5_flags and similarly alter the constant names. + $this->open_flags = array( + 0x00000001 => 'NET_SFTP_OPEN_READ', + 0x00000002 => 'NET_SFTP_OPEN_WRITE', + 0x00000004 => 'NET_SFTP_OPEN_APPEND', + 0x00000008 => 'NET_SFTP_OPEN_CREATE', + 0x00000010 => 'NET_SFTP_OPEN_TRUNCATE', + 0x00000020 => 'NET_SFTP_OPEN_EXCL' + ); + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 + // see Net_SFTP::_parseLongname() for an explanation + $this->file_types = array( + 1 => 'NET_SFTP_TYPE_REGULAR', + 2 => 'NET_SFTP_TYPE_DIRECTORY', + 3 => 'NET_SFTP_TYPE_SYMLINK', + 4 => 'NET_SFTP_TYPE_SPECIAL', + 5 => 'NET_SFTP_TYPE_UNKNOWN', + // the followin types were first defined for use in SFTPv5+ + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 + 6 => 'NET_SFTP_TYPE_SOCKET', + 7 => 'NET_SFTP_TYPE_CHAR_DEVICE', + 8 => 'NET_SFTP_TYPE_BLOCK_DEVICE', + 9 => 'NET_SFTP_TYPE_FIFO' + ); + $this->_define_array( + $this->packet_types, + $this->status_codes, + $this->attributes, + $this->open_flags, + $this->file_types + ); + + if (!defined('NET_SFTP_QUEUE_SIZE')) { + define('NET_SFTP_QUEUE_SIZE', 32); + } + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param string $host + * @param int $port + * @param int $timeout + * @access public + */ + function Net_SFTP($host, $port = 22, $timeout = 10) + { + $this->__construct($host, $port, $timeout); + } + + /** + * Login + * + * @param string $username + * @param string $password + * @return bool + * @access public + */ + function login($username) + { + $args = func_get_args(); + if (!call_user_func_array(array(&$this, '_login'), $args)) { + return false; + } + + $this->window_size_server_to_client[NET_SFTP_CHANNEL] = $this->window_size; + + $packet = pack( + 'CNa*N3', + NET_SSH2_MSG_CHANNEL_OPEN, + strlen('session'), + 'session', + NET_SFTP_CHANNEL, + $this->window_size, + 0x4000 + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_OPEN; + + $response = $this->_get_channel_packet(NET_SFTP_CHANNEL, true); + if ($response === false) { + return false; + } + + $packet = pack( + 'CNNa*CNa*', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[NET_SFTP_CHANNEL], + strlen('subsystem'), + 'subsystem', + 1, + strlen('sftp'), + 'sftp' + ); + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; + + $response = $this->_get_channel_packet(NET_SFTP_CHANNEL, true); + if ($response === false) { + // from PuTTY's psftp.exe + $command = "test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n" . + "test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n" . + "exec sftp-server"; + // we don't do $this->exec($command, false) because exec() operates on a different channel and plus the SSH_MSG_CHANNEL_OPEN that exec() does + // is redundant + $packet = pack( + 'CNNa*CNa*', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[NET_SFTP_CHANNEL], + strlen('exec'), + 'exec', + 1, + strlen($command), + $command + ); + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; + + $response = $this->_get_channel_packet(NET_SFTP_CHANNEL, true); + if ($response === false) { + return false; + } + } + + $this->channel_status[NET_SFTP_CHANNEL] = NET_SSH2_MSG_CHANNEL_DATA; + + if (!$this->_send_sftp_packet(NET_SFTP_INIT, "\0\0\0\3")) { + return false; + } + + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_VERSION) { + user_error('Expected SSH_FXP_VERSION'); + return false; + } + + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nversion', $this->_string_shift($response, 4))); + $this->version = $version; + while (!empty($response)) { + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $key = $this->_string_shift($response, $length); + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $value = $this->_string_shift($response, $length); + $this->extensions[$key] = $value; + } + + /* + SFTPv4+ defines a 'newline' extension. SFTPv3 seems to have unofficial support for it via 'newline@vandyke.com', + however, I'm not sure what 'newline@vandyke.com' is supposed to do (the fact that it's unofficial means that it's + not in the official SFTPv3 specs) and 'newline@vandyke.com' / 'newline' are likely not drop-in substitutes for + one another due to the fact that 'newline' comes with a SSH_FXF_TEXT bitmask whereas it seems unlikely that + 'newline@vandyke.com' would. + */ + /* + if (isset($this->extensions['newline@vandyke.com'])) { + $this->extensions['newline'] = $this->extensions['newline@vandyke.com']; + unset($this->extensions['newline@vandyke.com']); + } + */ + + $this->use_request_id = true; + + /* + A Note on SFTPv4/5/6 support: + states the following: + + "If the client wishes to interoperate with servers that support noncontiguous version + numbers it SHOULD send '3'" + + Given that the server only sends its version number after the client has already done so, the above + seems to be suggesting that v3 should be the default version. This makes sense given that v3 is the + most popular. + + states the following; + + "If the server did not send the "versions" extension, or the version-from-list was not included, the + server MAY send a status response describing the failure, but MUST then close the channel without + processing any further requests." + + So what do you do if you have a client whose initial SSH_FXP_INIT packet says it implements v3 and + a server whose initial SSH_FXP_VERSION reply says it implements v4 and only v4? If it only implements + v4, the "versions" extension is likely not going to have been sent so version re-negotiation as discussed + in draft-ietf-secsh-filexfer-13 would be quite impossible. As such, what Net_SFTP would do is close the + channel and reopen it with a new and updated SSH_FXP_INIT packet. + */ + switch ($this->version) { + case 2: + case 3: + break; + default: + return false; + } + + $this->pwd = $this->_realpath('.'); + + $this->_update_stat_cache($this->pwd, array()); + + return true; + } + + /** + * Disable the stat cache + * + * @access public + */ + function disableStatCache() + { + $this->use_stat_cache = false; + } + + /** + * Enable the stat cache + * + * @access public + */ + function enableStatCache() + { + $this->use_stat_cache = true; + } + + /** + * Clear the stat cache + * + * @access public + */ + function clearStatCache() + { + $this->stat_cache = array(); + } + + /** + * Enable path canonicalization + * + * @access public + */ + function enablePathCanonicalization() + { + $this->canonicalize_paths = true; + } + + /** + * Enable path canonicalization + * + * @access public + */ + function disablePathCanonicalization() + { + $this->canonicalize_paths = false; + } + + /** + * Returns the current directory name + * + * @return mixed + * @access public + */ + function pwd() + { + return $this->pwd; + } + + /** + * Logs errors + * + * @param string $response + * @param int $status + * @access public + */ + function _logError($response, $status = -1) + { + if ($status == -1) { + if (strlen($response) < 4) { + return; + } + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + } + + $error = $this->status_codes[$status]; + + if ($this->version > 2 || strlen($response) < 4) { + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->sftp_errors[] = $error . ': ' . $this->_string_shift($response, $length); + } else { + $this->sftp_errors[] = $error; + } + } + + /** + * Returns canonicalized absolute pathname + * + * realpath() expands all symbolic links and resolves references to '/./', '/../' and extra '/' characters in the input + * path and returns the canonicalized absolute pathname. + * + * @param string $path + * @return mixed + * @access public + */ + function realpath($path) + { + return $this->_realpath($path); + } + + /** + * Canonicalize the Server-Side Path Name + * + * SFTP doesn't provide a mechanism by which the current working directory can be changed, so we'll emulate it. Returns + * the absolute (canonicalized) path. + * + * If canonicalize_paths has been disabled using disablePathCanonicalization(), $path is returned as-is. + * + * @see self::chdir() + * @see self::disablePathCanonicalization() + * @param string $path + * @return mixed + * @access private + */ + function _realpath($path) + { + if (!$this->canonicalize_paths) { + return $path; + } + + if ($this->pwd === false) { + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.9 + if (!$this->_send_sftp_packet(NET_SFTP_REALPATH, pack('Na*', strlen($path), $path))) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_NAME: + // although SSH_FXP_NAME is implemented differently in SFTPv3 than it is in SFTPv4+, the following + // should work on all SFTP versions since the only part of the SSH_FXP_NAME packet the following looks + // at is the first part and that part is defined the same in SFTP versions 3 through 6. + $this->_string_shift($response, 4); // skip over the count - it should be 1, anyway + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + return $this->_string_shift($response, $length); + case NET_SFTP_STATUS: + $this->_logError($response); + return false; + default: + user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS'); + return false; + } + } + + if ($path[0] != '/') { + $path = $this->pwd . '/' . $path; + } + + $path = explode('/', $path); + $new = array(); + foreach ($path as $dir) { + if (!strlen($dir)) { + continue; + } + switch ($dir) { + case '..': + array_pop($new); + case '.': + break; + default: + $new[] = $dir; + } + } + + return '/' . implode('/', $new); + } + + /** + * Changes the current directory + * + * @param string $dir + * @return bool + * @access public + */ + function chdir($dir) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + // assume current dir if $dir is empty + if ($dir === '') { + $dir = './'; + // suffix a slash if needed + } elseif ($dir[strlen($dir) - 1] != '/') { + $dir.= '/'; + } + + $dir = $this->_realpath($dir); + + // confirm that $dir is, in fact, a valid directory + if ($this->use_stat_cache && is_array($this->_query_stat_cache($dir))) { + $this->pwd = $dir; + return true; + } + + // we could do a stat on the alleged $dir to see if it's a directory but that doesn't tell us + // the currently logged in user has the appropriate permissions or not. maybe you could see if + // the file's uid / gid match the currently logged in user's uid / gid but how there's no easy + // way to get those with SFTP + + if (!$this->_send_sftp_packet(NET_SFTP_OPENDIR, pack('Na*', strlen($dir), $dir))) { + return false; + } + + // see Net_SFTP::nlist() for a more thorough explanation of the following + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_HANDLE: + $handle = substr($response, 4); + break; + case NET_SFTP_STATUS: + $this->_logError($response); + return false; + default: + user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); + return false; + } + + if (!$this->_close_handle($handle)) { + return false; + } + + $this->_update_stat_cache($dir, array()); + + $this->pwd = $dir; + return true; + } + + /** + * Returns a list of files in the given directory + * + * @param string $dir + * @param bool $recursive + * @return mixed + * @access public + */ + function nlist($dir = '.', $recursive = false) + { + return $this->_nlist_helper($dir, $recursive, ''); + } + + /** + * Helper method for nlist + * + * @param string $dir + * @param bool $recursive + * @param string $relativeDir + * @return mixed + * @access private + */ + function _nlist_helper($dir, $recursive, $relativeDir) + { + $files = $this->_list($dir, false); + + if (!$recursive || $files === false) { + return $files; + } + + $result = array(); + foreach ($files as $value) { + if ($value == '.' || $value == '..') { + if ($relativeDir == '') { + $result[] = $value; + } + continue; + } + if (is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $value)))) { + $temp = $this->_nlist_helper($dir . '/' . $value, true, $relativeDir . $value . '/'); + $result = array_merge($result, $temp); + } else { + $result[] = $relativeDir . $value; + } + } + + return $result; + } + + /** + * Returns a detailed list of files in the given directory + * + * @param string $dir + * @param bool $recursive + * @return mixed + * @access public + */ + function rawlist($dir = '.', $recursive = false) + { + $files = $this->_list($dir, true); + if (!$recursive || $files === false) { + return $files; + } + + static $depth = 0; + + foreach ($files as $key => $value) { + if ($depth != 0 && $key == '..') { + unset($files[$key]); + continue; + } + $is_directory = false; + if ($key != '.' && $key != '..') { + if ($this->use_stat_cache) { + $is_directory = is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key))); + } else { + $stat = $this->lstat($dir . '/' . $key); + $is_directory = $stat && $stat['type'] === NET_SFTP_TYPE_DIRECTORY; + } + } + + if ($is_directory) { + $depth++; + $files[$key] = $this->rawlist($dir . '/' . $key, true); + $depth--; + } else { + $files[$key] = (object) $value; + } + } + + return $files; + } + + /** + * Reads a list, be it detailed or not, of files in the given directory + * + * @param string $dir + * @param bool $raw + * @return mixed + * @access private + */ + function _list($dir, $raw = true) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $dir = $this->_realpath($dir . '/'); + if ($dir === false) { + return false; + } + + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.2 + if (!$this->_send_sftp_packet(NET_SFTP_OPENDIR, pack('Na*', strlen($dir), $dir))) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_HANDLE: + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.2 + // since 'handle' is the last field in the SSH_FXP_HANDLE packet, we'll just remove the first four bytes that + // represent the length of the string and leave it at that + $handle = substr($response, 4); + break; + case NET_SFTP_STATUS: + // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + $this->_logError($response); + return false; + default: + user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); + return false; + } + + $this->_update_stat_cache($dir, array()); + + $contents = array(); + while (true) { + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.2 + // why multiple SSH_FXP_READDIR packets would be sent when the response to a single one can span arbitrarily many + // SSH_MSG_CHANNEL_DATA messages is not known to me. + if (!$this->_send_sftp_packet(NET_SFTP_READDIR, pack('Na*', strlen($handle), $handle))) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_NAME: + if (strlen($response) < 4) { + return false; + } + extract(unpack('Ncount', $this->_string_shift($response, 4))); + for ($i = 0; $i < $count; $i++) { + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $shortname = $this->_string_shift($response, $length); + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $longname = $this->_string_shift($response, $length); + $attributes = $this->_parseAttributes($response); + if (!isset($attributes['type'])) { + $fileType = $this->_parseLongname($longname); + if ($fileType) { + $attributes['type'] = $fileType; + } + } + $contents[$shortname] = $attributes + array('filename' => $shortname); + + if (isset($attributes['type']) && $attributes['type'] == NET_SFTP_TYPE_DIRECTORY && ($shortname != '.' && $shortname != '..')) { + $this->_update_stat_cache($dir . '/' . $shortname, array()); + } else { + if ($shortname == '..') { + $temp = $this->_realpath($dir . '/..') . '/.'; + } else { + $temp = $dir . '/' . $shortname; + } + $this->_update_stat_cache($temp, (object) array('lstat' => $attributes)); + } + // SFTPv6 has an optional boolean end-of-list field, but we'll ignore that, since the + // final SSH_FXP_STATUS packet should tell us that, already. + } + break; + case NET_SFTP_STATUS: + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_EOF) { + $this->_logError($response, $status); + return false; + } + break 2; + default: + user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS'); + return false; + } + } + + if (!$this->_close_handle($handle)) { + return false; + } + + if (count($this->sortOptions)) { + uasort($contents, array(&$this, '_comparator')); + } + + return $raw ? $contents : array_keys($contents); + } + + /** + * Compares two rawlist entries using parameters set by setListOrder() + * + * Intended for use with uasort() + * + * @param array $a + * @param array $b + * @return int + * @access private + */ + function _comparator($a, $b) + { + switch (true) { + case $a['filename'] === '.' || $b['filename'] === '.': + if ($a['filename'] === $b['filename']) { + return 0; + } + return $a['filename'] === '.' ? -1 : 1; + case $a['filename'] === '..' || $b['filename'] === '..': + if ($a['filename'] === $b['filename']) { + return 0; + } + return $a['filename'] === '..' ? -1 : 1; + case isset($a['type']) && $a['type'] === NET_SFTP_TYPE_DIRECTORY: + if (!isset($b['type'])) { + return 1; + } + if ($b['type'] !== $a['type']) { + return -1; + } + break; + case isset($b['type']) && $b['type'] === NET_SFTP_TYPE_DIRECTORY: + return 1; + } + foreach ($this->sortOptions as $sort => $order) { + if (!isset($a[$sort]) || !isset($b[$sort])) { + if (isset($a[$sort])) { + return -1; + } + if (isset($b[$sort])) { + return 1; + } + return 0; + } + switch ($sort) { + case 'filename': + $result = strcasecmp($a['filename'], $b['filename']); + if ($result) { + return $order === SORT_DESC ? -$result : $result; + } + break; + case 'permissions': + case 'mode': + $a[$sort]&= 07777; + $b[$sort]&= 07777; + default: + if ($a[$sort] === $b[$sort]) { + break; + } + return $order === SORT_ASC ? $a[$sort] - $b[$sort] : $b[$sort] - $a[$sort]; + } + } + } + + /** + * Defines how nlist() and rawlist() will be sorted - if at all. + * + * If sorting is enabled directories and files will be sorted independently with + * directories appearing before files in the resultant array that is returned. + * + * Any parameter returned by stat is a valid sort parameter for this function. + * Filename comparisons are case insensitive. + * + * Examples: + * + * $sftp->setListOrder('filename', SORT_ASC); + * $sftp->setListOrder('size', SORT_DESC, 'filename', SORT_ASC); + * $sftp->setListOrder(true); + * Separates directories from files but doesn't do any sorting beyond that + * $sftp->setListOrder(); + * Don't do any sort of sorting + * + * @access public + */ + function setListOrder() + { + $this->sortOptions = array(); + $args = func_get_args(); + if (empty($args)) { + return; + } + $len = count($args) & 0x7FFFFFFE; + for ($i = 0; $i < $len; $i+=2) { + $this->sortOptions[$args[$i]] = $args[$i + 1]; + } + if (!count($this->sortOptions)) { + $this->sortOptions = array('bogus' => true); + } + } + + /** + * Returns the file size, in bytes, or false, on failure + * + * Files larger than 4GB will show up as being exactly 4GB. + * + * @param string $filename + * @return mixed + * @access public + */ + function size($filename) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $result = $this->stat($filename); + if ($result === false) { + return false; + } + return isset($result['size']) ? $result['size'] : -1; + } + + /** + * Save files / directories to cache + * + * @param string $path + * @param mixed $value + * @access private + */ + function _update_stat_cache($path, $value) + { + if ($this->use_stat_cache === false) { + return; + } + + // preg_replace('#^/|/(?=/)|/$#', '', $dir) == str_replace('//', '/', trim($path, '/')) + $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); + + $temp = &$this->stat_cache; + $max = count($dirs) - 1; + foreach ($dirs as $i => $dir) { + // if $temp is an object that means one of two things. + // 1. a file was deleted and changed to a directory behind phpseclib's back + // 2. it's a symlink. when lstat is done it's unclear what it's a symlink to + if (is_object($temp)) { + $temp = array(); + } + if (!isset($temp[$dir])) { + $temp[$dir] = array(); + } + if ($i === $max) { + if (is_object($temp[$dir]) && is_object($value)) { + if (!isset($value->stat) && isset($temp[$dir]->stat)) { + $value->stat = $temp[$dir]->stat; + } + if (!isset($value->lstat) && isset($temp[$dir]->lstat)) { + $value->lstat = $temp[$dir]->lstat; + } + } + $temp[$dir] = $value; + break; + } + $temp = &$temp[$dir]; + } + } + + /** + * Remove files / directories from cache + * + * @param string $path + * @return bool + * @access private + */ + function _remove_from_stat_cache($path) + { + $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); + + $temp = &$this->stat_cache; + $max = count($dirs) - 1; + foreach ($dirs as $i => $dir) { + if ($i === $max) { + unset($temp[$dir]); + return true; + } + if (!isset($temp[$dir])) { + return false; + } + $temp = &$temp[$dir]; + } + } + + /** + * Checks cache for path + * + * Mainly used by file_exists + * + * @param string $dir + * @return mixed + * @access private + */ + function _query_stat_cache($path) + { + $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); + + $temp = &$this->stat_cache; + foreach ($dirs as $dir) { + if (!isset($temp[$dir])) { + return null; + } + $temp = &$temp[$dir]; + } + return $temp; + } + + /** + * Returns general information about a file. + * + * Returns an array on success and false otherwise. + * + * @param string $filename + * @return mixed + * @access public + */ + function stat($filename) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $filename = $this->_realpath($filename); + if ($filename === false) { + return false; + } + + if ($this->use_stat_cache) { + $result = $this->_query_stat_cache($filename); + if (is_array($result) && isset($result['.']) && isset($result['.']->stat)) { + return $result['.']->stat; + } + if (is_object($result) && isset($result->stat)) { + return $result->stat; + } + } + + $stat = $this->_stat($filename, NET_SFTP_STAT); + if ($stat === false) { + $this->_remove_from_stat_cache($filename); + return false; + } + if (isset($stat['type'])) { + if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { + $filename.= '/.'; + } + $this->_update_stat_cache($filename, (object) array('stat' => $stat)); + return $stat; + } + + $pwd = $this->pwd; + $stat['type'] = $this->chdir($filename) ? + NET_SFTP_TYPE_DIRECTORY : + NET_SFTP_TYPE_REGULAR; + $this->pwd = $pwd; + + if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { + $filename.= '/.'; + } + $this->_update_stat_cache($filename, (object) array('stat' => $stat)); + + return $stat; + } + + /** + * Returns general information about a file or symbolic link. + * + * Returns an array on success and false otherwise. + * + * @param string $filename + * @return mixed + * @access public + */ + function lstat($filename) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $filename = $this->_realpath($filename); + if ($filename === false) { + return false; + } + + if ($this->use_stat_cache) { + $result = $this->_query_stat_cache($filename); + if (is_array($result) && isset($result['.']) && isset($result['.']->lstat)) { + return $result['.']->lstat; + } + if (is_object($result) && isset($result->lstat)) { + return $result->lstat; + } + } + + $lstat = $this->_stat($filename, NET_SFTP_LSTAT); + if ($lstat === false) { + $this->_remove_from_stat_cache($filename); + return false; + } + if (isset($lstat['type'])) { + if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { + $filename.= '/.'; + } + $this->_update_stat_cache($filename, (object) array('lstat' => $lstat)); + return $lstat; + } + + $stat = $this->_stat($filename, NET_SFTP_STAT); + + if ($lstat != $stat) { + $lstat = array_merge($lstat, array('type' => NET_SFTP_TYPE_SYMLINK)); + $this->_update_stat_cache($filename, (object) array('lstat' => $lstat)); + return $stat; + } + + $pwd = $this->pwd; + $lstat['type'] = $this->chdir($filename) ? + NET_SFTP_TYPE_DIRECTORY : + NET_SFTP_TYPE_REGULAR; + $this->pwd = $pwd; + + if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { + $filename.= '/.'; + } + $this->_update_stat_cache($filename, (object) array('lstat' => $lstat)); + + return $lstat; + } + + /** + * Returns general information about a file or symbolic link + * + * Determines information without calling Net_SFTP::realpath(). + * The second parameter can be either NET_SFTP_STAT or NET_SFTP_LSTAT. + * + * @param string $filename + * @param int $type + * @return mixed + * @access private + */ + function _stat($filename, $type) + { + // SFTPv4+ adds an additional 32-bit integer field - flags - to the following: + $packet = pack('Na*', strlen($filename), $filename); + if (!$this->_send_sftp_packet($type, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_ATTRS: + return $this->_parseAttributes($response); + case NET_SFTP_STATUS: + $this->_logError($response); + return false; + } + + user_error('Expected SSH_FXP_ATTRS or SSH_FXP_STATUS'); + return false; + } + + /** + * Truncates a file to a given length + * + * @param string $filename + * @param int $new_size + * @return bool + * @access public + */ + function truncate($filename, $new_size) + { + $attr = pack('N3', NET_SFTP_ATTR_SIZE, $new_size / 4294967296, $new_size); // 4294967296 == 0x100000000 == 1<<32 + + return $this->_setstat($filename, $attr, false); + } + + /** + * Sets access and modification time of file. + * + * If the file does not exist, it will be created. + * + * @param string $filename + * @param int $time + * @param int $atime + * @return bool + * @access public + */ + function touch($filename, $time = null, $atime = null) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $filename = $this->_realpath($filename); + if ($filename === false) { + return false; + } + + if (!isset($time)) { + $time = time(); + } + if (!isset($atime)) { + $atime = $time; + } + + $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE | NET_SFTP_OPEN_EXCL; + $attr = pack('N3', NET_SFTP_ATTR_ACCESSTIME, $time, $atime); + $packet = pack('Na*Na*', strlen($filename), $filename, $flags, $attr); + if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_HANDLE: + return $this->_close_handle(substr($response, 4)); + case NET_SFTP_STATUS: + $this->_logError($response); + break; + default: + user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); + return false; + } + + return $this->_setstat($filename, $attr, false); + } + + /** + * Changes file or directory owner + * + * Returns true on success or false on error. + * + * @param string $filename + * @param int $uid + * @param bool $recursive + * @return bool + * @access public + */ + function chown($filename, $uid, $recursive = false) + { + // quoting from , + // "if the owner or group is specified as -1, then that ID is not changed" + $attr = pack('N3', NET_SFTP_ATTR_UIDGID, $uid, -1); + + return $this->_setstat($filename, $attr, $recursive); + } + + /** + * Changes file or directory group + * + * Returns true on success or false on error. + * + * @param string $filename + * @param int $gid + * @param bool $recursive + * @return bool + * @access public + */ + function chgrp($filename, $gid, $recursive = false) + { + $attr = pack('N3', NET_SFTP_ATTR_UIDGID, -1, $gid); + + return $this->_setstat($filename, $attr, $recursive); + } + + /** + * Set permissions on a file. + * + * Returns the new file permissions on success or false on error. + * If $recursive is true than this just returns true or false. + * + * @param int $mode + * @param string $filename + * @param bool $recursive + * @return mixed + * @access public + */ + function chmod($mode, $filename, $recursive = false) + { + if (is_string($mode) && is_int($filename)) { + $temp = $mode; + $mode = $filename; + $filename = $temp; + } + + $attr = pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); + if (!$this->_setstat($filename, $attr, $recursive)) { + return false; + } + if ($recursive) { + return true; + } + + $filename = $this->realpath($filename); + // rather than return what the permissions *should* be, we'll return what they actually are. this will also + // tell us if the file actually exists. + // incidentally, SFTPv4+ adds an additional 32-bit integer field - flags - to the following: + $packet = pack('Na*', strlen($filename), $filename); + if (!$this->_send_sftp_packet(NET_SFTP_STAT, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_ATTRS: + $attrs = $this->_parseAttributes($response); + return $attrs['permissions']; + case NET_SFTP_STATUS: + $this->_logError($response); + return false; + } + + user_error('Expected SSH_FXP_ATTRS or SSH_FXP_STATUS'); + return false; + } + + /** + * Sets information about a file + * + * @param string $filename + * @param string $attr + * @param bool $recursive + * @return bool + * @access private + */ + function _setstat($filename, $attr, $recursive) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $filename = $this->_realpath($filename); + if ($filename === false) { + return false; + } + + $this->_remove_from_stat_cache($filename); + + if ($recursive) { + $i = 0; + $result = $this->_setstat_recursive($filename, $attr, $i); + $this->_read_put_responses($i); + return $result; + } + + // SFTPv4+ has an additional byte field - type - that would need to be sent, as well. setting it to + // SSH_FILEXFER_TYPE_UNKNOWN might work. if not, we'd have to do an SSH_FXP_STAT before doing an SSH_FXP_SETSTAT. + if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($filename), $filename, $attr))) { + return false; + } + + /* + "Because some systems must use separate system calls to set various attributes, it is possible that a failure + response will be returned, but yet some of the attributes may be have been successfully modified. If possible, + servers SHOULD avoid this situation; however, clients MUST be aware that this is possible." + + -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.6 + */ + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + return false; + } + + return true; + } + + /** + * Recursively sets information on directories on the SFTP server + * + * Minimizes directory lookups and SSH_FXP_STATUS requests for speed. + * + * @param string $path + * @param string $attr + * @param int $i + * @return bool + * @access private + */ + function _setstat_recursive($path, $attr, &$i) + { + if (!$this->_read_put_responses($i)) { + return false; + } + $i = 0; + $entries = $this->_list($path, true); + + if ($entries === false) { + return $this->_setstat($path, $attr, false); + } + + // normally $entries would have at least . and .. but it might not if the directories + // permissions didn't allow reading + if (empty($entries)) { + return false; + } + + unset($entries['.'], $entries['..']); + foreach ($entries as $filename => $props) { + if (!isset($props['type'])) { + return false; + } + + $temp = $path . '/' . $filename; + if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { + if (!$this->_setstat_recursive($temp, $attr, $i)) { + return false; + } + } else { + if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($temp), $temp, $attr))) { + return false; + } + + $i++; + + if ($i >= NET_SFTP_QUEUE_SIZE) { + if (!$this->_read_put_responses($i)) { + return false; + } + $i = 0; + } + } + } + + if (!$this->_send_sftp_packet(NET_SFTP_SETSTAT, pack('Na*a*', strlen($path), $path, $attr))) { + return false; + } + + $i++; + + if ($i >= NET_SFTP_QUEUE_SIZE) { + if (!$this->_read_put_responses($i)) { + return false; + } + $i = 0; + } + + return true; + } + + /** + * Return the target of a symbolic link + * + * @param string $link + * @return mixed + * @access public + */ + function readlink($link) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $link = $this->_realpath($link); + + if (!$this->_send_sftp_packet(NET_SFTP_READLINK, pack('Na*', strlen($link), $link))) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_NAME: + break; + case NET_SFTP_STATUS: + $this->_logError($response); + return false; + default: + user_error('Expected SSH_FXP_NAME or SSH_FXP_STATUS'); + return false; + } + + if (strlen($response) < 4) { + return false; + } + extract(unpack('Ncount', $this->_string_shift($response, 4))); + // the file isn't a symlink + if (!$count) { + return false; + } + + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + return $this->_string_shift($response, $length); + } + + /** + * Create a symlink + * + * symlink() creates a symbolic link to the existing target with the specified name link. + * + * @param string $target + * @param string $link + * @return bool + * @access public + */ + function symlink($target, $link) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + //$target = $this->_realpath($target); + $link = $this->_realpath($link); + + $packet = pack('Na*Na*', strlen($target), $target, strlen($link), $link); + if (!$this->_send_sftp_packet(NET_SFTP_SYMLINK, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + return false; + } + + return true; + } + + /** + * Creates a directory. + * + * @param string $dir + * @return bool + * @access public + */ + function mkdir($dir, $mode = -1, $recursive = false) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $dir = $this->_realpath($dir); + // by not providing any permissions, hopefully the server will use the logged in users umask - their + // default permissions. + $attr = $mode == -1 ? "\0\0\0\0" : pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); + + if ($recursive) { + $dirs = explode('/', preg_replace('#/(?=/)|/$#', '', $dir)); + if (empty($dirs[0])) { + array_shift($dirs); + $dirs[0] = '/' . $dirs[0]; + } + for ($i = 0; $i < count($dirs); $i++) { + $temp = array_slice($dirs, 0, $i + 1); + $temp = implode('/', $temp); + $result = $this->_mkdir_helper($temp, $attr); + } + return $result; + } + + return $this->_mkdir_helper($dir, $attr); + } + + /** + * Helper function for directory creation + * + * @param string $dir + * @return bool + * @access private + */ + function _mkdir_helper($dir, $attr) + { + if (!$this->_send_sftp_packet(NET_SFTP_MKDIR, pack('Na*a*', strlen($dir), $dir, $attr))) { + return false; + } + + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + return false; + } + + return true; + } + + /** + * Removes a directory. + * + * @param string $dir + * @return bool + * @access public + */ + function rmdir($dir) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $dir = $this->_realpath($dir); + if ($dir === false) { + return false; + } + + if (!$this->_send_sftp_packet(NET_SFTP_RMDIR, pack('Na*', strlen($dir), $dir))) { + return false; + } + + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED? + $this->_logError($response, $status); + return false; + } + + $this->_remove_from_stat_cache($dir); + // the following will do a soft delete, which would be useful if you deleted a file + // and then tried to do a stat on the deleted file. the above, in contrast, does + // a hard delete + //$this->_update_stat_cache($dir, false); + + return true; + } + + /** + * Uploads a file to the SFTP server. + * + * By default, Net_SFTP::put() does not read from the local filesystem. $data is dumped directly into $remote_file. + * So, for example, if you set $data to 'filename.ext' and then do Net_SFTP::get(), you will get a file, twelve bytes + * long, containing 'filename.ext' as its contents. + * + * Setting $mode to NET_SFTP_LOCAL_FILE will change the above behavior. With NET_SFTP_LOCAL_FILE, $remote_file will + * contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how + * large $remote_file will be, as well. + * + * If $data is a resource then it'll be used as a resource instead. + * + * + * Setting $mode to NET_SFTP_CALLBACK will use $data as callback function, which gets only one parameter -- number + * of bytes to return, and returns a string if there is some data or null if there is no more data + * + * Currently, only binary mode is supported. As such, if the line endings need to be adjusted, you will need to take + * care of that, yourself. + * + * $mode can take an additional two parameters - NET_SFTP_RESUME and NET_SFTP_RESUME_START. These are bitwise AND'd with + * $mode. So if you want to resume upload of a 300mb file on the local file system you'd set $mode to the following: + * + * NET_SFTP_LOCAL_FILE | NET_SFTP_RESUME + * + * If you wanted to simply append the full contents of a local file to the full contents of a remote file you'd replace + * NET_SFTP_RESUME with NET_SFTP_RESUME_START. + * + * If $mode & (NET_SFTP_RESUME | NET_SFTP_RESUME_START) then NET_SFTP_RESUME_START will be assumed. + * + * $start and $local_start give you more fine grained control over this process and take precident over NET_SFTP_RESUME + * when they're non-negative. ie. $start could let you write at the end of a file (like NET_SFTP_RESUME) or in the middle + * of one. $local_start could let you start your reading from the end of a file (like NET_SFTP_RESUME_START) or in the + * middle of one. + * + * Setting $local_start to > 0 or $mode | NET_SFTP_RESUME_START doesn't do anything unless $mode | NET_SFTP_LOCAL_FILE. + * + * @param string $remote_file + * @param string|resource $data + * @param int $mode + * @param int $start + * @param int $local_start + * @param callable|null $progressCallback + * @return bool + * @access public + * @internal ASCII mode for SFTPv4/5/6 can be supported by adding a new function - Net_SFTP::setMode(). + */ + function put($remote_file, $data, $mode = NET_SFTP_STRING, $start = -1, $local_start = -1, $progressCallback = null) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $remote_file = $this->_realpath($remote_file); + if ($remote_file === false) { + return false; + } + + $this->_remove_from_stat_cache($remote_file); + + $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE; + // according to the SFTP specs, NET_SFTP_OPEN_APPEND should "force all writes to append data at the end of the file." + // in practice, it doesn't seem to do that. + //$flags|= ($mode & NET_SFTP_RESUME) ? NET_SFTP_OPEN_APPEND : NET_SFTP_OPEN_TRUNCATE; + + if ($start >= 0) { + $offset = $start; + } elseif ($mode & NET_SFTP_RESUME) { + // if NET_SFTP_OPEN_APPEND worked as it should _size() wouldn't need to be called + $size = $this->size($remote_file); + $offset = $size !== false ? $size : 0; + } else { + $offset = 0; + $flags|= NET_SFTP_OPEN_TRUNCATE; + } + + $packet = pack('Na*N2', strlen($remote_file), $remote_file, $flags, 0); + if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_HANDLE: + $handle = substr($response, 4); + break; + case NET_SFTP_STATUS: + $this->_logError($response); + return false; + default: + user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); + return false; + } + + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.3 + $dataCallback = false; + switch (true) { + case $mode & NET_SFTP_CALLBACK: + if (!is_callable($data)) { + user_error("\$data should be is_callable if you set NET_SFTP_CALLBACK flag"); + } + $dataCallback = $data; + // do nothing + break; + case is_resource($data): + $mode = $mode & ~NET_SFTP_LOCAL_FILE; + $info = stream_get_meta_data($data); + if ($info['wrapper_type'] == 'PHP' && $info['stream_type'] == 'Input') { + $fp = fopen('php://memory', 'w+'); + stream_copy_to_stream($data, $fp); + rewind($fp); + } else { + $fp = $data; + } + break; + case $mode & NET_SFTP_LOCAL_FILE: + if (!is_file($data)) { + user_error("$data is not a valid file"); + return false; + } + $fp = @fopen($data, 'rb'); + if (!$fp) { + return false; + } + } + + if (isset($fp)) { + $stat = fstat($fp); + $size = !empty($stat) ? $stat['size'] : 0; + + if ($local_start >= 0) { + fseek($fp, $local_start); + $size-= $local_start; + } + } elseif ($dataCallback) { + $size = 0; + } else { + $size = strlen($data); + } + + $sent = 0; + $size = $size < 0 ? ($size & 0x7FFFFFFF) + 0x80000000 : $size; + + $sftp_packet_size = 4096; // PuTTY uses 4096 + // make the SFTP packet be exactly 4096 bytes by including the bytes in the NET_SFTP_WRITE packets "header" + $sftp_packet_size-= strlen($handle) + 25; + $i = 0; + while ($dataCallback || ($size === 0 || $sent < $size)) { + if ($dataCallback) { + $temp = call_user_func($dataCallback, $sftp_packet_size); + if (is_null($temp)) { + break; + } + } else { + $temp = isset($fp) ? fread($fp, $sftp_packet_size) : substr($data, $sent, $sftp_packet_size); + if ($temp === false || $temp === '') { + break; + } + } + + $subtemp = $offset + $sent; + $packet = pack('Na*N3a*', strlen($handle), $handle, $subtemp / 4294967296, $subtemp, strlen($temp), $temp); + if (!$this->_send_sftp_packet(NET_SFTP_WRITE, $packet)) { + if ($mode & NET_SFTP_LOCAL_FILE) { + fclose($fp); + } + return false; + } + $sent+= strlen($temp); + if (is_callable($progressCallback)) { + call_user_func($progressCallback, $sent); + } + + $i++; + + if ($i == NET_SFTP_QUEUE_SIZE) { + if (!$this->_read_put_responses($i)) { + $i = 0; + break; + } + $i = 0; + } + } + + if (!$this->_read_put_responses($i)) { + if ($mode & NET_SFTP_LOCAL_FILE) { + fclose($fp); + } + $this->_close_handle($handle); + return false; + } + + if ($mode & NET_SFTP_LOCAL_FILE) { + fclose($fp); + } + + return $this->_close_handle($handle); + } + + /** + * Reads multiple successive SSH_FXP_WRITE responses + * + * Sending an SSH_FXP_WRITE packet and immediately reading its response isn't as efficient as blindly sending out $i + * SSH_FXP_WRITEs, in succession, and then reading $i responses. + * + * @param int $i + * @return bool + * @access private + */ + function _read_put_responses($i) + { + while ($i--) { + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + break; + } + } + + return $i < 0; + } + + /** + * Close handle + * + * @param string $handle + * @return bool + * @access private + */ + function _close_handle($handle) + { + if (!$this->_send_sftp_packet(NET_SFTP_CLOSE, pack('Na*', strlen($handle), $handle))) { + return false; + } + + // "The client MUST release all resources associated with the handle regardless of the status." + // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.3 + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + return false; + } + + return true; + } + + /** + * Downloads a file from the SFTP server. + * + * Returns a string containing the contents of $remote_file if $local_file is left undefined or a boolean false if + * the operation was unsuccessful. If $local_file is defined, returns true or false depending on the success of the + * operation. + * + * $offset and $length can be used to download files in chunks. + * + * @param string $remote_file + * @param string $local_file + * @param int $offset + * @param int $length + * @return mixed + * @access public + */ + function get($remote_file, $local_file = false, $offset = 0, $length = -1) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $remote_file = $this->_realpath($remote_file); + if ($remote_file === false) { + return false; + } + + $packet = pack('Na*N2', strlen($remote_file), $remote_file, NET_SFTP_OPEN_READ, 0); + if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_HANDLE: + $handle = substr($response, 4); + break; + case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + $this->_logError($response); + return false; + default: + user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); + return false; + } + + if (is_resource($local_file)) { + $fp = $local_file; + $stat = fstat($fp); + $res_offset = $stat['size']; + } else { + $res_offset = 0; + if ($local_file !== false) { + $fp = fopen($local_file, 'wb'); + if (!$fp) { + return false; + } + } else { + $content = ''; + } + } + + $fclose_check = $local_file !== false && !is_resource($local_file); + + $start = $offset; + $read = 0; + while (true) { + $i = 0; + + while ($i < NET_SFTP_QUEUE_SIZE && ($length < 0 || $read < $length)) { + $tempoffset = $start + $read; + + $packet_size = $length > 0 ? min($this->max_sftp_packet, $length - $read) : $this->max_sftp_packet; + + $packet = pack('Na*N3', strlen($handle), $handle, $tempoffset / 4294967296, $tempoffset, $packet_size); + if (!$this->_send_sftp_packet(NET_SFTP_READ, $packet, $i)) { + if ($fclose_check) { + fclose($fp); + } + return false; + } + $packet = null; + $read+= $packet_size; + $i++; + } + + if (!$i) { + break; + } + + $packets_sent = $i - 1; + + $clear_responses = false; + while ($i > 0) { + $i--; + + if ($clear_responses) { + $this->_get_sftp_packet($packets_sent - $i); + continue; + } else { + $response = $this->_get_sftp_packet($packets_sent - $i); + } + + switch ($this->packet_type) { + case NET_SFTP_DATA: + $temp = substr($response, 4); + $offset+= strlen($temp); + if ($local_file === false) { + $content.= $temp; + } else { + fputs($fp, $temp); + } + $temp = null; + break; + case NET_SFTP_STATUS: + // could, in theory, return false if !strlen($content) but we'll hold off for the time being + $this->_logError($response); + $clear_responses = true; // don't break out of the loop yet, so we can read the remaining responses + break; + default: + if ($fclose_check) { + fclose($fp); + } + user_error('Expected SSH_FX_DATA or SSH_FXP_STATUS'); + } + $response = null; + } + + if ($clear_responses) { + break; + } + } + + if ($length > 0 && $length <= $offset - $start) { + if ($local_file === false) { + $content = substr($content, 0, $length); + } else { + ftruncate($fp, $length + $res_offset); + } + } + + if ($fclose_check) { + fclose($fp); + } + + if (!$this->_close_handle($handle)) { + return false; + } + + // if $content isn't set that means a file was written to + return isset($content) ? $content : true; + } + + /** + * Deletes a file on the SFTP server. + * + * @param string $path + * @param bool $recursive + * @return bool + * @access public + */ + function delete($path, $recursive = true) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + if (is_object($path)) { + // It's an object. Cast it as string before we check anything else. + $path = (string) $path; + } + + if (!is_string($path) || $path == '') { + return false; + } + + $path = $this->_realpath($path); + if ($path === false) { + return false; + } + + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 + if (!$this->_send_sftp_packet(NET_SFTP_REMOVE, pack('Na*', strlen($path), $path))) { + return false; + } + + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + if (!$recursive) { + return false; + } + $i = 0; + $result = $this->_delete_recursive($path, $i); + $this->_read_put_responses($i); + return $result; + } + + $this->_remove_from_stat_cache($path); + + return true; + } + + /** + * Recursively deletes directories on the SFTP server + * + * Minimizes directory lookups and SSH_FXP_STATUS requests for speed. + * + * @param string $path + * @param int $i + * @return bool + * @access private + */ + function _delete_recursive($path, &$i) + { + if (!$this->_read_put_responses($i)) { + return false; + } + $i = 0; + $entries = $this->_list($path, true); + + // normally $entries would have at least . and .. but it might not if the directories + // permissions didn't allow reading + if (empty($entries)) { + return false; + } + + unset($entries['.'], $entries['..']); + foreach ($entries as $filename => $props) { + if (!isset($props['type'])) { + return false; + } + + $temp = $path . '/' . $filename; + if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { + if (!$this->_delete_recursive($temp, $i)) { + return false; + } + } else { + if (!$this->_send_sftp_packet(NET_SFTP_REMOVE, pack('Na*', strlen($temp), $temp))) { + return false; + } + $this->_remove_from_stat_cache($temp); + + $i++; + + if ($i >= NET_SFTP_QUEUE_SIZE) { + if (!$this->_read_put_responses($i)) { + return false; + } + $i = 0; + } + } + } + + if (!$this->_send_sftp_packet(NET_SFTP_RMDIR, pack('Na*', strlen($path), $path))) { + return false; + } + $this->_remove_from_stat_cache($path); + + $i++; + + if ($i >= NET_SFTP_QUEUE_SIZE) { + if (!$this->_read_put_responses($i)) { + return false; + } + $i = 0; + } + + return true; + } + + /** + * Checks whether a file or directory exists + * + * @param string $path + * @return bool + * @access public + */ + function file_exists($path) + { + if ($this->use_stat_cache) { + $path = $this->_realpath($path); + + $result = $this->_query_stat_cache($path); + + if (isset($result)) { + // return true if $result is an array or if it's an stdClass object + return $result !== false; + } + } + + return $this->stat($path) !== false; + } + + /** + * Tells whether the filename is a directory + * + * @param string $path + * @return bool + * @access public + */ + function is_dir($path) + { + $result = $this->_get_stat_cache_prop($path, 'type'); + if ($result === false) { + return false; + } + return $result === NET_SFTP_TYPE_DIRECTORY; + } + + /** + * Tells whether the filename is a regular file + * + * @param string $path + * @return bool + * @access public + */ + function is_file($path) + { + $result = $this->_get_stat_cache_prop($path, 'type'); + if ($result === false) { + return false; + } + return $result === NET_SFTP_TYPE_REGULAR; + } + + /** + * Tells whether the filename is a symbolic link + * + * @param string $path + * @return bool + * @access public + */ + function is_link($path) + { + $result = $this->_get_lstat_cache_prop($path, 'type'); + if ($result === false) { + return false; + } + return $result === NET_SFTP_TYPE_SYMLINK; + } + + /** + * Tells whether a file exists and is readable + * + * @param string $path + * @return bool + * @access public + */ + function is_readable($path) + { + $path = $this->_realpath($path); + + $packet = pack('Na*N2', strlen($path), $path, NET_SFTP_OPEN_READ, 0); + if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_HANDLE: + return true; + case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + return false; + default: + user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); + return false; + } + } + + /** + * Tells whether the filename is writable + * + * @param string $path + * @return bool + * @access public + */ + function is_writable($path) + { + $path = $this->_realpath($path); + + $packet = pack('Na*N2', strlen($path), $path, NET_SFTP_OPEN_WRITE, 0); + if (!$this->_send_sftp_packet(NET_SFTP_OPEN, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + switch ($this->packet_type) { + case NET_SFTP_HANDLE: + return true; + case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + return false; + default: + user_error('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS'); + return false; + } + } + + /** + * Tells whether the filename is writeable + * + * Alias of is_writable + * + * @param string $path + * @return bool + * @access public + */ + function is_writeable($path) + { + return $this->is_writable($path); + } + + /** + * Gets last access time of file + * + * @param string $path + * @return mixed + * @access public + */ + function fileatime($path) + { + return $this->_get_stat_cache_prop($path, 'atime'); + } + + /** + * Gets file modification time + * + * @param string $path + * @return mixed + * @access public + */ + function filemtime($path) + { + return $this->_get_stat_cache_prop($path, 'mtime'); + } + + /** + * Gets file permissions + * + * @param string $path + * @return mixed + * @access public + */ + function fileperms($path) + { + return $this->_get_stat_cache_prop($path, 'permissions'); + } + + /** + * Gets file owner + * + * @param string $path + * @return mixed + * @access public + */ + function fileowner($path) + { + return $this->_get_stat_cache_prop($path, 'uid'); + } + + /** + * Gets file group + * + * @param string $path + * @return mixed + * @access public + */ + function filegroup($path) + { + return $this->_get_stat_cache_prop($path, 'gid'); + } + + /** + * Gets file size + * + * @param string $path + * @return mixed + * @access public + */ + function filesize($path) + { + return $this->_get_stat_cache_prop($path, 'size'); + } + + /** + * Gets file type + * + * @param string $path + * @return mixed + * @access public + */ + function filetype($path) + { + $type = $this->_get_stat_cache_prop($path, 'type'); + if ($type === false) { + return false; + } + + switch ($type) { + case NET_SFTP_TYPE_BLOCK_DEVICE: + return 'block'; + case NET_SFTP_TYPE_CHAR_DEVICE: + return 'char'; + case NET_SFTP_TYPE_DIRECTORY: + return 'dir'; + case NET_SFTP_TYPE_FIFO: + return 'fifo'; + case NET_SFTP_TYPE_REGULAR: + return 'file'; + case NET_SFTP_TYPE_SYMLINK: + return 'link'; + default: + return false; + } + } + + /** + * Return a stat properity + * + * Uses cache if appropriate. + * + * @param string $path + * @param string $prop + * @return mixed + * @access private + */ + function _get_stat_cache_prop($path, $prop) + { + return $this->_get_xstat_cache_prop($path, $prop, 'stat'); + } + + /** + * Return an lstat properity + * + * Uses cache if appropriate. + * + * @param string $path + * @param string $prop + * @return mixed + * @access private + */ + function _get_lstat_cache_prop($path, $prop) + { + return $this->_get_xstat_cache_prop($path, $prop, 'lstat'); + } + + /** + * Return a stat or lstat properity + * + * Uses cache if appropriate. + * + * @param string $path + * @param string $prop + * @return mixed + * @access private + */ + function _get_xstat_cache_prop($path, $prop, $type) + { + if ($this->use_stat_cache) { + $path = $this->_realpath($path); + + $result = $this->_query_stat_cache($path); + + if (is_object($result) && isset($result->$type)) { + return $result->{$type}[$prop]; + } + } + + $result = $this->$type($path); + + if ($result === false || !isset($result[$prop])) { + return false; + } + + return $result[$prop]; + } + + /** + * Renames a file or a directory on the SFTP server + * + * @param string $oldname + * @param string $newname + * @return bool + * @access public + */ + function rename($oldname, $newname) + { + if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { + return false; + } + + $oldname = $this->_realpath($oldname); + $newname = $this->_realpath($newname); + if ($oldname === false || $newname === false) { + return false; + } + + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 + $packet = pack('Na*Na*', strlen($oldname), $oldname, strlen($newname), $newname); + if (!$this->_send_sftp_packet(NET_SFTP_RENAME, $packet)) { + return false; + } + + $response = $this->_get_sftp_packet(); + if ($this->packet_type != NET_SFTP_STATUS) { + user_error('Expected SSH_FXP_STATUS'); + return false; + } + + // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nstatus', $this->_string_shift($response, 4))); + if ($status != NET_SFTP_STATUS_OK) { + $this->_logError($response, $status); + return false; + } + + // don't move the stat cache entry over since this operation could very well change the + // atime and mtime attributes + //$this->_update_stat_cache($newname, $this->_query_stat_cache($oldname)); + $this->_remove_from_stat_cache($oldname); + $this->_remove_from_stat_cache($newname); + + return true; + } + + /** + * Parse Attributes + * + * See '7. File Attributes' of draft-ietf-secsh-filexfer-13 for more info. + * + * @param string $response + * @return array + * @access private + */ + function _parseAttributes(&$response) + { + $attr = array(); + if (strlen($response) < 4) { + user_error('Malformed file attributes'); + return array(); + } + extract(unpack('Nflags', $this->_string_shift($response, 4))); + // SFTPv4+ have a type field (a byte) that follows the above flag field + foreach ($this->attributes as $key => $value) { + switch ($flags & $key) { + case NET_SFTP_ATTR_SIZE: // 0x00000001 + // The size attribute is defined as an unsigned 64-bit integer. + // The following will use floats on 32-bit platforms, if necessary. + // As can be seen in the BigInteger class, floats are generally + // IEEE 754 binary64 "double precision" on such platforms and + // as such can represent integers of at least 2^50 without loss + // of precision. Interpreted in filesize, 2^50 bytes = 1024 TiB. + $attr['size'] = hexdec(bin2hex($this->_string_shift($response, 8))); + break; + case NET_SFTP_ATTR_UIDGID: // 0x00000002 (SFTPv3 only) + if (strlen($response) < 8) { + user_error('Malformed file attributes'); + return $attr; + } + $attr+= unpack('Nuid/Ngid', $this->_string_shift($response, 8)); + break; + case NET_SFTP_ATTR_PERMISSIONS: // 0x00000004 + if (strlen($response) < 4) { + user_error('Malformed file attributes'); + return $attr; + } + $attr+= unpack('Npermissions', $this->_string_shift($response, 4)); + // mode == permissions; permissions was the original array key and is retained for bc purposes. + // mode was added because that's the more industry standard terminology + $attr+= array('mode' => $attr['permissions']); + $fileType = $this->_parseMode($attr['permissions']); + if ($fileType !== false) { + $attr+= array('type' => $fileType); + } + break; + case NET_SFTP_ATTR_ACCESSTIME: // 0x00000008 + if (strlen($response) < 8) { + user_error('Malformed file attributes'); + return $attr; + } + $attr+= unpack('Natime/Nmtime', $this->_string_shift($response, 8)); + break; + case NET_SFTP_ATTR_EXTENDED: // 0x80000000 + if (strlen($response) < 4) { + user_error('Malformed file attributes'); + return $attr; + } + extract(unpack('Ncount', $this->_string_shift($response, 4))); + for ($i = 0; $i < $count; $i++) { + if (strlen($response) < 4) { + user_error('Malformed file attributes'); + return $attr; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $key = $this->_string_shift($response, $length); + if (strlen($response) < 4) { + user_error('Malformed file attributes'); + return $attr; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $attr[$key] = $this->_string_shift($response, $length); + } + } + } + return $attr; + } + + /** + * Attempt to identify the file type + * + * Quoting the SFTP RFC, "Implementations MUST NOT send bits that are not defined" but they seem to anyway + * + * @param int $mode + * @return int + * @access private + */ + function _parseMode($mode) + { + // values come from http://lxr.free-electrons.com/source/include/uapi/linux/stat.h#L12 + // see, also, http://linux.die.net/man/2/stat + switch ($mode & 0170000) {// ie. 1111 0000 0000 0000 + case 0000000: // no file type specified - figure out the file type using alternative means + return false; + case 0040000: + return NET_SFTP_TYPE_DIRECTORY; + case 0100000: + return NET_SFTP_TYPE_REGULAR; + case 0120000: + return NET_SFTP_TYPE_SYMLINK; + // new types introduced in SFTPv5+ + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 + case 0010000: // named pipe (fifo) + return NET_SFTP_TYPE_FIFO; + case 0020000: // character special + return NET_SFTP_TYPE_CHAR_DEVICE; + case 0060000: // block special + return NET_SFTP_TYPE_BLOCK_DEVICE; + case 0140000: // socket + return NET_SFTP_TYPE_SOCKET; + case 0160000: // whiteout + // "SPECIAL should be used for files that are of + // a known type which cannot be expressed in the protocol" + return NET_SFTP_TYPE_SPECIAL; + default: + return NET_SFTP_TYPE_UNKNOWN; + } + } + + /** + * Parse Longname + * + * SFTPv3 doesn't provide any easy way of identifying a file type. You could try to open + * a file as a directory and see if an error is returned or you could try to parse the + * SFTPv3-specific longname field of the SSH_FXP_NAME packet. That's what this function does. + * The result is returned using the + * {@link http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 SFTPv4 type constants}. + * + * If the longname is in an unrecognized format bool(false) is returned. + * + * @param string $longname + * @return mixed + * @access private + */ + function _parseLongname($longname) + { + // http://en.wikipedia.org/wiki/Unix_file_types + // http://en.wikipedia.org/wiki/Filesystem_permissions#Notation_of_traditional_Unix_permissions + if (preg_match('#^[^/]([r-][w-][xstST-]){3}#', $longname)) { + switch ($longname[0]) { + case '-': + return NET_SFTP_TYPE_REGULAR; + case 'd': + return NET_SFTP_TYPE_DIRECTORY; + case 'l': + return NET_SFTP_TYPE_SYMLINK; + default: + return NET_SFTP_TYPE_SPECIAL; + } + } + + return false; + } + + /** + * Sends SFTP Packets + * + * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info. + * + * @param int $type + * @param string $data + * @see self::_get_sftp_packet() + * @see Net_SSH2::_send_channel_packet() + * @return bool + * @access private + */ + function _send_sftp_packet($type, $data, $request_id = 1) + { + $packet = $this->use_request_id ? + pack('NCNa*', strlen($data) + 5, $type, $request_id, $data) : + pack('NCa*', strlen($data) + 1, $type, $data); + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $result = $this->_send_channel_packet(NET_SFTP_CHANNEL, $packet); + $stop = strtok(microtime(), ' ') + strtok(''); + + if (defined('NET_SFTP_LOGGING')) { + $packet_type = '-> ' . $this->packet_types[$type] . + ' (' . round($stop - $start, 4) . 's)'; + if (NET_SFTP_LOGGING == NET_SFTP_LOG_REALTIME) { + echo "
      \r\n" . $this->_format_log(array($data), array($packet_type)) . "\r\n
      \r\n"; + flush(); + ob_flush(); + } else { + $this->packet_type_log[] = $packet_type; + if (NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX) { + $this->packet_log[] = $data; + } + } + } + + return $result; + } + + /** + * Receives SFTP Packets + * + * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info. + * + * Incidentally, the number of SSH_MSG_CHANNEL_DATA messages has no bearing on the number of SFTP packets present. + * There can be one SSH_MSG_CHANNEL_DATA messages containing two SFTP packets or there can be two SSH_MSG_CHANNEL_DATA + * messages containing one SFTP packet. + * + * @see self::_send_sftp_packet() + * @return string + * @access private + */ + function _get_sftp_packet($request_id = null) + { + if (isset($request_id) && isset($this->requestBuffer[$request_id])) { + $this->packet_type = $this->requestBuffer[$request_id]['packet_type']; + $temp = $this->requestBuffer[$request_id]['packet']; + unset($this->requestBuffer[$request_id]); + return $temp; + } + + $this->curTimeout = false; + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + + // SFTP packet length + while (strlen($this->packet_buffer) < 4) { + $temp = $this->_get_channel_packet(NET_SFTP_CHANNEL, true); + if (is_bool($temp)) { + $this->packet_type = false; + $this->packet_buffer = ''; + return false; + } + $this->packet_buffer.= $temp; + } + if (strlen($this->packet_buffer) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($this->packet_buffer, 4))); + $tempLength = $length; + $tempLength-= strlen($this->packet_buffer); + + // SFTP packet type and data payload + while ($tempLength > 0) { + $temp = $this->_get_channel_packet(NET_SFTP_CHANNEL, true); + if (is_bool($temp)) { + $this->packet_type = false; + $this->packet_buffer = ''; + return false; + } + $this->packet_buffer.= $temp; + $tempLength-= strlen($temp); + } + + $stop = strtok(microtime(), ' ') + strtok(''); + + $this->packet_type = ord($this->_string_shift($this->packet_buffer)); + + if ($this->use_request_id) { + extract(unpack('Npacket_id', $this->_string_shift($this->packet_buffer, 4))); // remove the request id + $length-= 5; // account for the request id and the packet type + } else { + $length-= 1; // account for the packet type + } + + $packet = $this->_string_shift($this->packet_buffer, $length); + + if (defined('NET_SFTP_LOGGING')) { + $packet_type = '<- ' . $this->packet_types[$this->packet_type] . + ' (' . round($stop - $start, 4) . 's)'; + if (NET_SFTP_LOGGING == NET_SFTP_LOG_REALTIME) { + echo "
      \r\n" . $this->_format_log(array($packet), array($packet_type)) . "\r\n
      \r\n"; + flush(); + ob_flush(); + } else { + $this->packet_type_log[] = $packet_type; + if (NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX) { + $this->packet_log[] = $packet; + } + } + } + + if (isset($request_id) && $this->use_request_id && $packet_id != $request_id) { + $this->requestBuffer[$packet_id] = array( + 'packet_type' => $this->packet_type, + 'packet' => $packet + ); + return $this->_get_sftp_packet($request_id); + } + + return $packet; + } + + /** + * Returns a log of the packets that have been sent and received. + * + * Returns a string if NET_SFTP_LOGGING == NET_SFTP_LOG_COMPLEX, an array if NET_SFTP_LOGGING == NET_SFTP_LOG_SIMPLE and false if !defined('NET_SFTP_LOGGING') + * + * @access public + * @return string or Array + */ + function getSFTPLog() + { + if (!defined('NET_SFTP_LOGGING')) { + return false; + } + + switch (NET_SFTP_LOGGING) { + case NET_SFTP_LOG_COMPLEX: + return $this->_format_log($this->packet_log, $this->packet_type_log); + break; + //case NET_SFTP_LOG_SIMPLE: + default: + return $this->packet_type_log; + } + } + + /** + * Returns all errors + * + * @return array + * @access public + */ + function getSFTPErrors() + { + return $this->sftp_errors; + } + + /** + * Returns the last error + * + * @return string + * @access public + */ + function getLastSFTPError() + { + return count($this->sftp_errors) ? $this->sftp_errors[count($this->sftp_errors) - 1] : ''; + } + + /** + * Get supported SFTP versions + * + * @return array + * @access public + */ + function getSupportedVersions() + { + $temp = array('version' => $this->version); + if (isset($this->extensions['versions'])) { + $temp['extensions'] = $this->extensions['versions']; + } + return $temp; + } + + /** + * Disconnect + * + * @param int $reason + * @return bool + * @access private + */ + function _disconnect($reason) + { + $this->pwd = false; + parent::_disconnect($reason); + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SFTP/Stream.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SFTP/Stream.php old mode 100644 new mode 100755 index eda1cdbab..5be489265 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SFTP/Stream.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SFTP/Stream.php @@ -1,801 +1,815 @@ - - * @copyright 2013 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/** - * SFTP Stream Wrapper - * - * @package Net_SFTP_Stream - * @author Jim Wigginton - * @access public - */ -class Net_SFTP_Stream -{ - /** - * SFTP instances - * - * Rather than re-create the connection we re-use instances if possible - * - * @var Array - */ - static $instances; - - /** - * SFTP instance - * - * @var Object - * @access private - */ - var $sftp; - - /** - * Path - * - * @var String - * @access private - */ - var $path; - - /** - * Mode - * - * @var String - * @access private - */ - var $mode; - - /** - * Position - * - * @var Integer - * @access private - */ - var $pos; - - /** - * Size - * - * @var Integer - * @access private - */ - var $size; - - /** - * Directory entries - * - * @var Array - * @access private - */ - var $entries; - - /** - * EOF flag - * - * @var Boolean - * @access private - */ - var $eof; - - /** - * Context resource - * - * Technically this needs to be publically accessible so PHP can set it directly - * - * @var Resource - * @access public - */ - var $context; - - /** - * Notification callback function - * - * @var Callable - * @access public - */ - var $notification; - - /** - * Registers this class as a URL wrapper. - * - * @param optional String $protocol The wrapper name to be registered. - * @return Boolean True on success, false otherwise. - * @access public - */ - static function register($protocol = 'sftp') - { - if (in_array($protocol, stream_get_wrappers(), true)) { - return false; - } - $class = function_exists('get_called_class') ? get_called_class() : __CLASS__; - return stream_wrapper_register($protocol, $class); - } - - /** - * The Constructor - * - * @access public - */ - function Net_SFTP_Stream() - { - if (defined('NET_SFTP_STREAM_LOGGING')) { - echo "__construct()\r\n"; - } - - if (!class_exists('Net_SFTP')) { - include_once 'Net/SFTP.php'; - } - } - - /** - * Path Parser - * - * Extract a path from a URI and actually connect to an SSH server if appropriate - * - * If "notification" is set as a context parameter the message code for successful login is - * NET_SSH2_MSG_USERAUTH_SUCCESS. For a failed login it's NET_SSH2_MSG_USERAUTH_FAILURE. - * - * @param String $path - * @return String - * @access private - */ - function _parse_path($path) - { - extract(parse_url($path) + array('port' => 22)); - - if (!isset($host)) { - return false; - } - - if (isset($this->context)) { - $context = stream_context_get_params($this->context); - if (isset($context['notification'])) { - $this->notification = $context['notification']; - } - } - - if ($host[0] == '$') { - $host = substr($host, 1); - global $$host; - if (!is_object($$host) || get_class($$host) != 'Net_SFTP') { - return false; - } - $this->sftp = $$host; - } else { - if (isset($this->context)) { - $context = stream_context_get_options($this->context); - } - if (isset($context[$scheme]['session'])) { - $sftp = $context[$scheme]['session']; - } - if (isset($context[$scheme]['sftp'])) { - $sftp = $context[$scheme]['sftp']; - } - if (isset($sftp) && is_object($sftp) && get_class($sftp) == 'Net_SFTP') { - $this->sftp = $sftp; - return $path; - } - if (isset($context[$scheme]['username'])) { - $user = $context[$scheme]['username']; - } - if (isset($context[$scheme]['password'])) { - $pass = $context[$scheme]['password']; - } - if (isset($context[$scheme]['privkey']) && is_object($context[$scheme]['privkey']) && get_Class($context[$scheme]['privkey']) == 'Crypt_RSA') { - $pass = $context[$scheme]['privkey']; - } - - if (!isset($user) || !isset($pass)) { - return false; - } - - // casting $pass to a string is necessary in the event that it's a Crypt_RSA object - if (isset(self::$instances[$host][$port][$user][(string) $pass])) { - $this->sftp = self::$instances[$host][$port][$user][(string) $pass]; - } else { - $this->sftp = new Net_SFTP($host, $port); - $this->sftp->disableStatCache(); - if (isset($this->notification) && is_callable($this->notification)) { - /* if !is_callable($this->notification) we could do this: - - user_error('fopen(): failed to call user notifier', E_USER_WARNING); - - the ftp wrapper gives errors like that when the notifier isn't callable. - i've opted not to do that, however, since the ftp wrapper gives the line - on which the fopen occurred as the line number - not the line that the - user_error is on. - */ - call_user_func($this->notification, STREAM_NOTIFY_CONNECT, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); - call_user_func($this->notification, STREAM_NOTIFY_AUTH_REQUIRED, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); - if (!$this->sftp->login($user, $pass)) { - call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_ERR, 'Login Failure', NET_SSH2_MSG_USERAUTH_FAILURE, 0, 0); - return false; - } - call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_INFO, 'Login Success', NET_SSH2_MSG_USERAUTH_SUCCESS, 0, 0); - } else { - if (!$this->sftp->login($user, $pass)) { - return false; - } - } - self::$instances[$host][$port][$user][(string) $pass] = $this->sftp; - } - } - - return $path; - } - - /** - * Opens file or URL - * - * @param String $path - * @param String $mode - * @param Integer $options - * @param String $opened_path - * @return Boolean - * @access public - */ - function _stream_open($path, $mode, $options, &$opened_path) - { - $path = $this->_parse_path($path); - - if ($path === false) { - return false; - } - $this->path = $path; - - $this->size = $this->sftp->size($path); - $this->mode = preg_replace('#[bt]$#', '', $mode); - $this->eof = false; - - if ($this->size === false) { - if ($this->mode[0] == 'r') { - return false; - } - } else { - switch ($this->mode[0]) { - case 'x': - return false; - case 'w': - case 'c': - $this->sftp->truncate($path, 0); - } - } - - $this->pos = $this->mode[0] != 'a' ? 0 : $this->size; - - return true; - } - - /** - * Read from stream - * - * @param Integer $count - * @return Mixed - * @access public - */ - function _stream_read($count) - { - switch ($this->mode) { - case 'w': - case 'a': - case 'x': - case 'c': - return false; - } - - // commented out because some files - eg. /dev/urandom - will say their size is 0 when in fact it's kinda infinite - //if ($this->pos >= $this->size) { - // $this->eof = true; - // return false; - //} - - $result = $this->sftp->get($this->path, false, $this->pos, $count); - if (isset($this->notification) && is_callable($this->notification)) { - if ($result === false) { - call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); - return 0; - } - // seems that PHP calls stream_read in 8k chunks - call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($result), $this->size); - } - - if (empty($result)) { // ie. false or empty string - $this->eof = true; - return false; - } - $this->pos+= strlen($result); - - return $result; - } - - /** - * Write to stream - * - * @param String $data - * @return Mixed - * @access public - */ - function _stream_write($data) - { - switch ($this->mode) { - case 'r': - return false; - } - - $result = $this->sftp->put($this->path, $data, NET_SFTP_STRING, $this->pos); - if (isset($this->notification) && is_callable($this->notification)) { - if (!$result) { - call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); - return 0; - } - // seems that PHP splits up strings into 8k blocks before calling stream_write - call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($data), strlen($data)); - } - - if ($result === false) { - return false; - } - $this->pos+= strlen($data); - if ($this->pos > $this->size) { - $this->size = $this->pos; - } - $this->eof = false; - return strlen($data); - } - - /** - * Retrieve the current position of a stream - * - * @return Integer - * @access public - */ - function _stream_tell() - { - return $this->pos; - } - - /** - * Tests for end-of-file on a file pointer - * - * In my testing there are four classes functions that normally effect the pointer: - * fseek, fputs / fwrite, fgets / fread and ftruncate. - * - * Only fgets / fread, however, results in feof() returning true. do fputs($fp, 'aaa') on a blank file and feof() - * will return false. do fread($fp, 1) and feof() will then return true. do fseek($fp, 10) on ablank file and feof() - * will return false. do fread($fp, 1) and feof() will then return true. - * - * @return Boolean - * @access public - */ - function _stream_eof() - { - return $this->eof; - } - - /** - * Seeks to specific location in a stream - * - * @param Integer $offset - * @param Integer $whence - * @return Boolean - * @access public - */ - function _stream_seek($offset, $whence) - { - switch ($whence) { - case SEEK_SET: - if ($offset >= $this->size || $offset < 0) { - return false; - } - break; - case SEEK_CUR: - $offset+= $this->pos; - break; - case SEEK_END: - $offset+= $this->size; - } - - $this->pos = $offset; - $this->eof = false; - return true; - } - - /** - * Change stream options - * - * @param String $path - * @param Integer $option - * @param Mixed $var - * @return Boolean - * @access public - */ - function _stream_metadata($path, $option, $var) - { - $path = $this->_parse_path($path); - if ($path === false) { - return false; - } - - // stream_metadata was introduced in PHP 5.4.0 but as of 5.4.11 the constants haven't been defined - // see http://www.php.net/streamwrapper.stream-metadata and https://bugs.php.net/64246 - // and https://github.com/php/php-src/blob/master/main/php_streams.h#L592 - switch ($option) { - case 1: // PHP_STREAM_META_TOUCH - return $this->sftp->touch($path, $var[0], $var[1]); - case 2: // PHP_STREAM_OWNER_NAME - case 3: // PHP_STREAM_GROUP_NAME - return false; - case 4: // PHP_STREAM_META_OWNER - return $this->sftp->chown($path, $var); - case 5: // PHP_STREAM_META_GROUP - return $this->sftp->chgrp($path, $var); - case 6: // PHP_STREAM_META_ACCESS - return $this->sftp->chmod($path, $var) !== false; - } - } - - /** - * Retrieve the underlaying resource - * - * @param Integer $cast_as - * @return Resource - * @access public - */ - function _stream_cast($cast_as) - { - return $this->sftp->fsock; - } - - /** - * Advisory file locking - * - * @param Integer $operation - * @return Boolean - * @access public - */ - function _stream_lock($operation) - { - return false; - } - - /** - * Renames a file or directory - * - * Attempts to rename oldname to newname, moving it between directories if necessary. - * If newname exists, it will be overwritten. This is a departure from what Net_SFTP - * does. - * - * @param String $path_from - * @param String $path_to - * @return Boolean - * @access public - */ - function _rename($path_from, $path_to) - { - $path1 = parse_url($path_from); - $path2 = parse_url($path_to); - unset($path1['path'], $path2['path']); - if ($path1 != $path2) { - return false; - } - - $path_from = $this->_parse_path($path_from); - $path_to = parse_url($path_to); - if ($path_from == false) { - return false; - } - - $path_to = $path_to['path']; // the $component part of parse_url() was added in PHP 5.1.2 - // "It is an error if there already exists a file with the name specified by newpath." - // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-6.5 - if (!$this->sftp->rename($path_from, $path_to)) { - if ($this->sftp->stat($path_to)) { - return $this->sftp->delete($path_to, true) && $this->sftp->rename($path_from, $path_to); - } - return false; - } - - return true; - } - - /** - * Open directory handle - * - * The only $options is "whether or not to enforce safe_mode (0x04)". Since safe mode was deprecated in 5.3 and - * removed in 5.4 I'm just going to ignore it. - * - * Also, nlist() is the best that this function is realistically going to be able to do. When an SFTP client - * sends a SSH_FXP_READDIR packet you don't generally get info on just one file but on multiple files. Quoting - * the SFTP specs: - * - * The SSH_FXP_NAME response has the following format: - * - * uint32 id - * uint32 count - * repeats count times: - * string filename - * string longname - * ATTRS attrs - * - * @param String $path - * @param Integer $options - * @return Boolean - * @access public - */ - function _dir_opendir($path, $options) - { - $path = $this->_parse_path($path); - if ($path === false) { - return false; - } - $this->pos = 0; - $this->entries = $this->sftp->nlist($path); - return $this->entries !== false; - } - - /** - * Read entry from directory handle - * - * @return Mixed - * @access public - */ - function _dir_readdir() - { - if (isset($this->entries[$this->pos])) { - return $this->entries[$this->pos++]; - } - return false; - } - - /** - * Rewind directory handle - * - * @return Boolean - * @access public - */ - function _dir_rewinddir() - { - $this->pos = 0; - return true; - } - - /** - * Close directory handle - * - * @return Boolean - * @access public - */ - function _dir_closedir() - { - return true; - } - - /** - * Create a directory - * - * Only valid $options is STREAM_MKDIR_RECURSIVE - * - * @param String $path - * @param Integer $mode - * @param Integer $options - * @return Boolean - * @access public - */ - function _mkdir($path, $mode, $options) - { - $path = $this->_parse_path($path); - if ($path === false) { - return false; - } - - return $this->sftp->mkdir($path, $mode, $options & STREAM_MKDIR_RECURSIVE); - } - - /** - * Removes a directory - * - * Only valid $options is STREAM_MKDIR_RECURSIVE per , however, - * does not have a $recursive parameter as mkdir() does so I don't know how - * STREAM_MKDIR_RECURSIVE is supposed to be set. Also, when I try it out with rmdir() I get 8 as - * $options. What does 8 correspond to? - * - * @param String $path - * @param Integer $mode - * @param Integer $options - * @return Boolean - * @access public - */ - function _rmdir($path, $options) - { - $path = $this->_parse_path($path); - if ($path === false) { - return false; - } - - return $this->sftp->rmdir($path); - } - - /** - * Flushes the output - * - * See . Always returns true because Net_SFTP doesn't cache stuff before writing - * - * @return Boolean - * @access public - */ - function _stream_flush() - { - return true; - } - - /** - * Retrieve information about a file resource - * - * @return Mixed - * @access public - */ - function _stream_stat() - { - $results = $this->sftp->stat($this->path); - if ($results === false) { - return false; - } - return $results; - } - - /** - * Delete a file - * - * @param String $path - * @return Boolean - * @access public - */ - function _unlink($path) - { - $path = $this->_parse_path($path); - if ($path === false) { - return false; - } - - return $this->sftp->delete($path, false); - } - - /** - * Retrieve information about a file - * - * Ignores the STREAM_URL_STAT_QUIET flag because the entirety of Net_SFTP_Stream is quiet by default - * might be worthwhile to reconstruct bits 12-16 (ie. the file type) if mode doesn't have them but we'll - * cross that bridge when and if it's reached - * - * @param String $path - * @param Integer $flags - * @return Mixed - * @access public - */ - function _url_stat($path, $flags) - { - $path = $this->_parse_path($path); - if ($path === false) { - return false; - } - - $results = $flags & STREAM_URL_STAT_LINK ? $this->sftp->lstat($path) : $this->sftp->stat($path); - if ($results === false) { - return false; - } - - return $results; - } - - /** - * Truncate stream - * - * @param Integer $new_size - * @return Boolean - * @access public - */ - function _stream_truncate($new_size) - { - if (!$this->sftp->truncate($this->path, $new_size)) { - return false; - } - - $this->eof = false; - $this->size = $new_size; - - return true; - } - - /** - * Change stream options - * - * STREAM_OPTION_WRITE_BUFFER isn't supported for the same reason stream_flush isn't. - * The other two aren't supported because of limitations in Net_SFTP. - * - * @param Integer $option - * @param Integer $arg1 - * @param Integer $arg2 - * @return Boolean - * @access public - */ - function _stream_set_option($option, $arg1, $arg2) - { - return false; - } - - /** - * Close an resource - * - * @access public - */ - function _stream_close() - { - } - - /** - * __call Magic Method - * - * When you're utilizing an SFTP stream you're not calling the methods in this class directly - PHP is calling them for you. - * Which kinda begs the question... what methods is PHP calling and what parameters is it passing to them? This function - * lets you figure that out. - * - * If NET_SFTP_STREAM_LOGGING is defined all calls will be output on the screen and then (regardless of whether or not - * NET_SFTP_STREAM_LOGGING is enabled) the parameters will be passed through to the appropriate method. - * - * @param String - * @param Array - * @return Mixed - * @access public - */ - function __call($name, $arguments) - { - if (defined('NET_SFTP_STREAM_LOGGING')) { - echo $name . '('; - $last = count($arguments) - 1; - foreach ($arguments as $i => $argument) { - var_export($argument); - if ($i != $last) { - echo ','; - } - } - echo ")\r\n"; - } - $name = '_' . $name; - if (!method_exists($this, $name)) { - return false; - } - return call_user_func_array(array($this, $name), $arguments); - } -} - -Net_SFTP_Stream::register(); + + * @copyright 2013 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/** + * SFTP Stream Wrapper + * + * @package Net_SFTP_Stream + * @author Jim Wigginton + * @access public + */ +class Net_SFTP_Stream +{ + /** + * SFTP instances + * + * Rather than re-create the connection we re-use instances if possible + * + * @var array + */ + static $instances; + + /** + * SFTP instance + * + * @var object + * @access private + */ + var $sftp; + + /** + * Path + * + * @var string + * @access private + */ + var $path; + + /** + * Mode + * + * @var string + * @access private + */ + var $mode; + + /** + * Position + * + * @var int + * @access private + */ + var $pos; + + /** + * Size + * + * @var int + * @access private + */ + var $size; + + /** + * Directory entries + * + * @var array + * @access private + */ + var $entries; + + /** + * EOF flag + * + * @var bool + * @access private + */ + var $eof; + + /** + * Context resource + * + * Technically this needs to be publically accessible so PHP can set it directly + * + * @var resource + * @access public + */ + var $context; + + /** + * Notification callback function + * + * @var callable + * @access public + */ + var $notification; + + /** + * Registers this class as a URL wrapper. + * + * @param string $protocol The wrapper name to be registered. + * @return bool True on success, false otherwise. + * @access public + */ + static function register($protocol = 'sftp') + { + if (in_array($protocol, stream_get_wrappers(), true)) { + return false; + } + $class = function_exists('get_called_class') ? get_called_class() : __CLASS__; + return stream_wrapper_register($protocol, $class); + } + + /** + * The Constructor + * + * @access public + */ + function __construct() + { + if (defined('NET_SFTP_STREAM_LOGGING')) { + echo "__construct()\r\n"; + } + + if (!class_exists('Net_SFTP')) { + include_once 'Net/SFTP.php'; + } + } + + /** + * Path Parser + * + * Extract a path from a URI and actually connect to an SSH server if appropriate + * + * If "notification" is set as a context parameter the message code for successful login is + * NET_SSH2_MSG_USERAUTH_SUCCESS. For a failed login it's NET_SSH2_MSG_USERAUTH_FAILURE. + * + * @param string $path + * @return string + * @access private + */ + function _parse_path($path) + { + $orig = $path; + extract(parse_url($path) + array('port' => 22)); + if (isset($query)) { + $path.= '?' . $query; + } elseif (preg_match('/(\?|\?#)$/', $orig)) { + $path.= '?'; + } + if (isset($fragment)) { + $path.= '#' . $fragment; + } elseif ($orig[strlen($orig) - 1] == '#') { + $path.= '#'; + } + + if (!isset($host)) { + return false; + } + + if (isset($this->context)) { + $context = stream_context_get_params($this->context); + if (isset($context['notification'])) { + $this->notification = $context['notification']; + } + } + + if ($host[0] == '$') { + $host = substr($host, 1); + global ${$host}; + if (!is_object($$host) || get_class($$host) != 'Net_SFTP') { + return false; + } + $this->sftp = $$host; + } else { + if (isset($this->context)) { + $context = stream_context_get_options($this->context); + } + if (isset($context[$scheme]['session'])) { + $sftp = $context[$scheme]['session']; + } + if (isset($context[$scheme]['sftp'])) { + $sftp = $context[$scheme]['sftp']; + } + if (isset($sftp) && is_object($sftp) && get_class($sftp) == 'Net_SFTP') { + $this->sftp = $sftp; + return $path; + } + if (isset($context[$scheme]['username'])) { + $user = $context[$scheme]['username']; + } + if (isset($context[$scheme]['password'])) { + $pass = $context[$scheme]['password']; + } + if (isset($context[$scheme]['privkey']) && is_object($context[$scheme]['privkey']) && get_Class($context[$scheme]['privkey']) == 'Crypt_RSA') { + $pass = $context[$scheme]['privkey']; + } + + if (!isset($user) || !isset($pass)) { + return false; + } + + // casting $pass to a string is necessary in the event that it's a Crypt_RSA object + if (isset(self::$instances[$host][$port][$user][(string) $pass])) { + $this->sftp = self::$instances[$host][$port][$user][(string) $pass]; + } else { + $this->sftp = new Net_SFTP($host, $port); + $this->sftp->disableStatCache(); + if (isset($this->notification) && is_callable($this->notification)) { + /* if !is_callable($this->notification) we could do this: + + user_error('fopen(): failed to call user notifier', E_USER_WARNING); + + the ftp wrapper gives errors like that when the notifier isn't callable. + i've opted not to do that, however, since the ftp wrapper gives the line + on which the fopen occurred as the line number - not the line that the + user_error is on. + */ + call_user_func($this->notification, STREAM_NOTIFY_CONNECT, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); + call_user_func($this->notification, STREAM_NOTIFY_AUTH_REQUIRED, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); + if (!$this->sftp->login($user, $pass)) { + call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_ERR, 'Login Failure', NET_SSH2_MSG_USERAUTH_FAILURE, 0, 0); + return false; + } + call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_INFO, 'Login Success', NET_SSH2_MSG_USERAUTH_SUCCESS, 0, 0); + } else { + if (!$this->sftp->login($user, $pass)) { + return false; + } + } + self::$instances[$host][$port][$user][(string) $pass] = $this->sftp; + } + } + + return $path; + } + + /** + * Opens file or URL + * + * @param string $path + * @param string $mode + * @param int $options + * @param string $opened_path + * @return bool + * @access public + */ + function _stream_open($path, $mode, $options, &$opened_path) + { + $path = $this->_parse_path($path); + + if ($path === false) { + return false; + } + $this->path = $path; + + $this->size = $this->sftp->size($path); + $this->mode = preg_replace('#[bt]$#', '', $mode); + $this->eof = false; + + if ($this->size === false) { + if ($this->mode[0] == 'r') { + return false; + } else { + $this->sftp->touch($path); + $this->size = 0; + } + } else { + switch ($this->mode[0]) { + case 'x': + return false; + case 'w': + $this->sftp->truncate($path, 0); + $this->size = 0; + } + } + + $this->pos = $this->mode[0] != 'a' ? 0 : $this->size; + + return true; + } + + /** + * Read from stream + * + * @param int $count + * @return mixed + * @access public + */ + function _stream_read($count) + { + switch ($this->mode) { + case 'w': + case 'a': + case 'x': + case 'c': + return false; + } + + // commented out because some files - eg. /dev/urandom - will say their size is 0 when in fact it's kinda infinite + //if ($this->pos >= $this->size) { + // $this->eof = true; + // return false; + //} + + $result = $this->sftp->get($this->path, false, $this->pos, $count); + if (isset($this->notification) && is_callable($this->notification)) { + if ($result === false) { + call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); + return 0; + } + // seems that PHP calls stream_read in 8k chunks + call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($result), $this->size); + } + + if (empty($result)) { // ie. false or empty string + $this->eof = true; + return false; + } + $this->pos+= strlen($result); + + return $result; + } + + /** + * Write to stream + * + * @param string $data + * @return mixed + * @access public + */ + function _stream_write($data) + { + switch ($this->mode) { + case 'r': + return false; + } + + $result = $this->sftp->put($this->path, $data, NET_SFTP_STRING, $this->pos); + if (isset($this->notification) && is_callable($this->notification)) { + if (!$result) { + call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); + return 0; + } + // seems that PHP splits up strings into 8k blocks before calling stream_write + call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($data), strlen($data)); + } + + if ($result === false) { + return false; + } + $this->pos+= strlen($data); + if ($this->pos > $this->size) { + $this->size = $this->pos; + } + $this->eof = false; + return strlen($data); + } + + /** + * Retrieve the current position of a stream + * + * @return int + * @access public + */ + function _stream_tell() + { + return $this->pos; + } + + /** + * Tests for end-of-file on a file pointer + * + * In my testing there are four classes functions that normally effect the pointer: + * fseek, fputs / fwrite, fgets / fread and ftruncate. + * + * Only fgets / fread, however, results in feof() returning true. do fputs($fp, 'aaa') on a blank file and feof() + * will return false. do fread($fp, 1) and feof() will then return true. do fseek($fp, 10) on ablank file and feof() + * will return false. do fread($fp, 1) and feof() will then return true. + * + * @return bool + * @access public + */ + function _stream_eof() + { + return $this->eof; + } + + /** + * Seeks to specific location in a stream + * + * @param int $offset + * @param int $whence + * @return bool + * @access public + */ + function _stream_seek($offset, $whence) + { + switch ($whence) { + case SEEK_SET: + if ($offset >= $this->size || $offset < 0) { + return false; + } + break; + case SEEK_CUR: + $offset+= $this->pos; + break; + case SEEK_END: + $offset+= $this->size; + } + + $this->pos = $offset; + $this->eof = false; + return true; + } + + /** + * Change stream options + * + * @param string $path + * @param int $option + * @param mixed $var + * @return bool + * @access public + */ + function _stream_metadata($path, $option, $var) + { + $path = $this->_parse_path($path); + if ($path === false) { + return false; + } + + // stream_metadata was introduced in PHP 5.4.0 but as of 5.4.11 the constants haven't been defined + // see http://www.php.net/streamwrapper.stream-metadata and https://bugs.php.net/64246 + // and https://github.com/php/php-src/blob/master/main/php_streams.h#L592 + switch ($option) { + case 1: // PHP_STREAM_META_TOUCH + return $this->sftp->touch($path, $var[0], $var[1]); + case 2: // PHP_STREAM_OWNER_NAME + case 3: // PHP_STREAM_GROUP_NAME + return false; + case 4: // PHP_STREAM_META_OWNER + return $this->sftp->chown($path, $var); + case 5: // PHP_STREAM_META_GROUP + return $this->sftp->chgrp($path, $var); + case 6: // PHP_STREAM_META_ACCESS + return $this->sftp->chmod($path, $var) !== false; + } + } + + /** + * Retrieve the underlaying resource + * + * @param int $cast_as + * @return resource + * @access public + */ + function _stream_cast($cast_as) + { + return $this->sftp->fsock; + } + + /** + * Advisory file locking + * + * @param int $operation + * @return bool + * @access public + */ + function _stream_lock($operation) + { + return false; + } + + /** + * Renames a file or directory + * + * Attempts to rename oldname to newname, moving it between directories if necessary. + * If newname exists, it will be overwritten. This is a departure from what Net_SFTP + * does. + * + * @param string $path_from + * @param string $path_to + * @return bool + * @access public + */ + function _rename($path_from, $path_to) + { + $path1 = parse_url($path_from); + $path2 = parse_url($path_to); + unset($path1['path'], $path2['path']); + if ($path1 != $path2) { + return false; + } + + $path_from = $this->_parse_path($path_from); + $path_to = parse_url($path_to); + if ($path_from === false) { + return false; + } + + $path_to = $path_to['path']; // the $component part of parse_url() was added in PHP 5.1.2 + // "It is an error if there already exists a file with the name specified by newpath." + // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-6.5 + if (!$this->sftp->rename($path_from, $path_to)) { + if ($this->sftp->stat($path_to)) { + return $this->sftp->delete($path_to, true) && $this->sftp->rename($path_from, $path_to); + } + return false; + } + + return true; + } + + /** + * Open directory handle + * + * The only $options is "whether or not to enforce safe_mode (0x04)". Since safe mode was deprecated in 5.3 and + * removed in 5.4 I'm just going to ignore it. + * + * Also, nlist() is the best that this function is realistically going to be able to do. When an SFTP client + * sends a SSH_FXP_READDIR packet you don't generally get info on just one file but on multiple files. Quoting + * the SFTP specs: + * + * The SSH_FXP_NAME response has the following format: + * + * uint32 id + * uint32 count + * repeats count times: + * string filename + * string longname + * ATTRS attrs + * + * @param string $path + * @param int $options + * @return bool + * @access public + */ + function _dir_opendir($path, $options) + { + $path = $this->_parse_path($path); + if ($path === false) { + return false; + } + $this->pos = 0; + $this->entries = $this->sftp->nlist($path); + return $this->entries !== false; + } + + /** + * Read entry from directory handle + * + * @return mixed + * @access public + */ + function _dir_readdir() + { + if (isset($this->entries[$this->pos])) { + return $this->entries[$this->pos++]; + } + return false; + } + + /** + * Rewind directory handle + * + * @return bool + * @access public + */ + function _dir_rewinddir() + { + $this->pos = 0; + return true; + } + + /** + * Close directory handle + * + * @return bool + * @access public + */ + function _dir_closedir() + { + return true; + } + + /** + * Create a directory + * + * Only valid $options is STREAM_MKDIR_RECURSIVE + * + * @param string $path + * @param int $mode + * @param int $options + * @return bool + * @access public + */ + function _mkdir($path, $mode, $options) + { + $path = $this->_parse_path($path); + if ($path === false) { + return false; + } + + return $this->sftp->mkdir($path, $mode, $options & STREAM_MKDIR_RECURSIVE); + } + + /** + * Removes a directory + * + * Only valid $options is STREAM_MKDIR_RECURSIVE per , however, + * does not have a $recursive parameter as mkdir() does so I don't know how + * STREAM_MKDIR_RECURSIVE is supposed to be set. Also, when I try it out with rmdir() I get 8 as + * $options. What does 8 correspond to? + * + * @param string $path + * @param int $mode + * @param int $options + * @return bool + * @access public + */ + function _rmdir($path, $options) + { + $path = $this->_parse_path($path); + if ($path === false) { + return false; + } + + return $this->sftp->rmdir($path); + } + + /** + * Flushes the output + * + * See . Always returns true because Net_SFTP doesn't cache stuff before writing + * + * @return bool + * @access public + */ + function _stream_flush() + { + return true; + } + + /** + * Retrieve information about a file resource + * + * @return mixed + * @access public + */ + function _stream_stat() + { + $results = $this->sftp->stat($this->path); + if ($results === false) { + return false; + } + return $results; + } + + /** + * Delete a file + * + * @param string $path + * @return bool + * @access public + */ + function _unlink($path) + { + $path = $this->_parse_path($path); + if ($path === false) { + return false; + } + + return $this->sftp->delete($path, false); + } + + /** + * Retrieve information about a file + * + * Ignores the STREAM_URL_STAT_QUIET flag because the entirety of Net_SFTP_Stream is quiet by default + * might be worthwhile to reconstruct bits 12-16 (ie. the file type) if mode doesn't have them but we'll + * cross that bridge when and if it's reached + * + * @param string $path + * @param int $flags + * @return mixed + * @access public + */ + function _url_stat($path, $flags) + { + $path = $this->_parse_path($path); + if ($path === false) { + return false; + } + + $results = $flags & STREAM_URL_STAT_LINK ? $this->sftp->lstat($path) : $this->sftp->stat($path); + if ($results === false) { + return false; + } + + return $results; + } + + /** + * Truncate stream + * + * @param int $new_size + * @return bool + * @access public + */ + function _stream_truncate($new_size) + { + if (!$this->sftp->truncate($this->path, $new_size)) { + return false; + } + + $this->eof = false; + $this->size = $new_size; + + return true; + } + + /** + * Change stream options + * + * STREAM_OPTION_WRITE_BUFFER isn't supported for the same reason stream_flush isn't. + * The other two aren't supported because of limitations in Net_SFTP. + * + * @param int $option + * @param int $arg1 + * @param int $arg2 + * @return bool + * @access public + */ + function _stream_set_option($option, $arg1, $arg2) + { + return false; + } + + /** + * Close an resource + * + * @access public + */ + function _stream_close() + { + } + + /** + * __call Magic Method + * + * When you're utilizing an SFTP stream you're not calling the methods in this class directly - PHP is calling them for you. + * Which kinda begs the question... what methods is PHP calling and what parameters is it passing to them? This function + * lets you figure that out. + * + * If NET_SFTP_STREAM_LOGGING is defined all calls will be output on the screen and then (regardless of whether or not + * NET_SFTP_STREAM_LOGGING is enabled) the parameters will be passed through to the appropriate method. + * + * @param string + * @param array + * @return mixed + * @access public + */ + function __call($name, $arguments) + { + if (defined('NET_SFTP_STREAM_LOGGING')) { + echo $name . '('; + $last = count($arguments) - 1; + foreach ($arguments as $i => $argument) { + var_export($argument); + if ($i != $last) { + echo ','; + } + } + echo ")\r\n"; + } + $name = '_' . $name; + if (!method_exists($this, $name)) { + return false; + } + return call_user_func_array(array($this, $name), $arguments); + } +} + +Net_SFTP_Stream::register(); diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SSH1.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SSH1.php old mode 100644 new mode 100755 index f1fae02ba..702d140b2 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SSH1.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SSH1.php @@ -1,1651 +1,1691 @@ - - * login('username', 'password')) { - * exit('Login Failed'); - * } - * - * echo $ssh->exec('ls -la'); - * ?> - * - * - * Here's another short example: - * - * login('username', 'password')) { - * exit('Login Failed'); - * } - * - * echo $ssh->read('username@username:~$'); - * $ssh->write("ls -la\n"); - * echo $ssh->read('username@username:~$'); - * ?> - * - * - * More information on the SSHv1 specification can be found by reading - * {@link http://www.snailbook.com/docs/protocol-1.5.txt protocol-1.5.txt}. - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Net - * @package Net_SSH1 - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/**#@+ - * Encryption Methods - * - * @see Net_SSH1::getSupportedCiphers() - * @access public - */ -/** - * No encryption - * - * Not supported. - */ -define('NET_SSH1_CIPHER_NONE', 0); -/** - * IDEA in CFB mode - * - * Not supported. - */ -define('NET_SSH1_CIPHER_IDEA', 1); -/** - * DES in CBC mode - */ -define('NET_SSH1_CIPHER_DES', 2); -/** - * Triple-DES in CBC mode - * - * All implementations are required to support this - */ -define('NET_SSH1_CIPHER_3DES', 3); -/** - * TRI's Simple Stream encryption CBC - * - * Not supported nor is it defined in the official SSH1 specs. OpenSSH, however, does define it (see cipher.h), - * although it doesn't use it (see cipher.c) - */ -define('NET_SSH1_CIPHER_BROKEN_TSS', 4); -/** - * RC4 - * - * Not supported. - * - * @internal According to the SSH1 specs: - * - * "The first 16 bytes of the session key are used as the key for - * the server to client direction. The remaining 16 bytes are used - * as the key for the client to server direction. This gives - * independent 128-bit keys for each direction." - * - * This library currently only supports encryption when the same key is being used for both directions. This is - * because there's only one $crypto object. Two could be added ($encrypt and $decrypt, perhaps). - */ -define('NET_SSH1_CIPHER_RC4', 5); -/** - * Blowfish - * - * Not supported nor is it defined in the official SSH1 specs. OpenSSH, however, defines it (see cipher.h) and - * uses it (see cipher.c) - */ -define('NET_SSH1_CIPHER_BLOWFISH', 6); -/**#@-*/ - -/**#@+ - * Authentication Methods - * - * @see Net_SSH1::getSupportedAuthentications() - * @access public - */ -/** - * .rhosts or /etc/hosts.equiv - */ -define('NET_SSH1_AUTH_RHOSTS', 1); -/** - * pure RSA authentication - */ -define('NET_SSH1_AUTH_RSA', 2); -/** - * password authentication - * - * This is the only method that is supported by this library. - */ -define('NET_SSH1_AUTH_PASSWORD', 3); -/** - * .rhosts with RSA host authentication - */ -define('NET_SSH1_AUTH_RHOSTS_RSA', 4); -/**#@-*/ - -/**#@+ - * Terminal Modes - * - * @link http://3sp.com/content/developer/maverick-net/docs/Maverick.SSH.PseudoTerminalModesMembers.html - * @access private - */ -define('NET_SSH1_TTY_OP_END', 0); -/**#@-*/ - -/** - * The Response Type - * - * @see Net_SSH1::_get_binary_packet() - * @access private - */ -define('NET_SSH1_RESPONSE_TYPE', 1); - -/** - * The Response Data - * - * @see Net_SSH1::_get_binary_packet() - * @access private - */ -define('NET_SSH1_RESPONSE_DATA', 2); - -/**#@+ - * Execution Bitmap Masks - * - * @see Net_SSH1::bitmap - * @access private - */ -define('NET_SSH1_MASK_CONSTRUCTOR', 0x00000001); -define('NET_SSH1_MASK_CONNECTED', 0x00000002); -define('NET_SSH1_MASK_LOGIN', 0x00000004); -define('NET_SSH1_MASK_SHELL', 0x00000008); -/**#@-*/ - -/**#@+ - * @access public - * @see Net_SSH1::getLog() - */ -/** - * Returns the message numbers - */ -define('NET_SSH1_LOG_SIMPLE', 1); -/** - * Returns the message content - */ -define('NET_SSH1_LOG_COMPLEX', 2); -/** - * Outputs the content real-time - */ -define('NET_SSH1_LOG_REALTIME', 3); -/** - * Dumps the content real-time to a file - */ -define('NET_SSH1_LOG_REALTIME_FILE', 4); -/**#@-*/ - -/**#@+ - * @access public - * @see Net_SSH1::read() - */ -/** - * Returns when a string matching $expect exactly is found - */ -define('NET_SSH1_READ_SIMPLE', 1); -/** - * Returns when a string matching the regular expression $expect is found - */ -define('NET_SSH1_READ_REGEX', 2); -/**#@-*/ - -/** - * Pure-PHP implementation of SSHv1. - * - * @package Net_SSH1 - * @author Jim Wigginton - * @access public - */ -class Net_SSH1 -{ - /** - * The SSH identifier - * - * @var String - * @access private - */ - var $identifier = 'SSH-1.5-phpseclib'; - - /** - * The Socket Object - * - * @var Object - * @access private - */ - var $fsock; - - /** - * The cryptography object - * - * @var Object - * @access private - */ - var $crypto = false; - - /** - * Execution Bitmap - * - * The bits that are set represent functions that have been called already. This is used to determine - * if a requisite function has been successfully executed. If not, an error should be thrown. - * - * @var Integer - * @access private - */ - var $bitmap = 0; - - /** - * The Server Key Public Exponent - * - * Logged for debug purposes - * - * @see Net_SSH1::getServerKeyPublicExponent() - * @var String - * @access private - */ - var $server_key_public_exponent; - - /** - * The Server Key Public Modulus - * - * Logged for debug purposes - * - * @see Net_SSH1::getServerKeyPublicModulus() - * @var String - * @access private - */ - var $server_key_public_modulus; - - /** - * The Host Key Public Exponent - * - * Logged for debug purposes - * - * @see Net_SSH1::getHostKeyPublicExponent() - * @var String - * @access private - */ - var $host_key_public_exponent; - - /** - * The Host Key Public Modulus - * - * Logged for debug purposes - * - * @see Net_SSH1::getHostKeyPublicModulus() - * @var String - * @access private - */ - var $host_key_public_modulus; - - /** - * Supported Ciphers - * - * Logged for debug purposes - * - * @see Net_SSH1::getSupportedCiphers() - * @var Array - * @access private - */ - var $supported_ciphers = array( - NET_SSH1_CIPHER_NONE => 'No encryption', - NET_SSH1_CIPHER_IDEA => 'IDEA in CFB mode', - NET_SSH1_CIPHER_DES => 'DES in CBC mode', - NET_SSH1_CIPHER_3DES => 'Triple-DES in CBC mode', - NET_SSH1_CIPHER_BROKEN_TSS => 'TRI\'s Simple Stream encryption CBC', - NET_SSH1_CIPHER_RC4 => 'RC4', - NET_SSH1_CIPHER_BLOWFISH => 'Blowfish' - ); - - /** - * Supported Authentications - * - * Logged for debug purposes - * - * @see Net_SSH1::getSupportedAuthentications() - * @var Array - * @access private - */ - var $supported_authentications = array( - NET_SSH1_AUTH_RHOSTS => '.rhosts or /etc/hosts.equiv', - NET_SSH1_AUTH_RSA => 'pure RSA authentication', - NET_SSH1_AUTH_PASSWORD => 'password authentication', - NET_SSH1_AUTH_RHOSTS_RSA => '.rhosts with RSA host authentication' - ); - - /** - * Server Identification - * - * @see Net_SSH1::getServerIdentification() - * @var String - * @access private - */ - var $server_identification = ''; - - /** - * Protocol Flags - * - * @see Net_SSH1::Net_SSH1() - * @var Array - * @access private - */ - var $protocol_flags = array(); - - /** - * Protocol Flag Log - * - * @see Net_SSH1::getLog() - * @var Array - * @access private - */ - var $protocol_flag_log = array(); - - /** - * Message Log - * - * @see Net_SSH1::getLog() - * @var Array - * @access private - */ - var $message_log = array(); - - /** - * Real-time log file pointer - * - * @see Net_SSH1::_append_log() - * @var Resource - * @access private - */ - var $realtime_log_file; - - /** - * Real-time log file size - * - * @see Net_SSH1::_append_log() - * @var Integer - * @access private - */ - var $realtime_log_size; - - /** - * Real-time log file wrap boolean - * - * @see Net_SSH1::_append_log() - * @var Boolean - * @access private - */ - var $realtime_log_wrap; - - /** - * Interactive Buffer - * - * @see Net_SSH1::read() - * @var Array - * @access private - */ - var $interactiveBuffer = ''; - - /** - * Timeout - * - * @see Net_SSH1::setTimeout() - * @access private - */ - var $timeout; - - /** - * Current Timeout - * - * @see Net_SSH1::_get_channel_packet() - * @access private - */ - var $curTimeout; - - /** - * Log Boundary - * - * @see Net_SSH1::_format_log - * @access private - */ - var $log_boundary = ':'; - - /** - * Log Long Width - * - * @see Net_SSH1::_format_log - * @access private - */ - var $log_long_width = 65; - - /** - * Log Short Width - * - * @see Net_SSH1::_format_log - * @access private - */ - var $log_short_width = 16; - - /** - * Hostname - * - * @see Net_SSH1::Net_SSH1() - * @see Net_SSH1::_connect() - * @var String - * @access private - */ - var $host; - - /** - * Port Number - * - * @see Net_SSH1::Net_SSH1() - * @see Net_SSH1::_connect() - * @var Integer - * @access private - */ - var $port; - - /** - * Timeout for initial connection - * - * Set by the constructor call. Calling setTimeout() is optional. If it's not called functions like - * exec() won't timeout unless some PHP setting forces it too. The timeout specified in the constructor, - * however, is non-optional. There will be a timeout, whether or not you set it. If you don't it'll be - * 10 seconds. It is used by fsockopen() in that function. - * - * @see Net_SSH1::Net_SSH1() - * @see Net_SSH1::_connect() - * @var Integer - * @access private - */ - var $connectionTimeout; - - /** - * Default cipher - * - * @see Net_SSH1::Net_SSH1() - * @see Net_SSH1::_connect() - * @var Integer - * @access private - */ - var $cipher; - - /** - * Default Constructor. - * - * Connects to an SSHv1 server - * - * @param String $host - * @param optional Integer $port - * @param optional Integer $timeout - * @param optional Integer $cipher - * @return Net_SSH1 - * @access public - */ - function Net_SSH1($host, $port = 22, $timeout = 10, $cipher = NET_SSH1_CIPHER_3DES) - { - if (!class_exists('Math_BigInteger')) { - include_once 'Math/BigInteger.php'; - } - - // Include Crypt_Random - // the class_exists() will only be called if the crypt_random_string function hasn't been defined and - // will trigger a call to __autoload() if you're wanting to auto-load classes - // call function_exists() a second time to stop the include_once from being called outside - // of the auto loader - if (!function_exists('crypt_random_string') && !class_exists('Crypt_Random') && !function_exists('crypt_random_string')) { - include_once 'Crypt/Random.php'; - } - - $this->protocol_flags = array( - 1 => 'NET_SSH1_MSG_DISCONNECT', - 2 => 'NET_SSH1_SMSG_PUBLIC_KEY', - 3 => 'NET_SSH1_CMSG_SESSION_KEY', - 4 => 'NET_SSH1_CMSG_USER', - 9 => 'NET_SSH1_CMSG_AUTH_PASSWORD', - 10 => 'NET_SSH1_CMSG_REQUEST_PTY', - 12 => 'NET_SSH1_CMSG_EXEC_SHELL', - 13 => 'NET_SSH1_CMSG_EXEC_CMD', - 14 => 'NET_SSH1_SMSG_SUCCESS', - 15 => 'NET_SSH1_SMSG_FAILURE', - 16 => 'NET_SSH1_CMSG_STDIN_DATA', - 17 => 'NET_SSH1_SMSG_STDOUT_DATA', - 18 => 'NET_SSH1_SMSG_STDERR_DATA', - 19 => 'NET_SSH1_CMSG_EOF', - 20 => 'NET_SSH1_SMSG_EXITSTATUS', - 33 => 'NET_SSH1_CMSG_EXIT_CONFIRMATION' - ); - - $this->_define_array($this->protocol_flags); - - $this->host = $host; - $this->port = $port; - $this->connectionTimeout = $timeout; - $this->cipher = $cipher; - } - - /** - * Connect to an SSHv1 server - * - * @return Boolean - * @access private - */ - function _connect() - { - $this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->connectionTimeout); - if (!$this->fsock) { - user_error(rtrim("Cannot connect to {$this->host}:{$this->port}. Error $errno. $errstr")); - return false; - } - - $this->server_identification = $init_line = fgets($this->fsock, 255); - - if (defined('NET_SSH1_LOGGING')) { - $this->_append_log('<-', $this->server_identification); - $this->_append_log('->', $this->identifier . "\r\n"); - } - - if (!preg_match('#SSH-([0-9\.]+)-(.+)#', $init_line, $parts)) { - user_error('Can only connect to SSH servers'); - return false; - } - if ($parts[1][0] != 1) { - user_error("Cannot connect to SSH $parts[1] servers"); - return false; - } - - fputs($this->fsock, $this->identifier."\r\n"); - - $response = $this->_get_binary_packet(); - if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_PUBLIC_KEY) { - user_error('Expected SSH_SMSG_PUBLIC_KEY'); - return false; - } - - $anti_spoofing_cookie = $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 8); - - $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4); - - $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); - $server_key_public_exponent = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); - $this->server_key_public_exponent = $server_key_public_exponent; - - $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); - $server_key_public_modulus = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); - $this->server_key_public_modulus = $server_key_public_modulus; - - $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4); - - $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); - $host_key_public_exponent = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); - $this->host_key_public_exponent = $host_key_public_exponent; - - $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); - $host_key_public_modulus = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); - $this->host_key_public_modulus = $host_key_public_modulus; - - $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4); - - // get a list of the supported ciphers - extract(unpack('Nsupported_ciphers_mask', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4))); - foreach ($this->supported_ciphers as $mask=>$name) { - if (($supported_ciphers_mask & (1 << $mask)) == 0) { - unset($this->supported_ciphers[$mask]); - } - } - - // get a list of the supported authentications - extract(unpack('Nsupported_authentications_mask', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4))); - foreach ($this->supported_authentications as $mask=>$name) { - if (($supported_authentications_mask & (1 << $mask)) == 0) { - unset($this->supported_authentications[$mask]); - } - } - - $session_id = pack('H*', md5($host_key_public_modulus->toBytes() . $server_key_public_modulus->toBytes() . $anti_spoofing_cookie)); - - $session_key = crypt_random_string(32); - $double_encrypted_session_key = $session_key ^ str_pad($session_id, 32, chr(0)); - - if ($server_key_public_modulus->compare($host_key_public_modulus) < 0) { - $double_encrypted_session_key = $this->_rsa_crypt( - $double_encrypted_session_key, - array( - $server_key_public_exponent, - $server_key_public_modulus - ) - ); - $double_encrypted_session_key = $this->_rsa_crypt( - $double_encrypted_session_key, - array( - $host_key_public_exponent, - $host_key_public_modulus - ) - ); - } else { - $double_encrypted_session_key = $this->_rsa_crypt( - $double_encrypted_session_key, - array( - $host_key_public_exponent, - $host_key_public_modulus - ) - ); - $double_encrypted_session_key = $this->_rsa_crypt( - $double_encrypted_session_key, - array( - $server_key_public_exponent, - $server_key_public_modulus - ) - ); - } - - $cipher = isset($this->supported_ciphers[$this->cipher]) ? $this->cipher : NET_SSH1_CIPHER_3DES; - $data = pack('C2a*na*N', NET_SSH1_CMSG_SESSION_KEY, $cipher, $anti_spoofing_cookie, 8 * strlen($double_encrypted_session_key), $double_encrypted_session_key, 0); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_SESSION_KEY'); - return false; - } - - switch ($cipher) { - //case NET_SSH1_CIPHER_NONE: - // $this->crypto = new Crypt_Null(); - // break; - case NET_SSH1_CIPHER_DES: - if (!class_exists('Crypt_DES')) { - include_once 'Crypt/DES.php'; - } - $this->crypto = new Crypt_DES(); - $this->crypto->disablePadding(); - $this->crypto->enableContinuousBuffer(); - $this->crypto->setKey(substr($session_key, 0, 8)); - break; - case NET_SSH1_CIPHER_3DES: - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $this->crypto = new Crypt_TripleDES(CRYPT_DES_MODE_3CBC); - $this->crypto->disablePadding(); - $this->crypto->enableContinuousBuffer(); - $this->crypto->setKey(substr($session_key, 0, 24)); - break; - //case NET_SSH1_CIPHER_RC4: - // if (!class_exists('Crypt_RC4')) { - // include_once 'Crypt/RC4.php'; - // } - // $this->crypto = new Crypt_RC4(); - // $this->crypto->enableContinuousBuffer(); - // $this->crypto->setKey(substr($session_key, 0, 16)); - // break; - } - - $response = $this->_get_binary_packet(); - - if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_SUCCESS) { - user_error('Expected SSH_SMSG_SUCCESS'); - return false; - } - - $this->bitmap = NET_SSH1_MASK_CONNECTED; - - return true; - } - - /** - * Login - * - * @param String $username - * @param optional String $password - * @return Boolean - * @access public - */ - function login($username, $password = '') - { - if (!($this->bitmap & NET_SSH1_MASK_CONSTRUCTOR)) { - $this->bitmap |= NET_SSH1_MASK_CONSTRUCTOR; - if (!$this->_connect()) { - return false; - } - } - - if (!($this->bitmap & NET_SSH1_MASK_CONNECTED)) { - return false; - } - - $data = pack('CNa*', NET_SSH1_CMSG_USER, strlen($username), $username); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_USER'); - return false; - } - - $response = $this->_get_binary_packet(); - - if ($response === true) { - return false; - } - if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) { - $this->bitmap |= NET_SSH1_MASK_LOGIN; - return true; - } else if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_FAILURE) { - user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE'); - return false; - } - - $data = pack('CNa*', NET_SSH1_CMSG_AUTH_PASSWORD, strlen($password), $password); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_AUTH_PASSWORD'); - return false; - } - - // remove the username and password from the last logged packet - if (defined('NET_SSH1_LOGGING') && NET_SSH1_LOGGING == NET_SSH1_LOG_COMPLEX) { - $data = pack('CNa*', NET_SSH1_CMSG_AUTH_PASSWORD, strlen('password'), 'password'); - $this->message_log[count($this->message_log) - 1] = $data; - } - - $response = $this->_get_binary_packet(); - - if ($response === true) { - return false; - } - if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) { - $this->bitmap |= NET_SSH1_MASK_LOGIN; - return true; - } else if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_FAILURE) { - return false; - } else { - user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE'); - return false; - } - } - - /** - * Set Timeout - * - * $ssh->exec('ping 127.0.0.1'); on a Linux host will never return and will run indefinitely. setTimeout() makes it so it'll timeout. - * Setting $timeout to false or 0 will mean there is no timeout. - * - * @param Mixed $timeout - */ - function setTimeout($timeout) - { - $this->timeout = $this->curTimeout = $timeout; - } - - /** - * Executes a command on a non-interactive shell, returns the output, and quits. - * - * An SSH1 server will close the connection after a command has been executed on a non-interactive shell. SSH2 - * servers don't, however, this isn't an SSH2 client. The way this works, on the server, is by initiating a - * shell with the -s option, as discussed in the following links: - * - * {@link http://www.faqs.org/docs/bashman/bashref_65.html http://www.faqs.org/docs/bashman/bashref_65.html} - * {@link http://www.faqs.org/docs/bashman/bashref_62.html http://www.faqs.org/docs/bashman/bashref_62.html} - * - * To execute further commands, a new Net_SSH1 object will need to be created. - * - * Returns false on failure and the output, otherwise. - * - * @see Net_SSH1::interactiveRead() - * @see Net_SSH1::interactiveWrite() - * @param String $cmd - * @return mixed - * @access public - */ - function exec($cmd, $block = true) - { - if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { - user_error('Operation disallowed prior to login()'); - return false; - } - - $data = pack('CNa*', NET_SSH1_CMSG_EXEC_CMD, strlen($cmd), $cmd); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_EXEC_CMD'); - return false; - } - - if (!$block) { - return true; - } - - $output = ''; - $response = $this->_get_binary_packet(); - - if ($response !== false) { - do { - $output.= substr($response[NET_SSH1_RESPONSE_DATA], 4); - $response = $this->_get_binary_packet(); - } while (is_array($response) && $response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_EXITSTATUS); - } - - $data = pack('C', NET_SSH1_CMSG_EXIT_CONFIRMATION); - - // i don't think it's really all that important if this packet gets sent or not. - $this->_send_binary_packet($data); - - fclose($this->fsock); - - // reset the execution bitmap - a new Net_SSH1 object needs to be created. - $this->bitmap = 0; - - return $output; - } - - /** - * Creates an interactive shell - * - * @see Net_SSH1::interactiveRead() - * @see Net_SSH1::interactiveWrite() - * @return Boolean - * @access private - */ - function _initShell() - { - // connect using the sample parameters in protocol-1.5.txt. - // according to wikipedia.org's entry on text terminals, "the fundamental type of application running on a text - // terminal is a command line interpreter or shell". thus, opening a terminal session to run the shell. - $data = pack('CNa*N4C', NET_SSH1_CMSG_REQUEST_PTY, strlen('vt100'), 'vt100', 24, 80, 0, 0, NET_SSH1_TTY_OP_END); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_REQUEST_PTY'); - return false; - } - - $response = $this->_get_binary_packet(); - - if ($response === true) { - return false; - } - if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_SUCCESS) { - user_error('Expected SSH_SMSG_SUCCESS'); - return false; - } - - $data = pack('C', NET_SSH1_CMSG_EXEC_SHELL); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_EXEC_SHELL'); - return false; - } - - $this->bitmap |= NET_SSH1_MASK_SHELL; - - //stream_set_blocking($this->fsock, 0); - - return true; - } - - /** - * Inputs a command into an interactive shell. - * - * @see Net_SSH1::interactiveWrite() - * @param String $cmd - * @return Boolean - * @access public - */ - function write($cmd) - { - return $this->interactiveWrite($cmd); - } - - /** - * Returns the output of an interactive shell when there's a match for $expect - * - * $expect can take the form of a string literal or, if $mode == NET_SSH1_READ_REGEX, - * a regular expression. - * - * @see Net_SSH1::write() - * @param String $expect - * @param Integer $mode - * @return Boolean - * @access public - */ - function read($expect, $mode = NET_SSH1_READ_SIMPLE) - { - if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { - user_error('Operation disallowed prior to login()'); - return false; - } - - if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) { - user_error('Unable to initiate an interactive shell session'); - return false; - } - - $match = $expect; - while (true) { - if ($mode == NET_SSH1_READ_REGEX) { - preg_match($expect, $this->interactiveBuffer, $matches); - $match = isset($matches[0]) ? $matches[0] : ''; - } - $pos = strlen($match) ? strpos($this->interactiveBuffer, $match) : false; - if ($pos !== false) { - return $this->_string_shift($this->interactiveBuffer, $pos + strlen($match)); - } - $response = $this->_get_binary_packet(); - - if ($response === true) { - return $this->_string_shift($this->interactiveBuffer, strlen($this->interactiveBuffer)); - } - $this->interactiveBuffer.= substr($response[NET_SSH1_RESPONSE_DATA], 4); - } - } - - /** - * Inputs a command into an interactive shell. - * - * @see Net_SSH1::interactiveRead() - * @param String $cmd - * @return Boolean - * @access public - */ - function interactiveWrite($cmd) - { - if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { - user_error('Operation disallowed prior to login()'); - return false; - } - - if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) { - user_error('Unable to initiate an interactive shell session'); - return false; - } - - $data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($cmd), $cmd); - - if (!$this->_send_binary_packet($data)) { - user_error('Error sending SSH_CMSG_STDIN'); - return false; - } - - return true; - } - - /** - * Returns the output of an interactive shell when no more output is available. - * - * Requires PHP 4.3.0 or later due to the use of the stream_select() function. If you see stuff like - * "^[[00m", you're seeing ANSI escape codes. According to - * {@link http://support.microsoft.com/kb/101875 How to Enable ANSI.SYS in a Command Window}, "Windows NT - * does not support ANSI escape sequences in Win32 Console applications", so if you're a Windows user, - * there's not going to be much recourse. - * - * @see Net_SSH1::interactiveRead() - * @return String - * @access public - */ - function interactiveRead() - { - if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { - user_error('Operation disallowed prior to login()'); - return false; - } - - if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) { - user_error('Unable to initiate an interactive shell session'); - return false; - } - - $read = array($this->fsock); - $write = $except = null; - if (stream_select($read, $write, $except, 0)) { - $response = $this->_get_binary_packet(); - return substr($response[NET_SSH1_RESPONSE_DATA], 4); - } else { - return ''; - } - } - - /** - * Disconnect - * - * @access public - */ - function disconnect() - { - $this->_disconnect(); - } - - /** - * Destructor. - * - * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call - * disconnect(). - * - * @access public - */ - function __destruct() - { - $this->_disconnect(); - } - - /** - * Disconnect - * - * @param String $msg - * @access private - */ - function _disconnect($msg = 'Client Quit') - { - if ($this->bitmap) { - $data = pack('C', NET_SSH1_CMSG_EOF); - $this->_send_binary_packet($data); - /* - $response = $this->_get_binary_packet(); - if ($response === true) { - $response = array(NET_SSH1_RESPONSE_TYPE => -1); - } - switch ($response[NET_SSH1_RESPONSE_TYPE]) { - case NET_SSH1_SMSG_EXITSTATUS: - $data = pack('C', NET_SSH1_CMSG_EXIT_CONFIRMATION); - break; - default: - $data = pack('CNa*', NET_SSH1_MSG_DISCONNECT, strlen($msg), $msg); - } - */ - $data = pack('CNa*', NET_SSH1_MSG_DISCONNECT, strlen($msg), $msg); - - $this->_send_binary_packet($data); - fclose($this->fsock); - $this->bitmap = 0; - } - } - - /** - * Gets Binary Packets - * - * See 'The Binary Packet Protocol' of protocol-1.5.txt for more info. - * - * Also, this function could be improved upon by adding detection for the following exploit: - * http://www.securiteam.com/securitynews/5LP042K3FY.html - * - * @see Net_SSH1::_send_binary_packet() - * @return Array - * @access private - */ - function _get_binary_packet() - { - if (feof($this->fsock)) { - //user_error('connection closed prematurely'); - return false; - } - - if ($this->curTimeout) { - $read = array($this->fsock); - $write = $except = null; - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $sec = floor($this->curTimeout); - $usec = 1000000 * ($this->curTimeout - $sec); - // on windows this returns a "Warning: Invalid CRT parameters detected" error - if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) { - //$this->_disconnect('Timeout'); - return true; - } - $elapsed = strtok(microtime(), ' ') + strtok('') - $start; - $this->curTimeout-= $elapsed; - } - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $temp = unpack('Nlength', fread($this->fsock, 4)); - - $padding_length = 8 - ($temp['length'] & 7); - $length = $temp['length'] + $padding_length; - $raw = ''; - - while ($length > 0) { - $temp = fread($this->fsock, $length); - $raw.= $temp; - $length-= strlen($temp); - } - $stop = strtok(microtime(), ' ') + strtok(''); - - if (strlen($raw) && $this->crypto !== false) { - $raw = $this->crypto->decrypt($raw); - } - - $padding = substr($raw, 0, $padding_length); - $type = $raw[$padding_length]; - $data = substr($raw, $padding_length + 1, -4); - - $temp = unpack('Ncrc', substr($raw, -4)); - - //if ( $temp['crc'] != $this->_crc($padding . $type . $data) ) { - // user_error('Bad CRC in packet from server'); - // return false; - //} - - $type = ord($type); - - if (defined('NET_SSH1_LOGGING')) { - $temp = isset($this->protocol_flags[$type]) ? $this->protocol_flags[$type] : 'UNKNOWN'; - $temp = '<- ' . $temp . - ' (' . round($stop - $start, 4) . 's)'; - $this->_append_log($temp, $data); - } - - return array( - NET_SSH1_RESPONSE_TYPE => $type, - NET_SSH1_RESPONSE_DATA => $data - ); - } - - /** - * Sends Binary Packets - * - * Returns true on success, false on failure. - * - * @see Net_SSH1::_get_binary_packet() - * @param String $data - * @return Boolean - * @access private - */ - function _send_binary_packet($data) - { - if (feof($this->fsock)) { - //user_error('connection closed prematurely'); - return false; - } - - $length = strlen($data) + 4; - - $padding = crypt_random_string(8 - ($length & 7)); - - $orig = $data; - $data = $padding . $data; - $data.= pack('N', $this->_crc($data)); - - if ($this->crypto !== false) { - $data = $this->crypto->encrypt($data); - } - - $packet = pack('Na*', $length, $data); - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $result = strlen($packet) == fputs($this->fsock, $packet); - $stop = strtok(microtime(), ' ') + strtok(''); - - if (defined('NET_SSH1_LOGGING')) { - $temp = isset($this->protocol_flags[ord($orig[0])]) ? $this->protocol_flags[ord($orig[0])] : 'UNKNOWN'; - $temp = '-> ' . $temp . - ' (' . round($stop - $start, 4) . 's)'; - $this->_append_log($temp, $orig); - } - - return $result; - } - - /** - * Cyclic Redundancy Check (CRC) - * - * PHP's crc32 function is implemented slightly differently than the one that SSH v1 uses, so - * we've reimplemented it. A more detailed discussion of the differences can be found after - * $crc_lookup_table's initialization. - * - * @see Net_SSH1::_get_binary_packet() - * @see Net_SSH1::_send_binary_packet() - * @param String $data - * @return Integer - * @access private - */ - function _crc($data) - { - static $crc_lookup_table = array( - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D - ); - - // For this function to yield the same output as PHP's crc32 function, $crc would have to be - // set to 0xFFFFFFFF, initially - not 0x00000000 as it currently is. - $crc = 0x00000000; - $length = strlen($data); - - for ($i=0;$i<$length;$i++) { - // We AND $crc >> 8 with 0x00FFFFFF because we want the eight newly added bits to all - // be zero. PHP, unfortunately, doesn't always do this. 0x80000000 >> 8, as an example, - // yields 0xFF800000 - not 0x00800000. The following link elaborates: - // http://www.php.net/manual/en/language.operators.bitwise.php#57281 - $crc = (($crc >> 8) & 0x00FFFFFF) ^ $crc_lookup_table[($crc & 0xFF) ^ ord($data[$i])]; - } - - // In addition to having to set $crc to 0xFFFFFFFF, initially, the return value must be XOR'd with - // 0xFFFFFFFF for this function to return the same thing that PHP's crc32 function would. - return $crc; - } - - /** - * String Shift - * - * Inspired by array_shift - * - * @param String $string - * @param optional Integer $index - * @return String - * @access private - */ - function _string_shift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } - - /** - * RSA Encrypt - * - * Returns mod(pow($m, $e), $n), where $n should be the product of two (large) primes $p and $q and where $e - * should be a number with the property that gcd($e, ($p - 1) * ($q - 1)) == 1. Could just make anything that - * calls this call modexp, instead, but I think this makes things clearer, maybe... - * - * @see Net_SSH1::Net_SSH1() - * @param Math_BigInteger $m - * @param Array $key - * @return Math_BigInteger - * @access private - */ - function _rsa_crypt($m, $key) - { - /* - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - - $rsa = new Crypt_RSA(); - $rsa->loadKey($key, CRYPT_RSA_PUBLIC_FORMAT_RAW); - $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); - return $rsa->encrypt($m); - */ - - // To quote from protocol-1.5.txt: - // The most significant byte (which is only partial as the value must be - // less than the public modulus, which is never a power of two) is zero. - // - // The next byte contains the value 2 (which stands for public-key - // encrypted data in the PKCS standard [PKCS#1]). Then, there are non- - // zero random bytes to fill any unused space, a zero byte, and the data - // to be encrypted in the least significant bytes, the last byte of the - // data in the least significant byte. - - // Presumably the part of PKCS#1 they're refering to is "Section 7.2.1 Encryption Operation", - // under "7.2 RSAES-PKCS1-v1.5" and "7 Encryption schemes" of the following URL: - // ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf - $modulus = $key[1]->toBytes(); - $length = strlen($modulus) - strlen($m) - 3; - $random = ''; - while (strlen($random) != $length) { - $block = crypt_random_string($length - strlen($random)); - $block = str_replace("\x00", '', $block); - $random.= $block; - } - $temp = chr(0) . chr(2) . $random . chr(0) . $m; - - $m = new Math_BigInteger($temp, 256); - $m = $m->modPow($key[0], $key[1]); - - return $m->toBytes(); - } - - /** - * Define Array - * - * Takes any number of arrays whose indices are integers and whose values are strings and defines a bunch of - * named constants from it, using the value as the name of the constant and the index as the value of the constant. - * If any of the constants that would be defined already exists, none of the constants will be defined. - * - * @param Array $array - * @access private - */ - function _define_array() - { - $args = func_get_args(); - foreach ($args as $arg) { - foreach ($arg as $key=>$value) { - if (!defined($value)) { - define($value, $key); - } else { - break 2; - } - } - } - } - - /** - * Returns a log of the packets that have been sent and received. - * - * Returns a string if NET_SSH1_LOGGING == NET_SSH1_LOG_COMPLEX, an array if NET_SSH1_LOGGING == NET_SSH1_LOG_SIMPLE and false if !defined('NET_SSH1_LOGGING') - * - * @access public - * @return String or Array - */ - function getLog() - { - if (!defined('NET_SSH1_LOGGING')) { - return false; - } - - switch (NET_SSH1_LOGGING) { - case NET_SSH1_LOG_SIMPLE: - return $this->message_number_log; - break; - case NET_SSH1_LOG_COMPLEX: - return $this->_format_log($this->message_log, $this->protocol_flags_log); - break; - default: - return false; - } - } - - /** - * Formats a log for printing - * - * @param Array $message_log - * @param Array $message_number_log - * @access private - * @return String - */ - function _format_log($message_log, $message_number_log) - { - $output = ''; - for ($i = 0; $i < count($message_log); $i++) { - $output.= $message_number_log[$i] . "\r\n"; - $current_log = $message_log[$i]; - $j = 0; - do { - if (strlen($current_log)) { - $output.= str_pad(dechex($j), 7, '0', STR_PAD_LEFT) . '0 '; - } - $fragment = $this->_string_shift($current_log, $this->log_short_width); - $hex = substr(preg_replace_callback('#.#s', array($this, '_format_log_helper'), $fragment), strlen($this->log_boundary)); - // replace non ASCII printable characters with dots - // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters - // also replace < with a . since < messes up the output on web browsers - $raw = preg_replace('#[^\x20-\x7E]|<#', '.', $fragment); - $output.= str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n"; - $j++; - } while (strlen($current_log)); - $output.= "\r\n"; - } - - return $output; - } - - /** - * Helper function for _format_log - * - * For use with preg_replace_callback() - * - * @param Array $matches - * @access private - * @return String - */ - function _format_log_helper($matches) - { - return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT); - } - - /** - * Return the server key public exponent - * - * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, - * the raw bytes. This behavior is similar to PHP's md5() function. - * - * @param optional Boolean $raw_output - * @return String - * @access public - */ - function getServerKeyPublicExponent($raw_output = false) - { - return $raw_output ? $this->server_key_public_exponent->toBytes() : $this->server_key_public_exponent->toString(); - } - - /** - * Return the server key public modulus - * - * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, - * the raw bytes. This behavior is similar to PHP's md5() function. - * - * @param optional Boolean $raw_output - * @return String - * @access public - */ - function getServerKeyPublicModulus($raw_output = false) - { - return $raw_output ? $this->server_key_public_modulus->toBytes() : $this->server_key_public_modulus->toString(); - } - - /** - * Return the host key public exponent - * - * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, - * the raw bytes. This behavior is similar to PHP's md5() function. - * - * @param optional Boolean $raw_output - * @return String - * @access public - */ - function getHostKeyPublicExponent($raw_output = false) - { - return $raw_output ? $this->host_key_public_exponent->toBytes() : $this->host_key_public_exponent->toString(); - } - - /** - * Return the host key public modulus - * - * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, - * the raw bytes. This behavior is similar to PHP's md5() function. - * - * @param optional Boolean $raw_output - * @return String - * @access public - */ - function getHostKeyPublicModulus($raw_output = false) - { - return $raw_output ? $this->host_key_public_modulus->toBytes() : $this->host_key_public_modulus->toString(); - } - - /** - * Return a list of ciphers supported by SSH1 server. - * - * Just because a cipher is supported by an SSH1 server doesn't mean it's supported by this library. If $raw_output - * is set to true, returns, instead, an array of constants. ie. instead of array('Triple-DES in CBC mode'), you'll - * get array(NET_SSH1_CIPHER_3DES). - * - * @param optional Boolean $raw_output - * @return Array - * @access public - */ - function getSupportedCiphers($raw_output = false) - { - return $raw_output ? array_keys($this->supported_ciphers) : array_values($this->supported_ciphers); - } - - /** - * Return a list of authentications supported by SSH1 server. - * - * Just because a cipher is supported by an SSH1 server doesn't mean it's supported by this library. If $raw_output - * is set to true, returns, instead, an array of constants. ie. instead of array('password authentication'), you'll - * get array(NET_SSH1_AUTH_PASSWORD). - * - * @param optional Boolean $raw_output - * @return Array - * @access public - */ - function getSupportedAuthentications($raw_output = false) - { - return $raw_output ? array_keys($this->supported_authentications) : array_values($this->supported_authentications); - } - - /** - * Return the server identification. - * - * @return String - * @access public - */ - function getServerIdentification() - { - return rtrim($this->server_identification); - } - - /** - * Logs data packets - * - * Makes sure that only the last 1MB worth of packets will be logged - * - * @param String $data - * @access private - */ - function _append_log($protocol_flags, $message) - { - switch (NET_SSH1_LOGGING) { - // useful for benchmarks - case NET_SSH1_LOG_SIMPLE: - $this->protocol_flags_log[] = $protocol_flags; - break; - // the most useful log for SSH1 - case NET_SSH1_LOG_COMPLEX: - $this->protocol_flags_log[] = $protocol_flags; - $this->_string_shift($message); - $this->log_size+= strlen($message); - $this->message_log[] = $message; - while ($this->log_size > NET_SSH1_LOG_MAX_SIZE) { - $this->log_size-= strlen(array_shift($this->message_log)); - array_shift($this->protocol_flags_log); - } - break; - // dump the output out realtime; packets may be interspersed with non packets, - // passwords won't be filtered out and select other packets may not be correctly - // identified - case NET_SSH1_LOG_REALTIME: - echo "
      \r\n" . $this->_format_log(array($message), array($protocol_flags)) . "\r\n
      \r\n"; - @flush(); - @ob_flush(); - break; - // basically the same thing as NET_SSH1_LOG_REALTIME with the caveat that NET_SSH1_LOG_REALTIME_FILE - // needs to be defined and that the resultant log file will be capped out at NET_SSH1_LOG_MAX_SIZE. - // the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily - // at the beginning of the file - case NET_SSH1_LOG_REALTIME_FILE: - if (!isset($this->realtime_log_file)) { - // PHP doesn't seem to like using constants in fopen() - $filename = NET_SSH1_LOG_REALTIME_FILE; - $fp = fopen($filename, 'w'); - $this->realtime_log_file = $fp; - } - if (!is_resource($this->realtime_log_file)) { - break; - } - $entry = $this->_format_log(array($message), array($protocol_flags)); - if ($this->realtime_log_wrap) { - $temp = "<<< START >>>\r\n"; - $entry.= $temp; - fseek($this->realtime_log_file, ftell($this->realtime_log_file) - strlen($temp)); - } - $this->realtime_log_size+= strlen($entry); - if ($this->realtime_log_size > NET_SSH1_LOG_MAX_SIZE) { - fseek($this->realtime_log_file, 0); - $this->realtime_log_size = strlen($entry); - $this->realtime_log_wrap = true; - } - fputs($this->realtime_log_file, $entry); - } - } -} + + * login('username', 'password')) { + * exit('Login Failed'); + * } + * + * echo $ssh->exec('ls -la'); + * ?> + * + * + * Here's another short example: + * + * login('username', 'password')) { + * exit('Login Failed'); + * } + * + * echo $ssh->read('username@username:~$'); + * $ssh->write("ls -la\n"); + * echo $ssh->read('username@username:~$'); + * ?> + * + * + * More information on the SSHv1 specification can be found by reading + * {@link http://www.snailbook.com/docs/protocol-1.5.txt protocol-1.5.txt}. + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Net + * @package Net_SSH1 + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * Encryption Methods + * + * @see self::getSupportedCiphers() + * @access public + */ +/** + * No encryption + * + * Not supported. + */ +define('NET_SSH1_CIPHER_NONE', 0); +/** + * IDEA in CFB mode + * + * Not supported. + */ +define('NET_SSH1_CIPHER_IDEA', 1); +/** + * DES in CBC mode + */ +define('NET_SSH1_CIPHER_DES', 2); +/** + * Triple-DES in CBC mode + * + * All implementations are required to support this + */ +define('NET_SSH1_CIPHER_3DES', 3); +/** + * TRI's Simple Stream encryption CBC + * + * Not supported nor is it defined in the official SSH1 specs. OpenSSH, however, does define it (see cipher.h), + * although it doesn't use it (see cipher.c) + */ +define('NET_SSH1_CIPHER_BROKEN_TSS', 4); +/** + * RC4 + * + * Not supported. + * + * @internal According to the SSH1 specs: + * + * "The first 16 bytes of the session key are used as the key for + * the server to client direction. The remaining 16 bytes are used + * as the key for the client to server direction. This gives + * independent 128-bit keys for each direction." + * + * This library currently only supports encryption when the same key is being used for both directions. This is + * because there's only one $crypto object. Two could be added ($encrypt and $decrypt, perhaps). + */ +define('NET_SSH1_CIPHER_RC4', 5); +/** + * Blowfish + * + * Not supported nor is it defined in the official SSH1 specs. OpenSSH, however, defines it (see cipher.h) and + * uses it (see cipher.c) + */ +define('NET_SSH1_CIPHER_BLOWFISH', 6); +/**#@-*/ + +/**#@+ + * Authentication Methods + * + * @see self::getSupportedAuthentications() + * @access public + */ +/** + * .rhosts or /etc/hosts.equiv + */ +define('NET_SSH1_AUTH_RHOSTS', 1); +/** + * pure RSA authentication + */ +define('NET_SSH1_AUTH_RSA', 2); +/** + * password authentication + * + * This is the only method that is supported by this library. + */ +define('NET_SSH1_AUTH_PASSWORD', 3); +/** + * .rhosts with RSA host authentication + */ +define('NET_SSH1_AUTH_RHOSTS_RSA', 4); +/**#@-*/ + +/**#@+ + * Terminal Modes + * + * @link http://3sp.com/content/developer/maverick-net/docs/Maverick.SSH.PseudoTerminalModesMembers.html + * @access private + */ +define('NET_SSH1_TTY_OP_END', 0); +/**#@-*/ + +/** + * The Response Type + * + * @see self::_get_binary_packet() + * @access private + */ +define('NET_SSH1_RESPONSE_TYPE', 1); + +/** + * The Response Data + * + * @see self::_get_binary_packet() + * @access private + */ +define('NET_SSH1_RESPONSE_DATA', 2); + +/**#@+ + * Execution Bitmap Masks + * + * @see self::bitmap + * @access private + */ +define('NET_SSH1_MASK_CONSTRUCTOR', 0x00000001); +define('NET_SSH1_MASK_CONNECTED', 0x00000002); +define('NET_SSH1_MASK_LOGIN', 0x00000004); +define('NET_SSH1_MASK_SHELL', 0x00000008); +/**#@-*/ + +/**#@+ + * @access public + * @see self::getLog() + */ +/** + * Returns the message numbers + */ +define('NET_SSH1_LOG_SIMPLE', 1); +/** + * Returns the message content + */ +define('NET_SSH1_LOG_COMPLEX', 2); +/** + * Outputs the content real-time + */ +define('NET_SSH1_LOG_REALTIME', 3); +/** + * Dumps the content real-time to a file + */ +define('NET_SSH1_LOG_REALTIME_FILE', 4); +/**#@-*/ + +/**#@+ + * @access public + * @see self::read() + */ +/** + * Returns when a string matching $expect exactly is found + */ +define('NET_SSH1_READ_SIMPLE', 1); +/** + * Returns when a string matching the regular expression $expect is found + */ +define('NET_SSH1_READ_REGEX', 2); +/**#@-*/ + +/** + * Pure-PHP implementation of SSHv1. + * + * @package Net_SSH1 + * @author Jim Wigginton + * @access public + */ +class Net_SSH1 +{ + /** + * The SSH identifier + * + * @var string + * @access private + */ + var $identifier = 'SSH-1.5-phpseclib'; + + /** + * The Socket Object + * + * @var object + * @access private + */ + var $fsock; + + /** + * The cryptography object + * + * @var object + * @access private + */ + var $crypto = false; + + /** + * Execution Bitmap + * + * The bits that are set represent functions that have been called already. This is used to determine + * if a requisite function has been successfully executed. If not, an error should be thrown. + * + * @var int + * @access private + */ + var $bitmap = 0; + + /** + * The Server Key Public Exponent + * + * Logged for debug purposes + * + * @see self::getServerKeyPublicExponent() + * @var string + * @access private + */ + var $server_key_public_exponent; + + /** + * The Server Key Public Modulus + * + * Logged for debug purposes + * + * @see self::getServerKeyPublicModulus() + * @var string + * @access private + */ + var $server_key_public_modulus; + + /** + * The Host Key Public Exponent + * + * Logged for debug purposes + * + * @see self::getHostKeyPublicExponent() + * @var string + * @access private + */ + var $host_key_public_exponent; + + /** + * The Host Key Public Modulus + * + * Logged for debug purposes + * + * @see self::getHostKeyPublicModulus() + * @var string + * @access private + */ + var $host_key_public_modulus; + + /** + * Supported Ciphers + * + * Logged for debug purposes + * + * @see self::getSupportedCiphers() + * @var array + * @access private + */ + var $supported_ciphers = array( + NET_SSH1_CIPHER_NONE => 'No encryption', + NET_SSH1_CIPHER_IDEA => 'IDEA in CFB mode', + NET_SSH1_CIPHER_DES => 'DES in CBC mode', + NET_SSH1_CIPHER_3DES => 'Triple-DES in CBC mode', + NET_SSH1_CIPHER_BROKEN_TSS => 'TRI\'s Simple Stream encryption CBC', + NET_SSH1_CIPHER_RC4 => 'RC4', + NET_SSH1_CIPHER_BLOWFISH => 'Blowfish' + ); + + /** + * Supported Authentications + * + * Logged for debug purposes + * + * @see self::getSupportedAuthentications() + * @var array + * @access private + */ + var $supported_authentications = array( + NET_SSH1_AUTH_RHOSTS => '.rhosts or /etc/hosts.equiv', + NET_SSH1_AUTH_RSA => 'pure RSA authentication', + NET_SSH1_AUTH_PASSWORD => 'password authentication', + NET_SSH1_AUTH_RHOSTS_RSA => '.rhosts with RSA host authentication' + ); + + /** + * Server Identification + * + * @see self::getServerIdentification() + * @var string + * @access private + */ + var $server_identification = ''; + + /** + * Protocol Flags + * + * @see self::Net_SSH1() + * @var array + * @access private + */ + var $protocol_flags = array(); + + /** + * Protocol Flag Log + * + * @see self::getLog() + * @var array + * @access private + */ + var $protocol_flag_log = array(); + + /** + * Message Log + * + * @see self::getLog() + * @var array + * @access private + */ + var $message_log = array(); + + /** + * Real-time log file pointer + * + * @see self::_append_log() + * @var resource + * @access private + */ + var $realtime_log_file; + + /** + * Real-time log file size + * + * @see self::_append_log() + * @var int + * @access private + */ + var $realtime_log_size; + + /** + * Real-time log file wrap boolean + * + * @see self::_append_log() + * @var bool + * @access private + */ + var $realtime_log_wrap; + + /** + * Interactive Buffer + * + * @see self::read() + * @var array + * @access private + */ + var $interactiveBuffer = ''; + + /** + * Timeout + * + * @see self::setTimeout() + * @access private + */ + var $timeout; + + /** + * Current Timeout + * + * @see self::_get_channel_packet() + * @access private + */ + var $curTimeout; + + /** + * Log Boundary + * + * @see self::_format_log() + * @access private + */ + var $log_boundary = ':'; + + /** + * Log Long Width + * + * @see self::_format_log() + * @access private + */ + var $log_long_width = 65; + + /** + * Log Short Width + * + * @see self::_format_log() + * @access private + */ + var $log_short_width = 16; + + /** + * Hostname + * + * @see self::Net_SSH1() + * @see self::_connect() + * @var string + * @access private + */ + var $host; + + /** + * Port Number + * + * @see self::Net_SSH1() + * @see self::_connect() + * @var int + * @access private + */ + var $port; + + /** + * Timeout for initial connection + * + * Set by the constructor call. Calling setTimeout() is optional. If it's not called functions like + * exec() won't timeout unless some PHP setting forces it too. The timeout specified in the constructor, + * however, is non-optional. There will be a timeout, whether or not you set it. If you don't it'll be + * 10 seconds. It is used by fsockopen() in that function. + * + * @see self::Net_SSH1() + * @see self::_connect() + * @var int + * @access private + */ + var $connectionTimeout; + + /** + * Default cipher + * + * @see self::Net_SSH1() + * @see self::_connect() + * @var int + * @access private + */ + var $cipher; + + /** + * Default Constructor. + * + * Connects to an SSHv1 server + * + * @param string $host + * @param int $port + * @param int $timeout + * @param int $cipher + * @return Net_SSH1 + * @access public + */ + function __construct($host, $port = 22, $timeout = 10, $cipher = NET_SSH1_CIPHER_3DES) + { + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + + // Include Crypt_Random + // the class_exists() will only be called if the crypt_random_string function hasn't been defined and + // will trigger a call to __autoload() if you're wanting to auto-load classes + // call function_exists() a second time to stop the include_once from being called outside + // of the auto loader + if (!function_exists('crypt_random_string') && !class_exists('Crypt_Random') && !function_exists('crypt_random_string')) { + include_once 'Crypt/Random.php'; + } + + $this->protocol_flags = array( + 1 => 'NET_SSH1_MSG_DISCONNECT', + 2 => 'NET_SSH1_SMSG_PUBLIC_KEY', + 3 => 'NET_SSH1_CMSG_SESSION_KEY', + 4 => 'NET_SSH1_CMSG_USER', + 9 => 'NET_SSH1_CMSG_AUTH_PASSWORD', + 10 => 'NET_SSH1_CMSG_REQUEST_PTY', + 12 => 'NET_SSH1_CMSG_EXEC_SHELL', + 13 => 'NET_SSH1_CMSG_EXEC_CMD', + 14 => 'NET_SSH1_SMSG_SUCCESS', + 15 => 'NET_SSH1_SMSG_FAILURE', + 16 => 'NET_SSH1_CMSG_STDIN_DATA', + 17 => 'NET_SSH1_SMSG_STDOUT_DATA', + 18 => 'NET_SSH1_SMSG_STDERR_DATA', + 19 => 'NET_SSH1_CMSG_EOF', + 20 => 'NET_SSH1_SMSG_EXITSTATUS', + 33 => 'NET_SSH1_CMSG_EXIT_CONFIRMATION' + ); + + $this->_define_array($this->protocol_flags); + + $this->host = $host; + $this->port = $port; + $this->connectionTimeout = $timeout; + $this->cipher = $cipher; + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param string $host + * @param int $port + * @param int $timeout + * @param int $cipher + * @access public + */ + function Net_SSH1($host, $port = 22, $timeout = 10, $cipher = NET_SSH1_CIPHER_3DES) + { + $this->__construct($host, $port, $timeout, $cipher); + } + + /** + * Connect to an SSHv1 server + * + * @return bool + * @access private + */ + function _connect() + { + $this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->connectionTimeout); + if (!$this->fsock) { + user_error(rtrim("Cannot connect to {$this->host}:{$this->port}. Error $errno. $errstr")); + return false; + } + + $this->server_identification = $init_line = fgets($this->fsock, 255); + + if (defined('NET_SSH1_LOGGING')) { + $this->_append_log('<-', $this->server_identification); + $this->_append_log('->', $this->identifier . "\r\n"); + } + + if (!preg_match('#SSH-([0-9\.]+)-(.+)#', $init_line, $parts)) { + user_error('Can only connect to SSH servers'); + return false; + } + if ($parts[1][0] != 1) { + user_error("Cannot connect to SSH $parts[1] servers"); + return false; + } + + fputs($this->fsock, $this->identifier."\r\n"); + + $response = $this->_get_binary_packet(); + if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_PUBLIC_KEY) { + user_error('Expected SSH_SMSG_PUBLIC_KEY'); + return false; + } + + $anti_spoofing_cookie = $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 8); + + $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4); + + if (strlen($response[NET_SSH1_RESPONSE_DATA]) < 2) { + return false; + } + $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); + $server_key_public_exponent = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); + $this->server_key_public_exponent = $server_key_public_exponent; + + if (strlen($response[NET_SSH1_RESPONSE_DATA]) < 2) { + return false; + } + $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); + $server_key_public_modulus = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); + $this->server_key_public_modulus = $server_key_public_modulus; + + $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4); + + if (strlen($response[NET_SSH1_RESPONSE_DATA]) < 2) { + return false; + } + $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); + $host_key_public_exponent = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); + $this->host_key_public_exponent = $host_key_public_exponent; + + if (strlen($response[NET_SSH1_RESPONSE_DATA]) < 2) { + return false; + } + $temp = unpack('nlen', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 2)); + $host_key_public_modulus = new Math_BigInteger($this->_string_shift($response[NET_SSH1_RESPONSE_DATA], ceil($temp['len'] / 8)), 256); + $this->host_key_public_modulus = $host_key_public_modulus; + + $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4); + + // get a list of the supported ciphers + if (strlen($response[NET_SSH1_RESPONSE_DATA]) < 4) { + return false; + } + extract(unpack('Nsupported_ciphers_mask', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4))); + foreach ($this->supported_ciphers as $mask => $name) { + if (($supported_ciphers_mask & (1 << $mask)) == 0) { + unset($this->supported_ciphers[$mask]); + } + } + + // get a list of the supported authentications + if (strlen($response[NET_SSH1_RESPONSE_DATA]) < 4) { + return false; + } + extract(unpack('Nsupported_authentications_mask', $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 4))); + foreach ($this->supported_authentications as $mask => $name) { + if (($supported_authentications_mask & (1 << $mask)) == 0) { + unset($this->supported_authentications[$mask]); + } + } + + $session_id = pack('H*', md5($host_key_public_modulus->toBytes() . $server_key_public_modulus->toBytes() . $anti_spoofing_cookie)); + + $session_key = crypt_random_string(32); + $double_encrypted_session_key = $session_key ^ str_pad($session_id, 32, chr(0)); + + if ($server_key_public_modulus->compare($host_key_public_modulus) < 0) { + $double_encrypted_session_key = $this->_rsa_crypt( + $double_encrypted_session_key, + array( + $server_key_public_exponent, + $server_key_public_modulus + ) + ); + $double_encrypted_session_key = $this->_rsa_crypt( + $double_encrypted_session_key, + array( + $host_key_public_exponent, + $host_key_public_modulus + ) + ); + } else { + $double_encrypted_session_key = $this->_rsa_crypt( + $double_encrypted_session_key, + array( + $host_key_public_exponent, + $host_key_public_modulus + ) + ); + $double_encrypted_session_key = $this->_rsa_crypt( + $double_encrypted_session_key, + array( + $server_key_public_exponent, + $server_key_public_modulus + ) + ); + } + + $cipher = isset($this->supported_ciphers[$this->cipher]) ? $this->cipher : NET_SSH1_CIPHER_3DES; + $data = pack('C2a*na*N', NET_SSH1_CMSG_SESSION_KEY, $cipher, $anti_spoofing_cookie, 8 * strlen($double_encrypted_session_key), $double_encrypted_session_key, 0); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_SESSION_KEY'); + return false; + } + + switch ($cipher) { + //case NET_SSH1_CIPHER_NONE: + // $this->crypto = new Crypt_Null(); + // break; + case NET_SSH1_CIPHER_DES: + if (!class_exists('Crypt_DES')) { + include_once 'Crypt/DES.php'; + } + $this->crypto = new Crypt_DES(); + $this->crypto->disablePadding(); + $this->crypto->enableContinuousBuffer(); + $this->crypto->setKey(substr($session_key, 0, 8)); + break; + case NET_SSH1_CIPHER_3DES: + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $this->crypto = new Crypt_TripleDES(CRYPT_DES_MODE_3CBC); + $this->crypto->disablePadding(); + $this->crypto->enableContinuousBuffer(); + $this->crypto->setKey(substr($session_key, 0, 24)); + break; + //case NET_SSH1_CIPHER_RC4: + // if (!class_exists('Crypt_RC4')) { + // include_once 'Crypt/RC4.php'; + // } + // $this->crypto = new Crypt_RC4(); + // $this->crypto->enableContinuousBuffer(); + // $this->crypto->setKey(substr($session_key, 0, 16)); + // break; + } + + $response = $this->_get_binary_packet(); + + if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_SUCCESS) { + user_error('Expected SSH_SMSG_SUCCESS'); + return false; + } + + $this->bitmap = NET_SSH1_MASK_CONNECTED; + + return true; + } + + /** + * Login + * + * @param string $username + * @param string $password + * @return bool + * @access public + */ + function login($username, $password = '') + { + if (!($this->bitmap & NET_SSH1_MASK_CONSTRUCTOR)) { + $this->bitmap |= NET_SSH1_MASK_CONSTRUCTOR; + if (!$this->_connect()) { + return false; + } + } + + if (!($this->bitmap & NET_SSH1_MASK_CONNECTED)) { + return false; + } + + $data = pack('CNa*', NET_SSH1_CMSG_USER, strlen($username), $username); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_USER'); + return false; + } + + $response = $this->_get_binary_packet(); + + if ($response === true) { + return false; + } + if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) { + $this->bitmap |= NET_SSH1_MASK_LOGIN; + return true; + } elseif ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_FAILURE) { + user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE'); + return false; + } + + $data = pack('CNa*', NET_SSH1_CMSG_AUTH_PASSWORD, strlen($password), $password); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_AUTH_PASSWORD'); + return false; + } + + // remove the username and password from the last logged packet + if (defined('NET_SSH1_LOGGING') && NET_SSH1_LOGGING == NET_SSH1_LOG_COMPLEX) { + $data = pack('CNa*', NET_SSH1_CMSG_AUTH_PASSWORD, strlen('password'), 'password'); + $this->message_log[count($this->message_log) - 1] = $data; + } + + $response = $this->_get_binary_packet(); + + if ($response === true) { + return false; + } + if ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_SUCCESS) { + $this->bitmap |= NET_SSH1_MASK_LOGIN; + return true; + } elseif ($response[NET_SSH1_RESPONSE_TYPE] == NET_SSH1_SMSG_FAILURE) { + return false; + } else { + user_error('Expected SSH_SMSG_SUCCESS or SSH_SMSG_FAILURE'); + return false; + } + } + + /** + * Set Timeout + * + * $ssh->exec('ping 127.0.0.1'); on a Linux host will never return and will run indefinitely. setTimeout() makes it so it'll timeout. + * Setting $timeout to false or 0 will mean there is no timeout. + * + * @param mixed $timeout + */ + function setTimeout($timeout) + { + $this->timeout = $this->curTimeout = $timeout; + } + + /** + * Executes a command on a non-interactive shell, returns the output, and quits. + * + * An SSH1 server will close the connection after a command has been executed on a non-interactive shell. SSH2 + * servers don't, however, this isn't an SSH2 client. The way this works, on the server, is by initiating a + * shell with the -s option, as discussed in the following links: + * + * {@link http://www.faqs.org/docs/bashman/bashref_65.html http://www.faqs.org/docs/bashman/bashref_65.html} + * {@link http://www.faqs.org/docs/bashman/bashref_62.html http://www.faqs.org/docs/bashman/bashref_62.html} + * + * To execute further commands, a new Net_SSH1 object will need to be created. + * + * Returns false on failure and the output, otherwise. + * + * @see self::interactiveRead() + * @see self::interactiveWrite() + * @param string $cmd + * @return mixed + * @access public + */ + function exec($cmd, $block = true) + { + if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { + user_error('Operation disallowed prior to login()'); + return false; + } + + $data = pack('CNa*', NET_SSH1_CMSG_EXEC_CMD, strlen($cmd), $cmd); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_EXEC_CMD'); + return false; + } + + if (!$block) { + return true; + } + + $output = ''; + $response = $this->_get_binary_packet(); + + if ($response !== false) { + do { + $output.= substr($response[NET_SSH1_RESPONSE_DATA], 4); + $response = $this->_get_binary_packet(); + } while (is_array($response) && $response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_EXITSTATUS); + } + + $data = pack('C', NET_SSH1_CMSG_EXIT_CONFIRMATION); + + // i don't think it's really all that important if this packet gets sent or not. + $this->_send_binary_packet($data); + + fclose($this->fsock); + + // reset the execution bitmap - a new Net_SSH1 object needs to be created. + $this->bitmap = 0; + + return $output; + } + + /** + * Creates an interactive shell + * + * @see self::interactiveRead() + * @see self::interactiveWrite() + * @return bool + * @access private + */ + function _initShell() + { + // connect using the sample parameters in protocol-1.5.txt. + // according to wikipedia.org's entry on text terminals, "the fundamental type of application running on a text + // terminal is a command line interpreter or shell". thus, opening a terminal session to run the shell. + $data = pack('CNa*N4C', NET_SSH1_CMSG_REQUEST_PTY, strlen('vt100'), 'vt100', 24, 80, 0, 0, NET_SSH1_TTY_OP_END); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_REQUEST_PTY'); + return false; + } + + $response = $this->_get_binary_packet(); + + if ($response === true) { + return false; + } + if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_SUCCESS) { + user_error('Expected SSH_SMSG_SUCCESS'); + return false; + } + + $data = pack('C', NET_SSH1_CMSG_EXEC_SHELL); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_EXEC_SHELL'); + return false; + } + + $this->bitmap |= NET_SSH1_MASK_SHELL; + + //stream_set_blocking($this->fsock, 0); + + return true; + } + + /** + * Inputs a command into an interactive shell. + * + * @see self::interactiveWrite() + * @param string $cmd + * @return bool + * @access public + */ + function write($cmd) + { + return $this->interactiveWrite($cmd); + } + + /** + * Returns the output of an interactive shell when there's a match for $expect + * + * $expect can take the form of a string literal or, if $mode == NET_SSH1_READ_REGEX, + * a regular expression. + * + * @see self::write() + * @param string $expect + * @param int $mode + * @return bool + * @access public + */ + function read($expect, $mode = NET_SSH1_READ_SIMPLE) + { + if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { + user_error('Operation disallowed prior to login()'); + return false; + } + + if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) { + user_error('Unable to initiate an interactive shell session'); + return false; + } + + $match = $expect; + while (true) { + if ($mode == NET_SSH1_READ_REGEX) { + preg_match($expect, $this->interactiveBuffer, $matches); + $match = isset($matches[0]) ? $matches[0] : ''; + } + $pos = strlen($match) ? strpos($this->interactiveBuffer, $match) : false; + if ($pos !== false) { + return $this->_string_shift($this->interactiveBuffer, $pos + strlen($match)); + } + $response = $this->_get_binary_packet(); + + if ($response === true) { + return $this->_string_shift($this->interactiveBuffer, strlen($this->interactiveBuffer)); + } + $this->interactiveBuffer.= substr($response[NET_SSH1_RESPONSE_DATA], 4); + } + } + + /** + * Inputs a command into an interactive shell. + * + * @see self::interactiveRead() + * @param string $cmd + * @return bool + * @access public + */ + function interactiveWrite($cmd) + { + if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { + user_error('Operation disallowed prior to login()'); + return false; + } + + if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) { + user_error('Unable to initiate an interactive shell session'); + return false; + } + + $data = pack('CNa*', NET_SSH1_CMSG_STDIN_DATA, strlen($cmd), $cmd); + + if (!$this->_send_binary_packet($data)) { + user_error('Error sending SSH_CMSG_STDIN'); + return false; + } + + return true; + } + + /** + * Returns the output of an interactive shell when no more output is available. + * + * Requires PHP 4.3.0 or later due to the use of the stream_select() function. If you see stuff like + * "^[[00m", you're seeing ANSI escape codes. According to + * {@link http://support.microsoft.com/kb/101875 How to Enable ANSI.SYS in a Command Window}, "Windows NT + * does not support ANSI escape sequences in Win32 Console applications", so if you're a Windows user, + * there's not going to be much recourse. + * + * @see self::interactiveRead() + * @return string + * @access public + */ + function interactiveRead() + { + if (!($this->bitmap & NET_SSH1_MASK_LOGIN)) { + user_error('Operation disallowed prior to login()'); + return false; + } + + if (!($this->bitmap & NET_SSH1_MASK_SHELL) && !$this->_initShell()) { + user_error('Unable to initiate an interactive shell session'); + return false; + } + + $read = array($this->fsock); + $write = $except = null; + if (stream_select($read, $write, $except, 0)) { + $response = $this->_get_binary_packet(); + return substr($response[NET_SSH1_RESPONSE_DATA], 4); + } else { + return ''; + } + } + + /** + * Disconnect + * + * @access public + */ + function disconnect() + { + $this->_disconnect(); + } + + /** + * Destructor. + * + * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call + * disconnect(). + * + * @access public + */ + function __destruct() + { + $this->_disconnect(); + } + + /** + * Disconnect + * + * @param string $msg + * @access private + */ + function _disconnect($msg = 'Client Quit') + { + if ($this->bitmap) { + $data = pack('C', NET_SSH1_CMSG_EOF); + $this->_send_binary_packet($data); + /* + $response = $this->_get_binary_packet(); + if ($response === true) { + $response = array(NET_SSH1_RESPONSE_TYPE => -1); + } + switch ($response[NET_SSH1_RESPONSE_TYPE]) { + case NET_SSH1_SMSG_EXITSTATUS: + $data = pack('C', NET_SSH1_CMSG_EXIT_CONFIRMATION); + break; + default: + $data = pack('CNa*', NET_SSH1_MSG_DISCONNECT, strlen($msg), $msg); + } + */ + $data = pack('CNa*', NET_SSH1_MSG_DISCONNECT, strlen($msg), $msg); + + $this->_send_binary_packet($data); + fclose($this->fsock); + $this->bitmap = 0; + } + } + + /** + * Gets Binary Packets + * + * See 'The Binary Packet Protocol' of protocol-1.5.txt for more info. + * + * Also, this function could be improved upon by adding detection for the following exploit: + * http://www.securiteam.com/securitynews/5LP042K3FY.html + * + * @see self::_send_binary_packet() + * @return array + * @access private + */ + function _get_binary_packet() + { + if (feof($this->fsock)) { + //user_error('connection closed prematurely'); + return false; + } + + if ($this->curTimeout) { + $read = array($this->fsock); + $write = $except = null; + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $sec = floor($this->curTimeout); + $usec = 1000000 * ($this->curTimeout - $sec); + // on windows this returns a "Warning: Invalid CRT parameters detected" error + if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) { + //$this->_disconnect('Timeout'); + return true; + } + $elapsed = strtok(microtime(), ' ') + strtok('') - $start; + $this->curTimeout-= $elapsed; + } + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $data = fread($this->fsock, 4); + if (strlen($data) < 4) { + return false; + } + $temp = unpack('Nlength', $data); + + $padding_length = 8 - ($temp['length'] & 7); + $length = $temp['length'] + $padding_length; + $raw = ''; + + while ($length > 0) { + $temp = fread($this->fsock, $length); + $raw.= $temp; + $length-= strlen($temp); + } + $stop = strtok(microtime(), ' ') + strtok(''); + + if (strlen($raw) && $this->crypto !== false) { + $raw = $this->crypto->decrypt($raw); + } + + $padding = substr($raw, 0, $padding_length); + $type = $raw[$padding_length]; + $data = substr($raw, $padding_length + 1, -4); + + if (strlen($raw) < 4) { + return false; + } + $temp = unpack('Ncrc', substr($raw, -4)); + + //if ( $temp['crc'] != $this->_crc($padding . $type . $data) ) { + // user_error('Bad CRC in packet from server'); + // return false; + //} + + $type = ord($type); + + if (defined('NET_SSH1_LOGGING')) { + $temp = isset($this->protocol_flags[$type]) ? $this->protocol_flags[$type] : 'UNKNOWN'; + $temp = '<- ' . $temp . + ' (' . round($stop - $start, 4) . 's)'; + $this->_append_log($temp, $data); + } + + return array( + NET_SSH1_RESPONSE_TYPE => $type, + NET_SSH1_RESPONSE_DATA => $data + ); + } + + /** + * Sends Binary Packets + * + * Returns true on success, false on failure. + * + * @see self::_get_binary_packet() + * @param string $data + * @return bool + * @access private + */ + function _send_binary_packet($data) + { + if (feof($this->fsock)) { + //user_error('connection closed prematurely'); + return false; + } + + $length = strlen($data) + 4; + + $padding = crypt_random_string(8 - ($length & 7)); + + $orig = $data; + $data = $padding . $data; + $data.= pack('N', $this->_crc($data)); + + if ($this->crypto !== false) { + $data = $this->crypto->encrypt($data); + } + + $packet = pack('Na*', $length, $data); + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $result = strlen($packet) == fputs($this->fsock, $packet); + $stop = strtok(microtime(), ' ') + strtok(''); + + if (defined('NET_SSH1_LOGGING')) { + $temp = isset($this->protocol_flags[ord($orig[0])]) ? $this->protocol_flags[ord($orig[0])] : 'UNKNOWN'; + $temp = '-> ' . $temp . + ' (' . round($stop - $start, 4) . 's)'; + $this->_append_log($temp, $orig); + } + + return $result; + } + + /** + * Cyclic Redundancy Check (CRC) + * + * PHP's crc32 function is implemented slightly differently than the one that SSH v1 uses, so + * we've reimplemented it. A more detailed discussion of the differences can be found after + * $crc_lookup_table's initialization. + * + * @see self::_get_binary_packet() + * @see self::_send_binary_packet() + * @param string $data + * @return int + * @access private + */ + function _crc($data) + { + static $crc_lookup_table = array( + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, + 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, + 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, + 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, + 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, + 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, + 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, + 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, + 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, + 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, + 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, + 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, + 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, + 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, + 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, + 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, + 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, + 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, + 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, + 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, + 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, + 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, + 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, + 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, + 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, + 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, + 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, + 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, + 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, + 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, + 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, + 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, + 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D + ); + + // For this function to yield the same output as PHP's crc32 function, $crc would have to be + // set to 0xFFFFFFFF, initially - not 0x00000000 as it currently is. + $crc = 0x00000000; + $length = strlen($data); + + for ($i=0; $i<$length; $i++) { + // We AND $crc >> 8 with 0x00FFFFFF because we want the eight newly added bits to all + // be zero. PHP, unfortunately, doesn't always do this. 0x80000000 >> 8, as an example, + // yields 0xFF800000 - not 0x00800000. The following link elaborates: + // http://www.php.net/manual/en/language.operators.bitwise.php#57281 + $crc = (($crc >> 8) & 0x00FFFFFF) ^ $crc_lookup_table[($crc & 0xFF) ^ ord($data[$i])]; + } + + // In addition to having to set $crc to 0xFFFFFFFF, initially, the return value must be XOR'd with + // 0xFFFFFFFF for this function to return the same thing that PHP's crc32 function would. + return $crc; + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param string $string + * @param int $index + * @return string + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * RSA Encrypt + * + * Returns mod(pow($m, $e), $n), where $n should be the product of two (large) primes $p and $q and where $e + * should be a number with the property that gcd($e, ($p - 1) * ($q - 1)) == 1. Could just make anything that + * calls this call modexp, instead, but I think this makes things clearer, maybe... + * + * @see self::Net_SSH1() + * @param Math_BigInteger $m + * @param array $key + * @return Math_BigInteger + * @access private + */ + function _rsa_crypt($m, $key) + { + /* + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + + $rsa = new Crypt_RSA(); + $rsa->loadKey($key, CRYPT_RSA_PUBLIC_FORMAT_RAW); + $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); + return $rsa->encrypt($m); + */ + + // To quote from protocol-1.5.txt: + // The most significant byte (which is only partial as the value must be + // less than the public modulus, which is never a power of two) is zero. + // + // The next byte contains the value 2 (which stands for public-key + // encrypted data in the PKCS standard [PKCS#1]). Then, there are non- + // zero random bytes to fill any unused space, a zero byte, and the data + // to be encrypted in the least significant bytes, the last byte of the + // data in the least significant byte. + + // Presumably the part of PKCS#1 they're refering to is "Section 7.2.1 Encryption Operation", + // under "7.2 RSAES-PKCS1-v1.5" and "7 Encryption schemes" of the following URL: + // ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf + $modulus = $key[1]->toBytes(); + $length = strlen($modulus) - strlen($m) - 3; + $random = ''; + while (strlen($random) != $length) { + $block = crypt_random_string($length - strlen($random)); + $block = str_replace("\x00", '', $block); + $random.= $block; + } + $temp = chr(0) . chr(2) . $random . chr(0) . $m; + + $m = new Math_BigInteger($temp, 256); + $m = $m->modPow($key[0], $key[1]); + + return $m->toBytes(); + } + + /** + * Define Array + * + * Takes any number of arrays whose indices are integers and whose values are strings and defines a bunch of + * named constants from it, using the value as the name of the constant and the index as the value of the constant. + * If any of the constants that would be defined already exists, none of the constants will be defined. + * + * @param array $array + * @access private + */ + function _define_array() + { + $args = func_get_args(); + foreach ($args as $arg) { + foreach ($arg as $key => $value) { + if (!defined($value)) { + define($value, $key); + } else { + break 2; + } + } + } + } + + /** + * Returns a log of the packets that have been sent and received. + * + * Returns a string if NET_SSH1_LOGGING == NET_SSH1_LOG_COMPLEX, an array if NET_SSH1_LOGGING == NET_SSH1_LOG_SIMPLE and false if !defined('NET_SSH1_LOGGING') + * + * @access public + * @return array|false|string + */ + function getLog() + { + if (!defined('NET_SSH1_LOGGING')) { + return false; + } + + switch (NET_SSH1_LOGGING) { + case NET_SSH1_LOG_SIMPLE: + return $this->message_number_log; + break; + case NET_SSH1_LOG_COMPLEX: + return $this->_format_log($this->message_log, $this->protocol_flags_log); + break; + default: + return false; + } + } + + /** + * Formats a log for printing + * + * @param array $message_log + * @param array $message_number_log + * @access private + * @return string + */ + function _format_log($message_log, $message_number_log) + { + $output = ''; + for ($i = 0; $i < count($message_log); $i++) { + $output.= $message_number_log[$i] . "\r\n"; + $current_log = $message_log[$i]; + $j = 0; + do { + if (strlen($current_log)) { + $output.= str_pad(dechex($j), 7, '0', STR_PAD_LEFT) . '0 '; + } + $fragment = $this->_string_shift($current_log, $this->log_short_width); + $hex = substr(preg_replace_callback('#.#s', array($this, '_format_log_helper'), $fragment), strlen($this->log_boundary)); + // replace non ASCII printable characters with dots + // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters + // also replace < with a . since < messes up the output on web browsers + $raw = preg_replace('#[^\x20-\x7E]|<#', '.', $fragment); + $output.= str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n"; + $j++; + } while (strlen($current_log)); + $output.= "\r\n"; + } + + return $output; + } + + /** + * Helper function for _format_log + * + * For use with preg_replace_callback() + * + * @param array $matches + * @access private + * @return string + */ + function _format_log_helper($matches) + { + return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT); + } + + /** + * Return the server key public exponent + * + * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, + * the raw bytes. This behavior is similar to PHP's md5() function. + * + * @param bool $raw_output + * @return string + * @access public + */ + function getServerKeyPublicExponent($raw_output = false) + { + return $raw_output ? $this->server_key_public_exponent->toBytes() : $this->server_key_public_exponent->toString(); + } + + /** + * Return the server key public modulus + * + * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, + * the raw bytes. This behavior is similar to PHP's md5() function. + * + * @param bool $raw_output + * @return string + * @access public + */ + function getServerKeyPublicModulus($raw_output = false) + { + return $raw_output ? $this->server_key_public_modulus->toBytes() : $this->server_key_public_modulus->toString(); + } + + /** + * Return the host key public exponent + * + * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, + * the raw bytes. This behavior is similar to PHP's md5() function. + * + * @param bool $raw_output + * @return string + * @access public + */ + function getHostKeyPublicExponent($raw_output = false) + { + return $raw_output ? $this->host_key_public_exponent->toBytes() : $this->host_key_public_exponent->toString(); + } + + /** + * Return the host key public modulus + * + * Returns, by default, the base-10 representation. If $raw_output is set to true, returns, instead, + * the raw bytes. This behavior is similar to PHP's md5() function. + * + * @param bool $raw_output + * @return string + * @access public + */ + function getHostKeyPublicModulus($raw_output = false) + { + return $raw_output ? $this->host_key_public_modulus->toBytes() : $this->host_key_public_modulus->toString(); + } + + /** + * Return a list of ciphers supported by SSH1 server. + * + * Just because a cipher is supported by an SSH1 server doesn't mean it's supported by this library. If $raw_output + * is set to true, returns, instead, an array of constants. ie. instead of array('Triple-DES in CBC mode'), you'll + * get array(NET_SSH1_CIPHER_3DES). + * + * @param bool $raw_output + * @return array + * @access public + */ + function getSupportedCiphers($raw_output = false) + { + return $raw_output ? array_keys($this->supported_ciphers) : array_values($this->supported_ciphers); + } + + /** + * Return a list of authentications supported by SSH1 server. + * + * Just because a cipher is supported by an SSH1 server doesn't mean it's supported by this library. If $raw_output + * is set to true, returns, instead, an array of constants. ie. instead of array('password authentication'), you'll + * get array(NET_SSH1_AUTH_PASSWORD). + * + * @param bool $raw_output + * @return array + * @access public + */ + function getSupportedAuthentications($raw_output = false) + { + return $raw_output ? array_keys($this->supported_authentications) : array_values($this->supported_authentications); + } + + /** + * Return the server identification. + * + * @return string + * @access public + */ + function getServerIdentification() + { + return rtrim($this->server_identification); + } + + /** + * Logs data packets + * + * Makes sure that only the last 1MB worth of packets will be logged + * + * @param string $data + * @access private + */ + function _append_log($protocol_flags, $message) + { + switch (NET_SSH1_LOGGING) { + // useful for benchmarks + case NET_SSH1_LOG_SIMPLE: + $this->protocol_flags_log[] = $protocol_flags; + break; + // the most useful log for SSH1 + case NET_SSH1_LOG_COMPLEX: + $this->protocol_flags_log[] = $protocol_flags; + $this->_string_shift($message); + $this->log_size+= strlen($message); + $this->message_log[] = $message; + while ($this->log_size > NET_SSH1_LOG_MAX_SIZE) { + $this->log_size-= strlen(array_shift($this->message_log)); + array_shift($this->protocol_flags_log); + } + break; + // dump the output out realtime; packets may be interspersed with non packets, + // passwords won't be filtered out and select other packets may not be correctly + // identified + case NET_SSH1_LOG_REALTIME: + echo "
      \r\n" . $this->_format_log(array($message), array($protocol_flags)) . "\r\n
      \r\n"; + @flush(); + @ob_flush(); + break; + // basically the same thing as NET_SSH1_LOG_REALTIME with the caveat that NET_SSH1_LOG_REALTIME_FILE + // needs to be defined and that the resultant log file will be capped out at NET_SSH1_LOG_MAX_SIZE. + // the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily + // at the beginning of the file + case NET_SSH1_LOG_REALTIME_FILE: + if (!isset($this->realtime_log_file)) { + // PHP doesn't seem to like using constants in fopen() + $filename = NET_SSH1_LOG_REALTIME_FILE; + $fp = fopen($filename, 'w'); + $this->realtime_log_file = $fp; + } + if (!is_resource($this->realtime_log_file)) { + break; + } + $entry = $this->_format_log(array($message), array($protocol_flags)); + if ($this->realtime_log_wrap) { + $temp = "<<< START >>>\r\n"; + $entry.= $temp; + fseek($this->realtime_log_file, ftell($this->realtime_log_file) - strlen($temp)); + } + $this->realtime_log_size+= strlen($entry); + if ($this->realtime_log_size > NET_SSH1_LOG_MAX_SIZE) { + fseek($this->realtime_log_file, 0); + $this->realtime_log_size = strlen($entry); + $this->realtime_log_wrap = true; + } + fputs($this->realtime_log_file, $entry); + } + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SSH2.php b/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SSH2.php old mode 100644 new mode 100755 index d61345622..a03138a99 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SSH2.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/Net/SSH2.php @@ -1,3878 +1,4893 @@ - - * login('username', 'password')) { - * exit('Login Failed'); - * } - * - * echo $ssh->exec('pwd'); - * echo $ssh->exec('ls -la'); - * ?> - * - * - * - * setPassword('whatever'); - * $key->loadKey(file_get_contents('privatekey')); - * - * $ssh = new Net_SSH2('www.domain.tld'); - * if (!$ssh->login('username', $key)) { - * exit('Login Failed'); - * } - * - * echo $ssh->read('username@username:~$'); - * $ssh->write("ls -la\n"); - * echo $ssh->read('username@username:~$'); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category Net - * @package Net_SSH2 - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -/**#@+ - * Execution Bitmap Masks - * - * @see Net_SSH2::bitmap - * @access private - */ -define('NET_SSH2_MASK_CONSTRUCTOR', 0x00000001); -define('NET_SSH2_MASK_CONNECTED', 0x00000002); -define('NET_SSH2_MASK_LOGIN_REQ', 0x00000004); -define('NET_SSH2_MASK_LOGIN', 0x00000008); -define('NET_SSH2_MASK_SHELL', 0x00000010); -define('NET_SSH2_MASK_WINDOW_ADJUST', 0x00000020); -/**#@-*/ - -/**#@+ - * Channel constants - * - * RFC4254 refers not to client and server channels but rather to sender and recipient channels. we don't refer - * to them in that way because RFC4254 toggles the meaning. the client sends a SSH_MSG_CHANNEL_OPEN message with - * a sender channel and the server sends a SSH_MSG_CHANNEL_OPEN_CONFIRMATION in response, with a sender and a - * recepient channel. at first glance, you might conclude that SSH_MSG_CHANNEL_OPEN_CONFIRMATION's sender channel - * would be the same thing as SSH_MSG_CHANNEL_OPEN's sender channel, but it's not, per this snipet: - * The 'recipient channel' is the channel number given in the original - * open request, and 'sender channel' is the channel number allocated by - * the other side. - * - * @see Net_SSH2::_send_channel_packet() - * @see Net_SSH2::_get_channel_packet() - * @access private - */ -define('NET_SSH2_CHANNEL_EXEC', 0); // PuTTy uses 0x100 -define('NET_SSH2_CHANNEL_SHELL', 1); -define('NET_SSH2_CHANNEL_SUBSYSTEM', 2); -/**#@-*/ - -/**#@+ - * @access public - * @see Net_SSH2::getLog() - */ -/** - * Returns the message numbers - */ -define('NET_SSH2_LOG_SIMPLE', 1); -/** - * Returns the message content - */ -define('NET_SSH2_LOG_COMPLEX', 2); -/** - * Outputs the content real-time - */ -define('NET_SSH2_LOG_REALTIME', 3); -/** - * Dumps the content real-time to a file - */ -define('NET_SSH2_LOG_REALTIME_FILE', 4); -/**#@-*/ - -/**#@+ - * @access public - * @see Net_SSH2::read() - */ -/** - * Returns when a string matching $expect exactly is found - */ -define('NET_SSH2_READ_SIMPLE', 1); -/** - * Returns when a string matching the regular expression $expect is found - */ -define('NET_SSH2_READ_REGEX', 2); -/** - * Make sure that the log never gets larger than this - */ -define('NET_SSH2_LOG_MAX_SIZE', 1024 * 1024); -/**#@-*/ - -/** - * Pure-PHP implementation of SSHv2. - * - * @package Net_SSH2 - * @author Jim Wigginton - * @access public - */ -class Net_SSH2 -{ - /** - * The SSH identifier - * - * @var String - * @access private - */ - var $identifier; - - /** - * The Socket Object - * - * @var Object - * @access private - */ - var $fsock; - - /** - * Execution Bitmap - * - * The bits that are set represent functions that have been called already. This is used to determine - * if a requisite function has been successfully executed. If not, an error should be thrown. - * - * @var Integer - * @access private - */ - var $bitmap = 0; - - /** - * Error information - * - * @see Net_SSH2::getErrors() - * @see Net_SSH2::getLastError() - * @var String - * @access private - */ - var $errors = array(); - - /** - * Server Identifier - * - * @see Net_SSH2::getServerIdentification() - * @var mixed false or Array - * @access private - */ - var $server_identifier = false; - - /** - * Key Exchange Algorithms - * - * @see Net_SSH2::getKexAlgorithims() - * @var mixed false or Array - * @access private - */ - var $kex_algorithms = false; - - /** - * Server Host Key Algorithms - * - * @see Net_SSH2::getServerHostKeyAlgorithms() - * @var mixed false or Array - * @access private - */ - var $server_host_key_algorithms = false; - - /** - * Encryption Algorithms: Client to Server - * - * @see Net_SSH2::getEncryptionAlgorithmsClient2Server() - * @var mixed false or Array - * @access private - */ - var $encryption_algorithms_client_to_server = false; - - /** - * Encryption Algorithms: Server to Client - * - * @see Net_SSH2::getEncryptionAlgorithmsServer2Client() - * @var mixed false or Array - * @access private - */ - var $encryption_algorithms_server_to_client = false; - - /** - * MAC Algorithms: Client to Server - * - * @see Net_SSH2::getMACAlgorithmsClient2Server() - * @var mixed false or Array - * @access private - */ - var $mac_algorithms_client_to_server = false; - - /** - * MAC Algorithms: Server to Client - * - * @see Net_SSH2::getMACAlgorithmsServer2Client() - * @var mixed false or Array - * @access private - */ - var $mac_algorithms_server_to_client = false; - - /** - * Compression Algorithms: Client to Server - * - * @see Net_SSH2::getCompressionAlgorithmsClient2Server() - * @var mixed false or Array - * @access private - */ - var $compression_algorithms_client_to_server = false; - - /** - * Compression Algorithms: Server to Client - * - * @see Net_SSH2::getCompressionAlgorithmsServer2Client() - * @var mixed false or Array - * @access private - */ - var $compression_algorithms_server_to_client = false; - - /** - * Languages: Server to Client - * - * @see Net_SSH2::getLanguagesServer2Client() - * @var mixed false or Array - * @access private - */ - var $languages_server_to_client = false; - - /** - * Languages: Client to Server - * - * @see Net_SSH2::getLanguagesClient2Server() - * @var mixed false or Array - * @access private - */ - var $languages_client_to_server = false; - - /** - * Block Size for Server to Client Encryption - * - * "Note that the length of the concatenation of 'packet_length', - * 'padding_length', 'payload', and 'random padding' MUST be a multiple - * of the cipher block size or 8, whichever is larger. This constraint - * MUST be enforced, even when using stream ciphers." - * - * -- http://tools.ietf.org/html/rfc4253#section-6 - * - * @see Net_SSH2::Net_SSH2() - * @see Net_SSH2::_send_binary_packet() - * @var Integer - * @access private - */ - var $encrypt_block_size = 8; - - /** - * Block Size for Client to Server Encryption - * - * @see Net_SSH2::Net_SSH2() - * @see Net_SSH2::_get_binary_packet() - * @var Integer - * @access private - */ - var $decrypt_block_size = 8; - - /** - * Server to Client Encryption Object - * - * @see Net_SSH2::_get_binary_packet() - * @var Object - * @access private - */ - var $decrypt = false; - - /** - * Client to Server Encryption Object - * - * @see Net_SSH2::_send_binary_packet() - * @var Object - * @access private - */ - var $encrypt = false; - - /** - * Client to Server HMAC Object - * - * @see Net_SSH2::_send_binary_packet() - * @var Object - * @access private - */ - var $hmac_create = false; - - /** - * Server to Client HMAC Object - * - * @see Net_SSH2::_get_binary_packet() - * @var Object - * @access private - */ - var $hmac_check = false; - - /** - * Size of server to client HMAC - * - * We need to know how big the HMAC will be for the server to client direction so that we know how many bytes to read. - * For the client to server side, the HMAC object will make the HMAC as long as it needs to be. All we need to do is - * append it. - * - * @see Net_SSH2::_get_binary_packet() - * @var Integer - * @access private - */ - var $hmac_size = false; - - /** - * Server Public Host Key - * - * @see Net_SSH2::getServerPublicHostKey() - * @var String - * @access private - */ - var $server_public_host_key; - - /** - * Session identifer - * - * "The exchange hash H from the first key exchange is additionally - * used as the session identifier, which is a unique identifier for - * this connection." - * - * -- http://tools.ietf.org/html/rfc4253#section-7.2 - * - * @see Net_SSH2::_key_exchange() - * @var String - * @access private - */ - var $session_id = false; - - /** - * Exchange hash - * - * The current exchange hash - * - * @see Net_SSH2::_key_exchange() - * @var String - * @access private - */ - var $exchange_hash = false; - - /** - * Message Numbers - * - * @see Net_SSH2::Net_SSH2() - * @var Array - * @access private - */ - var $message_numbers = array(); - - /** - * Disconnection Message 'reason codes' defined in RFC4253 - * - * @see Net_SSH2::Net_SSH2() - * @var Array - * @access private - */ - var $disconnect_reasons = array(); - - /** - * SSH_MSG_CHANNEL_OPEN_FAILURE 'reason codes', defined in RFC4254 - * - * @see Net_SSH2::Net_SSH2() - * @var Array - * @access private - */ - var $channel_open_failure_reasons = array(); - - /** - * Terminal Modes - * - * @link http://tools.ietf.org/html/rfc4254#section-8 - * @see Net_SSH2::Net_SSH2() - * @var Array - * @access private - */ - var $terminal_modes = array(); - - /** - * SSH_MSG_CHANNEL_EXTENDED_DATA's data_type_codes - * - * @link http://tools.ietf.org/html/rfc4254#section-5.2 - * @see Net_SSH2::Net_SSH2() - * @var Array - * @access private - */ - var $channel_extended_data_type_codes = array(); - - /** - * Send Sequence Number - * - * See 'Section 6.4. Data Integrity' of rfc4253 for more info. - * - * @see Net_SSH2::_send_binary_packet() - * @var Integer - * @access private - */ - var $send_seq_no = 0; - - /** - * Get Sequence Number - * - * See 'Section 6.4. Data Integrity' of rfc4253 for more info. - * - * @see Net_SSH2::_get_binary_packet() - * @var Integer - * @access private - */ - var $get_seq_no = 0; - - /** - * Server Channels - * - * Maps client channels to server channels - * - * @see Net_SSH2::_get_channel_packet() - * @see Net_SSH2::exec() - * @var Array - * @access private - */ - var $server_channels = array(); - - /** - * Channel Buffers - * - * If a client requests a packet from one channel but receives two packets from another those packets should - * be placed in a buffer - * - * @see Net_SSH2::_get_channel_packet() - * @see Net_SSH2::exec() - * @var Array - * @access private - */ - var $channel_buffers = array(); - - /** - * Channel Status - * - * Contains the type of the last sent message - * - * @see Net_SSH2::_get_channel_packet() - * @var Array - * @access private - */ - var $channel_status = array(); - - /** - * Packet Size - * - * Maximum packet size indexed by channel - * - * @see Net_SSH2::_send_channel_packet() - * @var Array - * @access private - */ - var $packet_size_client_to_server = array(); - - /** - * Message Number Log - * - * @see Net_SSH2::getLog() - * @var Array - * @access private - */ - var $message_number_log = array(); - - /** - * Message Log - * - * @see Net_SSH2::getLog() - * @var Array - * @access private - */ - var $message_log = array(); - - /** - * The Window Size - * - * Bytes the other party can send before it must wait for the window to be adjusted (0x7FFFFFFF = 2GB) - * - * @var Integer - * @see Net_SSH2::_send_channel_packet() - * @see Net_SSH2::exec() - * @access private - */ - var $window_size = 0x7FFFFFFF; - - /** - * Window size, server to client - * - * Window size indexed by channel - * - * @see Net_SSH2::_send_channel_packet() - * @var Array - * @access private - */ - var $window_size_server_to_client = array(); - - /** - * Window size, client to server - * - * Window size indexed by channel - * - * @see Net_SSH2::_get_channel_packet() - * @var Array - * @access private - */ - var $window_size_client_to_server = array(); - - /** - * Server signature - * - * Verified against $this->session_id - * - * @see Net_SSH2::getServerPublicHostKey() - * @var String - * @access private - */ - var $signature = ''; - - /** - * Server signature format - * - * ssh-rsa or ssh-dss. - * - * @see Net_SSH2::getServerPublicHostKey() - * @var String - * @access private - */ - var $signature_format = ''; - - /** - * Interactive Buffer - * - * @see Net_SSH2::read() - * @var Array - * @access private - */ - var $interactiveBuffer = ''; - - /** - * Current log size - * - * Should never exceed NET_SSH2_LOG_MAX_SIZE - * - * @see Net_SSH2::_send_binary_packet() - * @see Net_SSH2::_get_binary_packet() - * @var Integer - * @access private - */ - var $log_size; - - /** - * Timeout - * - * @see Net_SSH2::setTimeout() - * @access private - */ - var $timeout; - - /** - * Current Timeout - * - * @see Net_SSH2::_get_channel_packet() - * @access private - */ - var $curTimeout; - - /** - * Real-time log file pointer - * - * @see Net_SSH2::_append_log() - * @var Resource - * @access private - */ - var $realtime_log_file; - - /** - * Real-time log file size - * - * @see Net_SSH2::_append_log() - * @var Integer - * @access private - */ - var $realtime_log_size; - - /** - * Has the signature been validated? - * - * @see Net_SSH2::getServerPublicHostKey() - * @var Boolean - * @access private - */ - var $signature_validated = false; - - /** - * Real-time log file wrap boolean - * - * @see Net_SSH2::_append_log() - * @access private - */ - var $realtime_log_wrap; - - /** - * Flag to suppress stderr from output - * - * @see Net_SSH2::enableQuietMode() - * @access private - */ - var $quiet_mode = false; - - /** - * Time of first network activity - * - * @var Integer - * @access private - */ - var $last_packet; - - /** - * Exit status returned from ssh if any - * - * @var Integer - * @access private - */ - var $exit_status; - - /** - * Flag to request a PTY when using exec() - * - * @var Boolean - * @see Net_SSH2::enablePTY() - * @access private - */ - var $request_pty = false; - - /** - * Flag set while exec() is running when using enablePTY() - * - * @var Boolean - * @access private - */ - var $in_request_pty_exec = false; - - /** - * Flag set after startSubsystem() is called - * - * @var Boolean - * @access private - */ - var $in_subsystem; - - /** - * Contents of stdError - * - * @var String - * @access private - */ - var $stdErrorLog; - - /** - * The Last Interactive Response - * - * @see Net_SSH2::_keyboard_interactive_process() - * @var String - * @access private - */ - var $last_interactive_response = ''; - - /** - * Keyboard Interactive Request / Responses - * - * @see Net_SSH2::_keyboard_interactive_process() - * @var Array - * @access private - */ - var $keyboard_requests_responses = array(); - - /** - * Banner Message - * - * Quoting from the RFC, "in some jurisdictions, sending a warning message before - * authentication may be relevant for getting legal protection." - * - * @see Net_SSH2::_filter() - * @see Net_SSH2::getBannerMessage() - * @var String - * @access private - */ - var $banner_message = ''; - - /** - * Did read() timeout or return normally? - * - * @see Net_SSH2::isTimeout() - * @var Boolean - * @access private - */ - var $is_timeout = false; - - /** - * Log Boundary - * - * @see Net_SSH2::_format_log() - * @var String - * @access private - */ - var $log_boundary = ':'; - - /** - * Log Long Width - * - * @see Net_SSH2::_format_log() - * @var Integer - * @access private - */ - var $log_long_width = 65; - - /** - * Log Short Width - * - * @see Net_SSH2::_format_log() - * @var Integer - * @access private - */ - var $log_short_width = 16; - - /** - * Hostname - * - * @see Net_SSH2::Net_SSH2() - * @see Net_SSH2::_connect() - * @var String - * @access private - */ - var $host; - - /** - * Port Number - * - * @see Net_SSH2::Net_SSH2() - * @see Net_SSH2::_connect() - * @var Integer - * @access private - */ - var $port; - - /** - * Timeout for initial connection - * - * Set by the constructor call. Calling setTimeout() is optional. If it's not called functions like - * exec() won't timeout unless some PHP setting forces it too. The timeout specified in the constructor, - * however, is non-optional. There will be a timeout, whether or not you set it. If you don't it'll be - * 10 seconds. It is used by fsockopen() and the initial stream_select in that function. - * - * @see Net_SSH2::Net_SSH2() - * @see Net_SSH2::_connect() - * @var Integer - * @access private - */ - var $connectionTimeout; - - /** - * Number of columns for terminal window size - * - * @see Net_SSH2::getWindowColumns() - * @see Net_SSH2::setWindowColumns() - * @see Net_SSH2::setWindowSize() - * @var Integer - * @access private - */ - var $windowColumns = 80; - - /** - * Number of columns for terminal window size - * - * @see Net_SSH2::getWindowRows() - * @see Net_SSH2::setWindowRows() - * @see Net_SSH2::setWindowSize() - * @var Integer - * @access private - */ - var $windowRows = 24; - - /** - * Default Constructor. - * - * @param String $host - * @param optional Integer $port - * @param optional Integer $timeout - * @see Net_SSH2::login() - * @return Net_SSH2 - * @access public - */ - function Net_SSH2($host, $port = 22, $timeout = 10) - { - // Include Math_BigInteger - // Used to do Diffie-Hellman key exchange and DSA/RSA signature verification. - if (!class_exists('Math_BigInteger')) { - include_once 'Math/BigInteger.php'; - } - - if (!function_exists('crypt_random_string')) { - include_once 'Crypt/Random.php'; - } - - if (!class_exists('Crypt_Hash')) { - include_once 'Crypt/Hash.php'; - } - - $this->message_numbers = array( - 1 => 'NET_SSH2_MSG_DISCONNECT', - 2 => 'NET_SSH2_MSG_IGNORE', - 3 => 'NET_SSH2_MSG_UNIMPLEMENTED', - 4 => 'NET_SSH2_MSG_DEBUG', - 5 => 'NET_SSH2_MSG_SERVICE_REQUEST', - 6 => 'NET_SSH2_MSG_SERVICE_ACCEPT', - 20 => 'NET_SSH2_MSG_KEXINIT', - 21 => 'NET_SSH2_MSG_NEWKEYS', - 30 => 'NET_SSH2_MSG_KEXDH_INIT', - 31 => 'NET_SSH2_MSG_KEXDH_REPLY', - 50 => 'NET_SSH2_MSG_USERAUTH_REQUEST', - 51 => 'NET_SSH2_MSG_USERAUTH_FAILURE', - 52 => 'NET_SSH2_MSG_USERAUTH_SUCCESS', - 53 => 'NET_SSH2_MSG_USERAUTH_BANNER', - - 80 => 'NET_SSH2_MSG_GLOBAL_REQUEST', - 81 => 'NET_SSH2_MSG_REQUEST_SUCCESS', - 82 => 'NET_SSH2_MSG_REQUEST_FAILURE', - 90 => 'NET_SSH2_MSG_CHANNEL_OPEN', - 91 => 'NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION', - 92 => 'NET_SSH2_MSG_CHANNEL_OPEN_FAILURE', - 93 => 'NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST', - 94 => 'NET_SSH2_MSG_CHANNEL_DATA', - 95 => 'NET_SSH2_MSG_CHANNEL_EXTENDED_DATA', - 96 => 'NET_SSH2_MSG_CHANNEL_EOF', - 97 => 'NET_SSH2_MSG_CHANNEL_CLOSE', - 98 => 'NET_SSH2_MSG_CHANNEL_REQUEST', - 99 => 'NET_SSH2_MSG_CHANNEL_SUCCESS', - 100 => 'NET_SSH2_MSG_CHANNEL_FAILURE' - ); - $this->disconnect_reasons = array( - 1 => 'NET_SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT', - 2 => 'NET_SSH2_DISCONNECT_PROTOCOL_ERROR', - 3 => 'NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED', - 4 => 'NET_SSH2_DISCONNECT_RESERVED', - 5 => 'NET_SSH2_DISCONNECT_MAC_ERROR', - 6 => 'NET_SSH2_DISCONNECT_COMPRESSION_ERROR', - 7 => 'NET_SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE', - 8 => 'NET_SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED', - 9 => 'NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE', - 10 => 'NET_SSH2_DISCONNECT_CONNECTION_LOST', - 11 => 'NET_SSH2_DISCONNECT_BY_APPLICATION', - 12 => 'NET_SSH2_DISCONNECT_TOO_MANY_CONNECTIONS', - 13 => 'NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER', - 14 => 'NET_SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE', - 15 => 'NET_SSH2_DISCONNECT_ILLEGAL_USER_NAME' - ); - $this->channel_open_failure_reasons = array( - 1 => 'NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED' - ); - $this->terminal_modes = array( - 0 => 'NET_SSH2_TTY_OP_END' - ); - $this->channel_extended_data_type_codes = array( - 1 => 'NET_SSH2_EXTENDED_DATA_STDERR' - ); - - $this->_define_array( - $this->message_numbers, - $this->disconnect_reasons, - $this->channel_open_failure_reasons, - $this->terminal_modes, - $this->channel_extended_data_type_codes, - array(60 => 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'), - array(60 => 'NET_SSH2_MSG_USERAUTH_PK_OK'), - array(60 => 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST', - 61 => 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE') - ); - - $this->host = $host; - $this->port = $port; - $this->connectionTimeout = $timeout; - } - - /** - * Connect to an SSHv2 server - * - * @return Boolean - * @access private - */ - function _connect() - { - if ($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR) { - return false; - } - - $this->bitmap |= NET_SSH2_MASK_CONSTRUCTOR; - - $timeout = $this->connectionTimeout; - $host = $this->host . ':' . $this->port; - - $this->last_packet = strtok(microtime(), ' ') + strtok(''); // == microtime(true) in PHP5 - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $timeout); - if (!$this->fsock) { - user_error(rtrim("Cannot connect to $host. Error $errno. $errstr")); - return false; - } - $elapsed = strtok(microtime(), ' ') + strtok('') - $start; - - $timeout-= $elapsed; - - if ($timeout <= 0) { - user_error("Cannot connect to $host. Timeout error"); - return false; - } - - $read = array($this->fsock); - $write = $except = null; - - $sec = floor($timeout); - $usec = 1000000 * ($timeout - $sec); - - // on windows this returns a "Warning: Invalid CRT parameters detected" error - // the !count() is done as a workaround for - if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) { - user_error("Cannot connect to $host. Banner timeout"); - return false; - } - - /* According to the SSH2 specs, - - "The server MAY send other lines of data before sending the version - string. Each line SHOULD be terminated by a Carriage Return and Line - Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded - in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients - MUST be able to process such lines." */ - $temp = ''; - $extra = ''; - while (!feof($this->fsock) && !preg_match('#^SSH-(\d\.\d+)#', $temp, $matches)) { - if (substr($temp, -2) == "\r\n") { - $extra.= $temp; - $temp = ''; - } - $temp.= fgets($this->fsock, 255); - } - - if (feof($this->fsock)) { - user_error('Connection closed by server'); - return false; - } - - $this->identifier = $this->_generate_identifier(); - - if (defined('NET_SSH2_LOGGING')) { - $this->_append_log('<-', $extra . $temp); - $this->_append_log('->', $this->identifier . "\r\n"); - } - - $this->server_identifier = trim($temp, "\r\n"); - if (strlen($extra)) { - $this->errors[] = utf8_decode($extra); - } - - if ($matches[1] != '1.99' && $matches[1] != '2.0') { - user_error("Cannot connect to SSH $matches[1] servers"); - return false; - } - - fputs($this->fsock, $this->identifier . "\r\n"); - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - if (ord($response[0]) != NET_SSH2_MSG_KEXINIT) { - user_error('Expected SSH_MSG_KEXINIT'); - return false; - } - - if (!$this->_key_exchange($response)) { - return false; - } - - $this->bitmap|= NET_SSH2_MASK_CONNECTED; - - return true; - } - - /** - * Generates the SSH identifier - * - * You should overwrite this method in your own class if you want to use another identifier - * - * @access protected - * @return String - */ - function _generate_identifier() - { - $identifier = 'SSH-2.0-phpseclib_0.3'; - - $ext = array(); - if (extension_loaded('mcrypt')) { - $ext[] = 'mcrypt'; - } - - if (extension_loaded('gmp')) { - $ext[] = 'gmp'; - } elseif (extension_loaded('bcmath')) { - $ext[] = 'bcmath'; - } - - if (!empty($ext)) { - $identifier .= ' (' . implode(', ', $ext) . ')'; - } - - return $identifier; - } - - /** - * Key Exchange - * - * @param String $kexinit_payload_server - * @access private - */ - function _key_exchange($kexinit_payload_server) - { - static $kex_algorithms = array( - 'diffie-hellman-group1-sha1', // REQUIRED - 'diffie-hellman-group14-sha1' // REQUIRED - ); - - static $server_host_key_algorithms = array( - 'ssh-rsa', // RECOMMENDED sign Raw RSA Key - 'ssh-dss' // REQUIRED sign Raw DSS Key - ); - - static $encryption_algorithms = false; - if ($encryption_algorithms === false) { - $encryption_algorithms = array( - // from : - 'arcfour256', - 'arcfour128', - - //'arcfour', // OPTIONAL the ARCFOUR stream cipher with a 128-bit key - - // CTR modes from : - 'aes128-ctr', // RECOMMENDED AES (Rijndael) in SDCTR mode, with 128-bit key - 'aes192-ctr', // RECOMMENDED AES with 192-bit key - 'aes256-ctr', // RECOMMENDED AES with 256-bit key - - 'twofish128-ctr', // OPTIONAL Twofish in SDCTR mode, with 128-bit key - 'twofish192-ctr', // OPTIONAL Twofish with 192-bit key - 'twofish256-ctr', // OPTIONAL Twofish with 256-bit key - - 'aes128-cbc', // RECOMMENDED AES with a 128-bit key - 'aes192-cbc', // OPTIONAL AES with a 192-bit key - 'aes256-cbc', // OPTIONAL AES in CBC mode, with a 256-bit key - - 'twofish128-cbc', // OPTIONAL Twofish with a 128-bit key - 'twofish192-cbc', // OPTIONAL Twofish with a 192-bit key - 'twofish256-cbc', - 'twofish-cbc', // OPTIONAL alias for "twofish256-cbc" - // (this is being retained for historical reasons) - - 'blowfish-ctr', // OPTIONAL Blowfish in SDCTR mode - - 'blowfish-cbc', // OPTIONAL Blowfish in CBC mode - - '3des-ctr', // RECOMMENDED Three-key 3DES in SDCTR mode - - '3des-cbc', // REQUIRED three-key 3DES in CBC mode - //'none' // OPTIONAL no encryption; NOT RECOMMENDED - ); - - if (phpseclib_resolve_include_path('Crypt/RC4.php') === false) { - $encryption_algorithms = array_diff( - $encryption_algorithms, - array('arcfour256', 'arcfour128', 'arcfour') - ); - } - if (phpseclib_resolve_include_path('Crypt/Rijndael.php') === false) { - $encryption_algorithms = array_diff( - $encryption_algorithms, - array('aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-cbc', 'aes192-cbc', 'aes256-cbc') - ); - } - if (phpseclib_resolve_include_path('Crypt/Twofish.php') === false) { - $encryption_algorithms = array_diff( - $encryption_algorithms, - array('twofish128-ctr', 'twofish192-ctr', 'twofish256-ctr', 'twofish128-cbc', 'twofish192-cbc', 'twofish256-cbc', 'twofish-cbc') - ); - } - if (phpseclib_resolve_include_path('Crypt/Blowfish.php') === false) { - $encryption_algorithms = array_diff( - $encryption_algorithms, - array('blowfish-ctr', 'blowfish-cbc') - ); - } - if (phpseclib_resolve_include_path('Crypt/TripleDES.php') === false) { - $encryption_algorithms = array_diff( - $encryption_algorithms, - array('3des-ctr', '3des-cbc') - ); - } - $encryption_algorithms = array_values($encryption_algorithms); - } - - $mac_algorithms = array( - // from : - 'hmac-sha2-256',// RECOMMENDED HMAC-SHA256 (digest length = key length = 32) - - 'hmac-sha1-96', // RECOMMENDED first 96 bits of HMAC-SHA1 (digest length = 12, key length = 20) - 'hmac-sha1', // REQUIRED HMAC-SHA1 (digest length = key length = 20) - 'hmac-md5-96', // OPTIONAL first 96 bits of HMAC-MD5 (digest length = 12, key length = 16) - 'hmac-md5', // OPTIONAL HMAC-MD5 (digest length = key length = 16) - //'none' // OPTIONAL no MAC; NOT RECOMMENDED - ); - - static $compression_algorithms = array( - 'none' // REQUIRED no compression - //'zlib' // OPTIONAL ZLIB (LZ77) compression - ); - - // some SSH servers have buggy implementations of some of the above algorithms - switch ($this->server_identifier) { - case 'SSH-2.0-SSHD': - $mac_algorithms = array_values(array_diff( - $mac_algorithms, - array('hmac-sha1-96', 'hmac-md5-96') - )); - } - - static $str_kex_algorithms, $str_server_host_key_algorithms, - $encryption_algorithms_server_to_client, $mac_algorithms_server_to_client, $compression_algorithms_server_to_client, - $encryption_algorithms_client_to_server, $mac_algorithms_client_to_server, $compression_algorithms_client_to_server; - - if (empty($str_kex_algorithms)) { - $str_kex_algorithms = implode(',', $kex_algorithms); - $str_server_host_key_algorithms = implode(',', $server_host_key_algorithms); - $encryption_algorithms_server_to_client = $encryption_algorithms_client_to_server = implode(',', $encryption_algorithms); - $mac_algorithms_server_to_client = $mac_algorithms_client_to_server = implode(',', $mac_algorithms); - $compression_algorithms_server_to_client = $compression_algorithms_client_to_server = implode(',', $compression_algorithms); - } - - $client_cookie = crypt_random_string(16); - - $response = $kexinit_payload_server; - $this->_string_shift($response, 1); // skip past the message number (it should be SSH_MSG_KEXINIT) - $server_cookie = $this->_string_shift($response, 16); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->kex_algorithms = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->server_host_key_algorithms = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->encryption_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->encryption_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->mac_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->mac_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->compression_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->compression_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->languages_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->languages_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); - - extract(unpack('Cfirst_kex_packet_follows', $this->_string_shift($response, 1))); - $first_kex_packet_follows = $first_kex_packet_follows != 0; - - // the sending of SSH2_MSG_KEXINIT could go in one of two places. this is the second place. - $kexinit_payload_client = pack('Ca*Na*Na*Na*Na*Na*Na*Na*Na*Na*Na*CN', - NET_SSH2_MSG_KEXINIT, $client_cookie, strlen($str_kex_algorithms), $str_kex_algorithms, - strlen($str_server_host_key_algorithms), $str_server_host_key_algorithms, strlen($encryption_algorithms_client_to_server), - $encryption_algorithms_client_to_server, strlen($encryption_algorithms_server_to_client), $encryption_algorithms_server_to_client, - strlen($mac_algorithms_client_to_server), $mac_algorithms_client_to_server, strlen($mac_algorithms_server_to_client), - $mac_algorithms_server_to_client, strlen($compression_algorithms_client_to_server), $compression_algorithms_client_to_server, - strlen($compression_algorithms_server_to_client), $compression_algorithms_server_to_client, 0, '', 0, '', - 0, 0 - ); - - if (!$this->_send_binary_packet($kexinit_payload_client)) { - return false; - } - // here ends the second place. - - // we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange - for ($i = 0; $i < count($encryption_algorithms) && !in_array($encryption_algorithms[$i], $this->encryption_algorithms_server_to_client); $i++); - if ($i == count($encryption_algorithms)) { - user_error('No compatible server to client encryption algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - // we don't initialize any crypto-objects, yet - we do that, later. for now, we need the lengths to make the - // diffie-hellman key exchange as fast as possible - $decrypt = $encryption_algorithms[$i]; - switch ($decrypt) { - case '3des-cbc': - case '3des-ctr': - $decryptKeyLength = 24; // eg. 192 / 8 - break; - case 'aes256-cbc': - case 'aes256-ctr': - case 'twofish-cbc': - case 'twofish256-cbc': - case 'twofish256-ctr': - $decryptKeyLength = 32; // eg. 256 / 8 - break; - case 'aes192-cbc': - case 'aes192-ctr': - case 'twofish192-cbc': - case 'twofish192-ctr': - $decryptKeyLength = 24; // eg. 192 / 8 - break; - case 'aes128-cbc': - case 'aes128-ctr': - case 'twofish128-cbc': - case 'twofish128-ctr': - case 'blowfish-cbc': - case 'blowfish-ctr': - $decryptKeyLength = 16; // eg. 128 / 8 - break; - case 'arcfour': - case 'arcfour128': - $decryptKeyLength = 16; // eg. 128 / 8 - break; - case 'arcfour256': - $decryptKeyLength = 32; // eg. 128 / 8 - break; - case 'none'; - $decryptKeyLength = 0; - } - - for ($i = 0; $i < count($encryption_algorithms) && !in_array($encryption_algorithms[$i], $this->encryption_algorithms_client_to_server); $i++); - if ($i == count($encryption_algorithms)) { - user_error('No compatible client to server encryption algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $encrypt = $encryption_algorithms[$i]; - switch ($encrypt) { - case '3des-cbc': - case '3des-ctr': - $encryptKeyLength = 24; - break; - case 'aes256-cbc': - case 'aes256-ctr': - case 'twofish-cbc': - case 'twofish256-cbc': - case 'twofish256-ctr': - $encryptKeyLength = 32; - break; - case 'aes192-cbc': - case 'aes192-ctr': - case 'twofish192-cbc': - case 'twofish192-ctr': - $encryptKeyLength = 24; - break; - case 'aes128-cbc': - case 'aes128-ctr': - case 'twofish128-cbc': - case 'twofish128-ctr': - case 'blowfish-cbc': - case 'blowfish-ctr': - $encryptKeyLength = 16; - break; - case 'arcfour': - case 'arcfour128': - $encryptKeyLength = 16; - break; - case 'arcfour256': - $encryptKeyLength = 32; - break; - case 'none'; - $encryptKeyLength = 0; - } - - $keyLength = $decryptKeyLength > $encryptKeyLength ? $decryptKeyLength : $encryptKeyLength; - - // through diffie-hellman key exchange a symmetric key is obtained - for ($i = 0; $i < count($kex_algorithms) && !in_array($kex_algorithms[$i], $this->kex_algorithms); $i++); - if ($i == count($kex_algorithms)) { - user_error('No compatible key exchange algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - switch ($kex_algorithms[$i]) { - // see http://tools.ietf.org/html/rfc2409#section-6.2 and - // http://tools.ietf.org/html/rfc2412, appendex E - case 'diffie-hellman-group1-sha1': - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . - '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . - '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . - 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF'; - break; - // see http://tools.ietf.org/html/rfc3526#section-3 - case 'diffie-hellman-group14-sha1': - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . - '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . - '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . - 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . - '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . - '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . - 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . - '3995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF'; - break; - } - - // For both diffie-hellman-group1-sha1 and diffie-hellman-group14-sha1 - // the generator field element is 2 (decimal) and the hash function is sha1. - $g = new Math_BigInteger(2); - $prime = new Math_BigInteger($prime, 16); - $kexHash = new Crypt_Hash('sha1'); - //$q = $p->bitwise_rightShift(1); - - /* To increase the speed of the key exchange, both client and server may - reduce the size of their private exponents. It should be at least - twice as long as the key material that is generated from the shared - secret. For more details, see the paper by van Oorschot and Wiener - [VAN-OORSCHOT]. - - -- http://tools.ietf.org/html/rfc4419#section-6.2 */ - $one = new Math_BigInteger(1); - $keyLength = min($keyLength, $kexHash->getLength()); - $max = $one->bitwise_leftShift(16 * $keyLength); // 2 * 8 * $keyLength - $max = $max->subtract($one); - - $x = $one->random($one, $max); - $e = $g->modPow($x, $prime); - - $eBytes = $e->toBytes(true); - $data = pack('CNa*', NET_SSH2_MSG_KEXDH_INIT, strlen($eBytes), $eBytes); - - if (!$this->_send_binary_packet($data)) { - user_error('Connection closed by server'); - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - if ($type != NET_SSH2_MSG_KEXDH_REPLY) { - user_error('Expected SSH_MSG_KEXDH_REPLY'); - return false; - } - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->server_public_host_key = $server_public_host_key = $this->_string_shift($response, $temp['length']); - - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $public_key_format = $this->_string_shift($server_public_host_key, $temp['length']); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $fBytes = $this->_string_shift($response, $temp['length']); - $f = new Math_BigInteger($fBytes, -256); - - $temp = unpack('Nlength', $this->_string_shift($response, 4)); - $this->signature = $this->_string_shift($response, $temp['length']); - - $temp = unpack('Nlength', $this->_string_shift($this->signature, 4)); - $this->signature_format = $this->_string_shift($this->signature, $temp['length']); - - $key = $f->modPow($x, $prime); - $keyBytes = $key->toBytes(true); - - $this->exchange_hash = pack('Na*Na*Na*Na*Na*Na*Na*Na*', - strlen($this->identifier), $this->identifier, strlen($this->server_identifier), $this->server_identifier, - strlen($kexinit_payload_client), $kexinit_payload_client, strlen($kexinit_payload_server), - $kexinit_payload_server, strlen($this->server_public_host_key), $this->server_public_host_key, strlen($eBytes), - $eBytes, strlen($fBytes), $fBytes, strlen($keyBytes), $keyBytes - ); - - $this->exchange_hash = $kexHash->hash($this->exchange_hash); - - if ($this->session_id === false) { - $this->session_id = $this->exchange_hash; - } - - for ($i = 0; $i < count($server_host_key_algorithms) && !in_array($server_host_key_algorithms[$i], $this->server_host_key_algorithms); $i++); - if ($i == count($server_host_key_algorithms)) { - user_error('No compatible server host key algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - if ($public_key_format != $server_host_key_algorithms[$i] || $this->signature_format != $server_host_key_algorithms[$i]) { - user_error('Server Host Key Algorithm Mismatch'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $packet = pack('C', - NET_SSH2_MSG_NEWKEYS - ); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $response = $this->_get_binary_packet(); - - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - if ($type != NET_SSH2_MSG_NEWKEYS) { - user_error('Expected SSH_MSG_NEWKEYS'); - return false; - } - - switch ($encrypt) { - case '3des-cbc': - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $this->encrypt = new Crypt_TripleDES(); - // $this->encrypt_block_size = 64 / 8 == the default - break; - case '3des-ctr': - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $this->encrypt = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); - // $this->encrypt_block_size = 64 / 8 == the default - break; - case 'aes256-cbc': - case 'aes192-cbc': - case 'aes128-cbc': - if (!class_exists('Crypt_Rijndael')) { - include_once 'Crypt/Rijndael.php'; - } - $this->encrypt = new Crypt_Rijndael(); - $this->encrypt_block_size = 16; // eg. 128 / 8 - break; - case 'aes256-ctr': - case 'aes192-ctr': - case 'aes128-ctr': - if (!class_exists('Crypt_Rijndael')) { - include_once 'Crypt/Rijndael.php'; - } - $this->encrypt = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CTR); - $this->encrypt_block_size = 16; // eg. 128 / 8 - break; - case 'blowfish-cbc': - if (!class_exists('Crypt_Blowfish')) { - include_once 'Crypt/Blowfish.php'; - } - $this->encrypt = new Crypt_Blowfish(); - $this->encrypt_block_size = 8; - break; - case 'blowfish-ctr': - if (!class_exists('Crypt_Blowfish')) { - include_once 'Crypt/Blowfish.php'; - } - $this->encrypt = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); - $this->encrypt_block_size = 8; - break; - case 'twofish128-cbc': - case 'twofish192-cbc': - case 'twofish256-cbc': - case 'twofish-cbc': - if (!class_exists('Crypt_Twofish')) { - include_once 'Crypt/Twofish.php'; - } - $this->encrypt = new Crypt_Twofish(); - $this->encrypt_block_size = 16; - break; - case 'twofish128-ctr': - case 'twofish192-ctr': - case 'twofish256-ctr': - if (!class_exists('Crypt_Twofish')) { - include_once 'Crypt/Twofish.php'; - } - $this->encrypt = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); - $this->encrypt_block_size = 16; - break; - case 'arcfour': - case 'arcfour128': - case 'arcfour256': - if (!class_exists('Crypt_RC4')) { - include_once 'Crypt/RC4.php'; - } - $this->encrypt = new Crypt_RC4(); - break; - case 'none'; - //$this->encrypt = new Crypt_Null(); - } - - switch ($decrypt) { - case '3des-cbc': - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $this->decrypt = new Crypt_TripleDES(); - break; - case '3des-ctr': - if (!class_exists('Crypt_TripleDES')) { - include_once 'Crypt/TripleDES.php'; - } - $this->decrypt = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); - break; - case 'aes256-cbc': - case 'aes192-cbc': - case 'aes128-cbc': - if (!class_exists('Crypt_Rijndael')) { - include_once 'Crypt/Rijndael.php'; - } - $this->decrypt = new Crypt_Rijndael(); - $this->decrypt_block_size = 16; - break; - case 'aes256-ctr': - case 'aes192-ctr': - case 'aes128-ctr': - if (!class_exists('Crypt_Rijndael')) { - include_once 'Crypt/Rijndael.php'; - } - $this->decrypt = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CTR); - $this->decrypt_block_size = 16; - break; - case 'blowfish-cbc': - if (!class_exists('Crypt_Blowfish')) { - include_once 'Crypt/Blowfish.php'; - } - $this->decrypt = new Crypt_Blowfish(); - $this->decrypt_block_size = 8; - break; - case 'blowfish-ctr': - if (!class_exists('Crypt_Blowfish')) { - include_once 'Crypt/Blowfish.php'; - } - $this->decrypt = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); - $this->decrypt_block_size = 8; - break; - case 'twofish128-cbc': - case 'twofish192-cbc': - case 'twofish256-cbc': - case 'twofish-cbc': - if (!class_exists('Crypt_Twofish')) { - include_once 'Crypt/Twofish.php'; - } - $this->decrypt = new Crypt_Twofish(); - $this->decrypt_block_size = 16; - break; - case 'twofish128-ctr': - case 'twofish192-ctr': - case 'twofish256-ctr': - if (!class_exists('Crypt_Twofish')) { - include_once 'Crypt/Twofish.php'; - } - $this->decrypt = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); - $this->decrypt_block_size = 16; - break; - case 'arcfour': - case 'arcfour128': - case 'arcfour256': - if (!class_exists('Crypt_RC4')) { - include_once 'Crypt/RC4.php'; - } - $this->decrypt = new Crypt_RC4(); - break; - case 'none'; - //$this->decrypt = new Crypt_Null(); - } - - $keyBytes = pack('Na*', strlen($keyBytes), $keyBytes); - - if ($this->encrypt) { - $this->encrypt->enableContinuousBuffer(); - $this->encrypt->disablePadding(); - - $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'A' . $this->session_id); - while ($this->encrypt_block_size > strlen($iv)) { - $iv.= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); - } - $this->encrypt->setIV(substr($iv, 0, $this->encrypt_block_size)); - - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'C' . $this->session_id); - while ($encryptKeyLength > strlen($key)) { - $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - $this->encrypt->setKey(substr($key, 0, $encryptKeyLength)); - } - - if ($this->decrypt) { - $this->decrypt->enableContinuousBuffer(); - $this->decrypt->disablePadding(); - - $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'B' . $this->session_id); - while ($this->decrypt_block_size > strlen($iv)) { - $iv.= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); - } - $this->decrypt->setIV(substr($iv, 0, $this->decrypt_block_size)); - - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'D' . $this->session_id); - while ($decryptKeyLength > strlen($key)) { - $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - $this->decrypt->setKey(substr($key, 0, $decryptKeyLength)); - } - - /* The "arcfour128" algorithm is the RC4 cipher, as described in - [SCHNEIER], using a 128-bit key. The first 1536 bytes of keystream - generated by the cipher MUST be discarded, and the first byte of the - first encrypted packet MUST be encrypted using the 1537th byte of - keystream. - - -- http://tools.ietf.org/html/rfc4345#section-4 */ - if ($encrypt == 'arcfour128' || $encrypt == 'arcfour256') { - $this->encrypt->encrypt(str_repeat("\0", 1536)); - } - if ($decrypt == 'arcfour128' || $decrypt == 'arcfour256') { - $this->decrypt->decrypt(str_repeat("\0", 1536)); - } - - for ($i = 0; $i < count($mac_algorithms) && !in_array($mac_algorithms[$i], $this->mac_algorithms_client_to_server); $i++); - if ($i == count($mac_algorithms)) { - user_error('No compatible client to server message authentication algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $createKeyLength = 0; // ie. $mac_algorithms[$i] == 'none' - switch ($mac_algorithms[$i]) { - case 'hmac-sha2-256': - $this->hmac_create = new Crypt_Hash('sha256'); - $createKeyLength = 32; - break; - case 'hmac-sha1': - $this->hmac_create = new Crypt_Hash('sha1'); - $createKeyLength = 20; - break; - case 'hmac-sha1-96': - $this->hmac_create = new Crypt_Hash('sha1-96'); - $createKeyLength = 20; - break; - case 'hmac-md5': - $this->hmac_create = new Crypt_Hash('md5'); - $createKeyLength = 16; - break; - case 'hmac-md5-96': - $this->hmac_create = new Crypt_Hash('md5-96'); - $createKeyLength = 16; - } - - for ($i = 0; $i < count($mac_algorithms) && !in_array($mac_algorithms[$i], $this->mac_algorithms_server_to_client); $i++); - if ($i == count($mac_algorithms)) { - user_error('No compatible server to client message authentication algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $checkKeyLength = 0; - $this->hmac_size = 0; - switch ($mac_algorithms[$i]) { - case 'hmac-sha2-256': - $this->hmac_check = new Crypt_Hash('sha256'); - $checkKeyLength = 32; - $this->hmac_size = 32; - break; - case 'hmac-sha1': - $this->hmac_check = new Crypt_Hash('sha1'); - $checkKeyLength = 20; - $this->hmac_size = 20; - break; - case 'hmac-sha1-96': - $this->hmac_check = new Crypt_Hash('sha1-96'); - $checkKeyLength = 20; - $this->hmac_size = 12; - break; - case 'hmac-md5': - $this->hmac_check = new Crypt_Hash('md5'); - $checkKeyLength = 16; - $this->hmac_size = 16; - break; - case 'hmac-md5-96': - $this->hmac_check = new Crypt_Hash('md5-96'); - $checkKeyLength = 16; - $this->hmac_size = 12; - } - - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'E' . $this->session_id); - while ($createKeyLength > strlen($key)) { - $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - $this->hmac_create->setKey(substr($key, 0, $createKeyLength)); - - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'F' . $this->session_id); - while ($checkKeyLength > strlen($key)) { - $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - $this->hmac_check->setKey(substr($key, 0, $checkKeyLength)); - - for ($i = 0; $i < count($compression_algorithms) && !in_array($compression_algorithms[$i], $this->compression_algorithms_server_to_client); $i++); - if ($i == count($compression_algorithms)) { - user_error('No compatible server to client compression algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - $this->decompress = $compression_algorithms[$i] == 'zlib'; - - for ($i = 0; $i < count($compression_algorithms) && !in_array($compression_algorithms[$i], $this->compression_algorithms_client_to_server); $i++); - if ($i == count($compression_algorithms)) { - user_error('No compatible client to server compression algorithms found'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - $this->compress = $compression_algorithms[$i] == 'zlib'; - - return true; - } - - /** - * Login - * - * The $password parameter can be a plaintext password, a Crypt_RSA object or an array - * - * @param String $username - * @param Mixed $password - * @param Mixed $... - * @return Boolean - * @see _login - * @access public - */ - function login($username) - { - $args = func_get_args(); - return call_user_func_array(array(&$this, '_login'), $args); - } - - /** - * Login Helper - * - * @param String $username - * @param Mixed $password - * @param Mixed $... - * @return Boolean - * @see _login_helper - * @access private - */ - function _login($username) - { - if (!($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR)) { - if (!$this->_connect()) { - return false; - } - } - - $args = array_slice(func_get_args(), 1); - if (empty($args)) { - return $this->_login_helper($username); - } - - foreach ($args as $arg) { - if ($this->_login_helper($username, $arg)) { - return true; - } - } - return false; - } - - /** - * Login Helper - * - * @param String $username - * @param optional String $password - * @return Boolean - * @access private - * @internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis} - * by sending dummy SSH_MSG_IGNORE messages. - */ - function _login_helper($username, $password = null) - { - if (!($this->bitmap & NET_SSH2_MASK_CONNECTED)) { - return false; - } - - if (!($this->bitmap & NET_SSH2_MASK_LOGIN_REQ)) { - $packet = pack('CNa*', - NET_SSH2_MSG_SERVICE_REQUEST, strlen('ssh-userauth'), 'ssh-userauth' - ); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - if ($type != NET_SSH2_MSG_SERVICE_ACCEPT) { - user_error('Expected SSH_MSG_SERVICE_ACCEPT'); - return false; - } - $this->bitmap |= NET_SSH2_MASK_LOGIN_REQ; - } - - if (strlen($this->last_interactive_response)) { - return !is_string($password) && !is_array($password) ? false : $this->_keyboard_interactive_process($password); - } - - // although PHP5's get_class() preserves the case, PHP4's does not - if (is_object($password)) { - switch (strtolower(get_class($password))) { - case 'crypt_rsa': - return $this->_privatekey_login($username, $password); - case 'system_ssh_agent': - return $this->_ssh_agent_login($username, $password); - } - } - - if (is_array($password)) { - if ($this->_keyboard_interactive_login($username, $password)) { - $this->bitmap |= NET_SSH2_MASK_LOGIN; - return true; - } - return false; - } - - if (!isset($password)) { - $packet = pack('CNa*Na*Na*', - NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection', - strlen('none'), 'none' - ); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - switch ($type) { - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= NET_SSH2_MASK_LOGIN; - return true; - //case NET_SSH2_MSG_USERAUTH_FAILURE: - default: - return false; - } - } - - $packet = pack('CNa*Na*Na*CNa*', - NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection', - strlen('password'), 'password', 0, strlen($password), $password - ); - - // remove the username and password from the logged packet - if (!defined('NET_SSH2_LOGGING')) { - $logged = null; - } else { - $logged = pack('CNa*Na*Na*CNa*', - NET_SSH2_MSG_USERAUTH_REQUEST, strlen('username'), 'username', strlen('ssh-connection'), 'ssh-connection', - strlen('password'), 'password', 0, strlen('password'), 'password' - ); - } - - if (!$this->_send_binary_packet($packet, $logged)) { - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - switch ($type) { - case NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ: // in theory, the password can be changed - if (defined('NET_SSH2_LOGGING')) { - $this->message_number_log[count($this->message_number_log) - 1] = 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'; - } - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . utf8_decode($this->_string_shift($response, $length)); - return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER); - case NET_SSH2_MSG_USERAUTH_FAILURE: - // can we use keyboard-interactive authentication? if not then either the login is bad or the server employees - // multi-factor authentication - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $auth_methods = explode(',', $this->_string_shift($response, $length)); - extract(unpack('Cpartial_success', $this->_string_shift($response, 1))); - $partial_success = $partial_success != 0; - - if (!$partial_success && in_array('keyboard-interactive', $auth_methods)) { - if ($this->_keyboard_interactive_login($username, $password)) { - $this->bitmap |= NET_SSH2_MASK_LOGIN; - return true; - } - return false; - } - return false; - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= NET_SSH2_MASK_LOGIN; - return true; - } - - return false; - } - - /** - * Login via keyboard-interactive authentication - * - * See {@link http://tools.ietf.org/html/rfc4256 RFC4256} for details. This is not a full-featured keyboard-interactive authenticator. - * - * @param String $username - * @param String $password - * @return Boolean - * @access private - */ - function _keyboard_interactive_login($username, $password) - { - $packet = pack('CNa*Na*Na*Na*Na*', - NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection', - strlen('keyboard-interactive'), 'keyboard-interactive', 0, '', 0, '' - ); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - return $this->_keyboard_interactive_process($password); - } - - /** - * Handle the keyboard-interactive requests / responses. - * - * @param String $responses... - * @return Boolean - * @access private - */ - function _keyboard_interactive_process() - { - $responses = func_get_args(); - - if (strlen($this->last_interactive_response)) { - $response = $this->last_interactive_response; - } else { - $orig = $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - switch ($type) { - case NET_SSH2_MSG_USERAUTH_INFO_REQUEST: - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->_string_shift($response, $length); // name; may be empty - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->_string_shift($response, $length); // instruction; may be empty - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->_string_shift($response, $length); // language tag; may be empty - extract(unpack('Nnum_prompts', $this->_string_shift($response, 4))); - - for ($i = 0; $i < count($responses); $i++) { - if (is_array($responses[$i])) { - foreach ($responses[$i] as $key => $value) { - $this->keyboard_requests_responses[$key] = $value; - } - unset($responses[$i]); - } - } - $responses = array_values($responses); - - if (isset($this->keyboard_requests_responses)) { - for ($i = 0; $i < $num_prompts; $i++) { - extract(unpack('Nlength', $this->_string_shift($response, 4))); - // prompt - ie. "Password: "; must not be empty - $prompt = $this->_string_shift($response, $length); - //$echo = $this->_string_shift($response) != chr(0); - foreach ($this->keyboard_requests_responses as $key => $value) { - if (substr($prompt, 0, strlen($key)) == $key) { - $responses[] = $value; - break; - } - } - } - } - - // see http://tools.ietf.org/html/rfc4256#section-3.2 - if (strlen($this->last_interactive_response)) { - $this->last_interactive_response = ''; - } else if (defined('NET_SSH2_LOGGING')) { - $this->message_number_log[count($this->message_number_log) - 1] = str_replace( - 'UNKNOWN', - 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST', - $this->message_number_log[count($this->message_number_log) - 1] - ); - } - - if (!count($responses) && $num_prompts) { - $this->last_interactive_response = $orig; - return false; - } - - /* - After obtaining the requested information from the user, the client - MUST respond with an SSH_MSG_USERAUTH_INFO_RESPONSE message. - */ - // see http://tools.ietf.org/html/rfc4256#section-3.4 - $packet = $logged = pack('CN', NET_SSH2_MSG_USERAUTH_INFO_RESPONSE, count($responses)); - for ($i = 0; $i < count($responses); $i++) { - $packet.= pack('Na*', strlen($responses[$i]), $responses[$i]); - $logged.= pack('Na*', strlen('dummy-answer'), 'dummy-answer'); - } - - if (!$this->_send_binary_packet($packet, $logged)) { - return false; - } - - if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX) { - $this->message_number_log[count($this->message_number_log) - 1] = str_replace( - 'UNKNOWN', - 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE', - $this->message_number_log[count($this->message_number_log) - 1] - ); - } - - /* - After receiving the response, the server MUST send either an - SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, or another - SSH_MSG_USERAUTH_INFO_REQUEST message. - */ - // maybe phpseclib should force close the connection after x request / responses? unless something like that is done - // there could be an infinite loop of request / responses. - return $this->_keyboard_interactive_process(); - case NET_SSH2_MSG_USERAUTH_SUCCESS: - return true; - case NET_SSH2_MSG_USERAUTH_FAILURE: - return false; - } - - return false; - } - - /** - * Login with an ssh-agent provided key - * - * @param String $username - * @param System_SSH_Agent $agent - * @return Boolean - * @access private - */ - function _ssh_agent_login($username, $agent) - { - $keys = $agent->requestIdentities(); - foreach ($keys as $key) { - if ($this->_privatekey_login($username, $key)) { - return true; - } - } - - return false; - } - - /** - * Login with an RSA private key - * - * @param String $username - * @param Crypt_RSA $password - * @return Boolean - * @access private - * @internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis} - * by sending dummy SSH_MSG_IGNORE messages. - */ - function _privatekey_login($username, $privatekey) - { - // see http://tools.ietf.org/html/rfc4253#page-15 - $publickey = $privatekey->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_RAW); - if ($publickey === false) { - return false; - } - - $publickey = array( - 'e' => $publickey['e']->toBytes(true), - 'n' => $publickey['n']->toBytes(true) - ); - $publickey = pack('Na*Na*Na*', - strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey['e']), $publickey['e'], strlen($publickey['n']), $publickey['n'] - ); - - $part1 = pack('CNa*Na*Na*', - NET_SSH2_MSG_USERAUTH_REQUEST, strlen($username), $username, strlen('ssh-connection'), 'ssh-connection', - strlen('publickey'), 'publickey' - ); - $part2 = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publickey), $publickey); - - $packet = $part1 . chr(0) . $part2; - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - switch ($type) { - case NET_SSH2_MSG_USERAUTH_FAILURE: - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->errors[] = 'SSH_MSG_USERAUTH_FAILURE: ' . $this->_string_shift($response, $length); - return false; - case NET_SSH2_MSG_USERAUTH_PK_OK: - // we'll just take it on faith that the public key blob and the public key algorithm name are as - // they should be - if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX) { - $this->message_number_log[count($this->message_number_log) - 1] = str_replace( - 'UNKNOWN', - 'NET_SSH2_MSG_USERAUTH_PK_OK', - $this->message_number_log[count($this->message_number_log) - 1] - ); - } - } - - $packet = $part1 . chr(1) . $part2; - $privatekey->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); - $signature = $privatekey->sign(pack('Na*a*', strlen($this->session_id), $this->session_id, $packet)); - $signature = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($signature), $signature); - $packet.= pack('Na*', strlen($signature), $signature); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - extract(unpack('Ctype', $this->_string_shift($response, 1))); - - switch ($type) { - case NET_SSH2_MSG_USERAUTH_FAILURE: - // either the login is bad or the server employs multi-factor authentication - return false; - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= NET_SSH2_MASK_LOGIN; - return true; - } - - return false; - } - - /** - * Set Timeout - * - * $ssh->exec('ping 127.0.0.1'); on a Linux host will never return and will run indefinitely. setTimeout() makes it so it'll timeout. - * Setting $timeout to false or 0 will mean there is no timeout. - * - * @param Mixed $timeout - * @access public - */ - function setTimeout($timeout) - { - $this->timeout = $this->curTimeout = $timeout; - } - - /** - * Get the output from stdError - * - * @access public - */ - function getStdError() - { - return $this->stdErrorLog; - } - - /** - * Execute Command - * - * If $callback is set to false then Net_SSH2::_get_channel_packet(NET_SSH2_CHANNEL_EXEC) will need to be called manually. - * In all likelihood, this is not a feature you want to be taking advantage of. - * - * @param String $command - * @param optional Callback $callback - * @return String - * @access public - */ - function exec($command, $callback = null) - { - $this->curTimeout = $this->timeout; - $this->is_timeout = false; - $this->stdErrorLog = ''; - - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - return false; - } - - // RFC4254 defines the (client) window size as "bytes the other party can send before it must wait for the window to - // be adjusted". 0x7FFFFFFF is, at 2GB, the max size. technically, it should probably be decremented, but, - // honestly, if you're transfering more than 2GB, you probably shouldn't be using phpseclib, anyway. - // see http://tools.ietf.org/html/rfc4254#section-5.2 for more info - $this->window_size_server_to_client[NET_SSH2_CHANNEL_EXEC] = $this->window_size; - // 0x8000 is the maximum max packet size, per http://tools.ietf.org/html/rfc4253#section-6.1, although since PuTTy - // uses 0x4000, that's what will be used here, as well. - $packet_size = 0x4000; - - $packet = pack('CNa*N3', - NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SSH2_CHANNEL_EXEC, $this->window_size_server_to_client[NET_SSH2_CHANNEL_EXEC], $packet_size); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_OPEN; - - $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); - if ($response === false) { - return false; - } - - if ($this->request_pty === true) { - $terminal_modes = pack('C', NET_SSH2_TTY_OP_END); - $packet = pack('CNNa*CNa*N5a*', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_EXEC], strlen('pty-req'), 'pty-req', 1, strlen('vt100'), 'vt100', - $this->windowColumns, $this->windowRows, 0, 0, strlen($terminal_modes), $terminal_modes); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - list(, $type) = unpack('C', $this->_string_shift($response, 1)); - - switch ($type) { - case NET_SSH2_MSG_CHANNEL_SUCCESS: - break; - case NET_SSH2_MSG_CHANNEL_FAILURE: - default: - user_error('Unable to request pseudo-terminal'); - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - $this->in_request_pty_exec = true; - } - - // sending a pty-req SSH_MSG_CHANNEL_REQUEST message is unnecessary and, in fact, in most cases, slows things - // down. the one place where it might be desirable is if you're doing something like Net_SSH2::exec('ping localhost &'). - // with a pty-req SSH_MSG_CHANNEL_REQUEST, exec() will return immediately and the ping process will then - // then immediately terminate. without such a request exec() will loop indefinitely. the ping process won't end but - // neither will your script. - - // although, in theory, the size of SSH_MSG_CHANNEL_REQUEST could exceed the maximum packet size established by - // SSH_MSG_CHANNEL_OPEN_CONFIRMATION, RFC4254#section-5.1 states that the "maximum packet size" refers to the - // "maximum size of an individual data packet". ie. SSH_MSG_CHANNEL_DATA. RFC4254#section-5.2 corroborates. - $packet = pack('CNNa*CNa*', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_EXEC], strlen('exec'), 'exec', 1, strlen($command), $command); - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); - if ($response === false) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_DATA; - - if ($callback === false || $this->in_request_pty_exec) { - return true; - } - - $output = ''; - while (true) { - $temp = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); - switch (true) { - case $temp === true: - return is_callable($callback) ? true : $output; - case $temp === false: - return false; - default: - if (is_callable($callback)) { - if (call_user_func($callback, $temp) === true) { - $this->_close_channel(NET_SSH2_CHANNEL_EXEC); - return true; - } - } else { - $output.= $temp; - } - } - } - } - - /** - * Creates an interactive shell - * - * @see Net_SSH2::read() - * @see Net_SSH2::write() - * @return Boolean - * @access private - */ - function _initShell() - { - if ($this->in_request_pty_exec === true) { - return true; - } - - $this->window_size_server_to_client[NET_SSH2_CHANNEL_SHELL] = $this->window_size; - $packet_size = 0x4000; - - $packet = pack('CNa*N3', - NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SSH2_CHANNEL_SHELL, $this->window_size_server_to_client[NET_SSH2_CHANNEL_SHELL], $packet_size); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_OPEN; - - $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SHELL); - if ($response === false) { - return false; - } - - $terminal_modes = pack('C', NET_SSH2_TTY_OP_END); - $packet = pack('CNNa*CNa*N5a*', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_SHELL], strlen('pty-req'), 'pty-req', 1, strlen('vt100'), 'vt100', - $this->windowColumns, $this->windowRows, 0, 0, strlen($terminal_modes), $terminal_modes); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - - list(, $type) = unpack('C', $this->_string_shift($response, 1)); - - switch ($type) { - case NET_SSH2_MSG_CHANNEL_SUCCESS: - // if a pty can't be opened maybe commands can still be executed - case NET_SSH2_MSG_CHANNEL_FAILURE: - break; - default: - user_error('Unable to request pseudo-terminal'); - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - - $packet = pack('CNNa*C', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_SHELL], strlen('shell'), 'shell', 1); - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SHELL); - if ($response === false) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_DATA; - - $this->bitmap |= NET_SSH2_MASK_SHELL; - - return true; - } - - /** - * Return the channel to be used with read() / write() - * - * @see Net_SSH2::read() - * @see Net_SSH2::write() - * @return Integer - * @access public - */ - function _get_interactive_channel() - { - switch (true) { - case $this->in_subsystem: - return NET_SSH2_CHANNEL_SUBSYSTEM; - case $this->in_request_pty_exec: - return NET_SSH2_CHANNEL_EXEC; - default: - return NET_SSH2_CHANNEL_SHELL; - } - } - - /** - * Returns the output of an interactive shell - * - * Returns when there's a match for $expect, which can take the form of a string literal or, - * if $mode == NET_SSH2_READ_REGEX, a regular expression. - * - * @see Net_SSH2::write() - * @param String $expect - * @param Integer $mode - * @return String - * @access public - */ - function read($expect = '', $mode = NET_SSH2_READ_SIMPLE) - { - $this->curTimeout = $this->timeout; - $this->is_timeout = false; - - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - user_error('Operation disallowed prior to login()'); - return false; - } - - if (!($this->bitmap & NET_SSH2_MASK_SHELL) && !$this->_initShell()) { - user_error('Unable to initiate an interactive shell session'); - return false; - } - - $channel = $this->_get_interactive_channel(); - - $match = $expect; - while (true) { - if ($mode == NET_SSH2_READ_REGEX) { - preg_match($expect, $this->interactiveBuffer, $matches); - $match = isset($matches[0]) ? $matches[0] : ''; - } - $pos = strlen($match) ? strpos($this->interactiveBuffer, $match) : false; - if ($pos !== false) { - return $this->_string_shift($this->interactiveBuffer, $pos + strlen($match)); - } - $response = $this->_get_channel_packet($channel); - if (is_bool($response)) { - $this->in_request_pty_exec = false; - return $response ? $this->_string_shift($this->interactiveBuffer, strlen($this->interactiveBuffer)) : false; - } - - $this->interactiveBuffer.= $response; - } - } - - /** - * Inputs a command into an interactive shell. - * - * @see Net_SSH2::read() - * @param String $cmd - * @return Boolean - * @access public - */ - function write($cmd) - { - if (!($this->bitmap & NET_SSH2_MASK_LOGIN)) { - user_error('Operation disallowed prior to login()'); - return false; - } - - if (!($this->bitmap & NET_SSH2_MASK_SHELL) && !$this->_initShell()) { - user_error('Unable to initiate an interactive shell session'); - return false; - } - - return $this->_send_channel_packet($this->_get_interactive_channel(), $cmd); - } - - /** - * Start a subsystem. - * - * Right now only one subsystem at a time is supported. To support multiple subsystem's stopSubsystem() could accept - * a string that contained the name of the subsystem, but at that point, only one subsystem of each type could be opened. - * To support multiple subsystem's of the same name maybe it'd be best if startSubsystem() generated a new channel id and - * returns that and then that that was passed into stopSubsystem() but that'll be saved for a future date and implemented - * if there's sufficient demand for such a feature. - * - * @see Net_SSH2::stopSubsystem() - * @param String $subsystem - * @return Boolean - * @access public - */ - function startSubsystem($subsystem) - { - $this->window_size_server_to_client[NET_SSH2_CHANNEL_SUBSYSTEM] = $this->window_size; - - $packet = pack('CNa*N3', - NET_SSH2_MSG_CHANNEL_OPEN, strlen('session'), 'session', NET_SSH2_CHANNEL_SUBSYSTEM, $this->window_size, 0x4000); - - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_OPEN; - - $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SUBSYSTEM); - if ($response === false) { - return false; - } - - $packet = pack('CNNa*CNa*', - NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[NET_SSH2_CHANNEL_SUBSYSTEM], strlen('subsystem'), 'subsystem', 1, strlen($subsystem), $subsystem); - if (!$this->_send_binary_packet($packet)) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SUBSYSTEM); - - if ($response === false) { - return false; - } - - $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_DATA; - - $this->bitmap |= NET_SSH2_MASK_SHELL; - $this->in_subsystem = true; - - return true; - } - - /** - * Stops a subsystem. - * - * @see Net_SSH2::startSubsystem() - * @return Boolean - * @access public - */ - function stopSubsystem() - { - $this->in_subsystem = false; - $this->_close_channel(NET_SSH2_CHANNEL_SUBSYSTEM); - return true; - } - - /** - * Closes a channel - * - * If read() timed out you might want to just close the channel and have it auto-restart on the next read() call - * - * @access public - */ - function reset() - { - $this->_close_channel($this->_get_interactive_channel()); - } - - /** - * Is timeout? - * - * Did exec() or read() return because they timed out or because they encountered the end? - * - * @access public - */ - function isTimeout() - { - return $this->is_timeout; - } - - /** - * Disconnect - * - * @access public - */ - function disconnect() - { - $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - if (isset($this->realtime_log_file) && is_resource($this->realtime_log_file)) { - fclose($this->realtime_log_file); - } - } - - /** - * Destructor. - * - * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call - * disconnect(). - * - * @access public - */ - function __destruct() - { - $this->disconnect(); - } - - /** - * Is the connection still active? - * - * @return boolean - * @access public - */ - function isConnected() - { - return (bool) ($this->bitmap & NET_SSH2_MASK_CONNECTED); - } - - /** - * Gets Binary Packets - * - * See '6. Binary Packet Protocol' of rfc4253 for more info. - * - * @see Net_SSH2::_send_binary_packet() - * @return String - * @access private - */ - function _get_binary_packet() - { - if (!is_resource($this->fsock) || feof($this->fsock)) { - user_error('Connection closed prematurely'); - $this->bitmap = 0; - return false; - } - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $raw = fread($this->fsock, $this->decrypt_block_size); - - if (!strlen($raw)) { - return ''; - } - - if ($this->decrypt !== false) { - $raw = $this->decrypt->decrypt($raw); - } - if ($raw === false) { - user_error('Unable to decrypt content'); - return false; - } - - extract(unpack('Npacket_length/Cpadding_length', $this->_string_shift($raw, 5))); - - $remaining_length = $packet_length + 4 - $this->decrypt_block_size; - - // quoting , - // "implementations SHOULD check that the packet length is reasonable" - // PuTTY uses 0x9000 as the actual max packet size and so to shall we - if ($remaining_length < -$this->decrypt_block_size || $remaining_length > 0x9000 || $remaining_length % $this->decrypt_block_size != 0) { - user_error('Invalid size'); - return false; - } - - $buffer = ''; - while ($remaining_length > 0) { - $temp = fread($this->fsock, $remaining_length); - if ($temp === false || feof($this->fsock)) { - user_error('Error reading from socket'); - $this->bitmap = 0; - return false; - } - $buffer.= $temp; - $remaining_length-= strlen($temp); - } - $stop = strtok(microtime(), ' ') + strtok(''); - if (strlen($buffer)) { - $raw.= $this->decrypt !== false ? $this->decrypt->decrypt($buffer) : $buffer; - } - - $payload = $this->_string_shift($raw, $packet_length - $padding_length - 1); - $padding = $this->_string_shift($raw, $padding_length); // should leave $raw empty - - if ($this->hmac_check !== false) { - $hmac = fread($this->fsock, $this->hmac_size); - if ($hmac === false || strlen($hmac) != $this->hmac_size) { - user_error('Error reading socket'); - $this->bitmap = 0; - return false; - } elseif ($hmac != $this->hmac_check->hash(pack('NNCa*', $this->get_seq_no, $packet_length, $padding_length, $payload . $padding))) { - user_error('Invalid HMAC'); - return false; - } - } - - //if ($this->decompress) { - // $payload = gzinflate(substr($payload, 2)); - //} - - $this->get_seq_no++; - - if (defined('NET_SSH2_LOGGING')) { - $current = strtok(microtime(), ' ') + strtok(''); - $message_number = isset($this->message_numbers[ord($payload[0])]) ? $this->message_numbers[ord($payload[0])] : 'UNKNOWN (' . ord($payload[0]) . ')'; - $message_number = '<- ' . $message_number . - ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($stop - $start, 4) . 's)'; - $this->_append_log($message_number, $payload); - $this->last_packet = $current; - } - - return $this->_filter($payload); - } - - /** - * Filter Binary Packets - * - * Because some binary packets need to be ignored... - * - * @see Net_SSH2::_get_binary_packet() - * @return String - * @access private - */ - function _filter($payload) - { - switch (ord($payload[0])) { - case NET_SSH2_MSG_DISCONNECT: - $this->_string_shift($payload, 1); - extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8))); - $this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . utf8_decode($this->_string_shift($payload, $length)); - $this->bitmap = 0; - return false; - case NET_SSH2_MSG_IGNORE: - $payload = $this->_get_binary_packet(); - break; - case NET_SSH2_MSG_DEBUG: - $this->_string_shift($payload, 2); - extract(unpack('Nlength', $this->_string_shift($payload, 4))); - $this->errors[] = 'SSH_MSG_DEBUG: ' . utf8_decode($this->_string_shift($payload, $length)); - $payload = $this->_get_binary_packet(); - break; - case NET_SSH2_MSG_UNIMPLEMENTED: - return false; - case NET_SSH2_MSG_KEXINIT: - if ($this->session_id !== false) { - if (!$this->_key_exchange($payload)) { - $this->bitmap = 0; - return false; - } - $payload = $this->_get_binary_packet(); - } - } - - // see http://tools.ietf.org/html/rfc4252#section-5.4; only called when the encryption has been activated and when we haven't already logged in - if (($this->bitmap & NET_SSH2_MASK_CONNECTED) && !($this->bitmap & NET_SSH2_MASK_LOGIN) && ord($payload[0]) == NET_SSH2_MSG_USERAUTH_BANNER) { - $this->_string_shift($payload, 1); - extract(unpack('Nlength', $this->_string_shift($payload, 4))); - $this->banner_message = utf8_decode($this->_string_shift($payload, $length)); - $payload = $this->_get_binary_packet(); - } - - // only called when we've already logged in - if (($this->bitmap & NET_SSH2_MASK_CONNECTED) && ($this->bitmap & NET_SSH2_MASK_LOGIN)) { - switch (ord($payload[0])) { - case NET_SSH2_MSG_GLOBAL_REQUEST: // see http://tools.ietf.org/html/rfc4254#section-4 - $this->_string_shift($payload, 1); - extract(unpack('Nlength', $this->_string_shift($payload))); - $this->errors[] = 'SSH_MSG_GLOBAL_REQUEST: ' . utf8_decode($this->_string_shift($payload, $length)); - - if (!$this->_send_binary_packet(pack('C', NET_SSH2_MSG_REQUEST_FAILURE))) { - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - - $payload = $this->_get_binary_packet(); - break; - case NET_SSH2_MSG_CHANNEL_OPEN: // see http://tools.ietf.org/html/rfc4254#section-5.1 - $this->_string_shift($payload, 1); - extract(unpack('Nlength', $this->_string_shift($payload, 4))); - $this->errors[] = 'SSH_MSG_CHANNEL_OPEN: ' . utf8_decode($this->_string_shift($payload, $length)); - - $this->_string_shift($payload, 4); // skip over client channel - extract(unpack('Nserver_channel', $this->_string_shift($payload, 4))); - - $packet = pack('CN3a*Na*', - NET_SSH2_MSG_REQUEST_FAILURE, $server_channel, NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED, 0, '', 0, ''); - - if (!$this->_send_binary_packet($packet)) { - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - - $payload = $this->_get_binary_packet(); - break; - case NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST: - $this->_string_shift($payload, 1); - extract(unpack('Nchannel', $this->_string_shift($payload, 4))); - extract(unpack('Nwindow_size', $this->_string_shift($payload, 4))); - $this->window_size_client_to_server[$channel]+= $window_size; - - $payload = ($this->bitmap & NET_SSH2_MASK_WINDOW_ADJUST) ? true : $this->_get_binary_packet(); - } - } - - return $payload; - } - - /** - * Enable Quiet Mode - * - * Suppress stderr from output - * - * @access public - */ - function enableQuietMode() - { - $this->quiet_mode = true; - } - - /** - * Disable Quiet Mode - * - * Show stderr in output - * - * @access public - */ - function disableQuietMode() - { - $this->quiet_mode = false; - } - - /** - * Returns whether Quiet Mode is enabled or not - * - * @see Net_SSH2::enableQuietMode() - * @see Net_SSH2::disableQuietMode() - * - * @access public - * @return boolean - */ - function isQuietModeEnabled() - { - return $this->quiet_mode; - } - - /** - * Enable request-pty when using exec() - * - * @access public - */ - function enablePTY() - { - $this->request_pty = true; - } - - /** - * Disable request-pty when using exec() - * - * @access public - */ - function disablePTY() - { - $this->request_pty = false; - } - - /** - * Returns whether request-pty is enabled or not - * - * @see Net_SSH2::enablePTY() - * @see Net_SSH2::disablePTY() - * - * @access public - * @return boolean - */ - function isPTYEnabled() - { - return $this->request_pty; - } - - /** - * Gets channel data - * - * Returns the data as a string if it's available and false if not. - * - * @param $client_channel - * @return Mixed - * @access private - */ - function _get_channel_packet($client_channel, $skip_extended = false) - { - if (!empty($this->channel_buffers[$client_channel])) { - return array_shift($this->channel_buffers[$client_channel]); - } - - while (true) { - if ($this->curTimeout) { - if ($this->curTimeout < 0) { - $this->is_timeout = true; - return true; - } - - $read = array($this->fsock); - $write = $except = null; - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $sec = floor($this->curTimeout); - $usec = 1000000 * ($this->curTimeout - $sec); - // on windows this returns a "Warning: Invalid CRT parameters detected" error - if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) { - $this->is_timeout = true; - return true; - } - $elapsed = strtok(microtime(), ' ') + strtok('') - $start; - $this->curTimeout-= $elapsed; - } - - $response = $this->_get_binary_packet(); - if ($response === false) { - user_error('Connection closed by server'); - return false; - } - if ($client_channel == -1 && $response === true) { - return true; - } - if (!strlen($response)) { - return ''; - } - - extract(unpack('Ctype/Nchannel', $this->_string_shift($response, 5))); - - $this->window_size_server_to_client[$channel]-= strlen($response); - - // resize the window, if appropriate - if ($this->window_size_server_to_client[$channel] < 0) { - $packet = pack('CNN', NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST, $this->server_channels[$channel], $this->window_size); - if (!$this->_send_binary_packet($packet)) { - return false; - } - $this->window_size_server_to_client[$channel]+= $this->window_size; - } - - switch ($this->channel_status[$channel]) { - case NET_SSH2_MSG_CHANNEL_OPEN: - switch ($type) { - case NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION: - extract(unpack('Nserver_channel', $this->_string_shift($response, 4))); - $this->server_channels[$channel] = $server_channel; - extract(unpack('Nwindow_size', $this->_string_shift($response, 4))); - $this->window_size_client_to_server[$channel] = $window_size; - $temp = unpack('Npacket_size_client_to_server', $this->_string_shift($response, 4)); - $this->packet_size_client_to_server[$channel] = $temp['packet_size_client_to_server']; - return $client_channel == $channel ? true : $this->_get_channel_packet($client_channel, $skip_extended); - //case NET_SSH2_MSG_CHANNEL_OPEN_FAILURE: - default: - user_error('Unable to open channel'); - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - break; - case NET_SSH2_MSG_CHANNEL_REQUEST: - switch ($type) { - case NET_SSH2_MSG_CHANNEL_SUCCESS: - return true; - case NET_SSH2_MSG_CHANNEL_FAILURE: - return false; - default: - user_error('Unable to fulfill channel request'); - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - case NET_SSH2_MSG_CHANNEL_CLOSE: - return $type == NET_SSH2_MSG_CHANNEL_CLOSE ? true : $this->_get_channel_packet($client_channel, $skip_extended); - } - - // ie. $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA - - switch ($type) { - case NET_SSH2_MSG_CHANNEL_DATA: - /* - if ($channel == NET_SSH2_CHANNEL_EXEC) { - // SCP requires null packets, such as this, be sent. further, in the case of the ssh.com SSH server - // this actually seems to make things twice as fast. more to the point, the message right after - // SSH_MSG_CHANNEL_DATA (usually SSH_MSG_IGNORE) won't block for as long as it would have otherwise. - // in OpenSSH it slows things down but only by a couple thousandths of a second. - $this->_send_channel_packet($channel, chr(0)); - } - */ - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $data = $this->_string_shift($response, $length); - if ($client_channel == $channel) { - return $data; - } - if (!isset($this->channel_buffers[$channel])) { - $this->channel_buffers[$channel] = array(); - } - $this->channel_buffers[$channel][] = $data; - break; - case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA: - /* - if ($client_channel == NET_SSH2_CHANNEL_EXEC) { - $this->_send_channel_packet($client_channel, chr(0)); - } - */ - // currently, there's only one possible value for $data_type_code: NET_SSH2_EXTENDED_DATA_STDERR - extract(unpack('Ndata_type_code/Nlength', $this->_string_shift($response, 8))); - $data = $this->_string_shift($response, $length); - $this->stdErrorLog.= $data; - if ($skip_extended || $this->quiet_mode) { - break; - } - if ($client_channel == $channel) { - return $data; - } - if (!isset($this->channel_buffers[$channel])) { - $this->channel_buffers[$channel] = array(); - } - $this->channel_buffers[$channel][] = $data; - break; - case NET_SSH2_MSG_CHANNEL_REQUEST: - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $value = $this->_string_shift($response, $length); - switch ($value) { - case 'exit-signal': - $this->_string_shift($response, 1); - extract(unpack('Nlength', $this->_string_shift($response, 4))); - $this->errors[] = 'SSH_MSG_CHANNEL_REQUEST (exit-signal): ' . $this->_string_shift($response, $length); - $this->_string_shift($response, 1); - extract(unpack('Nlength', $this->_string_shift($response, 4))); - if ($length) { - $this->errors[count($this->errors)].= "\r\n" . $this->_string_shift($response, $length); - } - - $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); - $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); - - $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_EOF; - - break; - case 'exit-status': - extract(unpack('Cfalse/Nexit_status', $this->_string_shift($response, 5))); - $this->exit_status = $exit_status; - - // "The client MAY ignore these messages." - // -- http://tools.ietf.org/html/rfc4254#section-6.10 - - break; - default: - // "Some systems may not implement signals, in which case they SHOULD ignore this message." - // -- http://tools.ietf.org/html/rfc4254#section-6.9 - break; - } - break; - case NET_SSH2_MSG_CHANNEL_CLOSE: - $this->curTimeout = 0; - - if ($this->bitmap & NET_SSH2_MASK_SHELL) { - $this->bitmap&= ~NET_SSH2_MASK_SHELL; - } - if ($this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_EOF) { - $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); - } - - $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_CLOSE; - return true; - case NET_SSH2_MSG_CHANNEL_EOF: - break; - default: - user_error('Error reading channel data'); - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - } - } - - /** - * Sends Binary Packets - * - * See '6. Binary Packet Protocol' of rfc4253 for more info. - * - * @param String $data - * @param optional String $logged - * @see Net_SSH2::_get_binary_packet() - * @return Boolean - * @access private - */ - function _send_binary_packet($data, $logged = null) - { - if (!is_resource($this->fsock) || feof($this->fsock)) { - user_error('Connection closed prematurely'); - $this->bitmap = 0; - return false; - } - - //if ($this->compress) { - // // the -4 removes the checksum: - // // http://php.net/function.gzcompress#57710 - // $data = substr(gzcompress($data), 0, -4); - //} - - // 4 (packet length) + 1 (padding length) + 4 (minimal padding amount) == 9 - $packet_length = strlen($data) + 9; - // round up to the nearest $this->encrypt_block_size - $packet_length+= (($this->encrypt_block_size - 1) * $packet_length) % $this->encrypt_block_size; - // subtracting strlen($data) is obvious - subtracting 5 is necessary because of packet_length and padding_length - $padding_length = $packet_length - strlen($data) - 5; - $padding = crypt_random_string($padding_length); - - // we subtract 4 from packet_length because the packet_length field isn't supposed to include itself - $packet = pack('NCa*', $packet_length - 4, $padding_length, $data . $padding); - - $hmac = $this->hmac_create !== false ? $this->hmac_create->hash(pack('Na*', $this->send_seq_no, $packet)) : ''; - $this->send_seq_no++; - - if ($this->encrypt !== false) { - $packet = $this->encrypt->encrypt($packet); - } - - $packet.= $hmac; - - $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 - $result = strlen($packet) == fputs($this->fsock, $packet); - $stop = strtok(microtime(), ' ') + strtok(''); - - if (defined('NET_SSH2_LOGGING')) { - $current = strtok(microtime(), ' ') + strtok(''); - $message_number = isset($this->message_numbers[ord($data[0])]) ? $this->message_numbers[ord($data[0])] : 'UNKNOWN (' . ord($data[0]) . ')'; - $message_number = '-> ' . $message_number . - ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($stop - $start, 4) . 's)'; - $this->_append_log($message_number, isset($logged) ? $logged : $data); - $this->last_packet = $current; - } - - return $result; - } - - /** - * Logs data packets - * - * Makes sure that only the last 1MB worth of packets will be logged - * - * @param String $data - * @access private - */ - function _append_log($message_number, $message) - { - // remove the byte identifying the message type from all but the first two messages (ie. the identification strings) - if (strlen($message_number) > 2) { - $this->_string_shift($message); - } - - switch (NET_SSH2_LOGGING) { - // useful for benchmarks - case NET_SSH2_LOG_SIMPLE: - $this->message_number_log[] = $message_number; - break; - // the most useful log for SSH2 - case NET_SSH2_LOG_COMPLEX: - $this->message_number_log[] = $message_number; - $this->log_size+= strlen($message); - $this->message_log[] = $message; - while ($this->log_size > NET_SSH2_LOG_MAX_SIZE) { - $this->log_size-= strlen(array_shift($this->message_log)); - array_shift($this->message_number_log); - } - break; - // dump the output out realtime; packets may be interspersed with non packets, - // passwords won't be filtered out and select other packets may not be correctly - // identified - case NET_SSH2_LOG_REALTIME: - switch (PHP_SAPI) { - case 'cli': - $start = $stop = "\r\n"; - break; - default: - $start = '
      ';
      -                        $stop = '
      '; - } - echo $start . $this->_format_log(array($message), array($message_number)) . $stop; - @flush(); - @ob_flush(); - break; - // basically the same thing as NET_SSH2_LOG_REALTIME with the caveat that NET_SSH2_LOG_REALTIME_FILE - // needs to be defined and that the resultant log file will be capped out at NET_SSH2_LOG_MAX_SIZE. - // the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily - // at the beginning of the file - case NET_SSH2_LOG_REALTIME_FILE: - if (!isset($this->realtime_log_file)) { - // PHP doesn't seem to like using constants in fopen() - $filename = NET_SSH2_LOG_REALTIME_FILENAME; - $fp = fopen($filename, 'w'); - $this->realtime_log_file = $fp; - } - if (!is_resource($this->realtime_log_file)) { - break; - } - $entry = $this->_format_log(array($message), array($message_number)); - if ($this->realtime_log_wrap) { - $temp = "<<< START >>>\r\n"; - $entry.= $temp; - fseek($this->realtime_log_file, ftell($this->realtime_log_file) - strlen($temp)); - } - $this->realtime_log_size+= strlen($entry); - if ($this->realtime_log_size > NET_SSH2_LOG_MAX_SIZE) { - fseek($this->realtime_log_file, 0); - $this->realtime_log_size = strlen($entry); - $this->realtime_log_wrap = true; - } - fputs($this->realtime_log_file, $entry); - } - } - - /** - * Sends channel data - * - * Spans multiple SSH_MSG_CHANNEL_DATAs if appropriate - * - * @param Integer $client_channel - * @param String $data - * @return Boolean - * @access private - */ - function _send_channel_packet($client_channel, $data) - { - while (strlen($data)) { - if (!$this->window_size_client_to_server[$client_channel]) { - $this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST; - // using an invalid channel will let the buffers be built up for the valid channels - $this->_get_channel_packet(-1); - $this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST; - } - - /* The maximum amount of data allowed is determined by the maximum - packet size for the channel, and the current window size, whichever - is smaller. - -- http://tools.ietf.org/html/rfc4254#section-5.2 */ - $max_size = min( - $this->packet_size_client_to_server[$client_channel], - $this->window_size_client_to_server[$client_channel] - ); - - $temp = $this->_string_shift($data, $max_size); - $packet = pack('CN2a*', - NET_SSH2_MSG_CHANNEL_DATA, - $this->server_channels[$client_channel], - strlen($temp), - $temp - ); - $this->window_size_client_to_server[$client_channel]-= strlen($temp); - if (!$this->_send_binary_packet($packet)) { - return false; - } - } - - return true; - } - - /** - * Closes and flushes a channel - * - * Net_SSH2 doesn't properly close most channels. For exec() channels are normally closed by the server - * and for SFTP channels are presumably closed when the client disconnects. This functions is intended - * for SCP more than anything. - * - * @param Integer $client_channel - * @param Boolean $want_reply - * @return Boolean - * @access private - */ - function _close_channel($client_channel, $want_reply = false) - { - // see http://tools.ietf.org/html/rfc4254#section-5.3 - - $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); - - if (!$want_reply) { - $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); - } - - $this->channel_status[$client_channel] = NET_SSH2_MSG_CHANNEL_CLOSE; - - $this->curTimeout = 0; - - while (!is_bool($this->_get_channel_packet($client_channel))); - - if ($want_reply) { - $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); - } - - if ($this->bitmap & NET_SSH2_MASK_SHELL) { - $this->bitmap&= ~NET_SSH2_MASK_SHELL; - } - } - - /** - * Disconnect - * - * @param Integer $reason - * @return Boolean - * @access private - */ - function _disconnect($reason) - { - if ($this->bitmap & NET_SSH2_MASK_CONNECTED) { - $data = pack('CNNa*Na*', NET_SSH2_MSG_DISCONNECT, $reason, 0, '', 0, ''); - $this->_send_binary_packet($data); - $this->bitmap = 0; - fclose($this->fsock); - return false; - } - } - - /** - * String Shift - * - * Inspired by array_shift - * - * @param String $string - * @param optional Integer $index - * @return String - * @access private - */ - function _string_shift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } - - /** - * Define Array - * - * Takes any number of arrays whose indices are integers and whose values are strings and defines a bunch of - * named constants from it, using the value as the name of the constant and the index as the value of the constant. - * If any of the constants that would be defined already exists, none of the constants will be defined. - * - * @param Array $array - * @access private - */ - function _define_array() - { - $args = func_get_args(); - foreach ($args as $arg) { - foreach ($arg as $key=>$value) { - if (!defined($value)) { - define($value, $key); - } else { - break 2; - } - } - } - } - - /** - * Returns a log of the packets that have been sent and received. - * - * Returns a string if NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX, an array if NET_SSH2_LOGGING == NET_SSH2_LOG_SIMPLE and false if !defined('NET_SSH2_LOGGING') - * - * @access public - * @return String or Array - */ - function getLog() - { - if (!defined('NET_SSH2_LOGGING')) { - return false; - } - - switch (NET_SSH2_LOGGING) { - case NET_SSH2_LOG_SIMPLE: - return $this->message_number_log; - break; - case NET_SSH2_LOG_COMPLEX: - return $this->_format_log($this->message_log, $this->message_number_log); - break; - default: - return false; - } - } - - /** - * Formats a log for printing - * - * @param Array $message_log - * @param Array $message_number_log - * @access private - * @return String - */ - function _format_log($message_log, $message_number_log) - { - $output = ''; - for ($i = 0; $i < count($message_log); $i++) { - $output.= $message_number_log[$i] . "\r\n"; - $current_log = $message_log[$i]; - $j = 0; - do { - if (strlen($current_log)) { - $output.= str_pad(dechex($j), 7, '0', STR_PAD_LEFT) . '0 '; - } - $fragment = $this->_string_shift($current_log, $this->log_short_width); - $hex = substr(preg_replace_callback('#.#s', array($this, '_format_log_helper'), $fragment), strlen($this->log_boundary)); - // replace non ASCII printable characters with dots - // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters - // also replace < with a . since < messes up the output on web browsers - $raw = preg_replace('#[^\x20-\x7E]|<#', '.', $fragment); - $output.= str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n"; - $j++; - } while (strlen($current_log)); - $output.= "\r\n"; - } - - return $output; - } - - /** - * Helper function for _format_log - * - * For use with preg_replace_callback() - * - * @param Array $matches - * @access private - * @return String - */ - function _format_log_helper($matches) - { - return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT); - } - - /** - * Returns all errors - * - * @return String - * @access public - */ - function getErrors() - { - return $this->errors; - } - - /** - * Returns the last error - * - * @return String - * @access public - */ - function getLastError() - { - return $this->errors[count($this->errors) - 1]; - } - - /** - * Return the server identification. - * - * @return String - * @access public - */ - function getServerIdentification() - { - $this->_connect(); - - return $this->server_identifier; - } - - /** - * Return a list of the key exchange algorithms the server supports. - * - * @return Array - * @access public - */ - function getKexAlgorithms() - { - $this->_connect(); - - return $this->kex_algorithms; - } - - /** - * Return a list of the host key (public key) algorithms the server supports. - * - * @return Array - * @access public - */ - function getServerHostKeyAlgorithms() - { - $this->_connect(); - - return $this->server_host_key_algorithms; - } - - /** - * Return a list of the (symmetric key) encryption algorithms the server supports, when receiving stuff from the client. - * - * @return Array - * @access public - */ - function getEncryptionAlgorithmsClient2Server() - { - $this->_connect(); - - return $this->encryption_algorithms_client_to_server; - } - - /** - * Return a list of the (symmetric key) encryption algorithms the server supports, when sending stuff to the client. - * - * @return Array - * @access public - */ - function getEncryptionAlgorithmsServer2Client() - { - $this->_connect(); - - return $this->encryption_algorithms_server_to_client; - } - - /** - * Return a list of the MAC algorithms the server supports, when receiving stuff from the client. - * - * @return Array - * @access public - */ - function getMACAlgorithmsClient2Server() - { - $this->_connect(); - - return $this->mac_algorithms_client_to_server; - } - - /** - * Return a list of the MAC algorithms the server supports, when sending stuff to the client. - * - * @return Array - * @access public - */ - function getMACAlgorithmsServer2Client() - { - $this->_connect(); - - return $this->mac_algorithms_server_to_client; - } - - /** - * Return a list of the compression algorithms the server supports, when receiving stuff from the client. - * - * @return Array - * @access public - */ - function getCompressionAlgorithmsClient2Server() - { - $this->_connect(); - - return $this->compression_algorithms_client_to_server; - } - - /** - * Return a list of the compression algorithms the server supports, when sending stuff to the client. - * - * @return Array - * @access public - */ - function getCompressionAlgorithmsServer2Client() - { - $this->_connect(); - - return $this->compression_algorithms_server_to_client; - } - - /** - * Return a list of the languages the server supports, when sending stuff to the client. - * - * @return Array - * @access public - */ - function getLanguagesServer2Client() - { - $this->_connect(); - - return $this->languages_server_to_client; - } - - /** - * Return a list of the languages the server supports, when receiving stuff from the client. - * - * @return Array - * @access public - */ - function getLanguagesClient2Server() - { - $this->_connect(); - - return $this->languages_client_to_server; - } - - /** - * Returns the banner message. - * - * Quoting from the RFC, "in some jurisdictions, sending a warning message before - * authentication may be relevant for getting legal protection." - * - * @return String - * @access public - */ - function getBannerMessage() - { - return $this->banner_message; - } - - /** - * Returns the server public host key. - * - * Caching this the first time you connect to a server and checking the result on subsequent connections - * is recommended. Returns false if the server signature is not signed correctly with the public host key. - * - * @return Mixed - * @access public - */ - function getServerPublicHostKey() - { - if (!($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR)) { - if (!$this->_connect()) { - return false; - } - } - - $signature = $this->signature; - $server_public_host_key = $this->server_public_host_key; - - extract(unpack('Nlength', $this->_string_shift($server_public_host_key, 4))); - $this->_string_shift($server_public_host_key, $length); - - if ($this->signature_validated) { - return $this->bitmap ? - $this->signature_format . ' ' . base64_encode($this->server_public_host_key) : - false; - } - - $this->signature_validated = true; - - switch ($this->signature_format) { - case 'ssh-dss': - $zero = new Math_BigInteger(); - - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $p = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); - - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $q = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); - - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $g = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); - - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $y = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); - - /* The value for 'dss_signature_blob' is encoded as a string containing - r, followed by s (which are 160-bit integers, without lengths or - padding, unsigned, and in network byte order). */ - $temp = unpack('Nlength', $this->_string_shift($signature, 4)); - if ($temp['length'] != 40) { - user_error('Invalid signature'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $r = new Math_BigInteger($this->_string_shift($signature, 20), 256); - $s = new Math_BigInteger($this->_string_shift($signature, 20), 256); - - switch (true) { - case $r->equals($zero): - case $r->compare($q) >= 0: - case $s->equals($zero): - case $s->compare($q) >= 0: - user_error('Invalid signature'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $w = $s->modInverse($q); - - $u1 = $w->multiply(new Math_BigInteger(sha1($this->exchange_hash), 16)); - list(, $u1) = $u1->divide($q); - - $u2 = $w->multiply($r); - list(, $u2) = $u2->divide($q); - - $g = $g->modPow($u1, $p); - $y = $y->modPow($u2, $p); - - $v = $g->multiply($y); - list(, $v) = $v->divide($p); - list(, $v) = $v->divide($q); - - if (!$v->equals($r)) { - user_error('Bad server signature'); - return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - } - - break; - case 'ssh-rsa': - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $e = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); - - $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); - $rawN = $this->_string_shift($server_public_host_key, $temp['length']); - $n = new Math_BigInteger($rawN, -256); - $nLength = strlen(ltrim($rawN, "\0")); - - /* - $temp = unpack('Nlength', $this->_string_shift($signature, 4)); - $signature = $this->_string_shift($signature, $temp['length']); - - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - - $rsa = new Crypt_RSA(); - $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); - $rsa->loadKey(array('e' => $e, 'n' => $n), CRYPT_RSA_PUBLIC_FORMAT_RAW); - if (!$rsa->verify($this->exchange_hash, $signature)) { - user_error('Bad server signature'); - return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - } - */ - - $temp = unpack('Nlength', $this->_string_shift($signature, 4)); - $s = new Math_BigInteger($this->_string_shift($signature, $temp['length']), 256); - - // validate an RSA signature per "8.2 RSASSA-PKCS1-v1_5", "5.2.2 RSAVP1", and "9.1 EMSA-PSS" in the - // following URL: - // ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf - - // also, see SSHRSA.c (rsa2_verifysig) in PuTTy's source. - - if ($s->compare(new Math_BigInteger()) < 0 || $s->compare($n->subtract(new Math_BigInteger(1))) > 0) { - user_error('Invalid signature'); - return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - } - - $s = $s->modPow($e, $n); - $s = $s->toBytes(); - - $h = pack('N4H*', 0x00302130, 0x0906052B, 0x0E03021A, 0x05000414, sha1($this->exchange_hash)); - $h = chr(0x01) . str_repeat(chr(0xFF), $nLength - 2 - strlen($h)) . $h; - - if ($s != $h) { - user_error('Bad server signature'); - return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - } - break; - default: - user_error('Unsupported signature format'); - return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - } - - return $this->signature_format . ' ' . base64_encode($this->server_public_host_key); - } - - /** - * Returns the exit status of an SSH command or false. - * - * @return Integer or false - * @access public - */ - function getExitStatus() - { - if (is_null($this->exit_status)) { - return false; - } - return $this->exit_status; - } - - /** - * Returns the number of columns for the terminal window size. - * - * @return Integer - * @access public - */ - function getWindowColumns() - { - return $this->windowColumns; - } - - /** - * Returns the number of rows for the terminal window size. - * - * @return Integer - * @access public - */ - function getWindowRows() - { - return $this->windowRows; - } - - /** - * Sets the number of columns for the terminal window size. - * - * @param Integer $value - * @access public - */ - function setWindowColumns($value) - { - $this->windowColumns = $value; - } - - /** - * Sets the number of rows for the terminal window size. - * - * @param Integer $value - * @access public - */ - function setWindowRows($value) - { - $this->windowRows = $value; - } - - /** - * Sets the number of columns and rows for the terminal window size. - * - * @param Integer $columns - * @param Integer $rows - * @access public - */ - function setWindowSize($columns = 80, $rows = 24) - { - $this->windowColumns = $columns; - $this->windowRows = $rows; - } -} + + * login('username', 'password')) { + * exit('Login Failed'); + * } + * + * echo $ssh->exec('pwd'); + * echo $ssh->exec('ls -la'); + * ?> + * + * + * + * setPassword('whatever'); + * $key->loadKey(file_get_contents('privatekey')); + * + * $ssh = new Net_SSH2('www.domain.tld'); + * if (!$ssh->login('username', $key)) { + * exit('Login Failed'); + * } + * + * echo $ssh->read('username@username:~$'); + * $ssh->write("ls -la\n"); + * echo $ssh->read('username@username:~$'); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category Net + * @package Net_SSH2 + * @author Jim Wigginton + * @copyright 2007 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + */ + +/**#@+ + * Execution Bitmap Masks + * + * @see self::bitmap + * @access private + */ +define('NET_SSH2_MASK_CONSTRUCTOR', 0x00000001); +define('NET_SSH2_MASK_CONNECTED', 0x00000002); +define('NET_SSH2_MASK_LOGIN_REQ', 0x00000004); +define('NET_SSH2_MASK_LOGIN', 0x00000008); +define('NET_SSH2_MASK_SHELL', 0x00000010); +define('NET_SSH2_MASK_WINDOW_ADJUST', 0x00000020); +/**#@-*/ + +/**#@+ + * Channel constants + * + * RFC4254 refers not to client and server channels but rather to sender and recipient channels. we don't refer + * to them in that way because RFC4254 toggles the meaning. the client sends a SSH_MSG_CHANNEL_OPEN message with + * a sender channel and the server sends a SSH_MSG_CHANNEL_OPEN_CONFIRMATION in response, with a sender and a + * recepient channel. at first glance, you might conclude that SSH_MSG_CHANNEL_OPEN_CONFIRMATION's sender channel + * would be the same thing as SSH_MSG_CHANNEL_OPEN's sender channel, but it's not, per this snipet: + * The 'recipient channel' is the channel number given in the original + * open request, and 'sender channel' is the channel number allocated by + * the other side. + * + * @see self::_send_channel_packet() + * @see self::_get_channel_packet() + * @access private + */ +define('NET_SSH2_CHANNEL_EXEC', 1); // PuTTy uses 0x100 +define('NET_SSH2_CHANNEL_SHELL', 2); +define('NET_SSH2_CHANNEL_SUBSYSTEM', 3); +define('NET_SSH2_CHANNEL_AGENT_FORWARD', 4); +define('NET_SSH2_CHANNEL_KEEP_ALIVE', 5); +/**#@-*/ + +/**#@+ + * @access public + * @see self::getLog() + */ +/** + * Returns the message numbers + */ +define('NET_SSH2_LOG_SIMPLE', 1); +/** + * Returns the message content + */ +define('NET_SSH2_LOG_COMPLEX', 2); +/** + * Outputs the content real-time + */ +define('NET_SSH2_LOG_REALTIME', 3); +/** + * Dumps the content real-time to a file + */ +define('NET_SSH2_LOG_REALTIME_FILE', 4); +/** + * Make sure that the log never gets larger than this + */ +define('NET_SSH2_LOG_MAX_SIZE', 1024 * 1024); +/**#@-*/ + +/**#@+ + * @access public + * @see self::read() + */ +/** + * Returns when a string matching $expect exactly is found + */ +define('NET_SSH2_READ_SIMPLE', 1); +/** + * Returns when a string matching the regular expression $expect is found + */ +define('NET_SSH2_READ_REGEX', 2); +/** + * Returns when a string matching the regular expression $expect is found + */ +define('NET_SSH2_READ_NEXT', 3); +/**#@-*/ + +/** + * Pure-PHP implementation of SSHv2. + * + * @package Net_SSH2 + * @author Jim Wigginton + * @access public + */ +class Net_SSH2 +{ + /** + * The SSH identifier + * + * @var string + * @access private + */ + var $identifier; + + /** + * The Socket Object + * + * @var object + * @access private + */ + var $fsock; + + /** + * Execution Bitmap + * + * The bits that are set represent functions that have been called already. This is used to determine + * if a requisite function has been successfully executed. If not, an error should be thrown. + * + * @var int + * @access private + */ + var $bitmap = 0; + + /** + * Error information + * + * @see self::getErrors() + * @see self::getLastError() + * @var string + * @access private + */ + var $errors = array(); + + /** + * Server Identifier + * + * @see self::getServerIdentification() + * @var array|false + * @access private + */ + var $server_identifier = false; + + /** + * Key Exchange Algorithms + * + * @see self::getKexAlgorithims() + * @var array|false + * @access private + */ + var $kex_algorithms = false; + + /** + * Minimum Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods + * + * @see self::_key_exchange() + * @var int + * @access private + */ + var $kex_dh_group_size_min = 1536; + + /** + * Preferred Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods + * + * @see self::_key_exchange() + * @var int + * @access private + */ + var $kex_dh_group_size_preferred = 2048; + + /** + * Maximum Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods + * + * @see self::_key_exchange() + * @var int + * @access private + */ + var $kex_dh_group_size_max = 4096; + + /** + * Server Host Key Algorithms + * + * @see self::getServerHostKeyAlgorithms() + * @var array|false + * @access private + */ + var $server_host_key_algorithms = false; + + /** + * Encryption Algorithms: Client to Server + * + * @see self::getEncryptionAlgorithmsClient2Server() + * @var array|false + * @access private + */ + var $encryption_algorithms_client_to_server = false; + + /** + * Encryption Algorithms: Server to Client + * + * @see self::getEncryptionAlgorithmsServer2Client() + * @var array|false + * @access private + */ + var $encryption_algorithms_server_to_client = false; + + /** + * MAC Algorithms: Client to Server + * + * @see self::getMACAlgorithmsClient2Server() + * @var array|false + * @access private + */ + var $mac_algorithms_client_to_server = false; + + /** + * MAC Algorithms: Server to Client + * + * @see self::getMACAlgorithmsServer2Client() + * @var array|false + * @access private + */ + var $mac_algorithms_server_to_client = false; + + /** + * Compression Algorithms: Client to Server + * + * @see self::getCompressionAlgorithmsClient2Server() + * @var array|false + * @access private + */ + var $compression_algorithms_client_to_server = false; + + /** + * Compression Algorithms: Server to Client + * + * @see self::getCompressionAlgorithmsServer2Client() + * @var array|false + * @access private + */ + var $compression_algorithms_server_to_client = false; + + /** + * Languages: Server to Client + * + * @see self::getLanguagesServer2Client() + * @var array|false + * @access private + */ + var $languages_server_to_client = false; + + /** + * Languages: Client to Server + * + * @see self::getLanguagesClient2Server() + * @var array|false + * @access private + */ + var $languages_client_to_server = false; + + /** + * Block Size for Server to Client Encryption + * + * "Note that the length of the concatenation of 'packet_length', + * 'padding_length', 'payload', and 'random padding' MUST be a multiple + * of the cipher block size or 8, whichever is larger. This constraint + * MUST be enforced, even when using stream ciphers." + * + * -- http://tools.ietf.org/html/rfc4253#section-6 + * + * @see self::Net_SSH2() + * @see self::_send_binary_packet() + * @var int + * @access private + */ + var $encrypt_block_size = 8; + + /** + * Block Size for Client to Server Encryption + * + * @see self::Net_SSH2() + * @see self::_get_binary_packet() + * @var int + * @access private + */ + var $decrypt_block_size = 8; + + /** + * Server to Client Encryption Object + * + * @see self::_get_binary_packet() + * @var object + * @access private + */ + var $decrypt = false; + + /** + * Client to Server Encryption Object + * + * @see self::_send_binary_packet() + * @var object + * @access private + */ + var $encrypt = false; + + /** + * Client to Server HMAC Object + * + * @see self::_send_binary_packet() + * @var object + * @access private + */ + var $hmac_create = false; + + /** + * Server to Client HMAC Object + * + * @see self::_get_binary_packet() + * @var object + * @access private + */ + var $hmac_check = false; + + /** + * Size of server to client HMAC + * + * We need to know how big the HMAC will be for the server to client direction so that we know how many bytes to read. + * For the client to server side, the HMAC object will make the HMAC as long as it needs to be. All we need to do is + * append it. + * + * @see self::_get_binary_packet() + * @var int + * @access private + */ + var $hmac_size = false; + + /** + * Server Public Host Key + * + * @see self::getServerPublicHostKey() + * @var string + * @access private + */ + var $server_public_host_key; + + /** + * Session identifier + * + * "The exchange hash H from the first key exchange is additionally + * used as the session identifier, which is a unique identifier for + * this connection." + * + * -- http://tools.ietf.org/html/rfc4253#section-7.2 + * + * @see self::_key_exchange() + * @var string + * @access private + */ + var $session_id = false; + + /** + * Exchange hash + * + * The current exchange hash + * + * @see self::_key_exchange() + * @var string + * @access private + */ + var $exchange_hash = false; + + /** + * Message Numbers + * + * @see self::Net_SSH2() + * @var array + * @access private + */ + var $message_numbers = array(); + + /** + * Disconnection Message 'reason codes' defined in RFC4253 + * + * @see self::Net_SSH2() + * @var array + * @access private + */ + var $disconnect_reasons = array(); + + /** + * SSH_MSG_CHANNEL_OPEN_FAILURE 'reason codes', defined in RFC4254 + * + * @see self::Net_SSH2() + * @var array + * @access private + */ + var $channel_open_failure_reasons = array(); + + /** + * Terminal Modes + * + * @link http://tools.ietf.org/html/rfc4254#section-8 + * @see self::Net_SSH2() + * @var array + * @access private + */ + var $terminal_modes = array(); + + /** + * SSH_MSG_CHANNEL_EXTENDED_DATA's data_type_codes + * + * @link http://tools.ietf.org/html/rfc4254#section-5.2 + * @see self::Net_SSH2() + * @var array + * @access private + */ + var $channel_extended_data_type_codes = array(); + + /** + * Send Sequence Number + * + * See 'Section 6.4. Data Integrity' of rfc4253 for more info. + * + * @see self::_send_binary_packet() + * @var int + * @access private + */ + var $send_seq_no = 0; + + /** + * Get Sequence Number + * + * See 'Section 6.4. Data Integrity' of rfc4253 for more info. + * + * @see self::_get_binary_packet() + * @var int + * @access private + */ + var $get_seq_no = 0; + + /** + * Server Channels + * + * Maps client channels to server channels + * + * @see self::_get_channel_packet() + * @see self::exec() + * @var array + * @access private + */ + var $server_channels = array(); + + /** + * Channel Buffers + * + * If a client requests a packet from one channel but receives two packets from another those packets should + * be placed in a buffer + * + * @see self::_get_channel_packet() + * @see self::exec() + * @var array + * @access private + */ + var $channel_buffers = array(); + + /** + * Channel Status + * + * Contains the type of the last sent message + * + * @see self::_get_channel_packet() + * @var array + * @access private + */ + var $channel_status = array(); + + /** + * Packet Size + * + * Maximum packet size indexed by channel + * + * @see self::_send_channel_packet() + * @var array + * @access private + */ + var $packet_size_client_to_server = array(); + + /** + * Message Number Log + * + * @see self::getLog() + * @var array + * @access private + */ + var $message_number_log = array(); + + /** + * Message Log + * + * @see self::getLog() + * @var array + * @access private + */ + var $message_log = array(); + + /** + * The Window Size + * + * Bytes the other party can send before it must wait for the window to be adjusted (0x7FFFFFFF = 2GB) + * + * @var int + * @see self::_send_channel_packet() + * @see self::exec() + * @access private + */ + var $window_size = 0x7FFFFFFF; + + /** + * Window size, server to client + * + * Window size indexed by channel + * + * @see self::_send_channel_packet() + * @var array + * @access private + */ + var $window_size_server_to_client = array(); + + /** + * Window size, client to server + * + * Window size indexed by channel + * + * @see self::_get_channel_packet() + * @var array + * @access private + */ + var $window_size_client_to_server = array(); + + /** + * Server signature + * + * Verified against $this->session_id + * + * @see self::getServerPublicHostKey() + * @var string + * @access private + */ + var $signature = ''; + + /** + * Server signature format + * + * ssh-rsa or ssh-dss. + * + * @see self::getServerPublicHostKey() + * @var string + * @access private + */ + var $signature_format = ''; + + /** + * Interactive Buffer + * + * @see self::read() + * @var array + * @access private + */ + var $interactiveBuffer = ''; + + /** + * Current log size + * + * Should never exceed NET_SSH2_LOG_MAX_SIZE + * + * @see self::_send_binary_packet() + * @see self::_get_binary_packet() + * @var int + * @access private + */ + var $log_size; + + /** + * Timeout + * + * @see self::setTimeout() + * @access private + */ + var $timeout; + + /** + * Current Timeout + * + * @see self::_get_channel_packet() + * @access private + */ + var $curTimeout; + + /** + * Real-time log file pointer + * + * @see self::_append_log() + * @var resource + * @access private + */ + var $realtime_log_file; + + /** + * Real-time log file size + * + * @see self::_append_log() + * @var int + * @access private + */ + var $realtime_log_size; + + /** + * Has the signature been validated? + * + * @see self::getServerPublicHostKey() + * @var bool + * @access private + */ + var $signature_validated = false; + + /** + * Real-time log file wrap boolean + * + * @see self::_append_log() + * @access private + */ + var $realtime_log_wrap; + + /** + * Flag to suppress stderr from output + * + * @see self::enableQuietMode() + * @access private + */ + var $quiet_mode = false; + + /** + * Time of first network activity + * + * @var int + * @access private + */ + var $last_packet; + + /** + * Exit status returned from ssh if any + * + * @var int + * @access private + */ + var $exit_status; + + /** + * Flag to request a PTY when using exec() + * + * @var bool + * @see self::enablePTY() + * @access private + */ + var $request_pty = false; + + /** + * Flag set while exec() is running when using enablePTY() + * + * @var bool + * @access private + */ + var $in_request_pty_exec = false; + + /** + * Flag set after startSubsystem() is called + * + * @var bool + * @access private + */ + var $in_subsystem; + + /** + * Contents of stdError + * + * @var string + * @access private + */ + var $stdErrorLog; + + /** + * The Last Interactive Response + * + * @see self::_keyboard_interactive_process() + * @var string + * @access private + */ + var $last_interactive_response = ''; + + /** + * Keyboard Interactive Request / Responses + * + * @see self::_keyboard_interactive_process() + * @var array + * @access private + */ + var $keyboard_requests_responses = array(); + + /** + * Banner Message + * + * Quoting from the RFC, "in some jurisdictions, sending a warning message before + * authentication may be relevant for getting legal protection." + * + * @see self::_filter() + * @see self::getBannerMessage() + * @var string + * @access private + */ + var $banner_message = ''; + + /** + * Did read() timeout or return normally? + * + * @see self::isTimeout() + * @var bool + * @access private + */ + var $is_timeout = false; + + /** + * Log Boundary + * + * @see self::_format_log() + * @var string + * @access private + */ + var $log_boundary = ':'; + + /** + * Log Long Width + * + * @see self::_format_log() + * @var int + * @access private + */ + var $log_long_width = 65; + + /** + * Log Short Width + * + * @see self::_format_log() + * @var int + * @access private + */ + var $log_short_width = 16; + + /** + * Hostname + * + * @see self::Net_SSH2() + * @see self::_connect() + * @var string + * @access private + */ + var $host; + + /** + * Port Number + * + * @see self::Net_SSH2() + * @see self::_connect() + * @var int + * @access private + */ + var $port; + + /** + * Number of columns for terminal window size + * + * @see self::getWindowColumns() + * @see self::setWindowColumns() + * @see self::setWindowSize() + * @var int + * @access private + */ + var $windowColumns = 80; + + /** + * Number of columns for terminal window size + * + * @see self::getWindowRows() + * @see self::setWindowRows() + * @see self::setWindowSize() + * @var int + * @access private + */ + var $windowRows = 24; + + /** + * Crypto Engine + * + * @see self::setCryptoEngine() + * @see self::_key_exchange() + * @var int + * @access private + */ + var $crypto_engine = false; + + /** + * A System_SSH_Agent for use in the SSH2 Agent Forwarding scenario + * + * @var System_SSH_Agent + * @access private + */ + var $agent; + + /** + * Send the identification string first? + * + * @var bool + * @access private + */ + var $send_id_string_first = true; + + /** + * Send the key exchange initiation packet first? + * + * @var bool + * @access private + */ + var $send_kex_first = true; + + /** + * Some versions of OpenSSH incorrectly calculate the key size + * + * @var bool + * @access private + */ + var $bad_key_size_fix = false; + + /** + * The selected decryption algorithm + * + * @var string + * @access private + */ + var $decrypt_algorithm = ''; + + /** + * Should we try to re-connect to re-establish keys? + * + * @var bool + * @access private + */ + var $retry_connect = false; + + /** + * Binary Packet Buffer + * + * @var string|false + * @access private + */ + var $binary_packet_buffer = false; + + /** + * Preferred Signature Format + * + * @var string|false + * @access private + */ + var $preferred_signature_format = false; + + /** + * Authentication Credentials + * + * @var array + * @access private + */ + var $auth = array(); + + /** + * Default Constructor. + * + * $host can either be a string, representing the host, or a stream resource. + * + * @param mixed $host + * @param int $port + * @param int $timeout + * @see self::login() + * @return Net_SSH2 + * @access public + */ + function __construct($host, $port = 22, $timeout = 10) + { + // Include Math_BigInteger + // Used to do Diffie-Hellman key exchange and DSA/RSA signature verification. + if (!class_exists('Math_BigInteger')) { + include_once 'Math/BigInteger.php'; + } + + if (!function_exists('crypt_random_string')) { + include_once 'Crypt/Random.php'; + } + + if (!class_exists('Crypt_Hash')) { + include_once 'Crypt/Hash.php'; + } + + // include Crypt_Base so constants can be defined for setCryptoEngine() + if (!class_exists('Crypt_Base')) { + include_once 'Crypt/Base.php'; + } + + $this->message_numbers = array( + 1 => 'NET_SSH2_MSG_DISCONNECT', + 2 => 'NET_SSH2_MSG_IGNORE', + 3 => 'NET_SSH2_MSG_UNIMPLEMENTED', + 4 => 'NET_SSH2_MSG_DEBUG', + 5 => 'NET_SSH2_MSG_SERVICE_REQUEST', + 6 => 'NET_SSH2_MSG_SERVICE_ACCEPT', + 20 => 'NET_SSH2_MSG_KEXINIT', + 21 => 'NET_SSH2_MSG_NEWKEYS', + 30 => 'NET_SSH2_MSG_KEXDH_INIT', + 31 => 'NET_SSH2_MSG_KEXDH_REPLY', + 50 => 'NET_SSH2_MSG_USERAUTH_REQUEST', + 51 => 'NET_SSH2_MSG_USERAUTH_FAILURE', + 52 => 'NET_SSH2_MSG_USERAUTH_SUCCESS', + 53 => 'NET_SSH2_MSG_USERAUTH_BANNER', + + 80 => 'NET_SSH2_MSG_GLOBAL_REQUEST', + 81 => 'NET_SSH2_MSG_REQUEST_SUCCESS', + 82 => 'NET_SSH2_MSG_REQUEST_FAILURE', + 90 => 'NET_SSH2_MSG_CHANNEL_OPEN', + 91 => 'NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION', + 92 => 'NET_SSH2_MSG_CHANNEL_OPEN_FAILURE', + 93 => 'NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST', + 94 => 'NET_SSH2_MSG_CHANNEL_DATA', + 95 => 'NET_SSH2_MSG_CHANNEL_EXTENDED_DATA', + 96 => 'NET_SSH2_MSG_CHANNEL_EOF', + 97 => 'NET_SSH2_MSG_CHANNEL_CLOSE', + 98 => 'NET_SSH2_MSG_CHANNEL_REQUEST', + 99 => 'NET_SSH2_MSG_CHANNEL_SUCCESS', + 100 => 'NET_SSH2_MSG_CHANNEL_FAILURE' + ); + $this->disconnect_reasons = array( + 1 => 'NET_SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT', + 2 => 'NET_SSH2_DISCONNECT_PROTOCOL_ERROR', + 3 => 'NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED', + 4 => 'NET_SSH2_DISCONNECT_RESERVED', + 5 => 'NET_SSH2_DISCONNECT_MAC_ERROR', + 6 => 'NET_SSH2_DISCONNECT_COMPRESSION_ERROR', + 7 => 'NET_SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE', + 8 => 'NET_SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED', + 9 => 'NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE', + 10 => 'NET_SSH2_DISCONNECT_CONNECTION_LOST', + 11 => 'NET_SSH2_DISCONNECT_BY_APPLICATION', + 12 => 'NET_SSH2_DISCONNECT_TOO_MANY_CONNECTIONS', + 13 => 'NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER', + 14 => 'NET_SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE', + 15 => 'NET_SSH2_DISCONNECT_ILLEGAL_USER_NAME' + ); + $this->channel_open_failure_reasons = array( + 1 => 'NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED' + ); + $this->terminal_modes = array( + 0 => 'NET_SSH2_TTY_OP_END' + ); + $this->channel_extended_data_type_codes = array( + 1 => 'NET_SSH2_EXTENDED_DATA_STDERR' + ); + + $this->_define_array( + $this->message_numbers, + $this->disconnect_reasons, + $this->channel_open_failure_reasons, + $this->terminal_modes, + $this->channel_extended_data_type_codes, + array(60 => 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'), + array(60 => 'NET_SSH2_MSG_USERAUTH_PK_OK'), + array(60 => 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST', + 61 => 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE'), + // RFC 4419 - diffie-hellman-group-exchange-sha{1,256} + array(30 => 'NET_SSH2_MSG_KEXDH_GEX_REQUEST_OLD', + 31 => 'NET_SSH2_MSG_KEXDH_GEX_GROUP', + 32 => 'NET_SSH2_MSG_KEXDH_GEX_INIT', + 33 => 'NET_SSH2_MSG_KEXDH_GEX_REPLY', + 34 => 'NET_SSH2_MSG_KEXDH_GEX_REQUEST') + ); + + if (is_resource($host)) { + $this->fsock = $host; + return; + } + + if (is_string($host)) { + $this->host = $host; + $this->port = $port; + $this->timeout = $timeout; + } + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param mixed $host + * @param int $port + * @param int $timeout + * @access public + */ + function Net_SSH2($host, $port = 22, $timeout = 10) + { + $this->__construct($host, $port, $timeout); + } + + /** + * Set Crypto Engine Mode + * + * Possible $engine values: + * CRYPT_MODE_INTERNAL, CRYPT_MODE_MCRYPT + * + * @param int $engine + * @access public + */ + function setCryptoEngine($engine) + { + $this->crypto_engine = $engine; + } + + /** + * Send Identification String First + * + * https://tools.ietf.org/html/rfc4253#section-4.2 says "when the connection has been established, + * both sides MUST send an identification string". It does not say which side sends it first. In + * theory it shouldn't matter but it is a fact of life that some SSH servers are simply buggy + * + * @access public + */ + function sendIdentificationStringFirst() + { + $this->send_id_string_first = true; + } + + /** + * Send Identification String Last + * + * https://tools.ietf.org/html/rfc4253#section-4.2 says "when the connection has been established, + * both sides MUST send an identification string". It does not say which side sends it first. In + * theory it shouldn't matter but it is a fact of life that some SSH servers are simply buggy + * + * @access public + */ + function sendIdentificationStringLast() + { + $this->send_id_string_first = false; + } + + /** + * Send SSH_MSG_KEXINIT First + * + * https://tools.ietf.org/html/rfc4253#section-7.1 says "key exchange begins by each sending + * sending the [SSH_MSG_KEXINIT] packet". It does not say which side sends it first. In theory + * it shouldn't matter but it is a fact of life that some SSH servers are simply buggy + * + * @access public + */ + function sendKEXINITFirst() + { + $this->send_kex_first = true; + } + + /** + * Send SSH_MSG_KEXINIT Last + * + * https://tools.ietf.org/html/rfc4253#section-7.1 says "key exchange begins by each sending + * sending the [SSH_MSG_KEXINIT] packet". It does not say which side sends it first. In theory + * it shouldn't matter but it is a fact of life that some SSH servers are simply buggy + * + * @access public + */ + function sendKEXINITLast() + { + $this->send_kex_first = false; + } + + /** + * Connect to an SSHv2 server + * + * @return bool + * @access private + */ + function _connect() + { + if ($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR) { + return false; + } + + $this->bitmap |= NET_SSH2_MASK_CONSTRUCTOR; + + $this->curTimeout = $this->timeout; + + $this->last_packet = strtok(microtime(), ' ') + strtok(''); // == microtime(true) in PHP5 + + if (!is_resource($this->fsock)) { + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + // with stream_select a timeout of 0 means that no timeout takes place; + // with fsockopen a timeout of 0 means that you instantly timeout + // to resolve this incompatibility a timeout of 100,000 will be used for fsockopen if timeout is 0 + $this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->curTimeout == 0 ? 100000 : $this->curTimeout); + if (!$this->fsock) { + $host = $this->host . ':' . $this->port; + user_error(rtrim("Cannot connect to $host. Error $errno. $errstr")); + return false; + } + $elapsed = strtok(microtime(), ' ') + strtok('') - $start; + + if ($this->curTimeout) { + $this->curTimeout-= $elapsed; + if ($this->curTimeout < 0) { + $this->is_timeout = true; + return false; + } + } + } + + $this->identifier = $this->_generate_identifier(); + + if ($this->send_id_string_first) { + fputs($this->fsock, $this->identifier . "\r\n"); + } + + /* According to the SSH2 specs, + + "The server MAY send other lines of data before sending the version + string. Each line SHOULD be terminated by a Carriage Return and Line + Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded + in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients + MUST be able to process such lines." */ + $temp = ''; + $extra = ''; + while (!feof($this->fsock) && !preg_match('#^SSH-(\d\.\d+)#', $temp, $matches)) { + if (substr($temp, -2) == "\r\n") { + $extra.= $temp; + $temp = ''; + } + + if ($this->curTimeout) { + if ($this->curTimeout < 0) { + $this->is_timeout = true; + return false; + } + $read = array($this->fsock); + $write = $except = null; + $start = strtok(microtime(), ' ') + strtok(''); + $sec = floor($this->curTimeout); + $usec = 1000000 * ($this->curTimeout - $sec); + // on windows this returns a "Warning: Invalid CRT parameters detected" error + // the !count() is done as a workaround for + if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) { + $this->is_timeout = true; + return false; + } + $elapsed = strtok(microtime(), ' ') + strtok('') - $start; + $this->curTimeout-= $elapsed; + } + + $temp.= fgets($this->fsock, 255); + } + + if (feof($this->fsock)) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + + if (defined('NET_SSH2_LOGGING')) { + $this->_append_log('<-', $extra . $temp); + $this->_append_log('->', $this->identifier . "\r\n"); + } + + $this->server_identifier = trim($temp, "\r\n"); + if (strlen($extra)) { + $this->errors[] = $extra; + } + + if (version_compare($matches[1], '1.99', '<')) { + user_error("Cannot connect to SSH $matches[1] servers"); + return false; + } + + if (!$this->send_id_string_first) { + fputs($this->fsock, $this->identifier . "\r\n"); + } + + if (!$this->send_kex_first) { + $response = $this->_get_binary_packet(); + if ($response === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + + if (!strlen($response) || ord($response[0]) != NET_SSH2_MSG_KEXINIT) { + user_error('Expected SSH_MSG_KEXINIT'); + return false; + } + + if (!$this->_key_exchange($response)) { + return false; + } + } + + if ($this->send_kex_first && !$this->_key_exchange()) { + return false; + } + + $this->bitmap|= NET_SSH2_MASK_CONNECTED; + + return true; + } + + /** + * Generates the SSH identifier + * + * You should overwrite this method in your own class if you want to use another identifier + * + * @access protected + * @return string + */ + function _generate_identifier() + { + $identifier = 'SSH-2.0-phpseclib_1.0'; + + $ext = array(); + if (extension_loaded('openssl')) { + $ext[] = 'openssl'; + } elseif (extension_loaded('mcrypt')) { + $ext[] = 'mcrypt'; + } + + if (extension_loaded('gmp')) { + $ext[] = 'gmp'; + } elseif (extension_loaded('bcmath')) { + $ext[] = 'bcmath'; + } + + if (!empty($ext)) { + $identifier .= ' (' . implode(', ', $ext) . ')'; + } + + return $identifier; + } + + /** + * Key Exchange + * + * @param string $kexinit_payload_server optional + * @access private + */ + function _key_exchange($kexinit_payload_server = false) + { + static $kex_algorithms = array( + 'diffie-hellman-group1-sha1', // REQUIRED + 'diffie-hellman-group14-sha1', // REQUIRED + 'diffie-hellman-group-exchange-sha1', // RFC 4419 + 'diffie-hellman-group-exchange-sha256', // RFC 4419 + ); + + static $server_host_key_algorithms = array( + 'rsa-sha2-256', // RFC 8332 + 'rsa-sha2-512', // RFC 8332 + 'ssh-rsa', // RECOMMENDED sign Raw RSA Key + 'ssh-dss' // REQUIRED sign Raw DSS Key + ); + + static $encryption_algorithms = false; + if ($encryption_algorithms === false) { + $encryption_algorithms = array( + // from : + 'arcfour256', + 'arcfour128', + + //'arcfour', // OPTIONAL the ARCFOUR stream cipher with a 128-bit key + + // CTR modes from : + 'aes128-ctr', // RECOMMENDED AES (Rijndael) in SDCTR mode, with 128-bit key + 'aes192-ctr', // RECOMMENDED AES with 192-bit key + 'aes256-ctr', // RECOMMENDED AES with 256-bit key + + 'twofish128-ctr', // OPTIONAL Twofish in SDCTR mode, with 128-bit key + 'twofish192-ctr', // OPTIONAL Twofish with 192-bit key + 'twofish256-ctr', // OPTIONAL Twofish with 256-bit key + + 'aes128-cbc', // RECOMMENDED AES with a 128-bit key + 'aes192-cbc', // OPTIONAL AES with a 192-bit key + 'aes256-cbc', // OPTIONAL AES in CBC mode, with a 256-bit key + + 'twofish128-cbc', // OPTIONAL Twofish with a 128-bit key + 'twofish192-cbc', // OPTIONAL Twofish with a 192-bit key + 'twofish256-cbc', + 'twofish-cbc', // OPTIONAL alias for "twofish256-cbc" + // (this is being retained for historical reasons) + + 'blowfish-ctr', // OPTIONAL Blowfish in SDCTR mode + + 'blowfish-cbc', // OPTIONAL Blowfish in CBC mode + + '3des-ctr', // RECOMMENDED Three-key 3DES in SDCTR mode + + '3des-cbc', // REQUIRED three-key 3DES in CBC mode + //'none' // OPTIONAL no encryption; NOT RECOMMENDED + ); + + if (extension_loaded('openssl') && !extension_loaded('mcrypt')) { + // OpenSSL does not support arcfour256 in any capacity and arcfour128 / arcfour support is limited to + // instances that do not use continuous buffers + $encryption_algorithms = array_diff( + $encryption_algorithms, + array('arcfour256', 'arcfour128', 'arcfour') + ); + } + + if (phpseclib_resolve_include_path('Crypt/RC4.php') === false) { + $encryption_algorithms = array_diff( + $encryption_algorithms, + array('arcfour256', 'arcfour128', 'arcfour') + ); + } + if (phpseclib_resolve_include_path('Crypt/Rijndael.php') === false) { + $encryption_algorithms = array_diff( + $encryption_algorithms, + array('aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-cbc', 'aes192-cbc', 'aes256-cbc') + ); + } + if (phpseclib_resolve_include_path('Crypt/Twofish.php') === false) { + $encryption_algorithms = array_diff( + $encryption_algorithms, + array('twofish128-ctr', 'twofish192-ctr', 'twofish256-ctr', 'twofish128-cbc', 'twofish192-cbc', 'twofish256-cbc', 'twofish-cbc') + ); + } + if (phpseclib_resolve_include_path('Crypt/Blowfish.php') === false) { + $encryption_algorithms = array_diff( + $encryption_algorithms, + array('blowfish-ctr', 'blowfish-cbc') + ); + } + if (phpseclib_resolve_include_path('Crypt/TripleDES.php') === false) { + $encryption_algorithms = array_diff( + $encryption_algorithms, + array('3des-ctr', '3des-cbc') + ); + } + $encryption_algorithms = array_values($encryption_algorithms); + } + + $mac_algorithms = array( + // from : + 'hmac-sha2-256',// RECOMMENDED HMAC-SHA256 (digest length = key length = 32) + + 'hmac-sha1-96', // RECOMMENDED first 96 bits of HMAC-SHA1 (digest length = 12, key length = 20) + 'hmac-sha1', // REQUIRED HMAC-SHA1 (digest length = key length = 20) + 'hmac-md5-96', // OPTIONAL first 96 bits of HMAC-MD5 (digest length = 12, key length = 16) + 'hmac-md5', // OPTIONAL HMAC-MD5 (digest length = key length = 16) + //'none' // OPTIONAL no MAC; NOT RECOMMENDED + ); + + static $compression_algorithms = array( + 'none' // REQUIRED no compression + //'zlib' // OPTIONAL ZLIB (LZ77) compression + ); + + // some SSH servers have buggy implementations of some of the above algorithms + switch (true) { + case $this->server_identifier == 'SSH-2.0-SSHD': + case substr($this->server_identifier, 0, 13) == 'SSH-2.0-DLINK': + $mac_algorithms = array_values(array_diff( + $mac_algorithms, + array('hmac-sha1-96', 'hmac-md5-96') + )); + } + + static $str_kex_algorithms, $str_server_host_key_algorithms, + $encryption_algorithms_server_to_client, $mac_algorithms_server_to_client, $compression_algorithms_server_to_client, + $encryption_algorithms_client_to_server, $mac_algorithms_client_to_server, $compression_algorithms_client_to_server; + + if (empty($str_kex_algorithms)) { + $str_kex_algorithms = implode(',', $kex_algorithms); + $str_server_host_key_algorithms = implode(',', $server_host_key_algorithms); + $encryption_algorithms_server_to_client = $encryption_algorithms_client_to_server = implode(',', $encryption_algorithms); + $mac_algorithms_server_to_client = $mac_algorithms_client_to_server = implode(',', $mac_algorithms); + $compression_algorithms_server_to_client = $compression_algorithms_client_to_server = implode(',', $compression_algorithms); + } + + $client_cookie = crypt_random_string(16); + + $kexinit_payload_client = pack( + 'Ca*Na*Na*Na*Na*Na*Na*Na*Na*Na*Na*CN', + NET_SSH2_MSG_KEXINIT, + $client_cookie, + strlen($str_kex_algorithms), + $str_kex_algorithms, + strlen($str_server_host_key_algorithms), + $str_server_host_key_algorithms, + strlen($encryption_algorithms_client_to_server), + $encryption_algorithms_client_to_server, + strlen($encryption_algorithms_server_to_client), + $encryption_algorithms_server_to_client, + strlen($mac_algorithms_client_to_server), + $mac_algorithms_client_to_server, + strlen($mac_algorithms_server_to_client), + $mac_algorithms_server_to_client, + strlen($compression_algorithms_client_to_server), + $compression_algorithms_client_to_server, + strlen($compression_algorithms_server_to_client), + $compression_algorithms_server_to_client, + 0, + '', + 0, + '', + 0, + 0 + ); + + if ($this->send_kex_first) { + if (!$this->_send_binary_packet($kexinit_payload_client)) { + return false; + } + + $kexinit_payload_server = $this->_get_binary_packet(); + if ($kexinit_payload_server === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + + if (!strlen($kexinit_payload_server) || ord($kexinit_payload_server[0]) != NET_SSH2_MSG_KEXINIT) { + user_error('Expected SSH_MSG_KEXINIT'); + return false; + } + } + + $response = $kexinit_payload_server; + $this->_string_shift($response, 1); // skip past the message number (it should be SSH_MSG_KEXINIT) + $server_cookie = $this->_string_shift($response, 16); + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->kex_algorithms = explode(',', $this->_string_shift($response, $temp['length'])); + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->server_host_key_algorithms = explode(',', $this->_string_shift($response, $temp['length'])); + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->encryption_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->encryption_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->mac_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->mac_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->compression_algorithms_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->compression_algorithms_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->languages_client_to_server = explode(',', $this->_string_shift($response, $temp['length'])); + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->languages_server_to_client = explode(',', $this->_string_shift($response, $temp['length'])); + + if (!strlen($response)) { + return false; + } + extract(unpack('Cfirst_kex_packet_follows', $this->_string_shift($response, 1))); + $first_kex_packet_follows = $first_kex_packet_follows != 0; + + if (!$this->send_kex_first && !$this->_send_binary_packet($kexinit_payload_client)) { + return false; + } + + // we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange + // we don't initialize any crypto-objects, yet - we do that, later. for now, we need the lengths to make the + // diffie-hellman key exchange as fast as possible + $decrypt = $this->_array_intersect_first($encryption_algorithms, $this->encryption_algorithms_server_to_client); + $decryptKeyLength = $this->_encryption_algorithm_to_key_size($decrypt); + if ($decryptKeyLength === null) { + user_error('No compatible server to client encryption algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $encrypt = $this->_array_intersect_first($encryption_algorithms, $this->encryption_algorithms_client_to_server); + $encryptKeyLength = $this->_encryption_algorithm_to_key_size($encrypt); + if ($encryptKeyLength === null) { + user_error('No compatible client to server encryption algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $keyLength = $decryptKeyLength > $encryptKeyLength ? $decryptKeyLength : $encryptKeyLength; + + // through diffie-hellman key exchange a symmetric key is obtained + $kex_algorithm = $this->_array_intersect_first($kex_algorithms, $this->kex_algorithms); + if ($kex_algorithm === false) { + user_error('No compatible key exchange algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + if (strpos($kex_algorithm, 'diffie-hellman-group-exchange') === 0) { + $dh_group_sizes_packed = pack( + 'NNN', + $this->kex_dh_group_size_min, + $this->kex_dh_group_size_preferred, + $this->kex_dh_group_size_max + ); + $packet = pack( + 'Ca*', + NET_SSH2_MSG_KEXDH_GEX_REQUEST, + $dh_group_sizes_packed + ); + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + if (!strlen($response)) { + return false; + } + extract(unpack('Ctype', $this->_string_shift($response, 1))); + if ($type != NET_SSH2_MSG_KEXDH_GEX_GROUP) { + user_error('Expected SSH_MSG_KEX_DH_GEX_GROUP'); + return false; + } + + if (strlen($response) < 4) { + return false; + } + extract(unpack('NprimeLength', $this->_string_shift($response, 4))); + $primeBytes = $this->_string_shift($response, $primeLength); + $prime = new Math_BigInteger($primeBytes, -256); + + if (strlen($response) < 4) { + return false; + } + extract(unpack('NgLength', $this->_string_shift($response, 4))); + $gBytes = $this->_string_shift($response, $gLength); + $g = new Math_BigInteger($gBytes, -256); + + $exchange_hash_rfc4419 = pack( + 'a*Na*Na*', + $dh_group_sizes_packed, + $primeLength, + $primeBytes, + $gLength, + $gBytes + ); + + $clientKexInitMessage = NET_SSH2_MSG_KEXDH_GEX_INIT; + $serverKexReplyMessage = NET_SSH2_MSG_KEXDH_GEX_REPLY; + } else { + switch ($kex_algorithm) { + // see http://tools.ietf.org/html/rfc2409#section-6.2 and + // http://tools.ietf.org/html/rfc2412, appendex E + case 'diffie-hellman-group1-sha1': + $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . + '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . + '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . + 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF'; + break; + // see http://tools.ietf.org/html/rfc3526#section-3 + case 'diffie-hellman-group14-sha1': + $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . + '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . + '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . + 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . + '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . + '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . + 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . + '3995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF'; + break; + } + // For both diffie-hellman-group1-sha1 and diffie-hellman-group14-sha1 + // the generator field element is 2 (decimal) and the hash function is sha1. + $g = new Math_BigInteger(2); + $prime = new Math_BigInteger($prime, 16); + $exchange_hash_rfc4419 = ''; + $clientKexInitMessage = NET_SSH2_MSG_KEXDH_INIT; + $serverKexReplyMessage = NET_SSH2_MSG_KEXDH_REPLY; + } + + switch ($kex_algorithm) { + case 'diffie-hellman-group-exchange-sha256': + $kexHash = new Crypt_Hash('sha256'); + break; + default: + $kexHash = new Crypt_Hash('sha1'); + } + + /* To increase the speed of the key exchange, both client and server may + reduce the size of their private exponents. It should be at least + twice as long as the key material that is generated from the shared + secret. For more details, see the paper by van Oorschot and Wiener + [VAN-OORSCHOT]. + + -- http://tools.ietf.org/html/rfc4419#section-6.2 */ + $one = new Math_BigInteger(1); + $keyLength = min($keyLength, $kexHash->getLength()); + $max = $one->bitwise_leftShift(16 * $keyLength); // 2 * 8 * $keyLength + $max = $max->subtract($one); + + $x = $one->random($one, $max); + $e = $g->modPow($x, $prime); + + $eBytes = $e->toBytes(true); + $data = pack('CNa*', $clientKexInitMessage, strlen($eBytes), $eBytes); + + if (!$this->_send_binary_packet($data)) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + if (!strlen($response)) { + return false; + } + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + if ($type != $serverKexReplyMessage) { + user_error('Expected SSH_MSG_KEXDH_REPLY'); + return false; + } + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->server_public_host_key = $server_public_host_key = $this->_string_shift($response, $temp['length']); + + if (strlen($server_public_host_key) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $public_key_format = $this->_string_shift($server_public_host_key, $temp['length']); + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $fBytes = $this->_string_shift($response, $temp['length']); + $f = new Math_BigInteger($fBytes, -256); + + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($response, 4)); + $this->signature = $this->_string_shift($response, $temp['length']); + + if (strlen($this->signature) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($this->signature, 4)); + $this->signature_format = $this->_string_shift($this->signature, $temp['length']); + + $key = $f->modPow($x, $prime); + $keyBytes = $key->toBytes(true); + + $this->exchange_hash = pack( + 'Na*Na*Na*Na*Na*a*Na*Na*Na*', + strlen($this->identifier), + $this->identifier, + strlen($this->server_identifier), + $this->server_identifier, + strlen($kexinit_payload_client), + $kexinit_payload_client, + strlen($kexinit_payload_server), + $kexinit_payload_server, + strlen($this->server_public_host_key), + $this->server_public_host_key, + $exchange_hash_rfc4419, + strlen($eBytes), + $eBytes, + strlen($fBytes), + $fBytes, + strlen($keyBytes), + $keyBytes + ); + + $this->exchange_hash = $kexHash->hash($this->exchange_hash); + + if ($this->session_id === false) { + $this->session_id = $this->exchange_hash; + } + + $server_host_key_algorithm = $this->_array_intersect_first($server_host_key_algorithms, $this->server_host_key_algorithms); + if ($server_host_key_algorithm === false) { + user_error('No compatible server host key algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + switch ($server_host_key_algorithm) { + case 'ssh-dss': + $expected_key_format = 'ssh-dss'; + break; + //case 'rsa-sha2-256': + //case 'rsa-sha2-512': + //case 'ssh-rsa': + default: + $expected_key_format = 'ssh-rsa'; + } + + if ($public_key_format != $expected_key_format || $this->signature_format != $server_host_key_algorithm) { + switch (true) { + case $this->signature_format == $server_host_key_algorithm: + case $server_host_key_algorithm != 'rsa-sha2-256' && $server_host_key_algorithm != 'rsa-sha2-512': + case $this->signature_format != 'ssh-rsa': + user_error('Server Host Key Algorithm Mismatch'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + } + + $packet = pack( + 'C', + NET_SSH2_MSG_NEWKEYS + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + + if ($response === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + + if (!strlen($response)) { + return false; + } + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + if ($type != NET_SSH2_MSG_NEWKEYS) { + user_error('Expected SSH_MSG_NEWKEYS'); + return false; + } + + switch ($encrypt) { + case '3des-cbc': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $this->encrypt = new Crypt_TripleDES(); + // $this->encrypt_block_size = 64 / 8 == the default + break; + case '3des-ctr': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $this->encrypt = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); + // $this->encrypt_block_size = 64 / 8 == the default + break; + case 'aes256-cbc': + case 'aes192-cbc': + case 'aes128-cbc': + if (!class_exists('Crypt_Rijndael')) { + include_once 'Crypt/Rijndael.php'; + } + $this->encrypt = new Crypt_Rijndael(); + $this->encrypt_block_size = 16; // eg. 128 / 8 + break; + case 'aes256-ctr': + case 'aes192-ctr': + case 'aes128-ctr': + if (!class_exists('Crypt_Rijndael')) { + include_once 'Crypt/Rijndael.php'; + } + $this->encrypt = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CTR); + $this->encrypt_block_size = 16; // eg. 128 / 8 + break; + case 'blowfish-cbc': + if (!class_exists('Crypt_Blowfish')) { + include_once 'Crypt/Blowfish.php'; + } + $this->encrypt = new Crypt_Blowfish(); + $this->encrypt_block_size = 8; + break; + case 'blowfish-ctr': + if (!class_exists('Crypt_Blowfish')) { + include_once 'Crypt/Blowfish.php'; + } + $this->encrypt = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); + $this->encrypt_block_size = 8; + break; + case 'twofish128-cbc': + case 'twofish192-cbc': + case 'twofish256-cbc': + case 'twofish-cbc': + if (!class_exists('Crypt_Twofish')) { + include_once 'Crypt/Twofish.php'; + } + $this->encrypt = new Crypt_Twofish(); + $this->encrypt_block_size = 16; + break; + case 'twofish128-ctr': + case 'twofish192-ctr': + case 'twofish256-ctr': + if (!class_exists('Crypt_Twofish')) { + include_once 'Crypt/Twofish.php'; + } + $this->encrypt = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); + $this->encrypt_block_size = 16; + break; + case 'arcfour': + case 'arcfour128': + case 'arcfour256': + if (!class_exists('Crypt_RC4')) { + include_once 'Crypt/RC4.php'; + } + $this->encrypt = new Crypt_RC4(); + break; + case 'none': + //$this->encrypt = new Crypt_Null(); + } + + switch ($decrypt) { + case '3des-cbc': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $this->decrypt = new Crypt_TripleDES(); + break; + case '3des-ctr': + if (!class_exists('Crypt_TripleDES')) { + include_once 'Crypt/TripleDES.php'; + } + $this->decrypt = new Crypt_TripleDES(CRYPT_DES_MODE_CTR); + break; + case 'aes256-cbc': + case 'aes192-cbc': + case 'aes128-cbc': + if (!class_exists('Crypt_Rijndael')) { + include_once 'Crypt/Rijndael.php'; + } + $this->decrypt = new Crypt_Rijndael(); + $this->decrypt_block_size = 16; + break; + case 'aes256-ctr': + case 'aes192-ctr': + case 'aes128-ctr': + if (!class_exists('Crypt_Rijndael')) { + include_once 'Crypt/Rijndael.php'; + } + $this->decrypt = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CTR); + $this->decrypt_block_size = 16; + break; + case 'blowfish-cbc': + if (!class_exists('Crypt_Blowfish')) { + include_once 'Crypt/Blowfish.php'; + } + $this->decrypt = new Crypt_Blowfish(); + $this->decrypt_block_size = 8; + break; + case 'blowfish-ctr': + if (!class_exists('Crypt_Blowfish')) { + include_once 'Crypt/Blowfish.php'; + } + $this->decrypt = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR); + $this->decrypt_block_size = 8; + break; + case 'twofish128-cbc': + case 'twofish192-cbc': + case 'twofish256-cbc': + case 'twofish-cbc': + if (!class_exists('Crypt_Twofish')) { + include_once 'Crypt/Twofish.php'; + } + $this->decrypt = new Crypt_Twofish(); + $this->decrypt_block_size = 16; + break; + case 'twofish128-ctr': + case 'twofish192-ctr': + case 'twofish256-ctr': + if (!class_exists('Crypt_Twofish')) { + include_once 'Crypt/Twofish.php'; + } + $this->decrypt = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR); + $this->decrypt_block_size = 16; + break; + case 'arcfour': + case 'arcfour128': + case 'arcfour256': + if (!class_exists('Crypt_RC4')) { + include_once 'Crypt/RC4.php'; + } + $this->decrypt = new Crypt_RC4(); + break; + case 'none': + //$this->decrypt = new Crypt_Null(); + } + + $this->decrypt_algorithm = $decrypt; + + $keyBytes = pack('Na*', strlen($keyBytes), $keyBytes); + + if ($this->encrypt) { + if ($this->crypto_engine) { + $this->encrypt->setPreferredEngine($this->crypto_engine); + } + $this->encrypt->enableContinuousBuffer(); + $this->encrypt->disablePadding(); + + $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'A' . $this->session_id); + while ($this->encrypt_block_size > strlen($iv)) { + $iv.= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); + } + $this->encrypt->setIV(substr($iv, 0, $this->encrypt_block_size)); + + $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'C' . $this->session_id); + while ($encryptKeyLength > strlen($key)) { + $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); + } + $this->encrypt->setKey(substr($key, 0, $encryptKeyLength)); + } + + if ($this->decrypt) { + if ($this->crypto_engine) { + $this->decrypt->setPreferredEngine($this->crypto_engine); + } + $this->decrypt->enableContinuousBuffer(); + $this->decrypt->disablePadding(); + + $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'B' . $this->session_id); + while ($this->decrypt_block_size > strlen($iv)) { + $iv.= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); + } + $this->decrypt->setIV(substr($iv, 0, $this->decrypt_block_size)); + + $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'D' . $this->session_id); + while ($decryptKeyLength > strlen($key)) { + $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); + } + $this->decrypt->setKey(substr($key, 0, $decryptKeyLength)); + } + + /* The "arcfour128" algorithm is the RC4 cipher, as described in + [SCHNEIER], using a 128-bit key. The first 1536 bytes of keystream + generated by the cipher MUST be discarded, and the first byte of the + first encrypted packet MUST be encrypted using the 1537th byte of + keystream. + + -- http://tools.ietf.org/html/rfc4345#section-4 */ + if ($encrypt == 'arcfour128' || $encrypt == 'arcfour256') { + $this->encrypt->encrypt(str_repeat("\0", 1536)); + } + if ($decrypt == 'arcfour128' || $decrypt == 'arcfour256') { + $this->decrypt->decrypt(str_repeat("\0", 1536)); + } + + $mac_algorithm = $this->_array_intersect_first($mac_algorithms, $this->mac_algorithms_client_to_server); + if ($mac_algorithm === false) { + user_error('No compatible client to server message authentication algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $createKeyLength = 0; // ie. $mac_algorithm == 'none' + switch ($mac_algorithm) { + case 'hmac-sha2-256': + $this->hmac_create = new Crypt_Hash('sha256'); + $createKeyLength = 32; + break; + case 'hmac-sha1': + $this->hmac_create = new Crypt_Hash('sha1'); + $createKeyLength = 20; + break; + case 'hmac-sha1-96': + $this->hmac_create = new Crypt_Hash('sha1-96'); + $createKeyLength = 20; + break; + case 'hmac-md5': + $this->hmac_create = new Crypt_Hash('md5'); + $createKeyLength = 16; + break; + case 'hmac-md5-96': + $this->hmac_create = new Crypt_Hash('md5-96'); + $createKeyLength = 16; + } + + $mac_algorithm = $this->_array_intersect_first($mac_algorithms, $this->mac_algorithms_server_to_client); + if ($mac_algorithm === false) { + user_error('No compatible server to client message authentication algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $checkKeyLength = 0; + $this->hmac_size = 0; + switch ($mac_algorithm) { + case 'hmac-sha2-256': + $this->hmac_check = new Crypt_Hash('sha256'); + $checkKeyLength = 32; + $this->hmac_size = 32; + break; + case 'hmac-sha1': + $this->hmac_check = new Crypt_Hash('sha1'); + $checkKeyLength = 20; + $this->hmac_size = 20; + break; + case 'hmac-sha1-96': + $this->hmac_check = new Crypt_Hash('sha1-96'); + $checkKeyLength = 20; + $this->hmac_size = 12; + break; + case 'hmac-md5': + $this->hmac_check = new Crypt_Hash('md5'); + $checkKeyLength = 16; + $this->hmac_size = 16; + break; + case 'hmac-md5-96': + $this->hmac_check = new Crypt_Hash('md5-96'); + $checkKeyLength = 16; + $this->hmac_size = 12; + } + + $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'E' . $this->session_id); + while ($createKeyLength > strlen($key)) { + $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); + } + $this->hmac_create->setKey(substr($key, 0, $createKeyLength)); + + $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'F' . $this->session_id); + while ($checkKeyLength > strlen($key)) { + $key.= $kexHash->hash($keyBytes . $this->exchange_hash . $key); + } + $this->hmac_check->setKey(substr($key, 0, $checkKeyLength)); + + $compression_algorithm = $this->_array_intersect_first($compression_algorithms, $this->compression_algorithms_server_to_client); + if ($compression_algorithm === false) { + user_error('No compatible server to client compression algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + $this->decompress = $compression_algorithm == 'zlib'; + + $compression_algorithm = $this->_array_intersect_first($compression_algorithms, $this->compression_algorithms_client_to_server); + if ($compression_algorithm === false) { + user_error('No compatible client to server compression algorithms found'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + $this->compress = $compression_algorithm == 'zlib'; + + return true; + } + + /** + * Maps an encryption algorithm name to the number of key bytes. + * + * @param string $algorithm Name of the encryption algorithm + * @return int|null Number of bytes as an integer or null for unknown + * @access private + */ + function _encryption_algorithm_to_key_size($algorithm) + { + if ($this->bad_key_size_fix && $this->_bad_algorithm_candidate($algorithm)) { + return 16; + } + + switch ($algorithm) { + case 'none': + return 0; + case 'aes128-cbc': + case 'aes128-ctr': + case 'arcfour': + case 'arcfour128': + case 'blowfish-cbc': + case 'blowfish-ctr': + case 'twofish128-cbc': + case 'twofish128-ctr': + return 16; + case '3des-cbc': + case '3des-ctr': + case 'aes192-cbc': + case 'aes192-ctr': + case 'twofish192-cbc': + case 'twofish192-ctr': + return 24; + case 'aes256-cbc': + case 'aes256-ctr': + case 'arcfour256': + case 'twofish-cbc': + case 'twofish256-cbc': + case 'twofish256-ctr': + return 32; + } + return null; + } + + /** + * Tests whether or not proposed algorithm has a potential for issues + * + * @link https://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/ssh2-aesctr-openssh.html + * @link https://bugzilla.mindrot.org/show_bug.cgi?id=1291 + * @param string $algorithm Name of the encryption algorithm + * @return bool + * @access private + */ + function _bad_algorithm_candidate($algorithm) + { + switch ($algorithm) { + case 'arcfour256': + case 'aes192-ctr': + case 'aes256-ctr': + return true; + } + + return false; + } + + /** + * Login + * + * The $password parameter can be a plaintext password, a Crypt_RSA object or an array + * + * @param string $username + * @param mixed $password + * @param mixed $... + * @return bool + * @see self::_login() + * @access public + */ + function login($username) + { + $args = func_get_args(); + $this->auth[] = $args; + return call_user_func_array(array(&$this, '_login'), $args); + } + + /** + * Login Helper + * + * @param string $username + * @param mixed $password + * @param mixed $... + * @return bool + * @see self::_login_helper() + * @access private + */ + function _login($username) + { + if (!($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR)) { + if (!$this->_connect()) { + return false; + } + } + + $args = array_slice(func_get_args(), 1); + if (empty($args)) { + return $this->_login_helper($username); + } + + foreach ($args as $arg) { + if ($this->_login_helper($username, $arg)) { + return true; + } + } + return false; + } + + /** + * Login Helper + * + * @param string $username + * @param string $password + * @return bool + * @access private + * @internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis} + * by sending dummy SSH_MSG_IGNORE messages. + */ + function _login_helper($username, $password = null) + { + if (!($this->bitmap & NET_SSH2_MASK_CONNECTED)) { + return false; + } + + if (!($this->bitmap & NET_SSH2_MASK_LOGIN_REQ)) { + $packet = pack( + 'CNa*', + NET_SSH2_MSG_SERVICE_REQUEST, + strlen('ssh-userauth'), + 'ssh-userauth' + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + if ($this->retry_connect) { + $this->retry_connect = false; + if (!$this->_connect()) { + return false; + } + return $this->_login_helper($username, $password); + } + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + + if (strlen($response) < 4) { + return false; + } + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + if ($type != NET_SSH2_MSG_SERVICE_ACCEPT) { + user_error('Expected SSH_MSG_SERVICE_ACCEPT'); + return false; + } + $this->bitmap |= NET_SSH2_MASK_LOGIN_REQ; + } + + if (strlen($this->last_interactive_response)) { + return !is_string($password) && !is_array($password) ? false : $this->_keyboard_interactive_process($password); + } + + // although PHP5's get_class() preserves the case, PHP4's does not + if (is_object($password)) { + switch (strtolower(get_class($password))) { + case 'crypt_rsa': + return $this->_privatekey_login($username, $password); + case 'system_ssh_agent': + return $this->_ssh_agent_login($username, $password); + } + } + + if (is_array($password)) { + if ($this->_keyboard_interactive_login($username, $password)) { + $this->bitmap |= NET_SSH2_MASK_LOGIN; + return true; + } + return false; + } + + if (!isset($password)) { + $packet = pack( + 'CNa*Na*Na*', + NET_SSH2_MSG_USERAUTH_REQUEST, + strlen($username), + $username, + strlen('ssh-connection'), + 'ssh-connection', + strlen('none'), + 'none' + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + + if (!strlen($response)) { + return false; + } + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + switch ($type) { + case NET_SSH2_MSG_USERAUTH_SUCCESS: + $this->bitmap |= NET_SSH2_MASK_LOGIN; + return true; + //case NET_SSH2_MSG_USERAUTH_FAILURE: + default: + return false; + } + } + + $packet = pack( + 'CNa*Na*Na*CNa*', + NET_SSH2_MSG_USERAUTH_REQUEST, + strlen($username), + $username, + strlen('ssh-connection'), + 'ssh-connection', + strlen('password'), + 'password', + 0, + strlen($password), + $password + ); + + // remove the username and password from the logged packet + if (!defined('NET_SSH2_LOGGING')) { + $logged = null; + } else { + $logged = pack( + 'CNa*Na*Na*CNa*', + NET_SSH2_MSG_USERAUTH_REQUEST, + strlen('username'), + 'username', + strlen('ssh-connection'), + 'ssh-connection', + strlen('password'), + 'password', + 0, + strlen('password'), + 'password' + ); + } + + if (!$this->_send_binary_packet($packet, $logged)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + + if (!strlen($response)) { + return false; + } + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + switch ($type) { + case NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ: // in theory, the password can be changed + if (defined('NET_SSH2_LOGGING')) { + $this->message_number_log[count($this->message_number_log) - 1] = 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'; + } + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . $this->_string_shift($response, $length); + return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER); + case NET_SSH2_MSG_USERAUTH_FAILURE: + // can we use keyboard-interactive authentication? if not then either the login is bad or the server employees + // multi-factor authentication + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $auth_methods = explode(',', $this->_string_shift($response, $length)); + if (!strlen($response)) { + return false; + } + extract(unpack('Cpartial_success', $this->_string_shift($response, 1))); + $partial_success = $partial_success != 0; + + if (!$partial_success && in_array('keyboard-interactive', $auth_methods)) { + if ($this->_keyboard_interactive_login($username, $password)) { + $this->bitmap |= NET_SSH2_MASK_LOGIN; + return true; + } + return false; + } + return false; + case NET_SSH2_MSG_USERAUTH_SUCCESS: + $this->bitmap |= NET_SSH2_MASK_LOGIN; + return true; + } + + return false; + } + + /** + * Login via keyboard-interactive authentication + * + * See {@link http://tools.ietf.org/html/rfc4256 RFC4256} for details. This is not a full-featured keyboard-interactive authenticator. + * + * @param string $username + * @param string $password + * @return bool + * @access private + */ + function _keyboard_interactive_login($username, $password) + { + $packet = pack( + 'CNa*Na*Na*Na*Na*', + NET_SSH2_MSG_USERAUTH_REQUEST, + strlen($username), + $username, + strlen('ssh-connection'), + 'ssh-connection', + strlen('keyboard-interactive'), + 'keyboard-interactive', + 0, + '', + 0, + '' + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + return $this->_keyboard_interactive_process($password); + } + + /** + * Handle the keyboard-interactive requests / responses. + * + * @param string $responses... + * @return bool + * @access private + */ + function _keyboard_interactive_process() + { + $responses = func_get_args(); + + if (strlen($this->last_interactive_response)) { + $response = $this->last_interactive_response; + } else { + $orig = $response = $this->_get_binary_packet(); + if ($response === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + } + + if (!strlen($response)) { + return false; + } + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + switch ($type) { + case NET_SSH2_MSG_USERAUTH_INFO_REQUEST: + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->_string_shift($response, $length); // name; may be empty + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->_string_shift($response, $length); // instruction; may be empty + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->_string_shift($response, $length); // language tag; may be empty + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nnum_prompts', $this->_string_shift($response, 4))); + + for ($i = 0; $i < count($responses); $i++) { + if (is_array($responses[$i])) { + foreach ($responses[$i] as $key => $value) { + $this->keyboard_requests_responses[$key] = $value; + } + unset($responses[$i]); + } + } + $responses = array_values($responses); + + if (isset($this->keyboard_requests_responses)) { + for ($i = 0; $i < $num_prompts; $i++) { + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + // prompt - ie. "Password: "; must not be empty + $prompt = $this->_string_shift($response, $length); + //$echo = $this->_string_shift($response) != chr(0); + foreach ($this->keyboard_requests_responses as $key => $value) { + if (substr($prompt, 0, strlen($key)) == $key) { + $responses[] = $value; + break; + } + } + } + } + + // see http://tools.ietf.org/html/rfc4256#section-3.2 + if (strlen($this->last_interactive_response)) { + $this->last_interactive_response = ''; + } elseif (defined('NET_SSH2_LOGGING')) { + $this->message_number_log[count($this->message_number_log) - 1] = str_replace( + 'UNKNOWN', + 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST', + $this->message_number_log[count($this->message_number_log) - 1] + ); + } + + if (!count($responses) && $num_prompts) { + $this->last_interactive_response = $orig; + return false; + } + + /* + After obtaining the requested information from the user, the client + MUST respond with an SSH_MSG_USERAUTH_INFO_RESPONSE message. + */ + // see http://tools.ietf.org/html/rfc4256#section-3.4 + $packet = $logged = pack('CN', NET_SSH2_MSG_USERAUTH_INFO_RESPONSE, count($responses)); + for ($i = 0; $i < count($responses); $i++) { + $packet.= pack('Na*', strlen($responses[$i]), $responses[$i]); + $logged.= pack('Na*', strlen('dummy-answer'), 'dummy-answer'); + } + + if (!$this->_send_binary_packet($packet, $logged)) { + return false; + } + + if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX) { + $this->message_number_log[count($this->message_number_log) - 1] = str_replace( + 'UNKNOWN', + 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE', + $this->message_number_log[count($this->message_number_log) - 1] + ); + } + + /* + After receiving the response, the server MUST send either an + SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, or another + SSH_MSG_USERAUTH_INFO_REQUEST message. + */ + // maybe phpseclib should force close the connection after x request / responses? unless something like that is done + // there could be an infinite loop of request / responses. + return $this->_keyboard_interactive_process(); + case NET_SSH2_MSG_USERAUTH_SUCCESS: + return true; + case NET_SSH2_MSG_USERAUTH_FAILURE: + return false; + } + + return false; + } + + /** + * Login with an ssh-agent provided key + * + * @param string $username + * @param System_SSH_Agent $agent + * @return bool + * @access private + */ + function _ssh_agent_login($username, $agent) + { + $this->agent = $agent; + $keys = $agent->requestIdentities(); + foreach ($keys as $key) { + if ($this->_privatekey_login($username, $key)) { + return true; + } + } + + return false; + } + + /** + * Login with an RSA private key + * + * @param string $username + * @param Crypt_RSA $password + * @return bool + * @access private + * @internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis} + * by sending dummy SSH_MSG_IGNORE messages. + */ + function _privatekey_login($username, $privatekey) + { + // see http://tools.ietf.org/html/rfc4253#page-15 + $publickey = $privatekey->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_RAW); + if ($publickey === false) { + return false; + } + + $publickey = array( + 'e' => $publickey['e']->toBytes(true), + 'n' => $publickey['n']->toBytes(true) + ); + $publickey = pack( + 'Na*Na*Na*', + strlen('ssh-rsa'), + 'ssh-rsa', + strlen($publickey['e']), + $publickey['e'], + strlen($publickey['n']), + $publickey['n'] + ); + + switch ($this->signature_format) { + case 'rsa-sha2-512': + $hash = 'sha512'; + $signatureType = 'rsa-sha2-512'; + break; + case 'rsa-sha2-256': + $hash = 'sha256'; + $signatureType = 'rsa-sha2-256'; + break; + //case 'ssh-rsa': + default: + $hash = 'sha1'; + $signatureType = 'ssh-rsa'; + } + + $part1 = pack( + 'CNa*Na*Na*', + NET_SSH2_MSG_USERAUTH_REQUEST, + strlen($username), + $username, + strlen('ssh-connection'), + 'ssh-connection', + strlen('publickey'), + 'publickey' + ); + $part2 = pack('Na*Na*', strlen($signatureType), $signatureType, strlen($publickey), $publickey); + + $packet = $part1 . chr(0) . $part2; + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + + if (!strlen($response)) { + return false; + } + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + switch ($type) { + case NET_SSH2_MSG_USERAUTH_FAILURE: + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->errors[] = 'SSH_MSG_USERAUTH_FAILURE: ' . $this->_string_shift($response, $length); + return false; + case NET_SSH2_MSG_USERAUTH_PK_OK: + // we'll just take it on faith that the public key blob and the public key algorithm name are as + // they should be + if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX) { + $this->message_number_log[count($this->message_number_log) - 1] = str_replace( + 'UNKNOWN', + 'NET_SSH2_MSG_USERAUTH_PK_OK', + $this->message_number_log[count($this->message_number_log) - 1] + ); + } + } + + $packet = $part1 . chr(1) . $part2; + $privatekey->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); + $privatekey->setHash($hash); + $signature = $privatekey->sign(pack('Na*a*', strlen($this->session_id), $this->session_id, $packet)); + $signature = pack('Na*Na*', strlen($signatureType), $signatureType, strlen($signature), $signature); + $packet.= pack('Na*', strlen($signature), $signature); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + + if (!strlen($response)) { + return false; + } + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + switch ($type) { + case NET_SSH2_MSG_USERAUTH_FAILURE: + // either the login is bad or the server employs multi-factor authentication + return false; + case NET_SSH2_MSG_USERAUTH_SUCCESS: + $this->bitmap |= NET_SSH2_MASK_LOGIN; + return true; + } + + return false; + } + + /** + * Set Timeout + * + * $ssh->exec('ping 127.0.0.1'); on a Linux host will never return and will run indefinitely. setTimeout() makes it so it'll timeout. + * Setting $timeout to false or 0 will mean there is no timeout. + * + * @param mixed $timeout + * @access public + */ + function setTimeout($timeout) + { + $this->timeout = $this->curTimeout = $timeout; + } + + /** + * Get the output from stdError + * + * @access public + */ + function getStdError() + { + return $this->stdErrorLog; + } + + /** + * Execute Command + * + * If $callback is set to false then Net_SSH2::_get_channel_packet(NET_SSH2_CHANNEL_EXEC) will need to be called manually. + * In all likelihood, this is not a feature you want to be taking advantage of. + * + * @param string $command + * @param Callback $callback + * @return string + * @access public + */ + function exec($command, $callback = null) + { + $this->curTimeout = $this->timeout; + $this->is_timeout = false; + $this->stdErrorLog = ''; + + if (!$this->isAuthenticated()) { + return false; + } + + if ($this->in_request_pty_exec) { + user_error('If you want to run multiple exec()\'s you will need to disable (and re-enable if appropriate) a PTY for each one.'); + return false; + } + + // RFC4254 defines the (client) window size as "bytes the other party can send before it must wait for the window to + // be adjusted". 0x7FFFFFFF is, at 2GB, the max size. technically, it should probably be decremented, but, + // honestly, if you're transferring more than 2GB, you probably shouldn't be using phpseclib, anyway. + // see http://tools.ietf.org/html/rfc4254#section-5.2 for more info + $this->window_size_server_to_client[NET_SSH2_CHANNEL_EXEC] = $this->window_size; + // 0x8000 is the maximum max packet size, per http://tools.ietf.org/html/rfc4253#section-6.1, although since PuTTy + // uses 0x4000, that's what will be used here, as well. + $packet_size = 0x4000; + + $packet = pack( + 'CNa*N3', + NET_SSH2_MSG_CHANNEL_OPEN, + strlen('session'), + 'session', + NET_SSH2_CHANNEL_EXEC, + $this->window_size_server_to_client[NET_SSH2_CHANNEL_EXEC], + $packet_size + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_OPEN; + + $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); + if ($response === false) { + return false; + } + + if ($this->request_pty === true) { + $terminal_modes = pack('C', NET_SSH2_TTY_OP_END); + $packet = pack( + 'CNNa*CNa*N5a*', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[NET_SSH2_CHANNEL_EXEC], + strlen('pty-req'), + 'pty-req', + 1, + strlen('vt100'), + 'vt100', + $this->windowColumns, + $this->windowRows, + 0, + 0, + strlen($terminal_modes), + $terminal_modes + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + + if (!strlen($response)) { + return false; + } + list(, $type) = unpack('C', $this->_string_shift($response, 1)); + + switch ($type) { + case NET_SSH2_MSG_CHANNEL_SUCCESS: + break; + case NET_SSH2_MSG_CHANNEL_FAILURE: + default: + user_error('Unable to request pseudo-terminal'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + $this->in_request_pty_exec = true; + } + + // sending a pty-req SSH_MSG_CHANNEL_REQUEST message is unnecessary and, in fact, in most cases, slows things + // down. the one place where it might be desirable is if you're doing something like Net_SSH2::exec('ping localhost &'). + // with a pty-req SSH_MSG_CHANNEL_REQUEST, exec() will return immediately and the ping process will then + // then immediately terminate. without such a request exec() will loop indefinitely. the ping process won't end but + // neither will your script. + + // although, in theory, the size of SSH_MSG_CHANNEL_REQUEST could exceed the maximum packet size established by + // SSH_MSG_CHANNEL_OPEN_CONFIRMATION, RFC4254#section-5.1 states that the "maximum packet size" refers to the + // "maximum size of an individual data packet". ie. SSH_MSG_CHANNEL_DATA. RFC4254#section-5.2 corroborates. + $packet = pack( + 'CNNa*CNa*', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[NET_SSH2_CHANNEL_EXEC], + strlen('exec'), + 'exec', + 1, + strlen($command), + $command + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_REQUEST; + + $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); + if ($response === false) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_DATA; + + if ($callback === false || $this->in_request_pty_exec) { + return true; + } + + $output = ''; + while (true) { + $temp = $this->_get_channel_packet(NET_SSH2_CHANNEL_EXEC); + switch (true) { + case $temp === true: + return is_callable($callback) ? true : $output; + case $temp === false: + return false; + default: + if (is_callable($callback)) { + if (call_user_func($callback, $temp) === true) { + $this->_close_channel(NET_SSH2_CHANNEL_EXEC); + return true; + } + } else { + $output.= $temp; + } + } + } + } + + /** + * Creates an interactive shell + * + * @see self::read() + * @see self::write() + * @return bool + * @access private + */ + function _initShell() + { + if ($this->in_request_pty_exec === true) { + return true; + } + + $this->window_size_server_to_client[NET_SSH2_CHANNEL_SHELL] = $this->window_size; + $packet_size = 0x4000; + + $packet = pack( + 'CNa*N3', + NET_SSH2_MSG_CHANNEL_OPEN, + strlen('session'), + 'session', + NET_SSH2_CHANNEL_SHELL, + $this->window_size_server_to_client[NET_SSH2_CHANNEL_SHELL], + $packet_size + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_OPEN; + + $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SHELL); + if ($response === false) { + return false; + } + + $terminal_modes = pack('C', NET_SSH2_TTY_OP_END); + $packet = pack( + 'CNNa*CNa*N5a*', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[NET_SSH2_CHANNEL_SHELL], + strlen('pty-req'), + 'pty-req', + 1, + strlen('vt100'), + 'vt100', + $this->windowColumns, + $this->windowRows, + 0, + 0, + strlen($terminal_modes), + $terminal_modes + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $response = $this->_get_binary_packet(); + if ($response === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + + if (!strlen($response)) { + return false; + } + list(, $type) = unpack('C', $this->_string_shift($response, 1)); + + switch ($type) { + case NET_SSH2_MSG_CHANNEL_SUCCESS: + // if a pty can't be opened maybe commands can still be executed + case NET_SSH2_MSG_CHANNEL_FAILURE: + break; + default: + user_error('Unable to request pseudo-terminal'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + + $packet = pack( + 'CNNa*C', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[NET_SSH2_CHANNEL_SHELL], + strlen('shell'), + 'shell', + 1 + ); + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_REQUEST; + + $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SHELL); + if ($response === false) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_DATA; + + $this->bitmap |= NET_SSH2_MASK_SHELL; + + return true; + } + + /** + * Return the channel to be used with read() / write() + * + * @see self::read() + * @see self::write() + * @return int + * @access public + */ + function _get_interactive_channel() + { + switch (true) { + case $this->in_subsystem: + return NET_SSH2_CHANNEL_SUBSYSTEM; + case $this->in_request_pty_exec: + return NET_SSH2_CHANNEL_EXEC; + default: + return NET_SSH2_CHANNEL_SHELL; + } + } + + /** + * Return an available open channel + * + * @return int + * @access public + */ + function _get_open_channel() + { + $channel = NET_SSH2_CHANNEL_EXEC; + do { + if (isset($this->channel_status[$channel]) && $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_OPEN) { + return $channel; + } + } while ($channel++ < NET_SSH2_CHANNEL_SUBSYSTEM); + + return false; + } + + /** + * Returns the output of an interactive shell + * + * Returns when there's a match for $expect, which can take the form of a string literal or, + * if $mode == NET_SSH2_READ_REGEX, a regular expression. + * + * @see self::write() + * @param string $expect + * @param int $mode + * @return string + * @access public + */ + function read($expect = '', $mode = NET_SSH2_READ_SIMPLE) + { + $this->curTimeout = $this->timeout; + $this->is_timeout = false; + + if (!$this->isAuthenticated()) { + user_error('Operation disallowed prior to login()'); + return false; + } + + if (!($this->bitmap & NET_SSH2_MASK_SHELL) && !$this->_initShell()) { + user_error('Unable to initiate an interactive shell session'); + return false; + } + + $channel = $this->_get_interactive_channel(); + + if ($mode == NET_SSH2_READ_NEXT) { + return $this->_get_channel_packet($channel); + } + + $match = $expect; + while (true) { + if ($mode == NET_SSH2_READ_REGEX) { + preg_match($expect, substr($this->interactiveBuffer, -1024), $matches); + $match = isset($matches[0]) ? $matches[0] : ''; + } + $pos = strlen($match) ? strpos($this->interactiveBuffer, $match) : false; + if ($pos !== false) { + return $this->_string_shift($this->interactiveBuffer, $pos + strlen($match)); + } + $response = $this->_get_channel_packet($channel); + if (is_bool($response)) { + $this->in_request_pty_exec = false; + return $response ? $this->_string_shift($this->interactiveBuffer, strlen($this->interactiveBuffer)) : false; + } + + $this->interactiveBuffer.= $response; + } + } + + /** + * Inputs a command into an interactive shell. + * + * @see self::read() + * @param string $cmd + * @return bool + * @access public + */ + function write($cmd) + { + if (!$this->isAuthenticated()) { + user_error('Operation disallowed prior to login()'); + return false; + } + + if (!($this->bitmap & NET_SSH2_MASK_SHELL) && !$this->_initShell()) { + user_error('Unable to initiate an interactive shell session'); + return false; + } + + return $this->_send_channel_packet($this->_get_interactive_channel(), $cmd); + } + + /** + * Start a subsystem. + * + * Right now only one subsystem at a time is supported. To support multiple subsystem's stopSubsystem() could accept + * a string that contained the name of the subsystem, but at that point, only one subsystem of each type could be opened. + * To support multiple subsystem's of the same name maybe it'd be best if startSubsystem() generated a new channel id and + * returns that and then that that was passed into stopSubsystem() but that'll be saved for a future date and implemented + * if there's sufficient demand for such a feature. + * + * @see self::stopSubsystem() + * @param string $subsystem + * @return bool + * @access public + */ + function startSubsystem($subsystem) + { + $this->window_size_server_to_client[NET_SSH2_CHANNEL_SUBSYSTEM] = $this->window_size; + + $packet = pack( + 'CNa*N3', + NET_SSH2_MSG_CHANNEL_OPEN, + strlen('session'), + 'session', + NET_SSH2_CHANNEL_SUBSYSTEM, + $this->window_size, + 0x4000 + ); + + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_OPEN; + + $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SUBSYSTEM); + if ($response === false) { + return false; + } + + $packet = pack( + 'CNNa*CNa*', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[NET_SSH2_CHANNEL_SUBSYSTEM], + strlen('subsystem'), + 'subsystem', + 1, + strlen($subsystem), + $subsystem + ); + if (!$this->_send_binary_packet($packet)) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_REQUEST; + + $response = $this->_get_channel_packet(NET_SSH2_CHANNEL_SUBSYSTEM); + + if ($response === false) { + return false; + } + + $this->channel_status[NET_SSH2_CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_DATA; + + $this->bitmap |= NET_SSH2_MASK_SHELL; + $this->in_subsystem = true; + + return true; + } + + /** + * Stops a subsystem. + * + * @see self::startSubsystem() + * @return bool + * @access public + */ + function stopSubsystem() + { + $this->in_subsystem = false; + $this->_close_channel(NET_SSH2_CHANNEL_SUBSYSTEM); + return true; + } + + /** + * Closes a channel + * + * If read() timed out you might want to just close the channel and have it auto-restart on the next read() call + * + * @access public + */ + function reset() + { + $this->_close_channel($this->_get_interactive_channel()); + } + + /** + * Is timeout? + * + * Did exec() or read() return because they timed out or because they encountered the end? + * + * @access public + */ + function isTimeout() + { + return $this->is_timeout; + } + + /** + * Disconnect + * + * @access public + */ + function disconnect() + { + $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + if (isset($this->realtime_log_file) && is_resource($this->realtime_log_file)) { + fclose($this->realtime_log_file); + } + } + + /** + * Destructor. + * + * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call + * disconnect(). + * + * @access public + */ + function __destruct() + { + $this->disconnect(); + } + + /** + * Is the connection still active? + * + * @return bool + * @access public + */ + function isConnected() + { + return (bool) ($this->bitmap & NET_SSH2_MASK_CONNECTED); + } + + /** + * Have you successfully been logged in? + * + * @return bool + * @access public + */ + function isAuthenticated() + { + return (bool) ($this->bitmap & NET_SSH2_MASK_LOGIN); + } + + /** + * Pings a server connection, or tries to reconnect if the connection has gone down + * + * Inspired by http://php.net/manual/en/mysqli.ping.php + * + * @return bool + * @access public + */ + function ping() + { + if (!$this->isAuthenticated()) { + return false; + } + + $this->window_size_server_to_client[NET_SSH2_CHANNEL_KEEP_ALIVE] = $this->window_size; + $packet_size = 0x4000; + $packet = pack( + 'CNa*N3', + NET_SSH2_MSG_CHANNEL_OPEN, + strlen('session'), + 'session', + NET_SSH2_CHANNEL_KEEP_ALIVE, + $this->window_size_server_to_client[NET_SSH2_CHANNEL_KEEP_ALIVE], + $packet_size + ); + + if (!@$this->_send_binary_packet($packet)) { + return $this->_reconnect(); + } + + $this->channel_status[NET_SSH2_CHANNEL_KEEP_ALIVE] = NET_SSH2_MSG_CHANNEL_OPEN; + + $response = @$this->_get_channel_packet(NET_SSH2_CHANNEL_KEEP_ALIVE); + if ($response !== false) { + $this->_close_channel(NET_SSH2_CHANNEL_KEEP_ALIVE); + return true; + } + + return $this->_reconnect(); + } + + /** + * In situ reconnect method + * + * @return boolean + * @access private + */ + function _reconnect() + { + $this->_reset_connection(NET_SSH2_DISCONNECT_CONNECTION_LOST); + $this->retry_connect = true; + if (!$this->_connect()) { + return false; + } + foreach ($this->auth as $auth) { + $result = call_user_func_array(array(&$this, 'parent::login'), $auth); + } + return $result; + } + + /** + * Resets a connection for re-use + * + * @param int $reason + * @access private + */ + function _reset_connection($reason) + { + $this->_disconnect($reason); + $this->decrypt = $this->encrypt = false; + $this->decrypt_block_size = $this->encrypt_block_size = 8; + $this->hmac_check = $this->hmac_create = false; + $this->hmac_size = false; + $this->session_id = false; + $this->retry_connect = true; + $this->get_seq_no = $this->send_seq_no = 0; + } + + /** + * Gets Binary Packets + * + * See '6. Binary Packet Protocol' of rfc4253 for more info. + * + * @see self::_send_binary_packet() + * @return string + * @access private + */ + function _get_binary_packet($skip_channel_filter = false) + { + if (!is_resource($this->fsock) || feof($this->fsock)) { + $this->bitmap = 0; + user_error('Connection closed prematurely'); + return false; + } + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $raw = fread($this->fsock, $this->decrypt_block_size); + + if (!strlen($raw)) { + return ''; + } + + if ($this->decrypt !== false) { + $raw = $this->decrypt->decrypt($raw); + } + if ($raw === false) { + user_error('Unable to decrypt content'); + return false; + } + + if (strlen($raw) < 5) { + return false; + } + extract(unpack('Npacket_length/Cpadding_length', $this->_string_shift($raw, 5))); + + $remaining_length = $packet_length + 4 - $this->decrypt_block_size; + + // quoting , + // "implementations SHOULD check that the packet length is reasonable" + // PuTTY uses 0x9000 as the actual max packet size and so to shall we + if ($remaining_length < -$this->decrypt_block_size || $remaining_length > 0x9000 || $remaining_length % $this->decrypt_block_size != 0) { + if (!$this->bad_key_size_fix && $this->_bad_algorithm_candidate($this->decrypt_algorithm) && !($this->bitmap & NET_SSH2_MASK_LOGIN)) { + $this->bad_key_size_fix = true; + $this->_reset_connection(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + return false; + } + user_error('Invalid size'); + return false; + } + + $buffer = ''; + while ($remaining_length > 0) { + $temp = fread($this->fsock, $remaining_length); + if ($temp === false || feof($this->fsock)) { + $this->bitmap = 0; + user_error('Error reading from socket'); + return false; + } + $buffer.= $temp; + $remaining_length-= strlen($temp); + } + + $stop = strtok(microtime(), ' ') + strtok(''); + if (strlen($buffer)) { + $raw.= $this->decrypt !== false ? $this->decrypt->decrypt($buffer) : $buffer; + } + + $payload = $this->_string_shift($raw, $packet_length - $padding_length - 1); + $padding = $this->_string_shift($raw, $padding_length); // should leave $raw empty + + if ($this->hmac_check !== false) { + $hmac = fread($this->fsock, $this->hmac_size); + if ($hmac === false || strlen($hmac) != $this->hmac_size) { + $this->bitmap = 0; + user_error('Error reading socket'); + return false; + } elseif ($hmac != $this->hmac_check->hash(pack('NNCa*', $this->get_seq_no, $packet_length, $padding_length, $payload . $padding))) { + user_error('Invalid HMAC'); + return false; + } + } + + //if ($this->decompress) { + // $payload = gzinflate(substr($payload, 2)); + //} + + $this->get_seq_no++; + + if (defined('NET_SSH2_LOGGING')) { + $current = strtok(microtime(), ' ') + strtok(''); + $message_number = isset($this->message_numbers[ord($payload[0])]) ? $this->message_numbers[ord($payload[0])] : 'UNKNOWN (' . ord($payload[0]) . ')'; + $message_number = '<- ' . $message_number . + ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($stop - $start, 4) . 's)'; + $this->_append_log($message_number, $payload); + $this->last_packet = $current; + } + + return $this->_filter($payload, $skip_channel_filter); + } + + /** + * Filter Binary Packets + * + * Because some binary packets need to be ignored... + * + * @see self::_get_binary_packet() + * @return string + * @access private + */ + function _filter($payload, $skip_channel_filter) + { + switch (ord($payload[0])) { + case NET_SSH2_MSG_DISCONNECT: + $this->_string_shift($payload, 1); + if (strlen($payload) < 8) { + return false; + } + extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8))); + $this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . $this->_string_shift($payload, $length); + $this->bitmap = 0; + return false; + case NET_SSH2_MSG_IGNORE: + $payload = $this->_get_binary_packet($skip_channel_filter); + break; + case NET_SSH2_MSG_DEBUG: + $this->_string_shift($payload, 2); + if (strlen($payload) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($payload, 4))); + $this->errors[] = 'SSH_MSG_DEBUG: ' . $this->_string_shift($payload, $length); + $payload = $this->_get_binary_packet($skip_channel_filter); + break; + case NET_SSH2_MSG_UNIMPLEMENTED: + return false; + case NET_SSH2_MSG_KEXINIT: + if ($this->session_id !== false) { + $this->send_kex_first = false; + if (!$this->_key_exchange($payload)) { + $this->bitmap = 0; + return false; + } + $payload = $this->_get_binary_packet($skip_channel_filter); + } + } + + // see http://tools.ietf.org/html/rfc4252#section-5.4; only called when the encryption has been activated and when we haven't already logged in + if (($this->bitmap & NET_SSH2_MASK_CONNECTED) && !$this->isAuthenticated() && ord($payload[0]) == NET_SSH2_MSG_USERAUTH_BANNER) { + $this->_string_shift($payload, 1); + if (strlen($payload) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($payload, 4))); + $this->banner_message = $this->_string_shift($payload, $length); + $payload = $this->_get_binary_packet(); + } + + // only called when we've already logged in + if (($this->bitmap & NET_SSH2_MASK_CONNECTED) && $this->isAuthenticated()) { + switch (ord($payload[0])) { + case NET_SSH2_MSG_CHANNEL_DATA: + case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA: + case NET_SSH2_MSG_CHANNEL_REQUEST: + case NET_SSH2_MSG_CHANNEL_CLOSE: + case NET_SSH2_MSG_CHANNEL_EOF: + if (!$skip_channel_filter && !empty($this->server_channels)) { + $this->binary_packet_buffer = $payload; + $this->_get_channel_packet(true); + $payload = $this->_get_binary_packet(); + } + break; + case NET_SSH2_MSG_GLOBAL_REQUEST: // see http://tools.ietf.org/html/rfc4254#section-4 + if (strlen($payload) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($payload, 4))); + $this->errors[] = 'SSH_MSG_GLOBAL_REQUEST: ' . $this->_string_shift($payload, $length); + + if (!$this->_send_binary_packet(pack('C', NET_SSH2_MSG_REQUEST_FAILURE))) { + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + + $payload = $this->_get_binary_packet($skip_channel_filter); + break; + case NET_SSH2_MSG_CHANNEL_OPEN: // see http://tools.ietf.org/html/rfc4254#section-5.1 + $this->_string_shift($payload, 1); + if (strlen($payload) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($payload, 4))); + $data = $this->_string_shift($payload, $length); + if (strlen($payload) < 4) { + return false; + } + extract(unpack('Nserver_channel', $this->_string_shift($payload, 4))); + switch ($data) { + case 'auth-agent': + case 'auth-agent@openssh.com': + if (isset($this->agent)) { + $new_channel = NET_SSH2_CHANNEL_AGENT_FORWARD; + + if (strlen($payload) < 8) { + return false; + } + extract(unpack('Nremote_window_size', $this->_string_shift($payload, 4))); + extract(unpack('Nremote_maximum_packet_size', $this->_string_shift($payload, 4))); + + $this->packet_size_client_to_server[$new_channel] = $remote_window_size; + $this->window_size_server_to_client[$new_channel] = $remote_maximum_packet_size; + $this->window_size_client_to_server[$new_channel] = $this->window_size; + + $packet_size = 0x4000; + + $packet = pack( + 'CN4', + NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, + $server_channel, + $new_channel, + $packet_size, + $packet_size + ); + + $this->server_channels[$new_channel] = $server_channel; + $this->channel_status[$new_channel] = NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION; + if (!$this->_send_binary_packet($packet)) { + return false; + } + } + break; + default: + $packet = pack( + 'CN3a*Na*', + NET_SSH2_MSG_REQUEST_FAILURE, + $server_channel, + NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED, + 0, + '', + 0, + '' + ); + + if (!$this->_send_binary_packet($packet)) { + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + } + $payload = $this->_get_binary_packet($skip_channel_filter); + break; + case NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST: + $this->_string_shift($payload, 1); + if (strlen($payload) < 8) { + return false; + } + extract(unpack('Nchannel', $this->_string_shift($payload, 4))); + extract(unpack('Nwindow_size', $this->_string_shift($payload, 4))); + $this->window_size_client_to_server[$channel]+= $window_size; + + $payload = ($this->bitmap & NET_SSH2_MASK_WINDOW_ADJUST) ? true : $this->_get_binary_packet($skip_channel_filter); + } + } + + return $payload; + } + + /** + * Enable Quiet Mode + * + * Suppress stderr from output + * + * @access public + */ + function enableQuietMode() + { + $this->quiet_mode = true; + } + + /** + * Disable Quiet Mode + * + * Show stderr in output + * + * @access public + */ + function disableQuietMode() + { + $this->quiet_mode = false; + } + + /** + * Returns whether Quiet Mode is enabled or not + * + * @see self::enableQuietMode() + * @see self::disableQuietMode() + * + * @access public + * @return bool + */ + function isQuietModeEnabled() + { + return $this->quiet_mode; + } + + /** + * Enable request-pty when using exec() + * + * @access public + */ + function enablePTY() + { + $this->request_pty = true; + } + + /** + * Disable request-pty when using exec() + * + * @access public + */ + function disablePTY() + { + if ($this->in_request_pty_exec) { + $this->_close_channel(NET_SSH2_CHANNEL_EXEC); + $this->in_request_pty_exec = false; + } + $this->request_pty = false; + } + + /** + * Returns whether request-pty is enabled or not + * + * @see self::enablePTY() + * @see self::disablePTY() + * + * @access public + * @return bool + */ + function isPTYEnabled() + { + return $this->request_pty; + } + + /** + * Gets channel data + * + * Returns the data as a string if it's available and false if not. + * + * @param $client_channel + * @return mixed + * @access private + */ + function _get_channel_packet($client_channel, $skip_extended = false) + { + if (!empty($this->channel_buffers[$client_channel])) { + return array_shift($this->channel_buffers[$client_channel]); + } + + while (true) { + if ($this->binary_packet_buffer !== false) { + $response = $this->binary_packet_buffer; + $this->binary_packet_buffer = false; + } else { + $read = array($this->fsock); + $write = $except = null; + + if (!$this->curTimeout) { + @stream_select($read, $write, $except, null); + } else { + if ($this->curTimeout < 0) { + $this->is_timeout = true; + return true; + } + + $read = array($this->fsock); + $write = $except = null; + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $sec = floor($this->curTimeout); + $usec = 1000000 * ($this->curTimeout - $sec); + // on windows this returns a "Warning: Invalid CRT parameters detected" error + if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) { + $this->is_timeout = true; + return true; + } + $elapsed = strtok(microtime(), ' ') + strtok('') - $start; + $this->curTimeout-= $elapsed; + } + + $response = $this->_get_binary_packet(true); + if ($response === false) { + $this->bitmap = 0; + user_error('Connection closed by server'); + return false; + } + } + + if ($client_channel == -1 && $response === true) { + return true; + } + if (!strlen($response)) { + return false; + } + extract(unpack('Ctype', $this->_string_shift($response, 1))); + + if (strlen($response) < 4) { + return false; + } + if ($type == NET_SSH2_MSG_CHANNEL_OPEN) { + extract(unpack('Nlength', $this->_string_shift($response, 4))); + } else { + extract(unpack('Nchannel', $this->_string_shift($response, 4))); + } + + // will not be setup yet on incoming channel open request + if (isset($channel) && isset($this->channel_status[$channel]) && isset($this->window_size_server_to_client[$channel])) { + $this->window_size_server_to_client[$channel]-= strlen($response); + + // resize the window, if appropriate + if ($this->window_size_server_to_client[$channel] < 0) { + $packet = pack('CNN', NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST, $this->server_channels[$channel], $this->window_size); + if (!$this->_send_binary_packet($packet)) { + return false; + } + $this->window_size_server_to_client[$channel]+= $this->window_size; + } + + switch ($type) { + case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA: + /* + if ($client_channel == NET_SSH2_CHANNEL_EXEC) { + $this->_send_channel_packet($client_channel, chr(0)); + } + */ + // currently, there's only one possible value for $data_type_code: NET_SSH2_EXTENDED_DATA_STDERR + if (strlen($response) < 8) { + return false; + } + extract(unpack('Ndata_type_code/Nlength', $this->_string_shift($response, 8))); + $data = $this->_string_shift($response, $length); + $this->stdErrorLog.= $data; + if ($skip_extended || $this->quiet_mode) { + continue 2; + } + if ($client_channel == $channel && $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA) { + return $data; + } + if (!isset($this->channel_buffers[$channel])) { + $this->channel_buffers[$channel] = array(); + } + $this->channel_buffers[$channel][] = $data; + + continue 2; + case NET_SSH2_MSG_CHANNEL_REQUEST: + if ($this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_CLOSE) { + continue 2; + } + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $value = $this->_string_shift($response, $length); + switch ($value) { + case 'exit-signal': + $this->_string_shift($response, 1); + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $this->errors[] = 'SSH_MSG_CHANNEL_REQUEST (exit-signal): ' . $this->_string_shift($response, $length); + $this->_string_shift($response, 1); + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + if ($length) { + $this->errors[count($this->errors)].= "\r\n" . $this->_string_shift($response, $length); + } + + $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); + $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); + + $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_EOF; + + continue 3; + case 'exit-status': + if (strlen($response) < 5) { + return false; + } + extract(unpack('Cfalse/Nexit_status', $this->_string_shift($response, 5))); + $this->exit_status = $exit_status; + + // "The client MAY ignore these messages." + // -- http://tools.ietf.org/html/rfc4254#section-6.10 + + continue 3; + default: + // "Some systems may not implement signals, in which case they SHOULD ignore this message." + // -- http://tools.ietf.org/html/rfc4254#section-6.9 + continue 3; + } + } + + switch ($this->channel_status[$channel]) { + case NET_SSH2_MSG_CHANNEL_OPEN: + switch ($type) { + case NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION: + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nserver_channel', $this->_string_shift($response, 4))); + $this->server_channels[$channel] = $server_channel; + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nwindow_size', $this->_string_shift($response, 4))); + if ($window_size < 0) { + $window_size&= 0x7FFFFFFF; + $window_size+= 0x80000000; + } + $this->window_size_client_to_server[$channel] = $window_size; + if (strlen($response) < 4) { + return false; + } + $temp = unpack('Npacket_size_client_to_server', $this->_string_shift($response, 4)); + $this->packet_size_client_to_server[$channel] = $temp['packet_size_client_to_server']; + $result = $client_channel == $channel ? true : $this->_get_channel_packet($client_channel, $skip_extended); + $this->_on_channel_open(); + return $result; + //case NET_SSH2_MSG_CHANNEL_OPEN_FAILURE: + default: + user_error('Unable to open channel'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + break; + case NET_SSH2_MSG_CHANNEL_REQUEST: + switch ($type) { + case NET_SSH2_MSG_CHANNEL_SUCCESS: + return true; + case NET_SSH2_MSG_CHANNEL_FAILURE: + return false; + default: + user_error('Unable to fulfill channel request'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + case NET_SSH2_MSG_CHANNEL_CLOSE: + return $type == NET_SSH2_MSG_CHANNEL_CLOSE ? true : $this->_get_channel_packet($client_channel, $skip_extended); + } + } + + // ie. $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA + + switch ($type) { + case NET_SSH2_MSG_CHANNEL_DATA: + /* + if ($channel == NET_SSH2_CHANNEL_EXEC) { + // SCP requires null packets, such as this, be sent. further, in the case of the ssh.com SSH server + // this actually seems to make things twice as fast. more to the point, the message right after + // SSH_MSG_CHANNEL_DATA (usually SSH_MSG_IGNORE) won't block for as long as it would have otherwise. + // in OpenSSH it slows things down but only by a couple thousandths of a second. + $this->_send_channel_packet($channel, chr(0)); + } + */ + if (strlen($response) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($response, 4))); + $data = $this->_string_shift($response, $length); + + if ($channel == NET_SSH2_CHANNEL_AGENT_FORWARD) { + $agent_response = $this->agent->_forward_data($data); + if (!is_bool($agent_response)) { + $this->_send_channel_packet($channel, $agent_response); + } + break; + } + + if ($client_channel == $channel) { + return $data; + } + if (!isset($this->channel_buffers[$channel])) { + $this->channel_buffers[$channel] = array(); + } + $this->channel_buffers[$channel][] = $data; + break; + case NET_SSH2_MSG_CHANNEL_CLOSE: + $this->curTimeout = 0; + + if ($this->bitmap & NET_SSH2_MASK_SHELL) { + $this->bitmap&= ~NET_SSH2_MASK_SHELL; + } + if ($this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_EOF) { + $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); + } + + $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_CLOSE; + if ($client_channel == $channel) { + return true; + } + case NET_SSH2_MSG_CHANNEL_EOF: + break; + default: + user_error('Error reading channel data'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + } + } + + /** + * Sends Binary Packets + * + * See '6. Binary Packet Protocol' of rfc4253 for more info. + * + * @param string $data + * @param string $logged + * @see self::_get_binary_packet() + * @return bool + * @access private + */ + function _send_binary_packet($data, $logged = null) + { + if (!is_resource($this->fsock) || feof($this->fsock)) { + $this->bitmap = 0; + user_error('Connection closed prematurely'); + return false; + } + + //if ($this->compress) { + // // the -4 removes the checksum: + // // http://php.net/function.gzcompress#57710 + // $data = substr(gzcompress($data), 0, -4); + //} + + // 4 (packet length) + 1 (padding length) + 4 (minimal padding amount) == 9 + $packet_length = strlen($data) + 9; + // round up to the nearest $this->encrypt_block_size + $packet_length+= (($this->encrypt_block_size - 1) * $packet_length) % $this->encrypt_block_size; + // subtracting strlen($data) is obvious - subtracting 5 is necessary because of packet_length and padding_length + $padding_length = $packet_length - strlen($data) - 5; + $padding = crypt_random_string($padding_length); + + // we subtract 4 from packet_length because the packet_length field isn't supposed to include itself + $packet = pack('NCa*', $packet_length - 4, $padding_length, $data . $padding); + + $hmac = $this->hmac_create !== false ? $this->hmac_create->hash(pack('Na*', $this->send_seq_no, $packet)) : ''; + $this->send_seq_no++; + + if ($this->encrypt !== false) { + $packet = $this->encrypt->encrypt($packet); + } + + $packet.= $hmac; + + $start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838 + $result = strlen($packet) == fputs($this->fsock, $packet); + $stop = strtok(microtime(), ' ') + strtok(''); + + if (defined('NET_SSH2_LOGGING')) { + $current = strtok(microtime(), ' ') + strtok(''); + $message_number = isset($this->message_numbers[ord($data[0])]) ? $this->message_numbers[ord($data[0])] : 'UNKNOWN (' . ord($data[0]) . ')'; + $message_number = '-> ' . $message_number . + ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($stop - $start, 4) . 's)'; + $this->_append_log($message_number, isset($logged) ? $logged : $data); + $this->last_packet = $current; + } + + return $result; + } + + /** + * Logs data packets + * + * Makes sure that only the last 1MB worth of packets will be logged + * + * @param string $data + * @access private + */ + function _append_log($message_number, $message) + { + // remove the byte identifying the message type from all but the first two messages (ie. the identification strings) + if (strlen($message_number) > 2) { + $this->_string_shift($message); + } + + switch (NET_SSH2_LOGGING) { + // useful for benchmarks + case NET_SSH2_LOG_SIMPLE: + $this->message_number_log[] = $message_number; + break; + // the most useful log for SSH2 + case NET_SSH2_LOG_COMPLEX: + $this->message_number_log[] = $message_number; + $this->log_size+= strlen($message); + $this->message_log[] = $message; + while ($this->log_size > NET_SSH2_LOG_MAX_SIZE) { + $this->log_size-= strlen(array_shift($this->message_log)); + array_shift($this->message_number_log); + } + break; + // dump the output out realtime; packets may be interspersed with non packets, + // passwords won't be filtered out and select other packets may not be correctly + // identified + case NET_SSH2_LOG_REALTIME: + switch (PHP_SAPI) { + case 'cli': + $start = $stop = "\r\n"; + break; + default: + $start = '
      ';
      +                        $stop = '
      '; + } + echo $start . $this->_format_log(array($message), array($message_number)) . $stop; + @flush(); + @ob_flush(); + break; + // basically the same thing as NET_SSH2_LOG_REALTIME with the caveat that NET_SSH2_LOG_REALTIME_FILE + // needs to be defined and that the resultant log file will be capped out at NET_SSH2_LOG_MAX_SIZE. + // the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily + // at the beginning of the file + case NET_SSH2_LOG_REALTIME_FILE: + if (!isset($this->realtime_log_file)) { + // PHP doesn't seem to like using constants in fopen() + $filename = NET_SSH2_LOG_REALTIME_FILENAME; + $fp = fopen($filename, 'w'); + $this->realtime_log_file = $fp; + } + if (!is_resource($this->realtime_log_file)) { + break; + } + $entry = $this->_format_log(array($message), array($message_number)); + if ($this->realtime_log_wrap) { + $temp = "<<< START >>>\r\n"; + $entry.= $temp; + fseek($this->realtime_log_file, ftell($this->realtime_log_file) - strlen($temp)); + } + $this->realtime_log_size+= strlen($entry); + if ($this->realtime_log_size > NET_SSH2_LOG_MAX_SIZE) { + fseek($this->realtime_log_file, 0); + $this->realtime_log_size = strlen($entry); + $this->realtime_log_wrap = true; + } + fputs($this->realtime_log_file, $entry); + } + } + + /** + * Sends channel data + * + * Spans multiple SSH_MSG_CHANNEL_DATAs if appropriate + * + * @param int $client_channel + * @param string $data + * @return bool + * @access private + */ + function _send_channel_packet($client_channel, $data) + { + while (strlen($data)) { + if (!$this->window_size_client_to_server[$client_channel]) { + $this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST; + // using an invalid channel will let the buffers be built up for the valid channels + $this->_get_channel_packet(-1); + $this->bitmap^= NET_SSH2_MASK_WINDOW_ADJUST; + } + + /* The maximum amount of data allowed is determined by the maximum + packet size for the channel, and the current window size, whichever + is smaller. + -- http://tools.ietf.org/html/rfc4254#section-5.2 */ + $max_size = min( + $this->packet_size_client_to_server[$client_channel], + $this->window_size_client_to_server[$client_channel] + ); + + $temp = $this->_string_shift($data, $max_size); + $packet = pack( + 'CN2a*', + NET_SSH2_MSG_CHANNEL_DATA, + $this->server_channels[$client_channel], + strlen($temp), + $temp + ); + $this->window_size_client_to_server[$client_channel]-= strlen($temp); + if (!$this->_send_binary_packet($packet)) { + return false; + } + } + + return true; + } + + /** + * Closes and flushes a channel + * + * Net_SSH2 doesn't properly close most channels. For exec() channels are normally closed by the server + * and for SFTP channels are presumably closed when the client disconnects. This functions is intended + * for SCP more than anything. + * + * @param int $client_channel + * @param bool $want_reply + * @return bool + * @access private + */ + function _close_channel($client_channel, $want_reply = false) + { + // see http://tools.ietf.org/html/rfc4254#section-5.3 + + $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); + + if (!$want_reply) { + $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); + } + + $this->channel_status[$client_channel] = NET_SSH2_MSG_CHANNEL_CLOSE; + + $this->curTimeout = 0; + + while (!is_bool($this->_get_channel_packet($client_channel))) { + } + + if ($want_reply) { + $this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); + } + + if ($this->bitmap & NET_SSH2_MASK_SHELL) { + $this->bitmap&= ~NET_SSH2_MASK_SHELL; + } + } + + /** + * Disconnect + * + * @param int $reason + * @return bool + * @access private + */ + function _disconnect($reason) + { + if ($this->bitmap & NET_SSH2_MASK_CONNECTED) { + $data = pack('CNNa*Na*', NET_SSH2_MSG_DISCONNECT, $reason, 0, '', 0, ''); + $this->_send_binary_packet($data); + $this->bitmap = 0; + fclose($this->fsock); + return false; + } + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param string $string + * @param int $index + * @return string + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } + + /** + * Define Array + * + * Takes any number of arrays whose indices are integers and whose values are strings and defines a bunch of + * named constants from it, using the value as the name of the constant and the index as the value of the constant. + * If any of the constants that would be defined already exists, none of the constants will be defined. + * + * @param array $array + * @access private + */ + function _define_array() + { + $args = func_get_args(); + foreach ($args as $arg) { + foreach ($arg as $key => $value) { + if (!defined($value)) { + define($value, $key); + } else { + break 2; + } + } + } + } + + /** + * Returns a log of the packets that have been sent and received. + * + * Returns a string if NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX, an array if NET_SSH2_LOGGING == NET_SSH2_LOG_SIMPLE and false if !defined('NET_SSH2_LOGGING') + * + * @access public + * @return array|false|string + */ + function getLog() + { + if (!defined('NET_SSH2_LOGGING')) { + return false; + } + + switch (NET_SSH2_LOGGING) { + case NET_SSH2_LOG_SIMPLE: + return $this->message_number_log; + case NET_SSH2_LOG_COMPLEX: + $log = $this->_format_log($this->message_log, $this->message_number_log); + return PHP_SAPI == 'cli' ? $log : '
      ' . $log . '
      '; + default: + return false; + } + } + + /** + * Formats a log for printing + * + * @param array $message_log + * @param array $message_number_log + * @access private + * @return string + */ + function _format_log($message_log, $message_number_log) + { + $output = ''; + for ($i = 0; $i < count($message_log); $i++) { + $output.= $message_number_log[$i] . "\r\n"; + $current_log = $message_log[$i]; + $j = 0; + do { + if (strlen($current_log)) { + $output.= str_pad(dechex($j), 7, '0', STR_PAD_LEFT) . '0 '; + } + $fragment = $this->_string_shift($current_log, $this->log_short_width); + $hex = substr(preg_replace_callback('#.#s', array($this, '_format_log_helper'), $fragment), strlen($this->log_boundary)); + // replace non ASCII printable characters with dots + // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters + // also replace < with a . since < messes up the output on web browsers + $raw = preg_replace('#[^\x20-\x7E]|<#', '.', $fragment); + $output.= str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n"; + $j++; + } while (strlen($current_log)); + $output.= "\r\n"; + } + + return $output; + } + + /** + * Helper function for _format_log + * + * For use with preg_replace_callback() + * + * @param array $matches + * @access private + * @return string + */ + function _format_log_helper($matches) + { + return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT); + } + + /** + * Helper function for agent->_on_channel_open() + * + * Used when channels are created to inform agent + * of said channel opening. Must be called after + * channel open confirmation received + * + * @access private + */ + function _on_channel_open() + { + if (isset($this->agent)) { + $this->agent->_on_channel_open($this); + } + } + + /** + * Returns the first value of the intersection of two arrays or false if + * the intersection is empty. The order is defined by the first parameter. + * + * @param array $array1 + * @param array $array2 + * @return mixed False if intersection is empty, else intersected value. + * @access private + */ + function _array_intersect_first($array1, $array2) + { + foreach ($array1 as $value) { + if (in_array($value, $array2)) { + return $value; + } + } + return false; + } + + /** + * Returns all errors + * + * @return string[] + * @access public + */ + function getErrors() + { + return $this->errors; + } + + /** + * Returns the last error + * + * @return string + * @access public + */ + function getLastError() + { + $count = count($this->errors); + + if ($count > 0) { + return $this->errors[$count - 1]; + } + } + + /** + * Return the server identification. + * + * @return string + * @access public + */ + function getServerIdentification() + { + $this->_connect(); + + return $this->server_identifier; + } + + /** + * Return a list of the key exchange algorithms the server supports. + * + * @return array + * @access public + */ + function getKexAlgorithms() + { + $this->_connect(); + + return $this->kex_algorithms; + } + + /** + * Return a list of the host key (public key) algorithms the server supports. + * + * @return array + * @access public + */ + function getServerHostKeyAlgorithms() + { + $this->_connect(); + + return $this->server_host_key_algorithms; + } + + /** + * Return a list of the (symmetric key) encryption algorithms the server supports, when receiving stuff from the client. + * + * @return array + * @access public + */ + function getEncryptionAlgorithmsClient2Server() + { + $this->_connect(); + + return $this->encryption_algorithms_client_to_server; + } + + /** + * Return a list of the (symmetric key) encryption algorithms the server supports, when sending stuff to the client. + * + * @return array + * @access public + */ + function getEncryptionAlgorithmsServer2Client() + { + $this->_connect(); + + return $this->encryption_algorithms_server_to_client; + } + + /** + * Return a list of the MAC algorithms the server supports, when receiving stuff from the client. + * + * @return array + * @access public + */ + function getMACAlgorithmsClient2Server() + { + $this->_connect(); + + return $this->mac_algorithms_client_to_server; + } + + /** + * Return a list of the MAC algorithms the server supports, when sending stuff to the client. + * + * @return array + * @access public + */ + function getMACAlgorithmsServer2Client() + { + $this->_connect(); + + return $this->mac_algorithms_server_to_client; + } + + /** + * Return a list of the compression algorithms the server supports, when receiving stuff from the client. + * + * @return array + * @access public + */ + function getCompressionAlgorithmsClient2Server() + { + $this->_connect(); + + return $this->compression_algorithms_client_to_server; + } + + /** + * Return a list of the compression algorithms the server supports, when sending stuff to the client. + * + * @return array + * @access public + */ + function getCompressionAlgorithmsServer2Client() + { + $this->_connect(); + + return $this->compression_algorithms_server_to_client; + } + + /** + * Return a list of the languages the server supports, when sending stuff to the client. + * + * @return array + * @access public + */ + function getLanguagesServer2Client() + { + $this->_connect(); + + return $this->languages_server_to_client; + } + + /** + * Return a list of the languages the server supports, when receiving stuff from the client. + * + * @return array + * @access public + */ + function getLanguagesClient2Server() + { + $this->_connect(); + + return $this->languages_client_to_server; + } + + /** + * Returns the banner message. + * + * Quoting from the RFC, "in some jurisdictions, sending a warning message before + * authentication may be relevant for getting legal protection." + * + * @return string + * @access public + */ + function getBannerMessage() + { + return $this->banner_message; + } + + /** + * Returns the server public host key. + * + * Caching this the first time you connect to a server and checking the result on subsequent connections + * is recommended. Returns false if the server signature is not signed correctly with the public host key. + * + * @return mixed + * @access public + */ + function getServerPublicHostKey() + { + if (!($this->bitmap & NET_SSH2_MASK_CONSTRUCTOR)) { + if (!$this->_connect()) { + return false; + } + } + + $signature = $this->signature; + $server_public_host_key = $this->server_public_host_key; + + if (strlen($server_public_host_key) < 4) { + return false; + } + extract(unpack('Nlength', $this->_string_shift($server_public_host_key, 4))); + $this->_string_shift($server_public_host_key, $length); + + if ($this->signature_validated) { + return $this->bitmap ? + $this->signature_format . ' ' . base64_encode($this->server_public_host_key) : + false; + } + + $this->signature_validated = true; + + switch ($this->signature_format) { + case 'ssh-dss': + $zero = new Math_BigInteger(); + + if (strlen($server_public_host_key) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $p = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); + + if (strlen($server_public_host_key) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $q = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); + + if (strlen($server_public_host_key) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $g = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); + + if (strlen($server_public_host_key) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $y = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); + + /* The value for 'dss_signature_blob' is encoded as a string containing + r, followed by s (which are 160-bit integers, without lengths or + padding, unsigned, and in network byte order). */ + $temp = unpack('Nlength', $this->_string_shift($signature, 4)); + if ($temp['length'] != 40) { + user_error('Invalid signature'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $r = new Math_BigInteger($this->_string_shift($signature, 20), 256); + $s = new Math_BigInteger($this->_string_shift($signature, 20), 256); + + switch (true) { + case $r->equals($zero): + case $r->compare($q) >= 0: + case $s->equals($zero): + case $s->compare($q) >= 0: + user_error('Invalid signature'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $w = $s->modInverse($q); + + $u1 = $w->multiply(new Math_BigInteger(sha1($this->exchange_hash), 16)); + list(, $u1) = $u1->divide($q); + + $u2 = $w->multiply($r); + list(, $u2) = $u2->divide($q); + + $g = $g->modPow($u1, $p); + $y = $y->modPow($u2, $p); + + $v = $g->multiply($y); + list(, $v) = $v->divide($p); + list(, $v) = $v->divide($q); + + if (!$v->equals($r)) { + user_error('Bad server signature'); + return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); + } + + break; + case 'ssh-rsa': + case 'rsa-sha2-256': + case 'rsa-sha2-512': + if (strlen($server_public_host_key) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $e = new Math_BigInteger($this->_string_shift($server_public_host_key, $temp['length']), -256); + + if (strlen($server_public_host_key) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($server_public_host_key, 4)); + $rawN = $this->_string_shift($server_public_host_key, $temp['length']); + $n = new Math_BigInteger($rawN, -256); + $nLength = strlen(ltrim($rawN, "\0")); + + /* + if (strlen($signature) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($signature, 4)); + $signature = $this->_string_shift($signature, $temp['length']); + + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + + $rsa = new Crypt_RSA(); + switch ($this->signature_format) { + case 'rsa-sha2-512': + $hash = 'sha512'; + break; + case 'rsa-sha2-256': + $hash = 'sha256'; + break; + //case 'ssh-rsa': + default: + $hash = 'sha1'; + } + $rsa->setHash($hash); + $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); + $rsa->loadKey(array('e' => $e, 'n' => $n), CRYPT_RSA_PUBLIC_FORMAT_RAW); + if (!$rsa->verify($this->exchange_hash, $signature)) { + user_error('Bad server signature'); + return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); + } + */ + + if (strlen($signature) < 4) { + return false; + } + $temp = unpack('Nlength', $this->_string_shift($signature, 4)); + $s = new Math_BigInteger($this->_string_shift($signature, $temp['length']), 256); + + // validate an RSA signature per "8.2 RSASSA-PKCS1-v1_5", "5.2.2 RSAVP1", and "9.1 EMSA-PSS" in the + // following URL: + // ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf + + // also, see SSHRSA.c (rsa2_verifysig) in PuTTy's source. + + if ($s->compare(new Math_BigInteger()) < 0 || $s->compare($n->subtract(new Math_BigInteger(1))) > 0) { + user_error('Invalid signature'); + return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); + } + + $s = $s->modPow($e, $n); + $s = $s->toBytes(); + + switch ($this->signature_format) { + case 'rsa-sha2-512': + $hash = 'sha512'; + break; + case 'rsa-sha2-256': + $hash = 'sha256'; + break; + //case 'ssh-rsa': + default: + $hash = 'sha1'; + } + $hashObj = new Crypt_Hash($hash); + switch ($this->signature_format) { + case 'rsa-sha2-512': + $h = pack('N5a*', 0x00305130, 0x0D060960, 0x86480165, 0x03040203, 0x05000440, $hashObj->hash($this->exchange_hash)); + break; + case 'rsa-sha2-256': + $h = pack('N5a*', 0x00303130, 0x0D060960, 0x86480165, 0x03040201, 0x05000420, $hashObj->hash($this->exchange_hash)); + break; + //case 'ssh-rsa': + default: + $hash = 'sha1'; + $h = pack('N4a*', 0x00302130, 0x0906052B, 0x0E03021A, 0x05000414, $hashObj->hash($this->exchange_hash)); + } + $h = chr(0x01) . str_repeat(chr(0xFF), $nLength - 2 - strlen($h)) . $h; + + if ($s != $h) { + user_error('Bad server signature'); + return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); + } + break; + default: + user_error('Unsupported signature format'); + return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); + } + + return $this->signature_format . ' ' . base64_encode($this->server_public_host_key); + } + + /** + * Returns the exit status of an SSH command or false. + * + * @return false|int + * @access public + */ + function getExitStatus() + { + if (is_null($this->exit_status)) { + return false; + } + return $this->exit_status; + } + + /** + * Returns the number of columns for the terminal window size. + * + * @return int + * @access public + */ + function getWindowColumns() + { + return $this->windowColumns; + } + + /** + * Returns the number of rows for the terminal window size. + * + * @return int + * @access public + */ + function getWindowRows() + { + return $this->windowRows; + } + + /** + * Sets the number of columns for the terminal window size. + * + * @param int $value + * @access public + */ + function setWindowColumns($value) + { + $this->windowColumns = $value; + } + + /** + * Sets the number of rows for the terminal window size. + * + * @param int $value + * @access public + */ + function setWindowRows($value) + { + $this->windowRows = $value; + } + + /** + * Sets the number of columns and rows for the terminal window size. + * + * @param int $columns + * @param int $rows + * @access public + */ + function setWindowSize($columns = 80, $rows = 24) + { + $this->windowColumns = $columns; + $this->windowRows = $rows; + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/System/SSH/Agent.php b/rainloop/v/0.0.0/app/libraries/phpseclib/System/SSH/Agent.php old mode 100644 new mode 100755 index 4c0ef733d..c44ca4062 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/System/SSH/Agent.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/System/SSH/Agent.php @@ -1,313 +1,561 @@ - - * login('username', $agent)) { - * exit('Login Failed'); - * } - * - * echo $ssh->exec('pwd'); - * echo $ssh->exec('ls -la'); - * ?> - * - * - * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @category System - * @package System_SSH_Agent - * @author Jim Wigginton - * @copyright 2014 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - * @internal See http://api.libssh.org/rfc/PROTOCOL.agent - */ - -/**#@+ - * Message numbers - * - * @access private - */ -// to request SSH1 keys you have to use SSH_AGENTC_REQUEST_RSA_IDENTITIES (1) -define('SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES', 11); -// this is the SSH2 response; the SSH1 response is SSH_AGENT_RSA_IDENTITIES_ANSWER (2). -define('SYSTEM_SSH_AGENT_IDENTITIES_ANSWER', 12); -define('SYSTEM_SSH_AGENT_FAILURE', 5); -// the SSH1 request is SSH_AGENTC_RSA_CHALLENGE (3) -define('SYSTEM_SSH_AGENTC_SIGN_REQUEST', 13); -// the SSH1 response is SSH_AGENT_RSA_RESPONSE (4) -define('SYSTEM_SSH_AGENT_SIGN_RESPONSE', 14); -/**#@-*/ - -/** - * Pure-PHP ssh-agent client identity object - * - * Instantiation should only be performed by System_SSH_Agent class. - * This could be thought of as implementing an interface that Crypt_RSA - * implements. ie. maybe a Net_SSH_Auth_PublicKey interface or something. - * The methods in this interface would be getPublicKey, setSignatureMode - * and sign since those are the methods phpseclib looks for to perform - * public key authentication. - * - * @package System_SSH_Agent - * @author Jim Wigginton - * @access internal - */ -class System_SSH_Agent_Identity -{ - /** - * Key Object - * - * @var Crypt_RSA - * @access private - * @see System_SSH_Agent_Identity::getPublicKey() - */ - var $key; - - /** - * Key Blob - * - * @var String - * @access private - * @see System_SSH_Agent_Identity::sign() - */ - var $key_blob; - - /** - * Socket Resource - * - * @var Resource - * @access private - * @see System_SSH_Agent_Identity::sign() - */ - var $fsock; - - /** - * Default Constructor. - * - * @param Resource $fsock - * @return System_SSH_Agent_Identity - * @access private - */ - function System_SSH_Agent_Identity($fsock) - { - $this->fsock = $fsock; - } - - /** - * Set Public Key - * - * Called by System_SSH_Agent::requestIdentities() - * - * @param Crypt_RSA $key - * @access private - */ - function setPublicKey($key) - { - $this->key = $key; - $this->key->setPublicKey(); - } - - /** - * Set Public Key - * - * Called by System_SSH_Agent::requestIdentities(). The key blob could be extracted from $this->key - * but this saves a small amount of computation. - * - * @param String $key_blob - * @access private - */ - function setPublicKeyBlob($key_blob) - { - $this->key_blob = $key_blob; - } - - /** - * Get Public Key - * - * Wrapper for $this->key->getPublicKey() - * - * @param Integer $format optional - * @return Mixed - * @access public - */ - function getPublicKey($format = null) - { - return !isset($format) ? $this->key->getPublicKey() : $this->key->getPublicKey($format); - } - - /** - * Set Signature Mode - * - * Doesn't do anything as ssh-agent doesn't let you pick and choose the signature mode. ie. - * ssh-agent's only supported mode is CRYPT_RSA_SIGNATURE_PKCS1 - * - * @param Integer $mode - * @access public - */ - function setSignatureMode($mode) - { - } - - /** - * Create a signature - * - * See "2.6.2 Protocol 2 private key signature request" - * - * @param String $message - * @return String - * @access public - */ - function sign($message) - { - // the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE - $packet = pack('CNa*Na*N', SYSTEM_SSH_AGENTC_SIGN_REQUEST, strlen($this->key_blob), $this->key_blob, strlen($message), $message, 0); - $packet = pack('Na*', strlen($packet), $packet); - if (strlen($packet) != fputs($this->fsock, $packet)) { - user_error('Connection closed during signing'); - } - - $length = current(unpack('N', fread($this->fsock, 4))); - $type = ord(fread($this->fsock, 1)); - if ($type != SYSTEM_SSH_AGENT_SIGN_RESPONSE) { - user_error('Unable to retreive signature'); - } - - $signature_blob = fread($this->fsock, $length - 1); - // the only other signature format defined - ssh-dss - is the same length as ssh-rsa - // the + 12 is for the other various SSH added length fields - return substr($signature_blob, strlen('ssh-rsa') + 12); - } -} - -/** - * Pure-PHP ssh-agent client identity factory - * - * requestIdentities() method pumps out System_SSH_Agent_Identity objects - * - * @package System_SSH_Agent - * @author Jim Wigginton - * @access internal - */ -class System_SSH_Agent -{ - /** - * Socket Resource - * - * @var Resource - * @access private - */ - var $fsock; - - /** - * Default Constructor - * - * @return System_SSH_Agent - * @access public - */ - function System_SSH_Agent() - { - switch (true) { - case isset($_SERVER['SSH_AUTH_SOCK']): - $address = $_SERVER['SSH_AUTH_SOCK']; - break; - case isset($_ENV['SSH_AUTH_SOCK']): - $address = $_ENV['SSH_AUTH_SOCK']; - break; - default: - user_error('SSH_AUTH_SOCK not found'); - return false; - } - - $this->fsock = fsockopen('unix://' . $address, 0, $errno, $errstr); - if (!$this->fsock) { - user_error("Unable to connect to ssh-agent (Error $errno: $errstr)"); - } - } - - /** - * Request Identities - * - * See "2.5.2 Requesting a list of protocol 2 keys" - * Returns an array containing zero or more System_SSH_Agent_Identity objects - * - * @return Array - * @access public - */ - function requestIdentities() - { - if (!$this->fsock) { - return array(); - } - - $packet = pack('NC', 1, SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES); - if (strlen($packet) != fputs($this->fsock, $packet)) { - user_error('Connection closed while requesting identities'); - } - - $length = current(unpack('N', fread($this->fsock, 4))); - $type = ord(fread($this->fsock, 1)); - if ($type != SYSTEM_SSH_AGENT_IDENTITIES_ANSWER) { - user_error('Unable to request identities'); - } - - $identities = array(); - $keyCount = current(unpack('N', fread($this->fsock, 4))); - for ($i = 0; $i < $keyCount; $i++) { - $length = current(unpack('N', fread($this->fsock, 4))); - $key_blob = fread($this->fsock, $length); - $length = current(unpack('N', fread($this->fsock, 4))); - $key_comment = fread($this->fsock, $length); - $length = current(unpack('N', substr($key_blob, 0, 4))); - $key_type = substr($key_blob, 4, $length); - switch ($key_type) { - case 'ssh-rsa': - if (!class_exists('Crypt_RSA')) { - include_once 'Crypt/RSA.php'; - } - $key = new Crypt_RSA(); - $key->loadKey('ssh-rsa ' . base64_encode($key_blob) . ' ' . $key_comment); - break; - case 'ssh-dss': - // not currently supported - break; - } - // resources are passed by reference by default - if (isset($key)) { - $identity = new System_SSH_Agent_Identity($this->fsock); - $identity->setPublicKey($key); - $identity->setPublicKeyBlob($key_blob); - $identities[] = $identity; - unset($key); - } - } - - return $identities; - } -} + + * login('username', $agent)) { + * exit('Login Failed'); + * } + * + * echo $ssh->exec('pwd'); + * echo $ssh->exec('ls -la'); + * ?> + * + * + * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @category System + * @package System_SSH_Agent + * @author Jim Wigginton + * @copyright 2014 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + * @internal See http://api.libssh.org/rfc/PROTOCOL.agent + */ + +/**#@+ + * Message numbers + * + * @access private + */ +// to request SSH1 keys you have to use SSH_AGENTC_REQUEST_RSA_IDENTITIES (1) +define('SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES', 11); +// this is the SSH2 response; the SSH1 response is SSH_AGENT_RSA_IDENTITIES_ANSWER (2). +define('SYSTEM_SSH_AGENT_IDENTITIES_ANSWER', 12); +define('SYSTEM_SSH_AGENT_FAILURE', 5); +// the SSH1 request is SSH_AGENTC_RSA_CHALLENGE (3) +define('SYSTEM_SSH_AGENTC_SIGN_REQUEST', 13); +// the SSH1 response is SSH_AGENT_RSA_RESPONSE (4) +define('SYSTEM_SSH_AGENT_SIGN_RESPONSE', 14); +/**#@-*/ + +/**@+ + * Agent forwarding status + * + * @access private + */ +// no forwarding requested and not active +define('SYSTEM_SSH_AGENT_FORWARD_NONE', 0); +// request agent forwarding when opportune +define('SYSTEM_SSH_AGENT_FORWARD_REQUEST', 1); +// forwarding has been request and is active +define('SYSTEM_SSH_AGENT_FORWARD_ACTIVE', 2); +/**#@-*/ + +/**@+ + * Signature Flags + * + * See https://tools.ietf.org/html/draft-miller-ssh-agent-00#section-5.3 + * + * @access private + */ +define('SYSTEM_SSH_AGENT_RSA2_256', 2); +define('SYSTEM_SSH_AGENT_RSA2_512', 4); +/**#@-*/ + +/** + * Pure-PHP ssh-agent client identity object + * + * Instantiation should only be performed by System_SSH_Agent class. + * This could be thought of as implementing an interface that Crypt_RSA + * implements. ie. maybe a Net_SSH_Auth_PublicKey interface or something. + * The methods in this interface would be getPublicKey, setSignatureMode + * and sign since those are the methods phpseclib looks for to perform + * public key authentication. + * + * @package System_SSH_Agent + * @author Jim Wigginton + * @access internal + */ +class System_SSH_Agent_Identity +{ + /** + * Key Object + * + * @var Crypt_RSA + * @access private + * @see self::getPublicKey() + */ + var $key; + + /** + * Key Blob + * + * @var string + * @access private + * @see self::sign() + */ + var $key_blob; + + /** + * Socket Resource + * + * @var resource + * @access private + * @see self::sign() + */ + var $fsock; + + /** + * Signature flags + * + * @var int + * @access private + * @see self::sign() + * @see self::setHash() + */ + var $flags = 0; + + /** + * Default Constructor. + * + * @param resource $fsock + * @return System_SSH_Agent_Identity + * @access private + */ + function __construct($fsock) + { + $this->fsock = $fsock; + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @param resource $fsock + * @access public + */ + function System_SSH_Agent_Identity($fsock) + { + $this->__construct($fsock); + } + + /** + * Set Public Key + * + * Called by System_SSH_Agent::requestIdentities() + * + * @param Crypt_RSA $key + * @access private + */ + function setPublicKey($key) + { + $this->key = $key; + $this->key->setPublicKey(); + } + + /** + * Set Public Key + * + * Called by System_SSH_Agent::requestIdentities(). The key blob could be extracted from $this->key + * but this saves a small amount of computation. + * + * @param string $key_blob + * @access private + */ + function setPublicKeyBlob($key_blob) + { + $this->key_blob = $key_blob; + } + + /** + * Get Public Key + * + * Wrapper for $this->key->getPublicKey() + * + * @param int $format optional + * @return mixed + * @access public + */ + function getPublicKey($format = null) + { + return !isset($format) ? $this->key->getPublicKey() : $this->key->getPublicKey($format); + } + + /** + * Set Signature Mode + * + * Doesn't do anything as ssh-agent doesn't let you pick and choose the signature mode. ie. + * ssh-agent's only supported mode is CRYPT_RSA_SIGNATURE_PKCS1 + * + * @param int $mode + * @access public + */ + function setSignatureMode($mode) + { + } + + /** + * Set Hash + * + * ssh-agent doesn't support using hashes for RSA other than SHA1 + * + * @param string $hash + * @access public + */ + function setHash($hash) + { + $this->flags = 0; + switch ($hash) { + case 'sha1': + break; + case 'sha256': + $this->flags = SYSTEM_SSH_AGENT_RSA2_256; + break; + case 'sha512': + $this->flags = SYSTEM_SSH_AGENT_RSA2_512; + break; + default: + user_error('The only supported hashes for RSA are sha1, sha256 and sha512'); + } + } + + /** + * Create a signature + * + * See "2.6.2 Protocol 2 private key signature request" + * + * @param string $message + * @return string + * @access public + */ + function sign($message) + { + // the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE + $packet = pack('CNa*Na*N', SYSTEM_SSH_AGENTC_SIGN_REQUEST, strlen($this->key_blob), $this->key_blob, strlen($message), $message, $this->flags); + $packet = pack('Na*', strlen($packet), $packet); + if (strlen($packet) != fputs($this->fsock, $packet)) { + user_error('Connection closed during signing'); + } + + $length = current(unpack('N', fread($this->fsock, 4))); + $type = ord(fread($this->fsock, 1)); + if ($type != SYSTEM_SSH_AGENT_SIGN_RESPONSE) { + user_error('Unable to retreive signature'); + } + + $signature_blob = fread($this->fsock, $length - 1); + $length = current(unpack('N', $this->_string_shift($signature_blob, 4))); + if ($length != strlen($signature_blob)) { + user_error('Malformed signature blob'); + } + $length = current(unpack('N', $this->_string_shift($signature_blob, 4))); + if ($length > strlen($signature_blob) + 4) { + user_error('Malformed signature blob'); + } + $type = $this->_string_shift($signature_blob, $length); + $this->_string_shift($signature_blob, 4); + + return $signature_blob; + } + + /** + * String Shift + * + * Inspired by array_shift + * + * @param string $string + * @param int $index + * @return string + * @access private + */ + function _string_shift(&$string, $index = 1) + { + $substr = substr($string, 0, $index); + $string = substr($string, $index); + return $substr; + } +} + +/** + * Pure-PHP ssh-agent client identity factory + * + * requestIdentities() method pumps out System_SSH_Agent_Identity objects + * + * @package System_SSH_Agent + * @author Jim Wigginton + * @access public + */ +class System_SSH_Agent +{ + /** + * Socket Resource + * + * @var resource + * @access private + */ + var $fsock; + + /** + * Agent forwarding status + * + * @access private + */ + var $forward_status = SYSTEM_SSH_AGENT_FORWARD_NONE; + + /** + * Buffer for accumulating forwarded authentication + * agent data arriving on SSH data channel destined + * for agent unix socket + * + * @access private + */ + var $socket_buffer = ''; + + /** + * Tracking the number of bytes we are expecting + * to arrive for the agent socket on the SSH data + * channel + */ + var $expected_bytes = 0; + + /** + * Default Constructor + * + * @return System_SSH_Agent + * @access public + */ + function __construct($address = null) + { + if (!$address) { + switch (true) { + case isset($_SERVER['SSH_AUTH_SOCK']): + $address = $_SERVER['SSH_AUTH_SOCK']; + break; + case isset($_ENV['SSH_AUTH_SOCK']): + $address = $_ENV['SSH_AUTH_SOCK']; + break; + default: + user_error('SSH_AUTH_SOCK not found'); + return false; + } + } + + $this->fsock = fsockopen('unix://' . $address, 0, $errno, $errstr); + if (!$this->fsock) { + user_error("Unable to connect to ssh-agent (Error $errno: $errstr)"); + } + } + + /** + * PHP4 compatible Default Constructor. + * + * @see self::__construct() + * @access public + */ + function System_SSH_Agent($address = null) + { + $this->__construct($address); + } + + /** + * Request Identities + * + * See "2.5.2 Requesting a list of protocol 2 keys" + * Returns an array containing zero or more System_SSH_Agent_Identity objects + * + * @return array + * @access public + */ + function requestIdentities() + { + if (!$this->fsock) { + return array(); + } + + $packet = pack('NC', 1, SYSTEM_SSH_AGENTC_REQUEST_IDENTITIES); + if (strlen($packet) != fputs($this->fsock, $packet)) { + user_error('Connection closed while requesting identities'); + return array(); + } + + $length = current(unpack('N', fread($this->fsock, 4))); + $type = ord(fread($this->fsock, 1)); + if ($type != SYSTEM_SSH_AGENT_IDENTITIES_ANSWER) { + user_error('Unable to request identities'); + return array(); + } + + $identities = array(); + $keyCount = current(unpack('N', fread($this->fsock, 4))); + for ($i = 0; $i < $keyCount; $i++) { + $length = current(unpack('N', fread($this->fsock, 4))); + $key_blob = fread($this->fsock, $length); + $key_str = 'ssh-rsa ' . base64_encode($key_blob); + $length = current(unpack('N', fread($this->fsock, 4))); + if ($length) { + $key_str.= ' ' . fread($this->fsock, $length); + } + $length = current(unpack('N', substr($key_blob, 0, 4))); + $key_type = substr($key_blob, 4, $length); + switch ($key_type) { + case 'ssh-rsa': + if (!class_exists('Crypt_RSA')) { + include_once 'Crypt/RSA.php'; + } + $key = new Crypt_RSA(); + $key->loadKey($key_str); + break; + case 'ssh-dss': + // not currently supported + break; + } + // resources are passed by reference by default + if (isset($key)) { + $identity = new System_SSH_Agent_Identity($this->fsock); + $identity->setPublicKey($key); + $identity->setPublicKeyBlob($key_blob); + $identities[] = $identity; + unset($key); + } + } + + return $identities; + } + + /** + * Signal that agent forwarding should + * be requested when a channel is opened + * + * @param Net_SSH2 $ssh + * @return bool + * @access public + */ + function startSSHForwarding($ssh) + { + if ($this->forward_status == SYSTEM_SSH_AGENT_FORWARD_NONE) { + $this->forward_status = SYSTEM_SSH_AGENT_FORWARD_REQUEST; + } + } + + /** + * Request agent forwarding of remote server + * + * @param Net_SSH2 $ssh + * @return bool + * @access private + */ + function _request_forwarding($ssh) + { + $request_channel = $ssh->_get_open_channel(); + if ($request_channel === false) { + return false; + } + + $packet = pack( + 'CNNa*C', + NET_SSH2_MSG_CHANNEL_REQUEST, + $ssh->server_channels[$request_channel], + strlen('auth-agent-req@openssh.com'), + 'auth-agent-req@openssh.com', + 1 + ); + + $ssh->channel_status[$request_channel] = NET_SSH2_MSG_CHANNEL_REQUEST; + + if (!$ssh->_send_binary_packet($packet)) { + return false; + } + + $response = $ssh->_get_channel_packet($request_channel); + if ($response === false) { + return false; + } + + $ssh->channel_status[$request_channel] = NET_SSH2_MSG_CHANNEL_OPEN; + $this->forward_status = SYSTEM_SSH_AGENT_FORWARD_ACTIVE; + + return true; + } + + /** + * On successful channel open + * + * This method is called upon successful channel + * open to give the SSH Agent an opportunity + * to take further action. i.e. request agent forwarding + * + * @param Net_SSH2 $ssh + * @access private + */ + function _on_channel_open($ssh) + { + if ($this->forward_status == SYSTEM_SSH_AGENT_FORWARD_REQUEST) { + $this->_request_forwarding($ssh); + } + } + + /** + * Forward data to SSH Agent and return data reply + * + * @param string $data + * @return data from SSH Agent + * @access private + */ + function _forward_data($data) + { + if ($this->expected_bytes > 0) { + $this->socket_buffer.= $data; + $this->expected_bytes -= strlen($data); + } else { + $agent_data_bytes = current(unpack('N', $data)); + $current_data_bytes = strlen($data); + $this->socket_buffer = $data; + if ($current_data_bytes != $agent_data_bytes + 4) { + $this->expected_bytes = ($agent_data_bytes + 4) - $current_data_bytes; + return false; + } + } + + if (strlen($this->socket_buffer) != fwrite($this->fsock, $this->socket_buffer)) { + user_error('Connection closed attempting to forward data to SSH agent'); + } + + $this->socket_buffer = ''; + $this->expected_bytes = 0; + + $agent_reply_bytes = current(unpack('N', fread($this->fsock, 4))); + + $agent_reply_data = fread($this->fsock, $agent_reply_bytes); + $agent_reply_data = current(unpack('a*', $agent_reply_data)); + + return pack('Na*', $agent_reply_bytes, $agent_reply_data); + } +} diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/System/SSH_Agent.php b/rainloop/v/0.0.0/app/libraries/phpseclib/System/SSH_Agent.php old mode 100644 new mode 100755 index ea434b9c5..2800ea007 --- a/rainloop/v/0.0.0/app/libraries/phpseclib/System/SSH_Agent.php +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/System/SSH_Agent.php @@ -1,39 +1,39 @@ - - * @copyright 2014 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - * @internal See http://api.libssh.org/rfc/PROTOCOL.agent - */ - -require_once 'SSH/Agent.php'; + + * @copyright 2014 Jim Wigginton + * @license http://www.opensource.org/licenses/mit-license.html MIT License + * @link http://phpseclib.sourceforge.net + * @internal See http://api.libssh.org/rfc/PROTOCOL.agent + */ + +require_once 'SSH/Agent.php'; diff --git a/rainloop/v/0.0.0/app/libraries/phpseclib/bootstrap.php b/rainloop/v/0.0.0/app/libraries/phpseclib/bootstrap.php new file mode 100755 index 000000000..95d5d6fbb --- /dev/null +++ b/rainloop/v/0.0.0/app/libraries/phpseclib/bootstrap.php @@ -0,0 +1,16 @@ +

    ZOQUOI;?I7%G{R9uDyu}b~e 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