Total Upkeep – WordPress Backup Plugin plus Restore & Migrate by BoldGrid - Version 1.7.0

Version Description

Release date: Dec 4th, 2018

  • New feature: Added auto-update settings for individual plugins and themes.
  • New feature: Added limited-lifetime download links for archive files.
  • New feature: Added import backup archive from URL address.
  • New feature: Added progress bar to show status of backups.
  • New feature: Adding the ability to set and title and description to a backup.
  • New feature: Adding the ability to flag a backup as being proteced (excluded from retention).
  • Update: Update protection is now valid for 1 hour after a full backup from the WordPress Updates or Plugins page.
  • Update: Made the Backup Archives page the default page in the admin menu.
  • Bug fix: Set a default backup directory if path in settings is not valid. Remove filters before fixing home and siteurl on restore.
  • Bug fix: Some HTML was caught in translations.
  • Bug fix: Duplicate emails were sent when a backup was complete, fixed.
  • Bug fix: Preserve timestamp on ftp / sftp uploads.
  • Bug fix: Fixed CLI support detection on some EA4 servers.
  • Update: Save settings and reload to the current section.
  • Update: Reorganized settings sections.
Download this release

Release Info

Developer boldgrid
Plugin Icon 128x128 Total Upkeep – WordPress Backup Plugin plus Restore & Migrate by BoldGrid
Version 1.7.0
Comparing to
See all releases

Code changes from version 1.6.6 to 1.7.0

Files changed (136) hide show
  1. admin/class-boldgrid-backup-admin-archive-actions.php +93 -0
  2. admin/class-boldgrid-backup-admin-archive-details.php +33 -1
  3. admin/class-boldgrid-backup-admin-archive-log.php +15 -5
  4. admin/class-boldgrid-backup-admin-archive.php +118 -7
  5. admin/class-boldgrid-backup-admin-archives.php +23 -7
  6. admin/class-boldgrid-backup-admin-auto-rollback.php +47 -5
  7. admin/class-boldgrid-backup-admin-backup-dir.php +48 -2
  8. admin/class-boldgrid-backup-admin-config.php +9 -4
  9. admin/class-boldgrid-backup-admin-core.php +95 -56
  10. admin/class-boldgrid-backup-admin-db-dump.php +8 -0
  11. admin/class-boldgrid-backup-admin-email.php +1 -1
  12. admin/class-boldgrid-backup-admin-go-pro.php +19 -2
  13. admin/class-boldgrid-backup-admin-in-progress-data.php +123 -0
  14. admin/class-boldgrid-backup-admin-in-progress.php +64 -9
  15. admin/class-boldgrid-backup-admin-notice.php +19 -0
  16. admin/class-boldgrid-backup-admin-remote.php +4 -10
  17. admin/class-boldgrid-backup-admin-settings.php +78 -142
  18. admin/class-boldgrid-backup-admin-support.php +82 -0
  19. admin/class-boldgrid-backup-admin-test.php +77 -55
  20. admin/class-boldgrid-backup-admin-upload.php +144 -18
  21. admin/class-boldgrid-backup-admin-utility.php +19 -0
  22. admin/class-boldgrid-backup-admin-xhprof.php +6 -3
  23. admin/class-boldgrid-backup-admin.php +19 -0
  24. admin/compressor/class-boldgrid-backup-admin-compressor-php-zip.php +54 -2
  25. admin/css/boldgrid-backup-admin-home.css +4 -0
  26. admin/css/boldgrid-backup-admin-settings.css +5 -1
  27. admin/css/boldgrid-backup-admin.css +127 -3
  28. admin/js/boldgrid-backup-admin-archive-actions.js +97 -0
  29. admin/js/boldgrid-backup-admin-archive-details.js +75 -1
  30. admin/js/boldgrid-backup-admin-backup-now.js +7 -1
  31. admin/js/boldgrid-backup-admin-ftp-settings.js +15 -7
  32. admin/js/boldgrid-backup-admin-home.js +98 -0
  33. admin/js/boldgrid-backup-admin-in-progress.js +446 -0
  34. admin/js/boldgrid-backup-admin-settings-autoupdate.js +195 -0
  35. admin/js/boldgrid-backup-admin-settings.js +0 -27
  36. admin/js/boldgrid-backup-admin-update-selectors.js +4 -1
  37. admin/js/boldgrid-backup-admin.js +0 -63
  38. admin/partials/archives/add-new.php +13 -3
  39. admin/partials/backup-now-modal/title.php +28 -0
  40. admin/partials/boldgrid-backup-admin-archive-details.php +80 -28
  41. admin/partials/boldgrid-backup-admin-backup-button.php +5 -2
  42. admin/partials/boldgrid-backup-admin-backup-modal.php +4 -1
  43. admin/partials/boldgrid-backup-admin-home.php +9 -4
  44. admin/partials/boldgrid-backup-admin-settings.php +35 -26
  45. admin/partials/boldgrid-backup-admin-test.php +10 -0
  46. admin/partials/remote/ftp.php +1 -8
  47. admin/partials/remote/local.php +33 -0
  48. admin/partials/settings/auto-backup.php +69 -0
  49. admin/partials/settings/auto-rollback.php +62 -0
  50. admin/partials/settings/auto-updates.php +0 -192
  51. admin/partials/settings/backup-directory.php +17 -18
  52. admin/partials/settings/connect-key.php +7 -58
  53. admin/partials/settings/retention.php +18 -32
  54. admin/partials/settings/scheduler.php +9 -7
  55. admin/partials/settings/storage.php +9 -10
  56. admin/partials/tools/local-remote.php +2 -1
  57. admin/remote/class-boldgrid-backup-admin-ftp-hooks.php +15 -7
  58. admin/remote/class-boldgrid-backup-admin-ftp-page.php +54 -25
  59. admin/remote/class-boldgrid-backup-admin-ftp.php +83 -10
  60. admin/storage/class-boldgrid-backup-admin-storage-local.php +210 -0
  61. boldgrid-backup.php +14 -33
  62. build/clipboard.min.js +7 -0
  63. cron/cli-support.php +8 -4
  64. includes/class-boldgrid-backup-activator.php +15 -13
  65. includes/class-boldgrid-backup-authentication.php +80 -0
  66. includes/class-boldgrid-backup-download.php +67 -0
  67. includes/class-boldgrid-backup-file.php +70 -0
  68. includes/class-boldgrid-backup.php +33 -2
  69. includes/config/config.plugin.php +4 -12
  70. includes/config/config.sample.php +3 -3
  71. readme.txt +24 -9
  72. vendor/autoload.php +1 -1
  73. vendor/boldgrid/library/.gitignore +1 -0
  74. vendor/boldgrid/library/.travis.yml +22 -54
  75. vendor/boldgrid/library/README.md +59 -0
  76. vendor/boldgrid/library/composer.json +5 -0
  77. vendor/boldgrid/library/gulpfile.js +8 -0
  78. vendor/boldgrid/library/package-lock.json +0 -1907
  79. vendor/boldgrid/library/package.json +5 -2
  80. vendor/boldgrid/library/src/Library/Api/Call.php +1 -1
  81. vendor/boldgrid/library/src/Library/Editor.php +42 -0
  82. vendor/boldgrid/library/src/Library/License.php +26 -10
  83. vendor/boldgrid/library/src/Library/Menu/External.php +5 -5
  84. vendor/boldgrid/library/src/Library/Menu/Reseller.php +5 -5
  85. vendor/boldgrid/library/src/Library/Notice.php +10 -1
  86. vendor/boldgrid/library/src/Library/Notice/KeyPrompt.php +17 -2
  87. vendor/boldgrid/library/src/Library/Page/Connect.php +158 -6
  88. vendor/boldgrid/library/src/Library/Plugin/Checker.php +3 -3
  89. vendor/boldgrid/library/src/Library/ReleaseChannel.php +33 -28
  90. vendor/boldgrid/library/src/Library/Start.php +1 -0
  91. vendor/boldgrid/library/src/Library/Ui.php +15 -1
  92. vendor/boldgrid/library/src/Library/Update.php +144 -4
  93. vendor/boldgrid/library/src/Library/Views/Connect.php +69 -3
  94. vendor/boldgrid/library/src/Library/Views/Connect/AutoUpdates.php +358 -0
  95. vendor/boldgrid/library/src/Library/Views/Connect/ConnectKey.php +15 -0
  96. vendor/boldgrid/library/src/Library/Views/Connect/UpdateChannels.php +165 -0
  97. vendor/boldgrid/library/src/Library/Views/EnvatoFreeKey.php +3 -3
  98. vendor/boldgrid/library/src/Library/Views/KeyPrompt.php +23 -23
  99. vendor/boldgrid/library/src/Library/Views/KeyPromptMini.php +73 -0
  100. vendor/boldgrid/library/src/Util/Load.php +17 -0
  101. vendor/boldgrid/library/src/Util/Option.php +4 -5
  102. vendor/boldgrid/library/src/Util/Version.php +9 -2
  103. vendor/boldgrid/library/src/assets/css/admin.css +131 -1
  104. vendor/boldgrid/library/src/assets/css/api-notice.css +34 -0
  105. vendor/boldgrid/library/src/assets/css/attributes.css +39 -0
  106. vendor/boldgrid/library/src/assets/css/ui.css +4 -0
  107. vendor/boldgrid/library/src/assets/fonts/boldgrid.eot +0 -0
  108. vendor/boldgrid/library/src/assets/fonts/boldgrid.svg +5 -4
  109. vendor/boldgrid/library/src/assets/fonts/boldgrid.ttf +0 -0
  110. vendor/boldgrid/library/src/assets/fonts/boldgrid.woff +0 -0
  111. vendor/boldgrid/library/src/assets/js/api-notice.js +108 -68
  112. vendor/boldgrid/library/src/assets/js/attributes.js +255 -0
  113. vendor/boldgrid/library/src/assets/js/connect.js +111 -4
  114. vendor/boldgrid/library/src/assets/js/license.js +6 -8
  115. vendor/boldgrid/library/src/assets/js/notice.js +4 -5
  116. vendor/boldgrid/library/src/assets/js/sticky.js +306 -276
  117. vendor/boldgrid/library/src/assets/js/ui.js +24 -4
  118. vendor/boldgrid/library/yarn.lock +2112 -153
  119. vendor/cbschuld/browser.php +1 -1
  120. vendor/composer/ClassLoader.php +1 -1
  121. vendor/composer/autoload_classmap.php +44 -0
  122. vendor/composer/autoload_real.php +7 -7
  123. vendor/composer/autoload_static.php +51 -3
  124. vendor/composer/installed.json +16 -16
  125. vendor/phpseclib/phpseclib/README.md +1 -1
  126. vendor/phpseclib/phpseclib/appveyor.yml +27 -0
  127. vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php +3 -3
  128. vendor/phpseclib/phpseclib/phpseclib/Crypt/Hash.php +78 -20
  129. vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php +5 -4
  130. vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php +12 -0
  131. vendor/phpseclib/phpseclib/phpseclib/File/X509.php +10 -2
  132. vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php +0 -1
  133. vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php +11 -1
  134. vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php +175 -19
  135. vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php +2 -0
  136. vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php +12 -0
admin/class-boldgrid-backup-admin-archive-actions.php CHANGED
@@ -58,7 +58,18 @@ class Boldgrid_Backup_Admin_Archive_Actions {
58
  'boldgrid-backup'
59
  );
60
 
 
 
 
 
 
 
 
 
 
 
61
  $handle = 'boldgrid-backup-admin-archive-actions';
 
62
  wp_register_script(
63
  $handle,
64
  plugin_dir_url( __FILE__ ) . 'js/' . $handle . '.js',
@@ -66,14 +77,32 @@ class Boldgrid_Backup_Admin_Archive_Actions {
66
  BOLDGRID_BACKUP_VERSION,
67
  false
68
  );
 
69
  $translation = array(
70
  'accessType' => $access_type,
71
  'archiveNonce' => $archive_nonce,
72
  'deleteConfirmText' => $delete_confirm_text,
73
  'restoreConfirmText' => $restore_confirm_text,
 
 
 
 
 
 
74
  );
 
75
  wp_localize_script( $handle, 'BoldGridBackupAdminArchiveActions', $translation );
76
  wp_enqueue_script( $handle );
 
 
 
 
 
 
 
 
 
 
77
  }
78
 
79
  /**
@@ -190,4 +219,68 @@ class Boldgrid_Backup_Admin_Archive_Actions {
190
 
191
  return $button;
192
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
193
  }
58
  'boldgrid-backup'
59
  );
60
 
61
+ $link_error_text = __( 'Could not generate link.', 'boldgrid-backup' );
62
+ $unknown_error_text = __( 'Unknown error.', 'boldgrid-backup' );
63
+ $copy_text = __( 'Copy Link', 'boldgrid-backup' );
64
+ $copied_text = __( 'Copied!', 'boldgrid-backup' );
65
+ $expires_text = __( 'This link expires in:', 'boldgrid-backup' );
66
+ $link_disclaimer_text = __(
67
+ 'Please keep this link private, as the download file contains sensitive data.',
68
+ 'boldgrid-backup'
69
+ );
70
+
71
  $handle = 'boldgrid-backup-admin-archive-actions';
72
+
73
  wp_register_script(
74
  $handle,
75
  plugin_dir_url( __FILE__ ) . 'js/' . $handle . '.js',
77
  BOLDGRID_BACKUP_VERSION,
78
  false
79
  );
80
+
81
  $translation = array(
82
  'accessType' => $access_type,
83
  'archiveNonce' => $archive_nonce,
84
  'deleteConfirmText' => $delete_confirm_text,
85
  'restoreConfirmText' => $restore_confirm_text,
86
+ 'linkErrorText' => $link_error_text,
87
+ 'unknownErrorText' => $unknown_error_text,
88
+ 'copyText' => $copy_text,
89
+ 'copiedText' => $copied_text,
90
+ 'expiresText' => $expires_text,
91
+ 'linkDisclaimerText' => $link_disclaimer_text,
92
  );
93
+
94
  wp_localize_script( $handle, 'BoldGridBackupAdminArchiveActions', $translation );
95
  wp_enqueue_script( $handle );
96
+
97
+ // Enqueue the external clipboard script.
98
+ wp_enqueue_script(
99
+ 'clipboard',
100
+ plugin_dir_url( BOLDGRID_BACKUP_PATH . '/boldgrid-backup.php' ) .
101
+ '/build/clipboard.min.js',
102
+ array( 'jquery' ),
103
+ '2.0.1',
104
+ true
105
+ );
106
  }
107
 
108
  /**
219
 
220
  return $button;
221
  }
222
+
223
+ /**
224
+ * Return a button link to request to generate a public link to download an archive file.
225
+ *
226
+ * @since 1.7.0
227
+ *
228
+ * @param string $filename Filename.
229
+ * @return string
230
+ */
231
+ public function get_download_link_button( $filename ) {
232
+ $link = '';
233
+ $archive = $this->core->archive->get_by_name( $filename );
234
+
235
+ if ( ! empty( $archive ) ) {
236
+ $link = sprintf(
237
+ '<a
238
+ id="download-link-button"
239
+ class="button"
240
+ href="#"
241
+ data-filename="%1$s"
242
+ data-nonce="%2$s"
243
+ >
244
+ %3$s
245
+ </a>
246
+ <span class="spinner"></span>
247
+ ',
248
+ /* 1 */ $archive['filename'],
249
+ /* 2 */ wp_create_nonce( 'boldgrid_backup_download_link' ),
250
+ /* 3 */ __( 'Get Download Link', 'boldgrid-backup' )
251
+ );
252
+ }
253
+
254
+ return $link;
255
+ }
256
+
257
+ /**
258
+ * Callback function for generating a public link to download an archive file.
259
+ *
260
+ * Used on the backup archive details page. The link is only valid for a limited time, which
261
+ * is configurable in a configuration file.
262
+ *
263
+ * @since 1.7.0
264
+ *
265
+ * @see Boldgrid_Backup_Admin_Archive::generate_download_link()
266
+ *
267
+ * @uses $_POST['archive_filename'] Backup archive filename.
268
+ *
269
+ * @return string
270
+ */
271
+ public function wp_ajax_generate_download_link() {
272
+ $archive_filename = ! empty( $_POST['archive_filename'] ) ?
273
+ sanitize_file_name( $_POST['archive_filename'] ) : null;
274
+
275
+ if ( check_admin_referer( 'boldgrid_backup_download_link', 'archive_auth' ) &&
276
+ current_user_can( 'update_plugins' ) && $archive_filename ) {
277
+ wp_send_json_success(
278
+ $this->core->archive->generate_download_link(
279
+ $archive_filename
280
+ )
281
+ );
282
+ } else {
283
+ wp_send_json_error();
284
+ }
285
+ }
286
  }
admin/class-boldgrid-backup-admin-archive-details.php CHANGED
@@ -110,6 +110,9 @@ class Boldgrid_Backup_Admin_Archive_Details {
110
 
111
  wp_enqueue_style( 'bglib-ui-css' );
112
 
 
 
 
113
  /**
114
  * Allow other plugins to enqueue scripts on this page.
115
  *
@@ -149,12 +152,14 @@ class Boldgrid_Backup_Admin_Archive_Details {
149
  } else {
150
  $archive = array(
151
  'filename' => $filename,
152
- 'filepath' => $this->core->backup_dir->get_path_to( $archive['filename'] ),
153
  );
154
  }
155
 
156
  // Initialize the archive. We will need it in our included template below.
157
  $this->core->archive->init( $archive['filepath'] );
 
 
158
 
159
  include BOLDGRID_BACKUP_PATH . '/admin/partials/boldgrid-backup-admin-archive-details.php';
160
  }
@@ -174,4 +179,31 @@ class Boldgrid_Backup_Admin_Archive_Details {
174
  public function validate_nonce() {
175
  return check_ajax_referer( 'boldgrid_backup_remote_storage_upload', 'security', false );
176
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177
  }
110
 
111
  wp_enqueue_style( 'bglib-ui-css' );
112
 
113
+ wp_enqueue_script( 'bglib-attributes-js' );
114
+ wp_enqueue_style( 'bglib-attributes-css' );
115
+
116
  /**
117
  * Allow other plugins to enqueue scripts on this page.
118
  *
152
  } else {
153
  $archive = array(
154
  'filename' => $filename,
155
+ 'filepath' => $this->core->backup_dir->get_path_to( $filename ),
156
  );
157
  }
158
 
159
  // Initialize the archive. We will need it in our included template below.
160
  $this->core->archive->init( $archive['filepath'] );
161
+ $title = $this->core->archive->get_attribute( 'title' );
162
+ $description = $this->core->archive->get_attribute( 'description' );
163
 
164
  include BOLDGRID_BACKUP_PATH . '/admin/partials/boldgrid-backup-admin-archive-details.php';
165
  }
179
  public function validate_nonce() {
180
  return check_ajax_referer( 'boldgrid_backup_remote_storage_upload', 'security', false );
181
  }
182
+
183
+ /**
184
+ * Handle the ajax request to "Update" from a backup archive page.
185
+ *
186
+ * @since 1.7.0
187
+ */
188
+ public function wp_ajax_update() {
189
+ if ( ! $this->validate_nonce() ) {
190
+ wp_send_json_error( __( 'Permission denied.', 'boldgrid-backup' ) );
191
+ }
192
+
193
+ $filename = ! empty( $_POST['filename'] ) ? sanitize_file_name( $_POST['filename'] ) : false; // phpcs:ignore WordPress.CSRF.NonceVerification
194
+ $filepath = $this->core->backup_dir->get_path_to( $filename );
195
+ if ( empty( $filename ) || ! $this->core->wp_filesystem->exists( $filepath ) ) {
196
+ wp_send_json_error( __( 'Invalid archive filepath.', 'boldgrid-backup' ) );
197
+ }
198
+
199
+ $this->core->archive->init( $filepath );
200
+
201
+ if ( ! empty( $_POST['attributes'] ) ) { // phpcs:ignore WordPress.CSRF.NonceVerification
202
+ foreach ( $_POST['attributes'] as $key => $value ) { // phpcs:ignore WordPress.CSRF.NonceVerification
203
+ $this->core->archive->set_attribute( $key, stripslashes( $value ) );
204
+ }
205
+ }
206
+
207
+ wp_send_json_success();
208
+ }
209
  }
admin/class-boldgrid-backup-admin-archive-log.php CHANGED
@@ -129,16 +129,19 @@ class Boldgrid_Backup_Admin_Archive_Log {
129
  *
130
  * @since 1.6.0
131
  *
132
- * @param string $filepath Archive file path.
 
133
  */
134
- public function restore_by_zip( $filepath ) {
135
  $log_filepath = $this->path_from_zip( $filepath );
136
- $log_filename = basename( $log_filepath );
137
 
138
  if ( $this->core->wp_filesystem->exists( $log_filepath ) ) {
139
  return true;
140
  }
141
 
 
 
 
142
  // Extract the log file to ABSPATH.
143
  $zip = new Boldgrid_Backup_Admin_Compressor_Pcl_Zip( $this->core );
144
  $status = $zip->extract_one( $filepath, $log_filename );
@@ -148,8 +151,9 @@ class Boldgrid_Backup_Admin_Archive_Log {
148
 
149
  // Move the log file from the ABSPATH to the backup dir.
150
  $old_path = ABSPATH . $log_filename;
151
- $new_path = $this->core->backup_dir->get_path_to( $log_filename );
152
- return $this->core->wp_filesystem->move( $old_path, $new_path );
 
153
  }
154
 
155
  /**
@@ -178,6 +182,9 @@ class Boldgrid_Backup_Admin_Archive_Log {
178
  }
179
 
180
  // Add the log file to the archive file, as of 1.5.4.
 
 
 
181
  $archive = new PclZip( $info['filepath'] );
182
  if ( 0 === $archive ) {
183
  return false;
@@ -194,6 +201,9 @@ class Boldgrid_Backup_Admin_Archive_Log {
194
  return false;
195
  }
196
 
 
 
 
197
  return true;
198
  }
199
  }
129
  *
130
  * @since 1.6.0
131
  *
132
+ * @param string $filepath Archive file path.
133
+ * @param string $alt_log_filename Optional log file path. Default is to get from filepath.
134
  */
135
+ public function restore_by_zip( $filepath, $alt_log_filename = null ) {
136
  $log_filepath = $this->path_from_zip( $filepath );
 
137
 
138
  if ( $this->core->wp_filesystem->exists( $log_filepath ) ) {
139
  return true;
140
  }
141
 
142
+ $log_filename = ! empty( $alt_log_filename ) ?
143
+ $alt_log_filename : basename( $log_filepath );
144
+
145
  // Extract the log file to ABSPATH.
146
  $zip = new Boldgrid_Backup_Admin_Compressor_Pcl_Zip( $this->core );
147
  $status = $zip->extract_one( $filepath, $log_filename );
151
 
152
  // Move the log file from the ABSPATH to the backup dir.
153
  $old_path = ABSPATH . $log_filename;
154
+ $new_path = $this->core->backup_dir->get_path_to( basename( $log_filepath ) );
155
+
156
+ return $this->core->wp_filesystem->move( $old_path, $new_path, true );
157
  }
158
 
159
  /**
182
  }
183
 
184
  // Add the log file to the archive file, as of 1.5.4.
185
+ if ( ! class_exists( 'PclZip' ) ) {
186
+ require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';
187
+ }
188
  $archive = new PclZip( $info['filepath'] );
189
  if ( 0 === $archive ) {
190
  return false;
201
  return false;
202
  }
203
 
204
+ // Ensure the act updating the log file does not change the backup file's timestamp.
205
+ $this->core->wp_filesystem->touch( $info['filepath'], $info['lastmodunix'] );
206
+
207
  return true;
208
  }
209
  }
admin/class-boldgrid-backup-admin-archive.php CHANGED
@@ -121,6 +121,18 @@ class Boldgrid_Backup_Admin_Archive {
121
  return $deleted;
122
  }
123
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  /**
125
  * Get an archive by name.
126
  *
@@ -190,7 +202,6 @@ class Boldgrid_Backup_Admin_Archive {
190
  * @param string $filepath File path.
191
  */
192
  public function init( $filepath ) {
193
-
194
  $filepath = strip_tags( $filepath );
195
 
196
  if ( ! empty( $this->filepath ) && $filepath === $this->filepath ) {
@@ -199,8 +210,6 @@ class Boldgrid_Backup_Admin_Archive {
199
 
200
  $this->reset();
201
 
202
- $zip = new Boldgrid_Backup_Admin_Compressor_Pcl_Zip( $this->core );
203
-
204
  $this->filepath = $filepath;
205
  $this->filename = basename( $this->filepath );
206
 
@@ -213,7 +222,6 @@ class Boldgrid_Backup_Admin_Archive {
213
  $have_log = $this->core->archive_log->restore_by_zip( $this->filepath );
214
  }
215
 
216
- // Init our log.
217
  if ( $have_log ) {
218
  $this->log = $this->core->archive_log->get_by_zip( $this->filepath );
219
  }
@@ -227,8 +235,6 @@ class Boldgrid_Backup_Admin_Archive {
227
  $this->compressor = ! empty( $this->log['compressor'] ) ? $this->log['compressor'] : 'php_zip';
228
 
229
  $this->view_details_url = admin_url( 'admin.php?page=boldgrid-backup-archive-details&filename=' . $this->filename );
230
-
231
- unset( $zip );
232
  }
233
 
234
  /**
@@ -337,6 +343,21 @@ class Boldgrid_Backup_Admin_Archive {
337
  $this->compressor = null;
338
  }
339
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
340
  /**
341
  * Update an archive's timestamp based on the time in the log.
342
  *
@@ -347,7 +368,6 @@ class Boldgrid_Backup_Admin_Archive {
347
  * timestamp from the log and configure the last modified appropriately.
348
  */
349
  public function update_timestamp() {
350
-
351
  // If we don't have what we need, abort.
352
  if ( empty( $this->filepath ) || empty( $this->log['lastmodunix'] ) ) {
353
  return false;
@@ -355,4 +375,95 @@ class Boldgrid_Backup_Admin_Archive {
355
 
356
  return $this->core->wp_filesystem->touch( $this->filepath, $this->log['lastmodunix'] );
357
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
358
  }
121
  return $deleted;
122
  }
123
 
124
+ /**
125
+ * Get an attribute from the log.
126
+ *
127
+ * @since 1.7.0
128
+ *
129
+ * @param string $key Attributes are key / value pairs.
130
+ * @return mixed
131
+ */
132
+ public function get_attribute( $key ) {
133
+ return ! empty( $this->log[ $key ] ) ? $this->log[ $key ] : null;
134
+ }
135
+
136
  /**
137
  * Get an archive by name.
138
  *
202
  * @param string $filepath File path.
203
  */
204
  public function init( $filepath ) {
 
205
  $filepath = strip_tags( $filepath );
206
 
207
  if ( ! empty( $this->filepath ) && $filepath === $this->filepath ) {
210
 
211
  $this->reset();
212
 
 
 
213
  $this->filepath = $filepath;
214
  $this->filename = basename( $this->filepath );
215
 
222
  $have_log = $this->core->archive_log->restore_by_zip( $this->filepath );
223
  }
224
 
 
225
  if ( $have_log ) {
226
  $this->log = $this->core->archive_log->get_by_zip( $this->filepath );
227
  }
235
  $this->compressor = ! empty( $this->log['compressor'] ) ? $this->log['compressor'] : 'php_zip';
236
 
237
  $this->view_details_url = admin_url( 'admin.php?page=boldgrid-backup-archive-details&filename=' . $this->filename );
 
 
238
  }
239
 
240
  /**
343
  $this->compressor = null;
344
  }
345
 
346
+ /**
347
+ * Set an attribute in the log.
348
+ *
349
+ * @since 1.7.0
350
+ *
351
+ * @param string $key The key.
352
+ * @param string $value The value.
353
+ * @return bool
354
+ */
355
+ public function set_attribute( $key, $value ) {
356
+ $this->log[ $key ] = $value;
357
+
358
+ return $this->core->archive_log->write( $this->log );
359
+ }
360
+
361
  /**
362
  * Update an archive's timestamp based on the time in the log.
363
  *
368
  * timestamp from the log and configure the last modified appropriately.
369
  */
370
  public function update_timestamp() {
 
371
  // If we don't have what we need, abort.
372
  if ( empty( $this->filepath ) || empty( $this->log['lastmodunix'] ) ) {
373
  return false;
375
 
376
  return $this->core->wp_filesystem->touch( $this->filepath, $this->log['lastmodunix'] );
377
  }
378
+
379
+ /**
380
+ * Validate a download link request.
381
+ *
382
+ * @since 1.7.0
383
+ *
384
+ * @see Boldgrid_Backup_Admin_Archive::get_by_name()
385
+ *
386
+ * @param string $filename
387
+ * @return array
388
+ */
389
+ public function validate_link_request( $filename ) {
390
+ $result['is_valid'] = true;
391
+
392
+ // Verify access permissions.
393
+ if ( ! current_user_can( 'update_plugins' ) ) {
394
+ $result['errors'][] = __( 'Insufficient permission', 'boldgrid-backup' );
395
+ }
396
+
397
+ // Validate archive filename.
398
+ if ( empty( $filename ) ) {
399
+ $result['errors'][] = __( 'Invalid archive filename', 'boldgrid-backup' );
400
+ }
401
+
402
+ // Check WP_Filesystem method; ensure it is "direct".
403
+ if ( 'direct' !== get_filesystem_method() ) {
404
+ $result['errors'][] = __(
405
+ 'Filesystem access method is not "direct"',
406
+ 'boldgrid-backup'
407
+ );
408
+ }
409
+
410
+ // Get archive details.
411
+ $archive = $this->get_by_name( $filename );
412
+
413
+ // Check if archive file was found.
414
+ if ( empty( $archive ) ) {
415
+ $result['errors'][] = __( 'Archive file not found', 'boldgrid-backup' );
416
+ }
417
+
418
+ $expires = strtotime( '+' . $this->core->configs['public_link_lifetime'] );
419
+
420
+ if ( ! $expires || $expires < time() ) {
421
+ $result['errors'][] = __(
422
+ 'Invalid "public_link_lifetime" configuration setting',
423
+ 'boldgrid-backup'
424
+ );
425
+ }
426
+
427
+ if ( ! empty( $result['errors'] ) ) {
428
+ $result['is_valid'] = false;
429
+ }
430
+
431
+ return $result;
432
+ }
433
+
434
+ /**
435
+ * Generate a public link to download an archive file.
436
+ *
437
+ * The link is only valid for a limited time, which is configurable in a configuration file.
438
+ *
439
+ * @since 1.7.0
440
+ *
441
+ * @see Boldgrid_Backup_Admin_Archive::validate_link_request()
442
+ * @see Boldgrid_Backup_Authentication::create_token()
443
+ *
444
+ * @param string $filename
445
+ * @return string
446
+ */
447
+ public function generate_download_link( $filename ) {
448
+ $validation_results = $this->validate_link_request( $filename );
449
+
450
+ if ( $validation_results['is_valid'] ) {
451
+ $expires = strtotime( '+' . $this->core->configs['public_link_lifetime'] );
452
+ $token = Boldgrid_Backup_Authentication::create_token( $filename, $expires );
453
+
454
+ $response['download_url'] = get_site_url(
455
+ null,
456
+ 'wp-admin/admin-ajax.php?action=boldgrid_backup_download&t=' . $token
457
+ );
458
+
459
+ $response['expires_when'] = human_time_diff(
460
+ $expires,
461
+ current_time( 'timestamp', true )
462
+ );
463
+ } else {
464
+ $response['error'] = implode( '<br />', $validation_results['errors'] );
465
+ }
466
+
467
+ return $response;
468
+ }
469
  }
admin/class-boldgrid-backup-admin-archives.php CHANGED
@@ -103,11 +103,21 @@ class Boldgrid_Backup_Admin_Archives {
103
 
104
  $title_attr = ! empty( $location['title_attr'] ) ? sprintf( 'title="%1$s"', esc_attr( $location['title_attr'] ) ) : '';
105
 
 
 
 
 
 
 
 
 
 
106
  $locations[] = sprintf(
107
- '<span %2$s %3$s>%1$s</span>',
108
  esc_html( $location['title'] ),
109
  $data_attr,
110
- $title_attr
 
111
  );
112
  }
113
 
@@ -196,16 +206,21 @@ class Boldgrid_Backup_Admin_Archives {
196
  );
197
 
198
  foreach ( $this->core->archives_all->all as $archive ) {
199
- $locations = $this->get_locations( $archive );
200
-
201
- // dirlist -> lastmodunix -> mtime (last_modified in unix time).
202
  $this->core->time->init( $archive['last_modified'], 'utc' );
203
 
 
 
 
 
 
 
 
204
  $table .= sprintf(
205
  '
206
  <tr>
207
  <td>
208
  %2$s
 
209
  <p class="description">%6$s</p>
210
  </td>
211
  <td>
@@ -220,11 +235,12 @@ class Boldgrid_Backup_Admin_Archives {
220
  </tr>
221
  ',
222
  /* 1 */ $backup,
223
- /* 2 */ $this->core->time->get_span(),
224
  /* 3 */ Boldgrid_Backup_Admin_Utility::bytes_to_human( $archive['size'] ),
225
  /* 4 */ $archive['filename'],
226
  /* 5 */ $view_details,
227
- /* 6 */ $locations
 
228
  );
229
  }
230
  $table .= '</tbody>
103
 
104
  $title_attr = ! empty( $location['title_attr'] ) ? sprintf( 'title="%1$s"', esc_attr( $location['title_attr'] ) ) : '';
105
 
106
+ /*
107
+ * As of 1.7.0, the user can flag an archive as protected (exluded from retention
108
+ * process). Show a padlock next to those backups.
109
+ */
110
+ $icon = '';
111
+ if ( 'on_web_server' === $location_type && '1' === $this->core->archive->get_attribute( 'protect' ) ) {
112
+ $icon = '<span class="dashicons dashicons-lock" title="' . esc_attr__( 'This backup will not be deleted automatically from your Web Server due to your retention settings.', 'boldgrid-backup' ) . '"></span>';
113
+ }
114
+
115
  $locations[] = sprintf(
116
+ '<span %2$s %3$s>%1$s%4$s</span>',
117
  esc_html( $location['title'] ),
118
  $data_attr,
119
+ $title_attr,
120
+ $icon
121
  );
122
  }
123
 
206
  );
207
 
208
  foreach ( $this->core->archives_all->all as $archive ) {
 
 
 
209
  $this->core->time->init( $archive['last_modified'], 'utc' );
210
 
211
+ // Get the title of the backup.
212
+ $filepath = $this->core->backup_dir->get_path_to( $archive['filename'] );
213
+ $this->core->archive->init( $filepath );
214
+ $title = $this->core->archive->get_attribute( 'title' );
215
+
216
+ $locations = $this->get_locations( $archive );
217
+
218
  $table .= sprintf(
219
  '
220
  <tr>
221
  <td>
222
  %2$s
223
+ %7$s<br />
224
  <p class="description">%6$s</p>
225
  </td>
226
  <td>
235
  </tr>
236
  ',
237
  /* 1 */ $backup,
238
+ /* 2 */ empty( $title ) ? '' : '<strong>' . esc_html( $title ) . '</strong><br />',
239
  /* 3 */ Boldgrid_Backup_Admin_Utility::bytes_to_human( $archive['size'] ),
240
  /* 4 */ $archive['filename'],
241
  /* 5 */ $view_details,
242
+ /* 6 */ $locations,
243
+ /* 7 */ $this->core->time->get_span()
244
  );
245
  }
246
  $table .= '</tbody>
admin/class-boldgrid-backup-admin-auto-rollback.php CHANGED
@@ -223,6 +223,10 @@ class Boldgrid_Backup_Admin_Auto_Rollback {
223
  wp_localize_script( $handle, 'localizeScriptData', $localize_script_data );
224
 
225
  wp_enqueue_script( $handle );
 
 
 
 
226
  }
227
 
228
  /**
@@ -273,13 +277,28 @@ class Boldgrid_Backup_Admin_Auto_Rollback {
273
  * @since 1.6.0
274
  */
275
  public function enqueue_home_scripts() {
276
- wp_enqueue_script(
277
- 'boldgrid-backup-admin-home',
 
 
278
  plugin_dir_url( __FILE__ ) . 'js/boldgrid-backup-admin-home.js',
279
  array( 'jquery' ),
280
  BOLDGRID_BACKUP_VERSION,
281
  false
282
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
283
  }
284
 
285
  /**
@@ -339,7 +358,7 @@ class Boldgrid_Backup_Admin_Auto_Rollback {
339
  * @since 1.6.0
340
  */
341
  public function enqueue_update_selectors() {
342
- if ( $this->on_update_page ) {
343
  $handle = 'boldgrid-backup-admin-update-selectors';
344
 
345
  wp_register_script(
@@ -757,9 +776,10 @@ class Boldgrid_Backup_Admin_Auto_Rollback {
757
  return;
758
  }
759
 
760
- // If there is a pending rollback, then abort.
761
  if ( ! empty( $pending_rollback['lastmodunix'] ) ) {
762
  $this->notice_activated_show();
 
763
  return;
764
  }
765
 
@@ -1027,7 +1047,7 @@ class Boldgrid_Backup_Admin_Auto_Rollback {
1027
  * @since 1.6.0
1028
  */
1029
  public function wp_ajax_get_protect_notice() {
1030
- if ( ! current_user_can( 'update_plugins' ) ) {
1031
  wp_send_json_error();
1032
  }
1033
 
@@ -1045,4 +1065,26 @@ class Boldgrid_Backup_Admin_Auto_Rollback {
1045
 
1046
  wp_send_json_success( $notice );
1047
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1048
  }
223
  wp_localize_script( $handle, 'localizeScriptData', $localize_script_data );
224
 
225
  wp_enqueue_script( $handle );
226
+
227
+ // Scripts required for showing backup in progress bar.
228
+ wp_enqueue_script( 'heartbeat' );
229
+ wp_enqueue_script( 'jquery-ui-progressbar' );
230
  }
231
 
232
  /**
277
  * @since 1.6.0
278
  */
279
  public function enqueue_home_scripts() {
280
+ $handle = 'boldgrid-backup-admin-home';
281
+
282
+ wp_register_script(
283
+ $handle,
284
  plugin_dir_url( __FILE__ ) . 'js/boldgrid-backup-admin-home.js',
285
  array( 'jquery' ),
286
  BOLDGRID_BACKUP_VERSION,
287
  false
288
  );
289
+
290
+ $translation = array(
291
+ 'savedTo' => __( 'File saved to: ', 'boldgrid-backup' ),
292
+ 'viewDetails' => __( 'View details', 'boldgrid-backup' ),
293
+ 'invalidUrl' => __( 'You must enter valid a URL address.', 'boldgrid-backup' ),
294
+ 'notZip' => __( 'The URL address is not a ZIP file.', 'boldgrid-backup' ),
295
+ 'unknownError' => __( 'Unknown error.', 'boldgrid-backup' ),
296
+ 'ajaxError' => __( 'Could not reach the URL address. HTTP error: ', 'boldgrid-backup' ),
297
+ 'urlRegex' => $this->core->configs['url_regex'],
298
+ );
299
+
300
+ wp_localize_script( $handle, 'BoldGridBackupAdminHome', $translation );
301
+ wp_enqueue_script( $handle );
302
  }
303
 
304
  /**
358
  * @since 1.6.0
359
  */
360
  public function enqueue_update_selectors() {
361
+ if ( $this->on_update_page || $this->core->utility->is_admin_page( 'boldgrid-backup' ) ) {
362
  $handle = 'boldgrid-backup-admin-update-selectors';
363
 
364
  wp_register_script(
776
  return;
777
  }
778
 
779
+ // If there is a pending rollback (backup within the last hour), then abort.
780
  if ( ! empty( $pending_rollback['lastmodunix'] ) ) {
781
  $this->notice_activated_show();
782
+
783
  return;
784
  }
785
 
1047
  * @since 1.6.0
1048
  */
1049
  public function wp_ajax_get_protect_notice() {
1050
+ if ( ! current_user_can( 'update_plugins' ) || ! $this->core->test->run_functionality_tests() ) {
1051
  wp_send_json_error();
1052
  }
1053
 
1065
 
1066
  wp_send_json_success( $notice );
1067
  }
1068
+
1069
+ /**
1070
+ * Validate the rollback option when retrieved.
1071
+ *
1072
+ * @since 1.7.0
1073
+ *
1074
+ * @param array|false WordPress option value for "boldgrid_backup_pending_rollback".
1075
+ * @param string Option name.
1076
+ * @return array|false
1077
+ */
1078
+ public function validate_rollback_option( $value, $option ) {
1079
+ $is_coutdown_active = ! empty( $value['deadline'] );
1080
+ $is_recent_backup = ! empty( $value['lastmodunix'] ) &&
1081
+ strtotime( '-1 HOUR' ) <= $value['lastmodunix'];
1082
+
1083
+ if ( ! $is_recent_backup && ! $is_coutdown_active ) {
1084
+ delete_site_option( $option );
1085
+ $value = false;
1086
+ }
1087
+
1088
+ return $value;
1089
+ }
1090
  }
admin/class-boldgrid-backup-admin-backup-dir.php CHANGED
@@ -168,6 +168,47 @@ class Boldgrid_Backup_Admin_Backup_Dir {
168
  return $backup_dir;
169
  }
170
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  /**
172
  * Get and return the backup directory path.
173
  *
@@ -184,8 +225,10 @@ class Boldgrid_Backup_Admin_Backup_Dir {
184
 
185
  // If we have it in the settings, then use it.
186
  $settings = $this->core->settings->get_settings();
187
- if ( ! empty( $settings['backup_directory'] ) ) {
188
- $this->set( $settings['backup_directory'] );
 
 
189
  return $this->backup_directory;
190
  }
191
 
@@ -293,7 +336,10 @@ class Boldgrid_Backup_Admin_Backup_Dir {
293
 
294
  $this->set( $backup_directory );
295
 
 
 
296
  $settings['backup_directory'] = $backup_directory;
 
297
  $this->core->settings->save( $settings );
298
 
299
  return $this->backup_directory;
168
  return $backup_dir;
169
  }
170
 
171
+ /**
172
+ * Get a directory listing of our backup directory.
173
+ *
174
+ * @since 1.7.0
175
+ *
176
+ * @return array
177
+ */
178
+ public function dirlist() {
179
+ $this->get();
180
+
181
+ $files = array();
182
+
183
+ if ( $this->backup_directory ) {
184
+ $files = $this->core->wp_filesystem->dirlist( $this->backup_directory );
185
+ }
186
+
187
+ return $files;
188
+ }
189
+
190
+ /**
191
+ * Find files in backup directory where filename contains search string.
192
+ *
193
+ * @since 1.7.0
194
+ *
195
+ * @param string $search The search string / needle.
196
+ * @return array
197
+ */
198
+ public function dirlist_containing( $search ) {
199
+ $matches = array();
200
+ $dirlist = $this->dirlist();
201
+
202
+ // Find all the files including $search in their filename.
203
+ foreach ( $dirlist as $filename => $filedata ) {
204
+ if ( false !== strpos( $filename, $search ) ) {
205
+ $matches[ $filename ] = $filedata;
206
+ }
207
+ }
208
+
209
+ return $matches;
210
+ }
211
+
212
  /**
213
  * Get and return the backup directory path.
214
  *
225
 
226
  // If we have it in the settings, then use it.
227
  $settings = $this->core->settings->get_settings();
228
+ if ( ! empty( $settings['backup_directory'] ) &&
229
+ $this->core->wp_filesystem->is_writable( $settings['backup_directory'] ) ) {
230
+ $this->set( $settings['backup_directory'] );
231
+
232
  return $this->backup_directory;
233
  }
234
 
336
 
337
  $this->set( $backup_directory );
338
 
339
+ $settings = $this->core->settings->get_settings();
340
+
341
  $settings['backup_directory'] = $backup_directory;
342
+
343
  $this->core->settings->save( $settings );
344
 
345
  return $this->backup_directory;
admin/class-boldgrid-backup-admin-config.php CHANGED
@@ -274,10 +274,15 @@ class Boldgrid_Backup_Admin_Config {
274
  */
275
  public function set_lang() {
276
  $this->lang = array(
277
- 'website_size' => esc_html__( 'Website Size:', 'boldgrid-backup' ),
278
- 'database_size' => esc_html__( 'Database Size:', 'boldgrid-backup' ),
279
- 'of' => esc_html__( 'of', 'boldgrid-backup' ),
280
- 'xmark' => '&#10007;',
 
 
 
 
 
281
  );
282
  }
283
 
274
  */
275
  public function set_lang() {
276
  $this->lang = array(
277
+ 'website_size' => esc_html__( 'Website Size:', 'boldgrid-backup' ),
278
+ 'database_size' => esc_html__( 'Database Size:', 'boldgrid-backup' ),
279
+ 'of' => esc_html__( 'of', 'boldgrid-backup' ),
280
+ 'xmark' => '&#10007;',
281
+ 'update' => esc_html__( 'Update', 'boldgrid-backup' ),
282
+ 'updating' => esc_html__( 'Updating...', 'boldgrid-backup' ),
283
+ 'updated' => esc_html__( 'Updated!', 'boldgrid-backup' ),
284
+ 'failed_to_update' => esc_html__( 'Failed to update: ', 'boldgrid-backup' ),
285
+ 'unknown_error' => esc_html__( 'Unknown error.', 'boldgrid-backup' ),
286
  );
287
  }
288
 
admin/class-boldgrid-backup-admin-core.php CHANGED
@@ -499,17 +499,25 @@ class Boldgrid_Backup_Admin_Core {
499
  */
500
  public $scheduler;
501
 
 
 
 
 
 
 
 
 
 
502
  /**
503
  * Constructor.
504
  *
505
  * @since 1.0
506
  *
507
- * @global $wp_filesystem.
508
  */
509
  public function __construct() {
510
  WP_Filesystem();
511
  global $wp_filesystem;
512
-
513
  global $pagenow;
514
 
515
  $this->doing_cron = ( defined( 'DOING_CRON' ) && DOING_CRON ) || isset( $_GET['doing_wp_cron'] ); // phpcs:ignore WordPress.CSRF.NonceVerification.NoNonceVerification
@@ -611,6 +619,8 @@ class Boldgrid_Backup_Admin_Core {
611
 
612
  $this->cron_log = new Boldgrid_Backup_Admin_Cron_Log( $this );
613
 
 
 
614
  // Ensure there is a backup identifier.
615
  $this->get_backup_identifier();
616
 
@@ -742,13 +752,14 @@ class Boldgrid_Backup_Admin_Core {
742
  *
743
  * @since 1.0
744
  *
745
- * @param string $command A command string to be executed.
746
- * @param array $available_exec_functions An array of available execution functions.
747
- * @param bool $success or failure of the operation, passed back to the caller.
748
- * @param int $return_var If present, the return_var, passed back to the caller.
 
749
  * @return string|bool Returns the command output or FALSE on error.
750
  */
751
- public function execute_command( $command, $available_exec_functions = array(), &$success = false, &$return_var = 0 ) {
752
  // If no command was passed, then fail.
753
  if ( empty( $command ) ) {
754
  return false;
@@ -759,6 +770,11 @@ class Boldgrid_Backup_Admin_Core {
759
  $available_exec_functions = $this->get_execution_functions();
760
  }
761
 
 
 
 
 
 
762
  // Disable stderr.
763
  if ( ! $this->test->is_windows() && false === strpos( $command, '2>/dev/null' ) ) {
764
  $command .= ' 2>/dev/null';
@@ -949,7 +965,7 @@ class Boldgrid_Backup_Admin_Core {
949
  global $submenu;
950
 
951
  $lang = array(
952
- 'backup_archive' => __( 'Backup Archive', 'boldgrid-backup' ),
953
  'boldgrid_backup' => __( 'BoldGrid Backup', 'boldgrid-backup' ),
954
  'get_premium' => __( 'Get Premium', 'boldgrid-bacukp' ),
955
  'preflight_check' => __( 'Preflight Check', 'boldgrid-backup' ),
@@ -958,13 +974,7 @@ class Boldgrid_Backup_Admin_Core {
958
  );
959
 
960
  // The main slug all sub menu items are children of.
961
- $main_slug = 'boldgrid-backup-settings';
962
-
963
- // The callable function for the settings page.
964
- $settings_page = array(
965
- $this->settings,
966
- 'page_backup_settings',
967
- );
968
 
969
  // The capability required for these menu items to be displayed to the user.
970
  $capability = 'administrator';
@@ -974,10 +984,26 @@ class Boldgrid_Backup_Admin_Core {
974
  $lang['boldgrid_backup'],
975
  $capability,
976
  $main_slug,
977
- $settings_page,
 
 
 
978
  'none'
979
  );
980
 
 
 
 
 
 
 
 
 
 
 
 
 
 
981
  /*
982
  * Add "Settings", formally known as "Backup Settings".
983
  *
@@ -988,20 +1014,10 @@ class Boldgrid_Backup_Admin_Core {
988
  $lang['boldgrid_backup'] . ' ' . $lang['settings'],
989
  $lang['settings'],
990
  $capability,
991
- $main_slug,
992
- $settings_page
993
- );
994
-
995
- // Add "Backup Archive", formally known as "BoldGrid Backup".
996
- add_submenu_page(
997
- $main_slug,
998
- 'BoldGrid ' . $lang['backup_archive'],
999
- $lang['backup_archive'],
1000
- $capability,
1001
- 'boldgrid-backup',
1002
  array(
1003
- $this,
1004
- 'page_archives',
1005
  )
1006
  );
1007
 
@@ -1271,10 +1287,11 @@ class Boldgrid_Backup_Admin_Core {
1271
 
1272
  // If changed, then restore the WP Option for "home".
1273
  if ( $restored_wp_home !== $wp_home ) {
1274
- // Ensure there are no trailing slashes in siteurl.
1275
- $wp_home = untrailingslashit( $wp_home );
1276
 
1277
- update_option( 'home', $wp_home );
 
 
 
1278
  }
1279
 
1280
  // Return success.
@@ -1504,6 +1521,12 @@ class Boldgrid_Backup_Admin_Core {
1504
  public function archive_files( $save = false, $dryrun = false ) {
1505
  $this->pre_auto_update = 'pre_auto_update' === current_filter();
1506
 
 
 
 
 
 
 
1507
  /**
1508
  * Actions to take before any archiving begins.
1509
  *
@@ -1566,6 +1589,8 @@ class Boldgrid_Backup_Admin_Core {
1566
  'folder_include' => $this->folder_exclusion->from_settings( 'include' ),
1567
  'folder_exclude' => $this->folder_exclusion->from_settings( 'exclude' ),
1568
  'table_exclude' => $this->db_omit->get_excluded_tables(),
 
 
1569
  );
1570
 
1571
  // Determine how this backup was triggered.
@@ -1660,6 +1685,12 @@ class Boldgrid_Backup_Admin_Core {
1660
  */
1661
  $info = apply_filters( 'boldgrid_backup_pre_archive_info', $info );
1662
 
 
 
 
 
 
 
1663
  /*
1664
  * Use the chosen compressor to build an archive.
1665
  * If the is no available compressor, then return an error.
@@ -1700,6 +1731,9 @@ class Boldgrid_Backup_Admin_Core {
1700
  break;
1701
  }
1702
 
 
 
 
1703
  $info['total_size'] += $this->filelist->get_total_size( $filelist );
1704
 
1705
  if ( true === $status && ! $this->wp_filesystem->exists( $info['filepath'] ) ) {
@@ -1761,8 +1795,16 @@ class Boldgrid_Backup_Admin_Core {
1761
  */
1762
  do_action( 'boldgrid_backup_post_archive_files', $info );
1763
 
1764
- // Send an email.
1765
- if ( $this->email->user_wants_notification( 'backup' ) && $this->doing_ajax ) {
 
 
 
 
 
 
 
 
1766
  $email_parts = $this->email->post_archive_parts( $info );
1767
  $email_body = $email_parts['body']['main'] . $email_parts['body']['signature'];
1768
  $info['mail_success'] = $this->email->send( $email_parts['subject'], $email_body );
@@ -1781,6 +1823,12 @@ class Boldgrid_Backup_Admin_Core {
1781
  update_option( 'boldgrid_backup_latest_backup', $info );
1782
  }
1783
 
 
 
 
 
 
 
1784
  // Return the array of archive information.
1785
  return $info;
1786
  }
@@ -2414,6 +2462,8 @@ class Boldgrid_Backup_Admin_Core {
2414
  * a message should be displayed with the path to download using an alternate method.
2415
  *
2416
  * @since 1.0
 
 
2417
  */
2418
  public function download_archive_file_callback() {
2419
  // Verify nonce, or die.
@@ -2475,27 +2525,8 @@ class Boldgrid_Backup_Admin_Core {
2475
 
2476
  $filesize = $archives[ $download_key ]['filesize'];
2477
 
2478
- // Send header.
2479
- header( 'Content-Disposition: attachment; filename="' . $filename . '"' );
2480
- header( 'Content-Transfer-Encoding: binary' );
2481
- header( 'Content-Type: binary/octet-stream' );
2482
- header( 'Content-Length: ' . $filesize );
2483
-
2484
- // Check and flush output buffer if needed.
2485
- if ( 0 !== ob_get_level() ) {
2486
- ob_end_flush();
2487
- }
2488
-
2489
- // Close any PHP session, so another session can open during the download.
2490
- session_write_close();
2491
-
2492
- // Send the file. Not finding a replacement in $wp_filesystem.
2493
- // phpcs:disable
2494
- readfile( $filepath );
2495
- // phpcs:enable
2496
-
2497
- // Exit.
2498
- wp_die();
2499
  }
2500
 
2501
  /**
@@ -2734,9 +2765,17 @@ class Boldgrid_Backup_Admin_Core {
2734
  // Get backup settings.
2735
  $settings = $this->settings->get_settings();
2736
 
2737
- // Get archive list.
2738
  $archives = $this->get_archive_list();
2739
 
 
 
 
 
 
 
 
 
 
2740
  // Get the archives file count.
2741
  $archives_count = count( $archives );
2742
 
499
  */
500
  public $scheduler;
501
 
502
+ /**
503
+ * The public download class object.
504
+ *
505
+ * @since 1.7.0
506
+ * @access public
507
+ * @var Boldgrid_Backup_Download
508
+ */
509
+ public $download;
510
+
511
  /**
512
  * Constructor.
513
  *
514
  * @since 1.0
515
  *
516
+ * @global $wp_filesystem
517
  */
518
  public function __construct() {
519
  WP_Filesystem();
520
  global $wp_filesystem;
 
521
  global $pagenow;
522
 
523
  $this->doing_cron = ( defined( 'DOING_CRON' ) && DOING_CRON ) || isset( $_GET['doing_wp_cron'] ); // phpcs:ignore WordPress.CSRF.NonceVerification.NoNonceVerification
619
 
620
  $this->cron_log = new Boldgrid_Backup_Admin_Cron_Log( $this );
621
 
622
+ $this->download = new Boldgrid_Backup_Download( $this );
623
+
624
  // Ensure there is a backup identifier.
625
  $this->get_backup_identifier();
626
 
752
  *
753
  * @since 1.0
754
  *
755
+ * @param string $command A command string to be executed.
756
+ * @param array $available_exec_functions An array of available execution functions.
757
+ * @param bool $success Success or failure of the operation, passed back.
758
+ * @param int $return_var If present, the return_var, passed back.
759
+ * @param string $filepath An optional file path to write the output.
760
  * @return string|bool Returns the command output or FALSE on error.
761
  */
762
+ public function execute_command( $command, $available_exec_functions = array(), &$success = false, &$return_var = 0, $filepath = null ) {
763
  // If no command was passed, then fail.
764
  if ( empty( $command ) ) {
765
  return false;
770
  $available_exec_functions = $this->get_execution_functions();
771
  }
772
 
773
+ // If an output filepath is supplied, and the directory is writable, then write to file.
774
+ if ( $filepath && $this->wp_filesystem->is_writable( dirname( $filepath ) ) ) {
775
+ $command .= ' > ' . wp_normalize_path( $filepath );
776
+ }
777
+
778
  // Disable stderr.
779
  if ( ! $this->test->is_windows() && false === strpos( $command, '2>/dev/null' ) ) {
780
  $command .= ' 2>/dev/null';
965
  global $submenu;
966
 
967
  $lang = array(
968
+ 'backup_archive' => __( 'Backup Archives', 'boldgrid-backup' ),
969
  'boldgrid_backup' => __( 'BoldGrid Backup', 'boldgrid-backup' ),
970
  'get_premium' => __( 'Get Premium', 'boldgrid-bacukp' ),
971
  'preflight_check' => __( 'Preflight Check', 'boldgrid-backup' ),
974
  );
975
 
976
  // The main slug all sub menu items are children of.
977
+ $main_slug = 'boldgrid-backup';
 
 
 
 
 
 
978
 
979
  // The capability required for these menu items to be displayed to the user.
980
  $capability = 'administrator';
984
  $lang['boldgrid_backup'],
985
  $capability,
986
  $main_slug,
987
+ array(
988
+ $this,
989
+ 'page_archives',
990
+ ),
991
  'none'
992
  );
993
 
994
+ // Add "Backup Archive", formally known as "BoldGrid Backup".
995
+ add_submenu_page(
996
+ $main_slug,
997
+ 'BoldGrid ' . $lang['backup_archive'],
998
+ $lang['backup_archive'],
999
+ $capability,
1000
+ 'boldgrid-backup',
1001
+ array(
1002
+ $this,
1003
+ 'page_archives',
1004
+ )
1005
+ );
1006
+
1007
  /*
1008
  * Add "Settings", formally known as "Backup Settings".
1009
  *
1014
  $lang['boldgrid_backup'] . ' ' . $lang['settings'],
1015
  $lang['settings'],
1016
  $capability,
1017
+ 'boldgrid-backup-settings',
 
 
 
 
 
 
 
 
 
 
1018
  array(
1019
+ $this->settings,
1020
+ 'page_backup_settings',
1021
  )
1022
  );
1023
 
1287
 
1288
  // If changed, then restore the WP Option for "home".
1289
  if ( $restored_wp_home !== $wp_home ) {
 
 
1290
 
1291
+ // There may be a filter, so remove it.
1292
+ remove_all_filters( 'pre_update_option_home' );
1293
+
1294
+ update_option( 'home', untrailingslashit( $wp_home ) );
1295
  }
1296
 
1297
  // Return success.
1521
  public function archive_files( $save = false, $dryrun = false ) {
1522
  $this->pre_auto_update = 'pre_auto_update' === current_filter();
1523
 
1524
+ Boldgrid_Backup_Admin_In_Progress_Data::set_args(
1525
+ array(
1526
+ 'status' => __( 'Initializing backup', 'boldgrid-backup' ),
1527
+ )
1528
+ );
1529
+
1530
  /**
1531
  * Actions to take before any archiving begins.
1532
  *
1589
  'folder_include' => $this->folder_exclusion->from_settings( 'include' ),
1590
  'folder_exclude' => $this->folder_exclusion->from_settings( 'exclude' ),
1591
  'table_exclude' => $this->db_omit->get_excluded_tables(),
1592
+ 'title' => ! empty( $_POST['backup_title'] ) ? stripslashes( $_POST['backup_title'] ) : null, // phpcs:ignore WordPress.CSRF.NonceVerification,WordPress.Arrays.ArrayDeclarationSpacing.ArrayItemNoNewLine
1593
+ 'description' => ! empty( $_POST['backup_description'] ) ? stripslashes( $_POST['backup_description'] ) : null, // phpcs:ignore WordPress.CSRF.NonceVerification,WordPress.Arrays.ArrayDeclarationSpacing.ArrayItemNoNewLine
1594
  );
1595
 
1596
  // Determine how this backup was triggered.
1685
  */
1686
  $info = apply_filters( 'boldgrid_backup_pre_archive_info', $info );
1687
 
1688
+ Boldgrid_Backup_Admin_In_Progress_Data::set_args(
1689
+ array(
1690
+ 'total_files_todo' => count( $filelist ),
1691
+ )
1692
+ );
1693
+
1694
  /*
1695
  * Use the chosen compressor to build an archive.
1696
  * If the is no available compressor, then return an error.
1731
  break;
1732
  }
1733
 
1734
+ Boldgrid_Backup_Admin_In_Progress_Data::set_arg( 'status', __( 'Wrapping things up...', 'boldgrid-backup' ) );
1735
+ Boldgrid_Backup_Admin_In_Progress_Data::set_arg( 'percentage', 100 );
1736
+
1737
  $info['total_size'] += $this->filelist->get_total_size( $filelist );
1738
 
1739
  if ( true === $status && ! $this->wp_filesystem->exists( $info['filepath'] ) ) {
1795
  */
1796
  do_action( 'boldgrid_backup_post_archive_files', $info );
1797
 
1798
+ /*
1799
+ * Send an email to the user, RIGHT NOW.
1800
+ *
1801
+ * Only send an email to the user now IF they are manually creating a backup. If this backup
1802
+ * was created during a scheduled backup, the user will get an email from the jobs queue.
1803
+ * Scheduled backups receive email notifications from the jobs queue because that email will
1804
+ * not only include the standard info about the backup (which we're sending now), it will
1805
+ * also include info about other jobs that were ran (such as uploading the backup remotely).
1806
+ */
1807
+ if ( $this->email->user_wants_notification( 'backup' ) && ! $is_scheduled_backup ) {
1808
  $email_parts = $this->email->post_archive_parts( $info );
1809
  $email_body = $email_parts['body']['main'] . $email_parts['body']['signature'];
1810
  $info['mail_success'] = $this->email->send( $email_parts['subject'], $email_body );
1823
  update_option( 'boldgrid_backup_latest_backup', $info );
1824
  }
1825
 
1826
+ Boldgrid_Backup_Admin_In_Progress_Data::set_args(
1827
+ array(
1828
+ 'status' => __( 'Backup complete!', 'boldgrid-backup' ),
1829
+ )
1830
+ );
1831
+
1832
  // Return the array of archive information.
1833
  return $info;
1834
  }
2462
  * a message should be displayed with the path to download using an alternate method.
2463
  *
2464
  * @since 1.0
2465
+ *
2466
+ * @see Boldgrid_Backup_File::send_file()
2467
  */
2468
  public function download_archive_file_callback() {
2469
  // Verify nonce, or die.
2525
 
2526
  $filesize = $archives[ $download_key ]['filesize'];
2527
 
2528
+ // Send the file and die nicely.
2529
+ Boldgrid_Backup_File::send_file( $filepath, $filesize );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2530
  }
2531
 
2532
  /**
2765
  // Get backup settings.
2766
  $settings = $this->settings->get_settings();
2767
 
 
2768
  $archives = $this->get_archive_list();
2769
 
2770
+ // Remove from the list of archives any that have been flagged as being protected.
2771
+ foreach ( $archives as $key => $archive ) {
2772
+ $this->archive->init( $archive['filepath'] );
2773
+ if ( '1' === $this->archive->get_attribute( 'protect' ) ) {
2774
+ unset( $archives[ $key ] );
2775
+ }
2776
+ }
2777
+ $archives = array_values( $archives );
2778
+
2779
  // Get the archives file count.
2780
  $archives_count = count( $archives );
2781
 
admin/class-boldgrid-backup-admin-db-dump.php CHANGED
@@ -54,6 +54,14 @@ class Boldgrid_Backup_Admin_Db_Dump {
54
  return array( 'error' => esc_html__( 'No tables selected to backup.', 'boldgrid-backup' ) );
55
  }
56
 
 
 
 
 
 
 
 
 
57
  /**
58
  * Take action before a database is dumped.
59
  *
54
  return array( 'error' => esc_html__( 'No tables selected to backup.', 'boldgrid-backup' ) );
55
  }
56
 
57
+ Boldgrid_Backup_Admin_In_Progress_Data::set_args(
58
+ array(
59
+ 'status' => __( 'Backing up database...', 'boldgrid-backup' ),
60
+ 'tables' => $include_tables,
61
+ 'step' => 1,
62
+ )
63
+ );
64
+
65
  /**
66
  * Take action before a database is dumped.
67
  *
admin/class-boldgrid-backup-admin-email.php CHANGED
@@ -87,7 +87,7 @@ class Boldgrid_Backup_Admin_Email {
87
  'generic' => $this->core->config->get_is_premium() ? '' : sprintf(
88
  // translators: 1: URL address.
89
  __( 'Want to store your backups on Amazon S3, restore individual files with just a click, and have access to more tools? Get BoldGrid Backup Premium! - %1$s', 'boldgrid-backup' ),
90
- Boldgrid_Backup_Admin_Go_Pro::$url
91
  ) . "\n\n",
92
  );
93
  }
87
  'generic' => $this->core->config->get_is_premium() ? '' : sprintf(
88
  // translators: 1: URL address.
89
  __( 'Want to store your backups on Amazon S3, restore individual files with just a click, and have access to more tools? Get BoldGrid Backup Premium! - %1$s', 'boldgrid-backup' ),
90
+ $this->core->go_pro->get_premium_url( 'bgbkup-email' )
91
  ) . "\n\n",
92
  );
93
  }
admin/class-boldgrid-backup-admin-go-pro.php CHANGED
@@ -91,7 +91,7 @@ class Boldgrid_Backup_Admin_Go_Pro {
91
  'message' => '<p>' . sprintf(
92
  // translators: 1: URL address for the upgrade page.
93
  __( 'Thank you for activating the <strong>BoldGrid Backup Premium Extension</strong>! Before you can begin using all of the premium features, you must <a href="%2$s">add your premium key</a>. If you are using an Official BoldGrid Host, contact them or login to their management system to retrieve your Premium key. Otherwise, please visit <a href="%1$s" target="_blank">BoldGrid Central</a> to upgrade.', 'boldgrid-backup' ),
94
- self::$url,
95
  admin_url( 'admin.php?page=boldgrid-backup-settings&section=connect_key' )
96
  ) . '</p>',
97
  ),
@@ -126,7 +126,9 @@ class Boldgrid_Backup_Admin_Go_Pro {
126
  * @param string $text Button text.
127
  * @return string
128
  */
129
- public function get_premium_button( $url = 'https://www.boldgrid.com/update-backup', $text = 'Get Premium' ) {
 
 
130
  return sprintf(
131
  '
132
  <a href="%1$s" class="button button-success" target="_blank">%2$s</a>',
@@ -134,4 +136,19 @@ class Boldgrid_Backup_Admin_Go_Pro {
134
  $text
135
  );
136
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
137
  }
91
  'message' => '<p>' . sprintf(
92
  // translators: 1: URL address for the upgrade page.
93
  __( 'Thank you for activating the <strong>BoldGrid Backup Premium Extension</strong>! Before you can begin using all of the premium features, you must <a href="%2$s">add your premium key</a>. If you are using an Official BoldGrid Host, contact them or login to their management system to retrieve your Premium key. Otherwise, please visit <a href="%1$s" target="_blank">BoldGrid Central</a> to upgrade.', 'boldgrid-backup' ),
94
+ $this->get_premium_url( 'bgbkup-premium-activate' ),
95
  admin_url( 'admin.php?page=boldgrid-backup-settings&section=connect_key' )
96
  ) . '</p>',
97
  ),
126
  * @param string $text Button text.
127
  * @return string
128
  */
129
+ public function get_premium_button( $url = null, $text = 'Get Premium' ) {
130
+ $url = ! empty( $url ) ? $url : $this->get_premium_url();
131
+
132
  return sprintf(
133
  '
134
  <a href="%1$s" class="button button-success" target="_blank">%2$s</a>',
136
  $text
137
  );
138
  }
139
+
140
+ /**
141
+ * Get a "Get Premium" url.
142
+ *
143
+ * @since 1.7.0
144
+ *
145
+ * @param string $source Source to append to url.
146
+ * @param string $url URL address for the upgrade page.
147
+ * @return string
148
+ */
149
+ public function get_premium_url( $source = 'bgbkup', $url = 'https://www.boldgrid.com/update-backup' ) {
150
+ $url = add_query_arg( 'source', $source, $url );
151
+
152
+ return $url;
153
+ }
154
  }
admin/class-boldgrid-backup-admin-in-progress-data.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class: Boldgrid_Backup_Admin_In_Progress_Data
4
+ *
5
+ * This class used for managing the data used by the Boldgrid_Backup_Admin_In_Progress class.
6
+ *
7
+ * @link https://www.boldgrid.com
8
+ * @since 1.7.0
9
+ *
10
+ * @package Boldgrid_Backup
11
+ * @subpackage Boldgrid_Backup/admin
12
+ * @copyright BoldGrid
13
+ * @version $Id$
14
+ * @author BoldGrid <support@boldgrid.com>
15
+ */
16
+
17
+ /**
18
+ * Class: Boldgrid_Backup_Admin_In_Progress_Data
19
+ *
20
+ * @since 1.7.0
21
+ */
22
+ class Boldgrid_Backup_Admin_In_Progress_Data {
23
+
24
+ /**
25
+ * Option name in which data is stored.
26
+ *
27
+ * @since 1.7.0
28
+ * @var string
29
+ */
30
+ public static $option_name = 'boldgrid_backup_in_progress_data';
31
+
32
+ /**
33
+ * Delete one arguement.
34
+ *
35
+ * @since 1.7.0
36
+ *
37
+ * @param string $arg The key.
38
+ */
39
+ public static function delete_arg( $arg ) {
40
+ $args = self::get_args();
41
+
42
+ if ( isset( $args[ $arg ] ) ) {
43
+ unset( $args[ $arg ] );
44
+ }
45
+
46
+ update_option( self::$option_name, $args );
47
+ }
48
+
49
+ /**
50
+ * Get one argument.
51
+ *
52
+ * @since 1.7.0
53
+ *
54
+ * @return mixed
55
+ */
56
+ public static function get_arg( $key ) {
57
+ $args = get_option( self::$option_name );
58
+
59
+ return isset( $args[ $key ] ) ? $args[ $key ] : false;
60
+ }
61
+
62
+ /**
63
+ * Get all arguments.
64
+ *
65
+ * @since 1.7.0
66
+ *
67
+ * @return array
68
+ */
69
+ public static function get_args() {
70
+ return get_option( self::$option_name );
71
+ }
72
+
73
+ /**
74
+ * Get required markup to show the progress bar.
75
+ *
76
+ * Generally displayed under a "Backup Now" button.
77
+ *
78
+ * @since 1.7.0
79
+ */
80
+ public static function get_markup( $label = null ) {
81
+ $label = ! empty( $label ) ? $label : __( 'Initializing backup...', 'boldgrid-backup' );
82
+
83
+ $steps = '<div id="boldgrid_backup_in_progress_steps">
84
+ <div class="step" data-step="1">' . esc_html__( 'Backing up database...', 'boldgrid-backup' ) . '</div>
85
+ <div class="step" data-step="2">' . esc_html__( 'Adding files to archive...', 'boldgrid-backup' ) . '</div>
86
+ <div class="step" data-step="3">' . esc_html__( 'Saving archive to disk...', 'boldgrid-backup' ) . '</div>
87
+ </div>';
88
+
89
+ $progress_bar = '<div id="boldgrid-backup-in-progress-bar">
90
+ <div class="progress-label">' . esc_html( $label ) . '</div>
91
+ <div id="last_file_archived"></div>
92
+ </div>';
93
+
94
+ return '<div id="boldgrid_backup_in_progress_container" class="hidden">' . $steps . $progress_bar . '</div>';
95
+ }
96
+
97
+ /**
98
+ * Set one arguement, a key / value pair.
99
+ *
100
+ * @since 1.7.0
101
+ *
102
+ * @param string $arg The key.
103
+ * @param string $value The value.
104
+ */
105
+ public static function set_arg( $arg, $value ) {
106
+ $args = self::get_args();
107
+
108
+ $args[ $arg ] = $value;
109
+
110
+ update_option( self::$option_name, $args );
111
+ }
112
+
113
+ /**
114
+ * Set arguments.
115
+ *
116
+ * @since 1.7.0
117
+ *
118
+ * @param array $args Arguments.
119
+ */
120
+ public static function set_args( $args ) {
121
+ update_option( self::$option_name, $args );
122
+ }
123
+ }
admin/class-boldgrid-backup-admin-in-progress.php CHANGED
@@ -72,6 +72,8 @@ class Boldgrid_Backup_Admin_In_Progress {
72
  */
73
  wp_enqueue_script( 'heartbeat' );
74
 
 
 
75
  $elapsed = time() - $in_progress;
76
  $limit = 15 * MINUTE_IN_SECONDS;
77
 
@@ -146,16 +148,18 @@ class Boldgrid_Backup_Admin_In_Progress {
146
  return false;
147
  }
148
 
149
- $notice = array(
 
 
 
 
 
 
 
 
 
150
  'class' => 'notice notice-warning boldgrid-backup-in-progress',
151
- 'message' => sprintf(
152
- // translators: 1: Time difference.
153
- __(
154
- 'BoldGrid Backup began archiving your website %1$s ago.',
155
- 'boldgrid-backup'
156
- ),
157
- human_time_diff( $in_progress, time() )
158
- ),
159
  'heading' => __( 'BoldGrid Backup - Backup in progress', 'boldgrid-backup' ),
160
  );
161
 
@@ -181,6 +185,47 @@ class Boldgrid_Backup_Admin_In_Progress {
181
  return $markup;
182
  }
183
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
  /**
185
  * Take action when the heartbeat is received.
186
  *
@@ -206,6 +251,16 @@ class Boldgrid_Backup_Admin_In_Progress {
206
  // Our "backup complete!" admin notice.
207
  $response['boldgrid_backup_complete'] = $this->core->notice->get_backup_complete();
208
 
 
 
 
 
 
 
 
 
 
 
209
  return $response;
210
  }
211
 
72
  */
73
  wp_enqueue_script( 'heartbeat' );
74
 
75
+ wp_enqueue_script( 'jquery-ui-progressbar' );
76
+
77
  $elapsed = time() - $in_progress;
78
  $limit = 15 * MINUTE_IN_SECONDS;
79
 
148
  return false;
149
  }
150
 
151
+ /*
152
+ * Create our notice for atop the page.
153
+ *
154
+ * Initially started out as "backup in progress". Has expanded to include a progress bar.
155
+ */
156
+ $loading = __( 'Loading...', 'bgtfw' );
157
+ // translators: 1: The time since the last backup was initiated.
158
+ $message = '<p>' . sprintf( __( 'BoldGrid Backup began archiving your website %1$s ago.', 'boldgrid-backup' ), human_time_diff( $in_progress, time() ) ) . '</p>';
159
+ $message .= Boldgrid_Backup_Admin_In_Progress_Data::get_markup( $loading );
160
+ $notice = array(
161
  'class' => 'notice notice-warning boldgrid-backup-in-progress',
162
+ 'message' => $message,
 
 
 
 
 
 
 
163
  'heading' => __( 'BoldGrid Backup - Backup in progress', 'boldgrid-backup' ),
164
  );
165
 
185
  return $markup;
186
  }
187
 
188
+ /**
189
+ * Get details on our temporary zip file.
190
+ *
191
+ * For example, if we're in the middle of saving / closing our backup file, there should be a
192
+ * file.zip.temp file in our backup directory. We are getting the details of that file.
193
+ *
194
+ * @since 1.7.0
195
+ *
196
+ * @return array
197
+ */
198
+ public function get_tmp() {
199
+ $data = array();
200
+
201
+ $dirlist = $this->core->backup_dir->dirlist_containing( '.zip.' );
202
+
203
+ /*
204
+ * We should only have one temp zip file. If we have multiple though, something may have
205
+ * gone recently. Sort by timestamp and use the newest file.
206
+ */
207
+ if ( 1 < count( $dirlist ) ) {
208
+ uasort(
209
+ $dirlist, function( $item1, $item2 ) {
210
+ return $item1['lastmodunix'] < $item2['lastmodunix'] ? 1 : -1;
211
+ }
212
+ );
213
+ }
214
+
215
+ if ( 1 <= count( $dirlist ) ) {
216
+ reset( $dirlist );
217
+ $tmp_filename = key( $dirlist );
218
+
219
+ $data = array(
220
+ 'size' => $dirlist[ $tmp_filename ]['size'],
221
+ 'lastmodunix' => $dirlist[ $tmp_filename ]['lastmodunix'],
222
+ 'size_format' => size_format( $dirlist[ $tmp_filename ]['size'] ),
223
+ );
224
+ }
225
+
226
+ return $data;
227
+ }
228
+
229
  /**
230
  * Take action when the heartbeat is received.
231
  *
251
  // Our "backup complete!" admin notice.
252
  $response['boldgrid_backup_complete'] = $this->core->notice->get_backup_complete();
253
 
254
+ $response['in_progress_data'] = Boldgrid_Backup_Admin_In_Progress_Data::get_args();
255
+
256
+ // Steps to take if we're on the last step, step 3, closing the archive.
257
+ if ( 3 === Boldgrid_Backup_Admin_In_Progress_Data::get_arg( 'step' ) ) {
258
+ $tmp = $this->get_tmp();
259
+ if ( ! empty( $tmp ) ) {
260
+ $response['in_progress_data']['tmp'] = $tmp;
261
+ }
262
+ }
263
+
264
  return $response;
265
  }
266
 
admin/class-boldgrid-backup-admin-notice.php CHANGED
@@ -227,4 +227,23 @@ class Boldgrid_Backup_Admin_Notice {
227
 
228
  return $message;
229
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
230
  }
227
 
228
  return $message;
229
  }
230
+
231
+ /**
232
+ * Display a notice for auto-update settings.
233
+ *
234
+ * @since 1.7.0
235
+ */
236
+ public function display_autoupdate_notice() {
237
+ $message = sprintf(
238
+ // translators: 1: HTML anchor opening tag, 2: HTML anchor closing tag.
239
+ esc_html__(
240
+ 'Auto-Updates can be configured in the %1$sBoldGrid Backup Settings%2$s.',
241
+ 'boldgrid-backup'
242
+ ),
243
+ '<a href="' . admin_url( 'admin.php?page=boldgrid-backup-settings&section=section_auto_updates' ) . '">',
244
+ '</a>'
245
+ );
246
+
247
+ do_action( 'boldgrid_backup_notice', $message, 'notice notice-info is-dismissible' );
248
+ }
249
  }
admin/class-boldgrid-backup-admin-remote.php CHANGED
@@ -80,19 +80,13 @@ class Boldgrid_Backup_Admin_Remote {
80
  *
81
  * @since 1.6.0
82
  *
 
 
 
83
  * @param string $filepath A file path.
84
  */
85
  public function post_download( $filepath ) {
86
- /*
87
- * Restore the log file from the archive so we can get all the juicy
88
- * meta data about the archive.
89
- */
90
- $this->core->archive_log->restore_by_zip( $filepath );
91
-
92
- /*
93
- * Now that we have the log, update the archive's timestamp based upon
94
- * time last modified time in the log.
95
- */
96
  $this->core->archive->reset();
97
  $this->core->archive->init( $filepath );
98
  $this->core->archive->update_timestamp();
80
  *
81
  * @since 1.6.0
82
  *
83
+ * @see Boldgrid_Backup_Admin_Archive::init()
84
+ * @see Boldgrid_Backup_Admin_Archive::update_timestamp()
85
+ *
86
  * @param string $filepath A file path.
87
  */
88
  public function post_download( $filepath ) {
89
+ // Update the archive's timestamp based upon time last modified time in the log.
 
 
 
 
 
 
 
 
 
90
  $this->core->archive->reset();
91
  $this->core->archive->init( $filepath );
92
  $this->core->archive->update_timestamp();
admin/class-boldgrid-backup-admin-settings.php CHANGED
@@ -157,13 +157,23 @@ class Boldgrid_Backup_Admin_Settings {
157
  }
158
 
159
  // Other settings.
160
- $settings['auto_backup'] = (
161
  ! isset( $settings['auto_backup'] ) || ! empty( $settings['auto_backup'] ) ? 1 : 0
162
  );
 
163
  $settings['auto_rollback'] = (
164
  ! isset( $settings['auto_rollback'] ) || ! empty( $settings['auto_rollback'] ) ?
165
  1 : 0
166
  );
 
 
 
 
 
 
 
 
 
167
  } else {
168
  // Define defaults.
169
  // Days of the week.
@@ -181,7 +191,7 @@ class Boldgrid_Backup_Admin_Settings {
181
  $settings['schedule']['tod_a'] = 'AM';
182
 
183
  // Other settings.
184
- $settings['retention_count'] = 5;
185
  $settings['notification_email'] = $this->core->config->get_admin_email();
186
  $settings['notifications']['backup'] = 1;
187
  $settings['notifications']['restore'] = 1;
@@ -189,16 +199,6 @@ class Boldgrid_Backup_Admin_Settings {
189
  $settings['auto_rollback'] = 1;
190
  }
191
 
192
- $boldgrid_settings = get_site_option( 'boldgrid_settings' );
193
-
194
- $settings['plugin_autoupdate'] = (
195
- ! empty( $boldgrid_settings['plugin_autoupdate'] ) ? 1 : 0
196
- );
197
-
198
- $settings['theme_autoupdate'] = (
199
- ! empty( $boldgrid_settings['theme_autoupdate'] ) ? 1 : 0
200
- );
201
-
202
  if ( empty( $settings['remote'] ) ) {
203
  $settings['remote'] = array();
204
  }
@@ -268,14 +268,13 @@ class Boldgrid_Backup_Admin_Settings {
268
  private function update_settings() {
269
  $update_errors = array();
270
 
271
- // Verify nonce.
272
- check_admin_referer( 'boldgrid-backup-settings', 'settings_auth' );
273
-
274
- // Get the retention count.
275
- if ( isset( $_POST['retention_count'] ) ) {
276
- $retention_count = intval( $_POST['retention_count'] );
277
- } else {
278
- $retention_count = $this->core->config->get_default_retention();
279
  }
280
 
281
  // Check for settings update.
@@ -384,10 +383,6 @@ class Boldgrid_Backup_Admin_Settings {
384
  }
385
 
386
  // Validate input for other settings.
387
- $settings['retention_count'] = (
388
- isset( $_POST['retention_count'] ) ? (int) $_POST['retention_count'] : 5
389
- );
390
-
391
  $settings['notifications']['backup'] = (
392
  ( isset( $_POST['notify_backup'] ) && '1' === $_POST['notify_backup'] ) ? 1 : 0
393
  );
@@ -410,88 +405,6 @@ class Boldgrid_Backup_Admin_Settings {
410
  $settings['notification_email'] = sanitize_email( $_POST['notification_email'] );
411
  }
412
 
413
- $boldgrid_settings['plugin_autoupdate'] = (
414
- ( isset( $_POST['plugin_autoupdate'] ) && '1' === $_POST['plugin_autoupdate'] ) ?
415
- 1 : 0
416
- );
417
-
418
- $boldgrid_settings['theme_autoupdate'] = (
419
- ( isset( $_POST['theme_autoupdate'] ) && '1' === $_POST['theme_autoupdate'] ) ?
420
- 1 : 0
421
- );
422
-
423
- unset( $settings['plugin_autoupdate'], $settings['theme_autoupdate'] );
424
-
425
- // Get the current backup directory path.
426
- $backup_dir_changed = false;
427
- $original_backup_directory = ! empty( $settings['backup_directory'] ) ? $settings['backup_directory'] : false;
428
-
429
- if ( ! empty( $_POST['backup_directory'] ) ) {
430
- $post_backup_directory = trim( $_POST['backup_directory'] );
431
- $post_backup_directory = untrailingslashit( $post_backup_directory );
432
- $post_backup_directory = str_replace( '\\\\', '\\', $post_backup_directory );
433
- }
434
-
435
- /*
436
- * Create the backup directory.
437
- *
438
- * Allow the user to submit a blank backup directory if they want
439
- * to set the backup directory to the default.
440
- */
441
- if ( empty( $_POST['backup_directory'] ) ) {
442
- // The get method validates and creates the backup directory.
443
- $backup_directory = $this->core->backup_dir->guess_and_set();
444
-
445
- $backup_dir_changed = $original_backup_directory !== $backup_directory;
446
- } elseif ( $post_backup_directory !== $original_backup_directory ) {
447
- $backup_directory = $post_backup_directory;
448
-
449
- /*
450
- * Create the backup directory.
451
- *
452
- * Even if the backup directory already exists, we still want to
453
- * run the create method so that the necessary .htaccess and other
454
- * files are created to protect the directory.
455
- */
456
- $backup_directory = $this->core->backup_dir->create( $backup_directory );
457
-
458
- // Make sure that the backup directory has proper permissions.
459
- $valid = $this->core->backup_dir->is_valid( $backup_directory );
460
- if ( ! $valid ) {
461
- $backup_directory = false;
462
- }
463
-
464
- $backup_dir_changed = true;
465
- }
466
-
467
- if ( $backup_dir_changed ) {
468
- if ( false === $backup_directory ) {
469
- $update_error = true;
470
- $backup_dir_changed = false;
471
- $update_errors = array_merge( $update_errors, $this->core->backup_dir->errors );
472
- } else {
473
- $settings['backup_directory'] = $backup_directory;
474
- }
475
- }
476
-
477
- // Move backups to the new directory.
478
- if ( $backup_dir_changed && isset( $_POST['move-backups'] ) && 'on' === $_POST['move-backups'] ) {
479
- $backups_moved = $this->move_backups( $original_backup_directory, $backup_directory );
480
-
481
- if ( ! $backups_moved ) {
482
- $update_error = true;
483
- $update_errors[] = sprintf(
484
- // translators: 1: Original backup directory, 2: New backup directory.
485
- __(
486
- 'Unable to move backups from %1$s to %2$s',
487
- 'boldgrid-backup'
488
- ),
489
- $original_backup_directory,
490
- $backup_directory
491
- );
492
- }
493
- }
494
-
495
  /*
496
  * Save compressor settings.
497
  *
@@ -603,11 +516,34 @@ class Boldgrid_Backup_Admin_Settings {
603
  $settings['folder_exclusion_exclude'] = $this->core->folder_exclusion->from_post( 'exclude' );
604
  $settings['folder_exclusion_type'] = $this->core->folder_exclusion->from_post( 'type' );
605
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
606
  // If no errors, then save the settings.
607
  if ( ! $update_error ) {
608
  $settings['updated'] = time();
609
  update_site_option( 'boldgrid_backup_settings', $settings );
610
- $this->update_boldgrid_settings( $boldgrid_settings );
611
  }
612
  }
613
 
@@ -659,11 +595,9 @@ class Boldgrid_Backup_Admin_Settings {
659
  public function page_backup_settings() {
660
  add_thickbox();
661
  wp_enqueue_style( 'boldgrid-backup-admin-new-thickbox-style' );
662
-
663
  wp_enqueue_style( 'bglib-ui-css' );
664
  wp_enqueue_script( 'bglib-ui-js' );
665
  wp_enqueue_script( 'bglib-sticky' );
666
-
667
  wp_enqueue_script( 'bglib-license' );
668
 
669
  if ( ! $this->is_saving_settings ) {
@@ -714,9 +648,7 @@ class Boldgrid_Backup_Admin_Settings {
714
 
715
  // Check for settings update.
716
  if ( $this->is_saving_settings ) {
717
- // Verify nonce.
718
- check_admin_referer( 'boldgrid-backup-settings', 'settings_auth' );
719
-
720
  $this->update_settings();
721
  }
722
 
@@ -736,6 +668,40 @@ class Boldgrid_Backup_Admin_Settings {
736
  false
737
  );
738
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
739
  $this->core->folder_exclusion->enqueue_scripts();
740
  $this->core->db_omit->enqueue_scripts();
741
 
@@ -761,36 +727,6 @@ class Boldgrid_Backup_Admin_Settings {
761
  * @return bool True on success.
762
  */
763
  public function save( $settings ) {
764
-
765
- // For consistency, untrailingslashit the backup dir.
766
- if ( isset( $settings['backup_directory'] ) ) {
767
- $settings['backup_directory'] = untrailingslashit( $settings['backup_directory'] );
768
- }
769
-
770
  return update_site_option( 'boldgrid_backup_settings', $settings );
771
  }
772
-
773
- /**
774
- * Update BoldGrid general settings.
775
- *
776
- * @since 1.3.11
777
- *
778
- * @param array $settings Array of BoldGrid settings.
779
- * @return bool
780
- */
781
- public function update_boldgrid_settings( array $settings ) {
782
- $boldgrid_settings = get_site_option( 'boldgrid_settings' );
783
-
784
- $boldgrid_settings['plugin_autoupdate'] = (
785
- ( isset( $settings['plugin_autoupdate'] ) && 1 === $settings['plugin_autoupdate'] ) ?
786
- 1 : 0
787
- );
788
-
789
- $boldgrid_settings['theme_autoupdate'] = (
790
- ( isset( $settings['theme_autoupdate'] ) && 1 === $settings['theme_autoupdate'] ) ?
791
- 1 : 0
792
- );
793
-
794
- return update_site_option( 'boldgrid_settings', $boldgrid_settings );
795
- }
796
  }
157
  }
158
 
159
  // Other settings.
160
+ $settings['auto_backup'] = (
161
  ! isset( $settings['auto_backup'] ) || ! empty( $settings['auto_backup'] ) ? 1 : 0
162
  );
163
+
164
  $settings['auto_rollback'] = (
165
  ! isset( $settings['auto_rollback'] ) || ! empty( $settings['auto_rollback'] ) ?
166
  1 : 0
167
  );
168
+
169
+ // Get retention count setting. Limit 1-99, default is from config.
170
+ $settings['retention_count'] = ( isset( $settings['retention_count'] ) &&
171
+ 99 >= $settings['retention_count'] ) ?
172
+ $settings['retention_count'] : $this->core->config->get_default_retention();
173
+
174
+ if ( $settings['retention_count'] > 99 ) {
175
+ $settings['retention_count'] = 99;
176
+ }
177
  } else {
178
  // Define defaults.
179
  // Days of the week.
191
  $settings['schedule']['tod_a'] = 'AM';
192
 
193
  // Other settings.
194
+ $settings['retention_count'] = $this->core->config->get_default_retention();
195
  $settings['notification_email'] = $this->core->config->get_admin_email();
196
  $settings['notifications']['backup'] = 1;
197
  $settings['notifications']['restore'] = 1;
199
  $settings['auto_rollback'] = 1;
200
  }
201
 
 
 
 
 
 
 
 
 
 
 
202
  if ( empty( $settings['remote'] ) ) {
203
  $settings['remote'] = array();
204
  }
268
  private function update_settings() {
269
  $update_errors = array();
270
 
271
+ // Check security nonce and referer.
272
+ if ( ! check_admin_referer( 'boldgrid-backup-settings', 'settings_auth' ) ) {
273
+ wp_send_json_error(
274
+ array(
275
+ 'error' => __( 'Security violation! Please try again.', 'boldgrid-backup' ),
276
+ )
277
+ );
 
278
  }
279
 
280
  // Check for settings update.
383
  }
384
 
385
  // Validate input for other settings.
 
 
 
 
386
  $settings['notifications']['backup'] = (
387
  ( isset( $_POST['notify_backup'] ) && '1' === $_POST['notify_backup'] ) ? 1 : 0
388
  );
405
  $settings['notification_email'] = sanitize_email( $_POST['notification_email'] );
406
  }
407
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
408
  /*
409
  * Save compressor settings.
410
  *
516
  $settings['folder_exclusion_exclude'] = $this->core->folder_exclusion->from_post( 'exclude' );
517
  $settings['folder_exclusion_type'] = $this->core->folder_exclusion->from_post( 'type' );
518
 
519
+ // Read BoldGrid settings form POST request, sanitize, and merge settings with saved.
520
+ $boldgrid_settings = array_merge(
521
+ get_option( 'boldgrid_settings' ),
522
+ \Boldgrid\Library\Library\Page\Connect::sanitizeSettings(
523
+ array(
524
+ 'autoupdate' => ! empty( $_POST['autoupdate'] ) ?
525
+ (array) $_POST['autoupdate'] : array(),
526
+ 'release_channel' => ! empty( $_POST['plugin_release_channel'] ) ?
527
+ sanitize_key( $_POST['plugin_release_channel'] ) : 'stable',
528
+ 'theme_release_channel' => ! empty( $_POST['theme_release_channel'] ) ?
529
+ sanitize_key( $_POST['theme_release_channel'] ) : 'stable',
530
+ )
531
+ )
532
+ );
533
+
534
+ // Cleanup old settings.
535
+ unset(
536
+ $settings['plugin_autoupdate'],
537
+ $settings['theme_autoupdate'],
538
+ $boldgrid_settings['plugin_autoupdate'],
539
+ $boldgrid_settings['theme_autoupdate']
540
+ );
541
+
542
  // If no errors, then save the settings.
543
  if ( ! $update_error ) {
544
  $settings['updated'] = time();
545
  update_site_option( 'boldgrid_backup_settings', $settings );
546
+ update_option( 'boldgrid_settings', $boldgrid_settings );
547
  }
548
  }
549
 
595
  public function page_backup_settings() {
596
  add_thickbox();
597
  wp_enqueue_style( 'boldgrid-backup-admin-new-thickbox-style' );
 
598
  wp_enqueue_style( 'bglib-ui-css' );
599
  wp_enqueue_script( 'bglib-ui-js' );
600
  wp_enqueue_script( 'bglib-sticky' );
 
601
  wp_enqueue_script( 'bglib-license' );
602
 
603
  if ( ! $this->is_saving_settings ) {
648
 
649
  // Check for settings update.
650
  if ( $this->is_saving_settings ) {
651
+ // The nonce is verified in the update_settings method.
 
 
652
  $this->update_settings();
653
  }
654
 
668
  false
669
  );
670
 
671
+ wp_enqueue_script(
672
+ 'boldgrid-backup-admin-settings-autoupdate',
673
+ plugin_dir_url( __FILE__ ) . 'js/boldgrid-backup-admin-settings-autoupdate.js',
674
+ array( 'jquery' ),
675
+ BOLDGRID_BACKUP_VERSION,
676
+ false
677
+ );
678
+
679
+ // Enqueue JS for the toggles on the auto-updates section.
680
+ wp_enqueue_script(
681
+ 'boldgrid-library-connect',
682
+ \Boldgrid\Library\Library\Configs::get( 'libraryUrl' ) . 'src/assets/js/connect.js',
683
+ array( 'jquery' ),
684
+ BOLDGRID_BACKUP_VERSION,
685
+ false
686
+ );
687
+
688
+ // Enqueue jquery-toggles JS.
689
+ wp_enqueue_script(
690
+ 'jquery-toggles',
691
+ \Boldgrid\Library\Library\Configs::get( 'libraryUrl' ) . 'build/toggles.min.js',
692
+ array( 'jquery' ),
693
+ BOLDGRID_BACKUP_VERSION,
694
+ true
695
+ );
696
+
697
+ // Enqueue jquery-toggles CSS.
698
+ wp_enqueue_style(
699
+ 'jquery-toggles-full',
700
+ \Boldgrid\Library\Library\Configs::get( 'libraryUrl' ) . 'build/toggles-full.css',
701
+ array(),
702
+ BOLDGRID_BACKUP_VERSION
703
+ );
704
+
705
  $this->core->folder_exclusion->enqueue_scripts();
706
  $this->core->db_omit->enqueue_scripts();
707
 
727
  * @return bool True on success.
728
  */
729
  public function save( $settings ) {
 
 
 
 
 
 
730
  return update_site_option( 'boldgrid_backup_settings', $settings );
731
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
732
  }
admin/class-boldgrid-backup-admin-support.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File: class-boldgrid-backup-admin-support.php
4
+ *
5
+ * @link https://www.boldgrid.com
6
+ * @since 1.7.0
7
+ *
8
+ * @package Boldgrid_Backup
9
+ * @subpackage Boldgrid_Backup/admin
10
+ * @copyright BoldGrid
11
+ * @version $Id$
12
+ * @author BoldGrid <support@boldgrid.com>
13
+ */
14
+
15
+ /**
16
+ * Class: Boldgrid_Backup_Admin_Support
17
+ *
18
+ * @since 1.7.0
19
+ */
20
+ class Boldgrid_Backup_Admin_Support {
21
+
22
+ /**
23
+ * Deactivate and show an error.
24
+ *
25
+ * @since 1.7.0
26
+ *
27
+ * @param string $error
28
+ */
29
+ public function deactivate( $error ) {
30
+ add_action( 'admin_notices', function () use ( $error ) {
31
+ $allowed_html = array(
32
+ 'p' => array(),
33
+ 'strong' => array(),
34
+ 'br' => array(),
35
+ 'em' => array(),
36
+ );
37
+
38
+ $error = '<p>' . sprintf(
39
+ /* translators: 1 and 2 are opening and closing string tags. */
40
+ __( '%1$sBoldGrid Backup%2$s has been deactivated due to the following error:', 'boldgrid-backup' ),
41
+ '<strong>',
42
+ '</strong>' ) . '<br /><br />' . $error . '</p>';
43
+
44
+ // Echo our admin notice. Hide the "plugin activated" notice.
45
+ echo '
46
+ <div class="notice notice-error is-dismissible">' . wp_kses( $error, $allowed_html ) . '</div>
47
+ <style type="text/css">
48
+ .updated.notice { display: none; }
49
+ </style>
50
+ ';
51
+ });
52
+
53
+ add_action( 'admin_init', function() {
54
+ deactivate_plugins( 'boldgrid-backup/boldgrid-backup.php', true );
55
+ });
56
+ }
57
+
58
+ /**
59
+ * Determine whether or not we have our build directory.
60
+ *
61
+ * @since 1.7.0
62
+ *
63
+ * @return bool
64
+ */
65
+ public function has_been_built() {
66
+ return file_exists( BOLDGRID_BACKUP_PATH . '/build/clipboard.min.js' );
67
+ }
68
+
69
+ /**
70
+ * Determine whether or not composer has been setup.
71
+ *
72
+ * @since 1.7.0
73
+ *
74
+ * @return bool
75
+ */
76
+ public function has_composer_installed() {
77
+ $exists_composer = file_exists( BOLDGRID_BACKUP_PATH . '/composer.json' );
78
+ $exists_autoload = file_exists( BOLDGRID_BACKUP_PATH . '/vendor/autoload.php' );
79
+
80
+ return ! $exists_composer || $exists_autoload;
81
+ }
82
+ }
admin/class-boldgrid-backup-admin-test.php CHANGED
@@ -94,15 +94,6 @@ class Boldgrid_Backup_Admin_Test {
94
  */
95
  private $is_php_safemode = null;
96
 
97
- /**
98
- * Functionality tests completed?
99
- *
100
- * @since 1.0
101
- * @access private
102
- * @var bool
103
- */
104
- private $functionality_tested = false;
105
-
106
  /**
107
  * Is functional?
108
  *
@@ -488,6 +479,19 @@ class Boldgrid_Backup_Admin_Test {
488
  return $this->is_php_safemode;
489
  }
490
 
 
 
 
 
 
 
 
 
 
 
 
 
 
491
  /**
492
  * Determine if this is a plesk environment.
493
  *
@@ -510,64 +514,34 @@ class Boldgrid_Backup_Admin_Test {
510
  *
511
  * @since 1.0
512
  *
513
- * @global WP_Filesystem $wp_filesystem The WordPress Filesystem API global object.
514
- *
515
  * @return bool
516
  */
517
  public function run_functionality_tests() {
518
- // If functionality tests were already performed, then just return status.
519
- if ( $this->functionality_tested && null !== $this->is_functional ) {
520
  return $this->is_functional;
521
  }
522
 
523
- // Connect to the WordPress Filesystem API.
524
- global $wp_filesystem;
525
 
526
- // If not writable, then mark as not functional.
527
- if ( ! $this->get_is_abspath_writable() ) {
528
  $this->is_functional = false;
529
- }
530
-
531
- // Configure the backup directory path, or mark as not functional.
532
- if ( ! $this->core->backup_dir->get() ) {
533
  $this->is_functional = false;
534
- }
535
-
536
- // Get available compressors.
537
- $available_compressors = $this->core->config->get_available_compressors();
538
-
539
- // Test for available compressors, and add them to the array, or mark as not functional.
540
- if ( empty( $available_compressors ) ) {
541
  $this->is_functional = false;
542
- }
543
-
544
- if ( 'php_zip' === $this->core->compressors->get() ) {
545
- $php_zip = new Boldgrid_Backup_Admin_Compressor_Php_Zip( $this->core );
546
- if ( ! $php_zip->test( false ) ) {
547
- $this->is_functional = false;
548
- }
549
- }
550
-
551
- if ( 'pcl_zip' === $this->core->compressors->get() ) {
552
- $pcl_zip = new Boldgrid_Backup_Admin_Compressor_Pcl_Zip( $this->core );
553
- if ( ! $pcl_zip->test( false ) ) {
554
- $this->is_functional = false;
555
- }
556
- }
557
-
558
- // Test for PHP safe mode.
559
- if ( $this->is_php_safemode() ) {
560
  $this->is_functional = false;
561
- }
562
-
563
- // Save result, if not previously saved.
564
- if ( null === $this->is_functional ) {
 
 
 
565
  $this->is_functional = true;
566
  }
567
 
568
- // Mark as completed.
569
- $this->functionality_tested = true;
570
-
571
  return $this->is_functional;
572
  }
573
 
@@ -680,6 +654,9 @@ class Boldgrid_Backup_Admin_Test {
680
  'has_url_fopen' => false,
681
  );
682
 
 
 
 
683
  // Configure an array of commands to run.
684
  $cmds = array(
685
  'php -qf ' . trailingslashit( BOLDGRID_BACKUP_PATH ) . 'cron/cli-support.php',
@@ -697,9 +674,14 @@ class Boldgrid_Backup_Admin_Test {
697
 
698
  // Find a command that gives us an array.
699
  foreach ( $cmds as $cmd ) {
700
- $result = $this->core->execute_command( $cmd );
701
 
702
- $result = json_decode( $result, true );
 
 
 
 
 
703
 
704
  if ( ! is_array( $result ) ) {
705
  continue;
@@ -822,6 +804,19 @@ class Boldgrid_Backup_Admin_Test {
822
  false !== strpos( $_SERVER['SERVER_SOFTWARE'], 'IIS' );
823
  }
824
 
 
 
 
 
 
 
 
 
 
 
 
 
 
825
  /**
826
  * Determine if this server has cPanel EasyApache 4 with php-cli installed.
827
  *
@@ -839,4 +834,31 @@ class Boldgrid_Backup_Admin_Test {
839
 
840
  return $is_ea4 || $has_php_cli;
841
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
842
  }
94
  */
95
  private $is_php_safemode = null;
96
 
 
 
 
 
 
 
 
 
 
97
  /**
98
  * Is functional?
99
  *
479
  return $this->is_php_safemode;
480
  }
481
 
482
+ /**
483
+ * Determine whether or not php_zip is suppored.
484
+ *
485
+ * @since 1.7.0
486
+ *
487
+ * @return bool
488
+ */
489
+ public function is_php_zip_supported() {
490
+ $php_zip = new Boldgrid_Backup_Admin_Compressor_Php_Zip( $this->core );
491
+
492
+ return $php_zip->test( false );
493
+ }
494
+
495
  /**
496
  * Determine if this is a plesk environment.
497
  *
514
  *
515
  * @since 1.0
516
  *
 
 
517
  * @return bool
518
  */
519
  public function run_functionality_tests() {
520
+ if ( null !== $this->is_functional ) {
 
521
  return $this->is_functional;
522
  }
523
 
524
+ $available_compressors = $this->core->config->get_available_compressors();
525
+ $compressor = $this->core->compressors->get();
526
 
527
+ if ( ! self::is_filesystem_supported() ) {
 
528
  $this->is_functional = false;
529
+ } elseif ( ! $this->get_is_abspath_writable() ) {
 
 
 
530
  $this->is_functional = false;
531
+ } elseif ( ! $this->core->backup_dir->get() ) {
 
 
 
 
 
 
532
  $this->is_functional = false;
533
+ } elseif ( empty( $available_compressors ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
534
  $this->is_functional = false;
535
+ } elseif ( 'php_zip' === $compressor && ! $this->is_php_zip_supported() ) {
536
+ $this->is_functional = false;
537
+ } elseif ( 'pcl_zip' === $compressor && ! $this->is_pcl_zip_supported() ) {
538
+ $this->is_functional = false;
539
+ } elseif ( $this->is_php_safemode() ) {
540
+ $this->is_functional = false;
541
+ } else {
542
  $this->is_functional = true;
543
  }
544
 
 
 
 
545
  return $this->is_functional;
546
  }
547
 
654
  'has_url_fopen' => false,
655
  );
656
 
657
+ // Set a file path for the cli-support script output.
658
+ $filepath = wp_normalize_path( $this->core->backup_dir->get() . '/cli-support.txt' );
659
+
660
  // Configure an array of commands to run.
661
  $cmds = array(
662
  'php -qf ' . trailingslashit( BOLDGRID_BACKUP_PATH ) . 'cron/cli-support.php',
674
 
675
  // Find a command that gives us an array.
676
  foreach ( $cmds as $cmd ) {
677
+ $this->core->execute_command( $cmd, array(), $null, $null, $filepath );
678
 
679
+ // Our command may have resulted in unexpected output. Look for a json string.
680
+ preg_match( '/{.*}/', $this->core->wp_filesystem->get_contents( $filepath ), $matches );
681
+
682
+ $result = is_array( $matches ) ? json_decode( $matches[0], true ) : null;
683
+
684
+ $this->core->wp_filesystem->delete( $filepath );
685
 
686
  if ( ! is_array( $result ) ) {
687
  continue;
804
  false !== strpos( $_SERVER['SERVER_SOFTWARE'], 'IIS' );
805
  }
806
 
807
+ /**
808
+ * Determine whether pcl_zip is supported.
809
+ *
810
+ * @since 1.7.0
811
+ *
812
+ * @return bool
813
+ */
814
+ public function is_pcl_zip_supported() {
815
+ $pcl_zip = new Boldgrid_Backup_Admin_Compressor_Pcl_Zip( $this->core );
816
+
817
+ return $pcl_zip->test( false );
818
+ }
819
+
820
  /**
821
  * Determine if this server has cPanel EasyApache 4 with php-cli installed.
822
  *
834
 
835
  return $is_ea4 || $has_php_cli;
836
  }
837
+
838
+ /**
839
+ * Determine whether or not the current filesystem is supported.
840
+ *
841
+ * @since 1.7.0
842
+ *
843
+ * @global object $wp_filesystem
844
+ *
845
+ * @return boolean
846
+ */
847
+ public static function is_filesystem_supported() {
848
+ global $wp_filesystem;
849
+
850
+ $supported = true;
851
+
852
+ // Ensure that the WP Filesystem API is loaded.
853
+ if ( empty( $wp_filesystem ) ) {
854
+ require_once ABSPATH . '/wp-admin/includes/file.php';
855
+ WP_Filesystem();
856
+ }
857
+
858
+ if ( 'direct' !== get_filesystem_method() ) {
859
+ $supported = false;
860
+ }
861
+
862
+ return $supported;
863
+ }
864
  }
admin/class-boldgrid-backup-admin-upload.php CHANGED
@@ -221,43 +221,44 @@ class Boldgrid_Backup_Admin_Upload {
221
  * @see Boldgrid_Backup_Admin_Config::get_backup_identifier()
222
  * @see Boldgrid_Backup_Admin_Backup_Dir::get()
223
  *
224
- * @return string The file save path.
 
225
  */
226
- public function get_save_path() {
227
- // Get the upload file basename.
228
- $file_basename = basename( $_FILES['file']['name'] );
229
-
230
- // Get backup identifier.
231
  $backup_identifier = $this->core->get_backup_identifier();
232
 
233
- // Get the backup directory.
234
- $backup_directory = $this->core->backup_dir->get();
235
 
236
  // Create an array of strings to remove from the filename.
237
  $remove_strings = array(
238
  'boldgrid-backup-',
239
  $backup_identifier,
240
  'uploaded-',
 
 
241
  );
242
 
243
  // Remove references from filename.
244
  foreach ( $remove_strings as $remove_string ) {
245
- $file_basename = str_replace( $remove_string, '', $file_basename );
 
 
 
 
 
246
  }
247
 
248
  // Reformat the filename.
249
- $file_basename = 'boldgrid-backup-' . $backup_identifier . '-uploaded-' . $file_basename;
250
 
251
  // Remove extra dashes.
252
- $file_basename = preg_replace( '#-+#', '-', $file_basename );
253
 
254
- // Create the file save path.
255
- $file_save_path = $backup_directory . DIRECTORY_SEPARATOR . $file_basename;
256
-
257
- // Update the base filename.
258
- $_FILES['file']['name'] = $file_basename;
259
 
260
- return $file_save_path;
 
261
  }
262
 
263
  /**
@@ -333,7 +334,10 @@ class Boldgrid_Backup_Admin_Upload {
333
  }
334
 
335
  // Create the file save path, and update the destination base filename..
336
- $file_save_path = $this->get_save_path();
 
 
 
337
 
338
  // Handle the upload.
339
  $movefile = $this->handle_upload();
@@ -369,4 +373,126 @@ class Boldgrid_Backup_Admin_Upload {
369
  return false;
370
  }
371
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
372
  }
221
  * @see Boldgrid_Backup_Admin_Config::get_backup_identifier()
222
  * @see Boldgrid_Backup_Admin_Backup_Dir::get()
223
  *
224
+ * @param string $filename Filename.
225
+ * @return string
226
  */
227
+ public function get_save_path( $filename ) {
 
 
 
 
228
  $backup_identifier = $this->core->get_backup_identifier();
229
 
230
+ // Ensure that the input filename is a basename and remove any query string.
231
+ $filename = preg_replace( '/\?.*$/', '', basename( $filename ) );
232
 
233
  // Create an array of strings to remove from the filename.
234
  $remove_strings = array(
235
  'boldgrid-backup-',
236
  $backup_identifier,
237
  'uploaded-',
238
+ 'admin-ajax.php',
239
+ '.zip',
240
  );
241
 
242
  // Remove references from filename.
243
  foreach ( $remove_strings as $remove_string ) {
244
+ $filename = str_replace( $remove_string, '', $filename );
245
+ }
246
+
247
+ // If the filename is now empty, then make is a unix timestamp.
248
+ if ( empty( $filename ) ) {
249
+ $filename = current_time( 'timestamp', true );
250
  }
251
 
252
  // Reformat the filename.
253
+ $filename = 'boldgrid-backup-' . $backup_identifier . '-uploaded-' . $filename . '.zip';
254
 
255
  // Remove extra dashes.
256
+ $filename = preg_replace( '#-+#', '-', $filename );
257
 
258
+ $backup_directory = $this->core->backup_dir->get();
 
 
 
 
259
 
260
+ // Return the full file path.
261
+ return $backup_directory . DIRECTORY_SEPARATOR . $filename;
262
  }
263
 
264
  /**
334
  }
335
 
336
  // Create the file save path, and update the destination base filename..
337
+ $file_save_path = $this->get_save_path( $_FILES['file']['name'] );
338
+
339
+ // Update the filename.
340
+ $_FILES['file']['name'] = basename( $file_save_path );
341
 
342
  // Handle the upload.
343
  $movefile = $this->handle_upload();
373
  return false;
374
  }
375
  }
376
+
377
+ /**
378
+ * Callback function for importing a backup archive file via URL address.
379
+ *
380
+ * Used on the backup archives page.
381
+ *
382
+ * @since 1.7.0
383
+ *
384
+ * @see Boldgrid_Backup_Admin_Backup_Dir::get()
385
+ * @see Boldgrid_Backup_Admin_Backup_Dir::get_path_to()
386
+ * @see Boldgrid_Backup_Admin_Archive_Log::path_from_zip()
387
+ * @see Boldgrid_Backup_Admin_Archive_Log::restore_by_zip()
388
+ * @see Boldgrid_Backup_Admin_Remote::post_download()
389
+ *
390
+ * @uses $_POST['url'] URL address.
391
+ *
392
+ * @return string
393
+ */
394
+ public function ajax_url_import() {
395
+ // Check user permissions.
396
+ if ( ! current_user_can( 'update_plugins' ) ) {
397
+ wp_send_json_error(
398
+ array(
399
+ 'error' => __( 'User access violation!', 'boldgrid-backup' ),
400
+ )
401
+ );
402
+ }
403
+
404
+ // Check security nonce and referer.
405
+ if ( ! check_admin_referer( 'upload_archive_file' ) ) {
406
+ wp_send_json_error(
407
+ array(
408
+ 'error' => __( 'Security violation! Please try again.', 'boldgrid-backup' ),
409
+ )
410
+ );
411
+ }
412
+
413
+ $url = ! empty( $_POST['url'] ) ? esc_url_raw( $_POST['url'] ) : null;
414
+ $url_regex = '/' . $this->core->configs['url_regex'] . '/i';
415
+
416
+ if ( ! preg_match( $url_regex, $url ) ) {
417
+ wp_send_json_error(
418
+ array(
419
+ 'error' => __( 'Invalid URL address.', 'boldgrid-backup' ),
420
+ )
421
+ );
422
+ }
423
+
424
+ $backup_directory = $this->core->backup_dir->get();
425
+
426
+ if ( ! $this->core->backup_dir->is_valid( $backup_directory ) &&
427
+ ! empty( $this->core->backup_dir->errors ) ) {
428
+ wp_send_json_error(
429
+ array(
430
+ 'error' => implode( '<br />', $this->core->backup_dir->errors ),
431
+ )
432
+ );
433
+ }
434
+
435
+ $filepath = $this->get_save_path( basename( $url ) );
436
+
437
+ $allowed_content_types = array(
438
+ 'application/octet-stream',
439
+ 'binary/octet-stream',
440
+ 'application/zip',
441
+ );
442
+
443
+ $response = wp_remote_get(
444
+ $url, array(
445
+ 'filename' => $filepath,
446
+ 'headers' => 'Accept: ' . implode( ', ', $allowed_content_types ),
447
+ 'sslverify' => false,
448
+ 'stream' => true,
449
+ 'timeout' => MINUTE_IN_SECONDS * 20,
450
+ )
451
+ );
452
+
453
+ if ( is_array( $response ) && ! is_wp_error( $response ) &&
454
+ in_array( $response['headers']['content-type'], $allowed_content_types, true ) ) {
455
+ // Determine the archive log file path.
456
+ $log_filepath = $filepath;
457
+
458
+ if ( ! empty( $response['headers']['content-disposition'] ) ) {
459
+ $log_filepath = trim(
460
+ str_replace(
461
+ 'attachment; filename=', '', $response['headers']['content-disposition']
462
+ ), '"'
463
+ );
464
+
465
+ $log_filepath = $this->core->backup_dir->get_path_to( $log_filepath );
466
+ }
467
+
468
+ $log_filepath = $this->core->archive_log->path_from_zip( $log_filepath );
469
+
470
+ // Restore the log file from the archive.
471
+ $this->core->archive_log->restore_by_zip( $filepath, basename( $log_filepath ) );
472
+
473
+ // Update the archive file modification time, based on the log file contents.
474
+ $this->core->remote->post_download( $filepath );
475
+
476
+ wp_send_json_success(
477
+ array(
478
+ 'filepath' => $filepath,
479
+ 'detailsUrl' => admin_url(
480
+ 'admin.php?page=boldgrid-backup-archive-details&filename=' .
481
+ basename( $filepath )
482
+ ),
483
+ )
484
+ );
485
+ } else {
486
+ $this->core->wp_filesystem->delete( $filepath );
487
+ }
488
+
489
+ wp_send_json_error(
490
+ array(
491
+ 'error' => __(
492
+ 'Could not retrieve the remote file. It may not be a ZIP file, or the link is no longer valid.',
493
+ 'boldgrid-backup'
494
+ ),
495
+ )
496
+ );
497
+ }
498
  }
admin/class-boldgrid-backup-admin-utility.php CHANGED
@@ -496,6 +496,22 @@ class Boldgrid_Backup_Admin_Utility {
496
  return true;
497
  }
498
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
499
  /**
500
  * Check if a file is a ZIP archive file.
501
  *
@@ -708,6 +724,9 @@ class Boldgrid_Backup_Admin_Utility {
708
  $old_siteurl = untrailingslashit( $old_siteurl );
709
  $new_siteurl = untrailingslashit( $new_siteurl );
710
 
 
 
 
711
  // Update the WP otion "siteurl".
712
  update_option( 'siteurl', $new_siteurl );
713
 
496
  return true;
497
  }
498
 
499
+ /**
500
+ * Determine whether or not the given $page is the current.
501
+ *
502
+ * @since 1.7.0
503
+ *
504
+ * @global string $pagenow
505
+ *
506
+ * @param string $page The page to check for in $_GET.
507
+ * @return boolean
508
+ */
509
+ public static function is_admin_page( $page ) {
510
+ global $pagenow;
511
+
512
+ return 'admin.php' === $pagenow && ! empty( $_GET['page'] ) && $page === $_GET['page']; // phpcs:ignore WordPress.CSRF.NonceVerification
513
+ }
514
+
515
  /**
516
  * Check if a file is a ZIP archive file.
517
  *
724
  $old_siteurl = untrailingslashit( $old_siteurl );
725
  $new_siteurl = untrailingslashit( $new_siteurl );
726
 
727
+ // There may be a filter, so remove it.
728
+ remove_all_filters( 'pre_update_option_siteurl' );
729
+
730
  // Update the WP otion "siteurl".
731
  update_option( 'siteurl', $new_siteurl );
732
 
admin/class-boldgrid-backup-admin-xhprof.php CHANGED
@@ -108,7 +108,7 @@ class Boldgrid_Backup_Admin_Xhprof {
108
  }
109
 
110
  // Configure the utils path.
111
- $xhprof_utils_path = '/usr/share/pear/xhprof_lib/utils';
112
 
113
  // If the utility libraries exists, then load them.
114
  if ( file_exists( $xhprof_utils_path . '/xhprof_lib.php' ) &&
@@ -122,8 +122,11 @@ class Boldgrid_Backup_Admin_Xhprof {
122
 
123
  // Write the report URL to the error log.
124
  error_log(
125
- __METHOD__ . ': https://' . $_SERVER['HTTP_HOST'] .
126
- '/xhprof/index.php?run=' . $run_id . '&source=xhprof_boldgrid_backup'
 
 
 
127
  );
128
  }
129
  }
108
  }
109
 
110
  // Configure the utils path.
111
+ $xhprof_utils_path = BOLDGRID_BACKUP_PATH . '/vendor/lox/xhprof/xhprof_lib/utils';
112
 
113
  // If the utility libraries exists, then load them.
114
  if ( file_exists( $xhprof_utils_path . '/xhprof_lib.php' ) &&
122
 
123
  // Write the report URL to the error log.
124
  error_log(
125
+ __METHOD__ . ': ' . plugins_url(
126
+ plugin_basename( BOLDGRID_BACKUP_PATH ) .
127
+ '/vendor/lox/xhprof/xhprof_html/index.php?run=' . $run_id .
128
+ '&source=xhprof_boldgrid_backup'
129
+ )
130
  );
131
  }
132
  }
admin/class-boldgrid-backup-admin.php CHANGED
@@ -121,6 +121,7 @@ class Boldgrid_Backup_Admin {
121
  'is_premium' => ( true === $this->config->get_is_premium() ? 'true' : 'false' ),
122
  'lang' => $this->config->lang,
123
  'spinner_loading' => $spinner . __( 'Loading', 'boldgrid-backup' ) . $dots,
 
124
  'get_premium_url' => Boldgrid_Backup_Admin_Go_Pro::$url,
125
  );
126
 
@@ -128,6 +129,24 @@ class Boldgrid_Backup_Admin {
128
 
129
  wp_enqueue_script( 'boldgrid-backup-admin' );
130
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
  // Used by admin.js to highlight / bounce elements.
132
  wp_enqueue_script( 'jquery-effects-core' );
133
  wp_enqueue_script( 'jquery-effects-bounce' );
121
  'is_premium' => ( true === $this->config->get_is_premium() ? 'true' : 'false' ),
122
  'lang' => $this->config->lang,
123
  'spinner_loading' => $spinner . __( 'Loading', 'boldgrid-backup' ) . $dots,
124
+ 'spinner' => $spinner,
125
  'get_premium_url' => Boldgrid_Backup_Admin_Go_Pro::$url,
126
  );
127
 
129
 
130
  wp_enqueue_script( 'boldgrid-backup-admin' );
131
 
132
+ // Enqueue "In Progress" script.
133
+ $handle = 'boldgrid-backup-admin-in-progress';
134
+ wp_register_script(
135
+ $handle,
136
+ plugin_dir_url( __FILE__ ) . 'js/' . $handle . '.js',
137
+ array( 'jquery' ),
138
+ BOLDGRID_BACKUP_VERSION,
139
+ false
140
+ );
141
+ $translation = array(
142
+ 'archive_file_size' => __( 'Archive file size: ', 'boldgrid_backup' ),
143
+ 'size_before_compression' => __( 'File size before compression: ', 'boldgrid-backup' ),
144
+ 'adding_tables' => __( 'Adding tables.', 'boldgrid-backup' ),
145
+ 'completing_database' => __( 'Completing database backup...', 'boldgrid-backup' ),
146
+ );
147
+ wp_localize_script( $handle, 'BoldGridBackupAdminInProgress', $translation );
148
+ wp_enqueue_script( $handle );
149
+
150
  // Used by admin.js to highlight / bounce elements.
151
  wp_enqueue_script( 'jquery-effects-core' );
152
  wp_enqueue_script( 'jquery-effects-bounce' );
admin/compressor/class-boldgrid-backup-admin-compressor-php-zip.php CHANGED
@@ -98,7 +98,7 @@ class Boldgrid_Backup_Admin_Compressor_Php_Zip extends Boldgrid_Backup_Admin_Com
98
  * @type string mode backup
99
  * @type bool dryrun
100
  * @type string compressor php_zip
101
- * @type ing filesize 0
102
  * @type bool save 1
103
  * @type int total_size 0
104
  * }
@@ -106,6 +106,12 @@ class Boldgrid_Backup_Admin_Compressor_Php_Zip extends Boldgrid_Backup_Admin_Com
106
  public function archive_files( $filelist, &$info ) {
107
  $info['filepath'] = $this->core->generate_archive_path( 'zip' );
108
 
 
 
 
 
 
 
109
  if ( $info['dryrun'] ) {
110
  return true;
111
  }
@@ -131,9 +137,55 @@ class Boldgrid_Backup_Admin_Compressor_Php_Zip extends Boldgrid_Backup_Admin_Com
131
  $this->zip->addFile( $fileinfo[0], $fileinfo[1] );
132
  $this->add_dir( $fileinfo[1] );
133
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
134
  }
135
 
136
- if ( ! $this->zip->close() ) {
 
 
 
 
 
 
 
 
 
 
 
 
137
  return array(
138
  'error' => 'Cannot close ZIP archive file "' . $info['filepath'] . '".',
139
  );
98
  * @type string mode backup
99
  * @type bool dryrun
100
  * @type string compressor php_zip
101
+ * @type int filesize 0
102
  * @type bool save 1
103
  * @type int total_size 0
104
  * }
106
  public function archive_files( $filelist, &$info ) {
107
  $info['filepath'] = $this->core->generate_archive_path( 'zip' );
108
 
109
+ // Init vars used for our "in progress" bar.
110
+ $number_files_archived = 0;
111
+ $total_size_archived = 0;
112
+ $number_files_todo = count( $filelist );
113
+ $last_x_files = array();
114
+
115
  if ( $info['dryrun'] ) {
116
  return true;
117
  }
137
  $this->zip->addFile( $fileinfo[0], $fileinfo[1] );
138
  $this->add_dir( $fileinfo[1] );
139
  }
140
+
141
+ $number_files_archived++;
142
+ $total_size_archived += empty( $fileinfo[2] ) ? 0 : $fileinfo[2];
143
+
144
+ /*
145
+ * If applicable, add this file to the list of files archived that we show the user.
146
+ *
147
+ * To give the user a more broad sense of the files being added, our list only contains
148
+ * every 20th file.
149
+ *
150
+ * Our list is only 5 long because we make hook into the heartbeat every 5 seconds to grab
151
+ * the last 5 files, and we display each file for 1 second.
152
+ */
153
+ if ( 0 === $number_files_archived % 20 ) {
154
+ $last_x_files[] = $fileinfo[1];
155
+ if ( count( $last_x_files ) > 5 ) {
156
+ array_shift( $last_x_files );
157
+ }
158
+ }
159
+
160
+ /*
161
+ * Update our "in progress" data.
162
+ *
163
+ * To prevent excessive calls to update options, we only update our in progress data every
164
+ * 100 files.
165
+ */
166
+ $all_files_archived = $number_files_archived >= $number_files_todo;
167
+ if ( 0 === $number_files_archived % 100 || $all_files_archived ) {
168
+ Boldgrid_Backup_Admin_In_Progress_Data::set_arg( 'total_files_done', $number_files_archived );
169
+ Boldgrid_Backup_Admin_In_Progress_Data::set_arg( 'last_files', $last_x_files );
170
+ Boldgrid_Backup_Admin_In_Progress_Data::set_arg( 'total_size_archived', $total_size_archived );
171
+ Boldgrid_Backup_Admin_In_Progress_Data::set_arg( 'total_size_archived_size_format', size_format( $total_size_archived ) );
172
+ Boldgrid_Backup_Admin_In_Progress_Data::set_arg( 'step', 2 );
173
+ }
174
  }
175
 
176
+ /*
177
+ * We're done archiving all files.
178
+ *
179
+ * Empty out the "last files archived" data, and set an appropriate status.
180
+ */
181
+ Boldgrid_Backup_Admin_In_Progress_Data::delete_arg( 'last_files' );
182
+ Boldgrid_Backup_Admin_In_Progress_Data::set_arg( 'step', 3 );
183
+
184
+ $close = $this->zip->close();
185
+
186
+ Boldgrid_Backup_Admin_In_Progress_Data::delete_arg( 'step' );
187
+
188
+ if ( ! $close ) {
189
  return array(
190
  'error' => 'Cannot close ZIP archive file "' . $info['filepath'] . '".',
191
  );
admin/css/boldgrid-backup-admin-home.css CHANGED
@@ -13,4 +13,8 @@
13
  /* Disable floating of mine count so help section displays nicely. */
14
  .subsubsub {
15
  float: none;
 
 
 
 
16
  }
13
  /* Disable floating of mine count so help section displays nicely. */
14
  .subsubsub {
15
  float: none;
16
+ }
17
+
18
+ .page-title-actions {
19
+ display: inline-block;
20
  }
admin/css/boldgrid-backup-admin-settings.css CHANGED
@@ -6,4 +6,8 @@
6
  .form-table tr td p {
7
  padding: 5px 0px;
8
  margin: 0px;
9
- }
 
 
 
 
6
  .form-table tr td p {
7
  padding: 5px 0px;
8
  margin: 0px;
9
+ }
10
+
11
+ .bgb-unbold {
12
+ font-weight: normal;
13
+ }
admin/css/boldgrid-backup-admin.css CHANGED
@@ -109,8 +109,8 @@ hr.separator-small {
109
  }
110
 
111
  /* Get Premium link in the left nav. */
112
- .toplevel_page_boldgrid-backup-settings .get-premium,
113
- .toplevel_page_boldgrid-backup-settings .dashicons-dashboard {
114
  color: #ffb900;
115
  }
116
 
@@ -126,4 +126,128 @@ h3 {
126
 
127
  input:invalid {
128
  border: 1px solid red;
129
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
109
  }
110
 
111
  /* Get Premium link in the left nav. */
112
+ #adminmenu [class*=boldgrid-backup] .get-premium,
113
+ #adminmenu [class*=boldgrid-backup] .dashicons-dashboard {
114
  color: #ffb900;
115
  }
116
 
126
 
127
  input:invalid {
128
  border: 1px solid red;
129
+ }
130
+
131
+ #download-link-copy, #url-import-notice {
132
+ display: none;
133
+ }
134
+
135
+ #download-copy-button .dashicons {
136
+ font-size: 16px;
137
+ }
138
+
139
+ /**
140
+ * Progress bar.
141
+ *
142
+ * When a backup is in progress, we show the user a progress bar.
143
+ */
144
+
145
+ #boldgrid-backup-in-progress-bar:before {
146
+ transition: background-color 2s ease;
147
+ background-color: transparent;
148
+ }
149
+
150
+ .heartbeat-lost-focus #boldgrid-backup-in-progress-bar:before {
151
+ content:"";
152
+ display: block;
153
+ height: 100%;
154
+ position: absolute;
155
+ top: 0;
156
+ left: 0;
157
+ width: 100%;
158
+ background-color: rgba( 255, 255, 255, .9 );
159
+ }
160
+
161
+ .heartbeat-lost-focus #boldgrid-backup-in-progress-bar #last_file_archived,
162
+ .heartbeat-lost-focus #boldgrid-backup-in-progress-bar .progress-label {
163
+ color: #ddd;
164
+ }
165
+
166
+ #boldgrid-backup-in-progress-bar {
167
+ position: relative;
168
+ background: #f7f7f7;
169
+ border: 1px solid #ccc;
170
+ clear:both;
171
+ overflow: visible;
172
+ height: 2em;
173
+ margin: 0px;
174
+ margin-bottom: 20px;
175
+ }
176
+
177
+ /* The actual progress bar that goes from 0% to 100%. */
178
+ #boldgrid-backup-in-progress-bar .ui-progressbar-value {
179
+ background-color: #0085ba;
180
+ -webkit-transition: width 1s ease-out;
181
+ -moz-transition: width 1s ease-out;
182
+ -o-transition: width 1s ease-out;
183
+ transition: width 1s ease-out;
184
+ }
185
+
186
+ #boldgrid-backup-in-progress-bar #last_file_archived {
187
+ font-size: 10px;
188
+ position: absolute;
189
+ bottom: -20px;
190
+ left: 0px;
191
+ white-space: nowrap;
192
+ }
193
+
194
+ #boldgrid-backup-in-progress-bar .spinner {
195
+ vertical-align: middle;
196
+ margin-top: -2px;
197
+ }
198
+
199
+ .ui-progressbar .ui-progressbar-value {
200
+ height: 100%;
201
+ }
202
+
203
+ .progress-label {
204
+ position: absolute;
205
+ top: 4px;
206
+ font-weight: bold;
207
+ text-shadow: 1px 1px 0 #fff;
208
+ left:0;
209
+ right:0;
210
+ font-weight: 600;
211
+ color: #0073aa;
212
+ text-align: center;
213
+ }
214
+
215
+ .progress-label.over-50 {
216
+ color: #fff;
217
+ text-shadow: none;
218
+ }
219
+
220
+ #boldgrid_backup_in_progress_steps .step {
221
+ float: left;
222
+ width: 33%;
223
+ text-align:center;
224
+ color: #ddd;
225
+ }
226
+
227
+ #boldgrid_backup_in_progress_steps .step:first-of-type {
228
+ text-align: left;
229
+ }
230
+
231
+ #boldgrid_backup_in_progress_steps .step:last-of-type {
232
+ text-align: right;
233
+ }
234
+
235
+ #boldgrid_backup_in_progress_steps .step.active {
236
+ color: #444;
237
+ font-weight: bold;
238
+ }
239
+
240
+ /*
241
+ * Backup Archive Details: title and description.
242
+ *
243
+ * This section contains styles for the title and description input fields.
244
+ */
245
+ #titlediv #titlewrap #title {
246
+ margin-bottom: 15px;
247
+ }
248
+
249
+ [name="backup_description"] {
250
+ width: 100%;
251
+ height: 100px;
252
+ margin: 0px;
253
+ }
admin/js/boldgrid-backup-admin-archive-actions.js CHANGED
@@ -151,6 +151,101 @@ BOLDGRID.BACKUP.ACTIONS = function( $ ) {
151
  return false;
152
  };
153
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
  $( function() {
155
  $body = $( 'body' );
156
  $wpbody = $body.find( '#wpbody' );
@@ -158,6 +253,8 @@ BOLDGRID.BACKUP.ACTIONS = function( $ ) {
158
  $body.on( 'click', '.action-download', self.downloadArchive );
159
  $body.on( 'click', '.restore-now', self.restoreArchiveConfirm );
160
  $body.on( 'click', '#delete-action a', self.onClickDelete );
 
 
161
  } );
162
  };
163
 
151
  return false;
152
  };
153
 
154
+ /**
155
+ * @summary Get a download link for a selected backup archive file.
156
+ *
157
+ * @since 1.7.0
158
+ */
159
+ self.getDownloadLink = function( e ) {
160
+ var $this = $( this ),
161
+ data = {
162
+ action: 'boldgrid_backup_generate_download_link',
163
+ archive_filename: $this.attr( 'data-filename' ),
164
+ archive_auth: $this.attr( 'data-nonce' )
165
+ },
166
+ $spinner = $this.next(),
167
+ $downloadLink = $( '#download-link-copy' );
168
+
169
+ e.preventDefault();
170
+
171
+ $this.attr( 'disabled', 'disabled' );
172
+
173
+ $spinner.addClass( 'inline' );
174
+
175
+ $.post( ajaxurl, data, function( response ) {
176
+ var $copyLink;
177
+
178
+ if ( response.data !== undefined && response.data.download_url !== undefined ) {
179
+ $downloadLink
180
+ .removeClass( 'notice-error' )
181
+ .addClass( 'notice-info' )
182
+ .html( response.data.download_url + ' ' );
183
+
184
+ $copyLink = $(
185
+ '<button class="button" id="download-copy-button"' +
186
+ ' data-clipboard-text="' +
187
+ response.data.download_url +
188
+ '"> ' +
189
+ lang.copyText +
190
+ ' <span class="dashicons dashicons-admin-links"></span></button>'
191
+ );
192
+ $downloadLink.append( $copyLink );
193
+
194
+ $downloadLink.wrapInner( '<p></p>' );
195
+
196
+ $downloadLink.append(
197
+ '<p>' +
198
+ lang.expiresText +
199
+ ' ' +
200
+ response.data.expires_when +
201
+ '</p><p>' +
202
+ lang.linkDisclaimerText +
203
+ '</p>'
204
+ );
205
+
206
+ new ClipboardJS( $copyLink[0] );
207
+ } else if ( response.data !== undefined && response.data.error !== undefined ) {
208
+ $downloadLink
209
+ .removeClass( 'notice-info' )
210
+ .addClass( 'notice-error' )
211
+ .html( response.data.error );
212
+ } else {
213
+ $downloadLink
214
+ .removeClass( 'notice-info' )
215
+ .addClass( 'notice-error' )
216
+ .html( lang.linkErrorText );
217
+ }
218
+ } )
219
+ .error( function() {
220
+ $downloadLink.html( lang.unknownErrorText );
221
+ } )
222
+ .always( function() {
223
+ $downloadLink.show();
224
+ $spinner.removeClass( 'inline' );
225
+ $this.removeAttr( 'disabled' );
226
+ } );
227
+ };
228
+
229
+ /**
230
+ * @summary Update the download link copy button after clicking, and then reset after 3 seconds.
231
+ *
232
+ * @since 1.7.0
233
+ */
234
+ self.updateCopyText = function( e ) {
235
+ var $this = $( this ),
236
+ oldHtml = $this.html();
237
+
238
+ e.preventDefault();
239
+
240
+ $this.attr( 'disabled', 'disabled' );
241
+ $this.html( lang.copiedText );
242
+
243
+ setTimeout( function() {
244
+ $this.html( oldHtml );
245
+ $this.removeAttr( 'disabled' );
246
+ }, 3000 );
247
+ };
248
+
249
  $( function() {
250
  $body = $( 'body' );
251
  $wpbody = $body.find( '#wpbody' );
253
  $body.on( 'click', '.action-download', self.downloadArchive );
254
  $body.on( 'click', '.restore-now', self.restoreArchiveConfirm );
255
  $body.on( 'click', '#delete-action a', self.onClickDelete );
256
+ $body.on( 'click', '#download-link-button', self.getDownloadLink );
257
+ $body.on( 'click', '#download-copy-button', self.updateCopyText );
258
  } );
259
  };
260
 
admin/js/boldgrid-backup-admin-archive-details.js CHANGED
@@ -6,7 +6,7 @@
6
  * @since 1.3.3
7
  */
8
 
9
- /* global ajaxurl,BoldGridBackupAdmin,jQuery */
10
 
11
  var BoldGrid = BoldGrid || {};
12
 
@@ -149,12 +149,86 @@ BoldGrid.ArchiveDetails = function( $ ) {
149
  }
150
  };
151
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  /**
153
  * Init.
154
  */
155
  $( function() {
156
  $body.on( 'click', '.remote-storage a.upload', self.onClickUpload );
157
  $body.on( 'click', '.remote-storage .download-to-server', self.onClickDownload );
 
158
  $editorTabs.on( 'click', self.onClickTab );
159
  $downloadFirst.on( 'click', self.onClickDownloadFirst );
160
  } );
6
  * @since 1.3.3
7
  */
8
 
9
+ /* global ajaxurl,BoldGridBackupAdmin,jQuery,boldgrid_backup_archive_details */
10
 
11
  var BoldGrid = BoldGrid || {};
12
 
149
  }
150
  };
151
 
152
+ /**
153
+ * @summary Action to take when the user clicks "Update".
154
+ *
155
+ * What are they updating? Not really the backup itself, but things like the title and
156
+ * description of the backup.
157
+ *
158
+ * @since 1.7.0
159
+ */
160
+ self.onClickUpdate = function() {
161
+ var request,
162
+ data = {
163
+ action: 'boldgrid_backup_update_archive_details',
164
+ filename: $( '#filename' ).val(),
165
+ security: $( '#_wpnonce' ).val(),
166
+ attributes: {
167
+ title: $( '[name="backup_title"]' ).val(),
168
+ description: $( '[name="backup_description"]' ).val(),
169
+ protect: $( '[name="backup_protect"]' ).val(),
170
+ }
171
+ },
172
+ onFail,
173
+ onSuccess,
174
+ $actions = $( '#major-publishing-actions' ),
175
+ $button = $( this ),
176
+ $spinner = $button.siblings( '.spinner' );
177
+
178
+ onSuccess = function( response ) {
179
+ if ( false === response.success ) {
180
+ onFail( response.data );
181
+ } else {
182
+ // Animate things.
183
+ $spinner.removeClass( 'inline' );
184
+ $button.text( adminLang.updated );
185
+ setTimeout( function() {
186
+ $button
187
+ .text( adminLang.update )
188
+ .prop( 'disabled', false );
189
+ }, 1000 );
190
+ }
191
+ };
192
+
193
+ onFail = function( msg ) {
194
+ // Configure our error message.
195
+ if ( msg === undefined ) {
196
+ msg = adminLang.unknown_error;
197
+ } else if( 'object' === typeof msg && msg.statusText ) {
198
+ msg = msg.statusText;
199
+ }
200
+ msg = adminLang.failed_to_update + msg;
201
+
202
+ // Animate things.
203
+ $spinner.removeClass( 'inline' );
204
+ $button
205
+ .text( adminLang.update )
206
+ .prop( 'disabled', false );
207
+
208
+ // Add an error message and make it dissmissible.
209
+ $actions.prepend( '<div class="notice notice-error is-dismissible"><p>' + msg + '</p></div>' );
210
+ $( 'body' ).trigger( 'make_notices_dismissible' );
211
+ };
212
+
213
+ // Animate things.
214
+ $spinner.addClass( 'inline' );
215
+ $button
216
+ .text( adminLang.updating )
217
+ .prop( 'disabled', true );
218
+ $actions.find( '.notice' ).slideUp();
219
+
220
+ request = $.post( ajaxurl, data )
221
+ .done( onSuccess )
222
+ .fail( onFail );
223
+ };
224
+
225
  /**
226
  * Init.
227
  */
228
  $( function() {
229
  $body.on( 'click', '.remote-storage a.upload', self.onClickUpload );
230
  $body.on( 'click', '.remote-storage .download-to-server', self.onClickDownload );
231
+ $body.on( 'click', '#publishing-action button', self.onClickUpdate );
232
  $editorTabs.on( 'click', self.onClickTab );
233
  $downloadFirst.on( 'click', self.onClickDownloadFirst );
234
  } );
admin/js/boldgrid-backup-admin-backup-now.js CHANGED
@@ -141,6 +141,8 @@ BOLDGRID.BACKUP.BackupNow = function( $ ) {
141
  success && data.data !== undefined && data.data.callback !== undefined ?
142
  data.data.callback :
143
  null;
 
 
144
 
145
  switch ( callback ) {
146
  case 'updateProtectionEnabled':
@@ -159,7 +161,9 @@ BOLDGRID.BACKUP.BackupNow = function( $ ) {
159
  _wp_http_referer: wpHttpReferer,
160
  is_updating: isUpdating,
161
  backup_now: '1',
162
- folder_exclusion_type: type
 
 
163
  };
164
 
165
  /*
@@ -208,6 +212,8 @@ BOLDGRID.BACKUP.BackupNow = function( $ ) {
208
  }
209
  }
210
  } );
 
 
211
 
212
  // Prevent default browser action.
213
  e.preventDefault();
141
  success && data.data !== undefined && data.data.callback !== undefined ?
142
  data.data.callback :
143
  null;
144
+
145
+ $( 'body' ).trigger( 'boldgrid_backup_complete' );
146
 
147
  switch ( callback ) {
148
  case 'updateProtectionEnabled':
161
  _wp_http_referer: wpHttpReferer,
162
  is_updating: isUpdating,
163
  backup_now: '1',
164
+ folder_exclusion_type: type,
165
+ backup_title: $( '[name="backup_title"]' ).val(),
166
+ backup_description: $( '[name="backup_description"]' ).val(),
167
  };
168
 
169
  /*
212
  }
213
  }
214
  } );
215
+
216
+ $( 'body' ).trigger( 'boldgrid_backup_initiated' );
217
 
218
  // Prevent default browser action.
219
  e.preventDefault();
admin/js/boldgrid-backup-admin-ftp-settings.js CHANGED
@@ -17,13 +17,13 @@ BoldGrid.FtpSettings = function( $ ) {
17
 
18
  var self = this,
19
  lang = BoldGridBackupAdminFtpSettings,
20
- $action = $( '[name="action"]' ),
21
- $port = $( '[name="port"]' ),
22
- $type = $( '[name="type"]' ),
23
- $form = $port.closest( 'form' ),
24
- $saveButton = $form.find( '.button-primary' ),
25
- $deleteButton = $form.find( '.button-secondary' ),
26
- $spinner = $form.find( '.spinner' );
27
 
28
  /**
29
  * @summary Take action when the delete button is clicked.
@@ -60,6 +60,14 @@ BoldGrid.FtpSettings = function( $ ) {
60
  };
61
 
62
  $( function() {
 
 
 
 
 
 
 
 
63
  $type.on( 'change', self.onTypeChange );
64
  $form.on( 'submit', self.onSubmit );
65
  $deleteButton.on( 'click', self.onClickDelete );
17
 
18
  var self = this,
19
  lang = BoldGridBackupAdminFtpSettings,
20
+ $action,
21
+ $port,
22
+ $type,
23
+ $form,
24
+ $saveButton,
25
+ $deleteButton,
26
+ $spinner;
27
 
28
  /**
29
  * @summary Take action when the delete button is clicked.
60
  };
61
 
62
  $( function() {
63
+ $action = $( '[name="action"]' ),
64
+ $port = $( '[name="port"]' ),
65
+ $type = $( '[name="type"]' ),
66
+ $form = $port.closest( 'form' ),
67
+ $saveButton = $form.find( '.button-primary' ),
68
+ $deleteButton = $form.find( '.button-secondary' ),
69
+ $spinner = $form.find( '.spinner' );
70
+
71
  $type.on( 'change', self.onTypeChange );
72
  $form.on( 'submit', self.onSubmit );
73
  $deleteButton.on( 'click', self.onClickDelete );
admin/js/boldgrid-backup-admin-home.js CHANGED
@@ -18,12 +18,14 @@ BOLDGRID.BACKUP.HOME = function( $ ) {
18
 
19
  // General Variables.
20
  var self = this,
 
21
  $fileInput = $( 'input:file' ),
22
  $mineCount = $( '.mine' ),
23
  $mineCountHelp = $( '.subsubsub' ).find( '.dashicons' );
24
 
25
  // Onload event listener.
26
  $( function() {
 
27
 
28
  // On click action for the Upload button.
29
  $( '#upload-archive-form' )
@@ -50,6 +52,17 @@ BOLDGRID.BACKUP.HOME = function( $ ) {
50
  $mineCount.on( 'click', self.onClickCount ).on( 'mouseover', function() {
51
  $mineCountHelp.bgbuDrawAttention();
52
  } );
 
 
 
 
 
 
 
 
 
 
 
53
  } );
54
 
55
  /**
@@ -191,6 +204,91 @@ BOLDGRID.BACKUP.HOME = function( $ ) {
191
  .next( '.help' )
192
  .toggle();
193
  };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
194
  };
195
 
196
  BOLDGRID.BACKUP.HOME( jQuery );
18
 
19
  // General Variables.
20
  var self = this,
21
+ lang = BoldGridBackupAdminHome,
22
  $fileInput = $( 'input:file' ),
23
  $mineCount = $( '.mine' ),
24
  $mineCountHelp = $( '.subsubsub' ).find( '.dashicons' );
25
 
26
  // Onload event listener.
27
  $( function() {
28
+ var $urlImportSection = $( '#url-import-section' );
29
 
30
  // On click action for the Upload button.
31
  $( '#upload-archive-form' )
52
  $mineCount.on( 'click', self.onClickCount ).on( 'mouseover', function() {
53
  $mineCountHelp.bgbuDrawAttention();
54
  } );
55
+
56
+ $urlImportSection
57
+ .find( 'input' )
58
+ .first()
59
+ .keypress( function( e ) {
60
+ if ( 13 === e.which ) {
61
+ self.urlUpload( e );
62
+ }
63
+ } );
64
+
65
+ $urlImportSection.find( '.button' ).on( 'click', self.urlUpload );
66
  } );
67
 
68
  /**
204
  .next( '.help' )
205
  .toggle();
206
  };
207
+
208
+ /**
209
+ * Upload a file from a URL address.
210
+ *
211
+ * @since 1.7.0
212
+ */
213
+ self.urlUpload = function( e ) {
214
+ var jqxhr,
215
+ $this = $( this ),
216
+ $spinner = $this.next(),
217
+ $notice = $( '#url-import-notice' ),
218
+ urlRegex = new RegExp( lang.urlRegex, 'i' ),
219
+ data = {
220
+ action: 'boldgrid_backup_url_upload',
221
+ _wpnonce: $( '[name="_wpnonce"]' ).val(),
222
+ _wp_http_referer: $( '[name="_wp_http_referer"]' ).val(),
223
+ url: $( '[name="url"]' ).val()
224
+ };
225
+
226
+ e.preventDefault();
227
+
228
+ if ( ! urlRegex.test( data.url ) ) {
229
+ $notice
230
+ .removeClass( 'notice-success' )
231
+ .addClass( 'notice-error' )
232
+ .html( lang.invalidUrl )
233
+ .wrapInner( '<p></p>' )
234
+ .show();
235
+
236
+ return;
237
+ }
238
+
239
+ $notice
240
+ .removeClass( 'notice-error' )
241
+ .addClass( 'notice-success' )
242
+ .empty()
243
+ .hide();
244
+
245
+ $this.attr( 'disabled', 'disabled' );
246
+
247
+ $spinner.addClass( 'inline' );
248
+
249
+ jqxhr = $.post( ajaxurl, data, function( response ) {
250
+ if ( response.data !== undefined && response.data.filepath !== undefined ) {
251
+ $notice
252
+ .removeClass( 'notice-error' )
253
+ .addClass( 'notice-success' )
254
+ .html(
255
+ lang.savedTo +
256
+ response.data.filepath +
257
+ ' <a href="' +
258
+ response.data.detailsUrl +
259
+ '">' +
260
+ lang.viewDetails +
261
+ '</a>'
262
+ );
263
+ } else if ( response.data !== undefined && response.data.error !== undefined ) {
264
+ $notice
265
+ .removeClass( 'notice-success' )
266
+ .addClass( 'notice-error' )
267
+ .html( response.data.error );
268
+
269
+ $this.removeAttr( 'disabled' );
270
+ } else {
271
+ $notice
272
+ .removeClass( 'notice-success' )
273
+ .addClass( 'notice-error' )
274
+ .html( lang.unknownError );
275
+
276
+ $this.removeAttr( 'disabled' );
277
+ }
278
+ } )
279
+ .error( function() {
280
+ $notice
281
+ .removeClass( 'notice-success' )
282
+ .addClass( 'notice-error' )
283
+ .html( lang.ajaxError + jqxhr.status + ' (' + jqxhr.statusText + ')' );
284
+
285
+ $this.removeAttr( 'disabled' );
286
+ } )
287
+ .always( function() {
288
+ $notice.wrapInner( '<p></p>' ).show();
289
+ $spinner.removeClass( 'inline' );
290
+ } );
291
+ };
292
  };
293
 
294
  BOLDGRID.BACKUP.HOME( jQuery );
admin/js/boldgrid-backup-admin-in-progress.js ADDED
@@ -0,0 +1,446 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * This file handles the "In progress" bar for when a backup is in progress.
3
+ *
4
+ * @summary Backup In Progress Bar.
5
+ *
6
+ * @since 1.7.0
7
+ */
8
+
9
+ /* global jQuery,wp */
10
+
11
+ var BOLDGRID = BOLDGRID || {};
12
+
13
+ BOLDGRID.BACKUP = BOLDGRID.BACKUP || {};
14
+
15
+ ( function ( $ ) {
16
+
17
+ 'use strict';
18
+
19
+ var self;
20
+
21
+ /**
22
+ * Suggest starter content.
23
+ *
24
+ * @since 1.7.0
25
+ */
26
+ BOLDGRID.BACKUP.InProgress = {
27
+
28
+ /**
29
+ * Label.
30
+ *
31
+ * @since 1.7.0
32
+ *
33
+ * @type string
34
+ */
35
+ $label: null,
36
+
37
+ /**
38
+ * In progress notice.
39
+ *
40
+ * BoldGrid Backup - Backup in progress
41
+ * BoldGrid Backup began archiving your website 1 min ago.
42
+ *
43
+ * @since 1.7.0
44
+ */
45
+ $inProgressNotice: null,
46
+
47
+ /**
48
+ * i18n.
49
+ *
50
+ * @since 1.7.0
51
+ *
52
+ * @type object
53
+ */
54
+ i18n: window.BoldGridBackupAdminInProgress || {},
55
+
56
+ /**
57
+ * Init.
58
+ *
59
+ * @since 1.7.0
60
+ */
61
+ init: function() {
62
+ self._onReady();
63
+ },
64
+
65
+ /**
66
+ * On ready.
67
+ *
68
+ * @since 1.7.0
69
+ */
70
+ _onReady: function() {
71
+ $( function(){
72
+ if( typeof wp.heartbeat !== 'undefined' ) {
73
+ /*
74
+ * Check for a backup in progress.
75
+ *
76
+ * If there is, we need to begin listenting to the heartbeat to find out when it
77
+ * completes (so we can adjust the message).
78
+ */
79
+ setTimeout( self.onInProgress, 1000 );
80
+
81
+ /*
82
+ * Event "boldgrid_backup_progress_notice_added" currently only triggered within the
83
+ * customizer. When a user clicks on themes, we may dynamically show them a notice that
84
+ * a backup is in progress.
85
+ */
86
+ $( document ).on( 'boldgrid_backup_progress_notice_added', 'body', self.onInProgress );
87
+
88
+ $( document ).on( 'boldgrid_backup_initiated', 'body', self.onBackupInitiated );
89
+
90
+ $( document ).on( 'boldgrid_backup_complete', 'body', self.onComplete );
91
+ }
92
+ } );
93
+ },
94
+
95
+ /**
96
+ * Determine whether or not a step is active.
97
+ *
98
+ * @since 1.7.0
99
+ *
100
+ * @param string step The id of the container.
101
+ * @return bool
102
+ */
103
+ isStepActive: function( step ) {
104
+ return $( '#boldgrid_backup_in_progress_steps' )
105
+ .find( '[data-step="' + step + '"]' )
106
+ .hasClass( 'active' );
107
+ },
108
+
109
+ /**
110
+ * Action to take when a backup is initiated.
111
+ *
112
+ * We configure the heartbeat and the progress bar.
113
+ *
114
+ * @since 1.7.0
115
+ */
116
+ onBackupInitiated: function() {
117
+ self.heartbeatStart();
118
+
119
+ // Show and initialize our progress bar.
120
+ $( '#boldgrid_backup_in_progress_container' ).show();
121
+ self.$label = $( '.progress-label' );
122
+ self.setPercentage( 0 );
123
+ },
124
+
125
+ /**
126
+ * Action to take when a backup is completed.
127
+ *
128
+ * This function is called on the body's "boldgrid_backup_complete" event, which is trigger
129
+ * in the following scenarios:
130
+ * # We make an ajax call to backup now, and that call is successful.
131
+ * # We are using the wp.heartbeat to check on the status of a in progress backup and we're
132
+ * notified the backup is complete.
133
+ *
134
+ * @since 1.7.0
135
+ */
136
+ onComplete: function() {
137
+ // Hide "in progress" notices.
138
+ self.$inProgressNotice.slideUp();
139
+ $( '#boldgrid_backup_in_progress_container' ).slideUp();
140
+
141
+ // Bail out of the heartbeat.
142
+ $( document ).off( 'heartbeat-tick', self.onHeartbeatTick );
143
+ $( document ).off( 'heartbeat-send', self.heartbeatModify );
144
+ },
145
+
146
+ /**
147
+ * Steps to take when the heartbeat ticket is received.
148
+ *
149
+ * @since 1.7.0
150
+ */
151
+ onHeartbeatTick: function( e, data ) {
152
+ var $notice;
153
+
154
+ /*
155
+ * This class deals with backups in progress. If our in progress class didn't give us
156
+ * any information, abort.
157
+ */
158
+ if ( undefined === data.boldgrid_backup_in_progress ) {
159
+ return;
160
+ }
161
+
162
+ /*
163
+ * Ensure the fast heartbeat.
164
+ *
165
+ * At this point in the script, we've already set the heartbeat to fast. The problem
166
+ * is that this elevated heartbeat only lasts for at most 2.5 minutes. If you've got
167
+ * a really big site, once that heartbeat goes back to 60, it's going to look like
168
+ * this froze.
169
+ */
170
+ if( 5 !== wp.heartbeat.interval ) {
171
+ wp.heartbeat.interval( 'fast' );
172
+ }
173
+
174
+ if ( data.in_progress_data.percentage ) {
175
+ self.setPercentage( data.in_progress_data.percentage );
176
+ }
177
+
178
+ // Update our progress bar.
179
+ if ( 1 === data.in_progress_data.step ) {
180
+ self.onStepDatabase( data.in_progress_data );
181
+ } else if ( 2 === data.in_progress_data.step ) {
182
+ self.onStepAddingFiles( data.in_progress_data );
183
+ } else if ( 3 === data.in_progress_data.step && data.in_progress_data.tmp ) {
184
+ self.onStepSaving( data.in_progress_data );
185
+ } else {
186
+ self.setStepActive();
187
+ self.setLabel( data.in_progress_data.status );
188
+ self.setSubText();
189
+ }
190
+
191
+ // Steps to take when we no longer have a backup in progress.
192
+ if ( null === data.boldgrid_backup_in_progress ) {
193
+ // Create our success notice and show it.
194
+ $notice = $( data.boldgrid_backup_complete );
195
+ $notice
196
+ .css( 'display', 'none' )
197
+ .insertBefore( self.$inProgressNotice )
198
+ .slideDown();
199
+
200
+ $( 'body' ).trigger( 'make_notices_dismissible' );
201
+ $( 'body' ).trigger( 'boldgrid_backup_complete' );
202
+ }
203
+ },
204
+
205
+ /**
206
+ * Action to take if we have a backup in progress.
207
+ *
208
+ * This function is ran when the page is ready. It checks to see if we're showing a "Backup
209
+ * In Progress" notice. If we are, then we need to hook into the heartbeat and find out when
210
+ * that backup has been completed.
211
+ *
212
+ * @since 1.7.0
213
+ */
214
+ onInProgress: function() {
215
+ self.$inProgressNotice = $( '.boldgrid-backup-in-progress' );
216
+
217
+ if ( 1 === self.$inProgressNotice.length ) {
218
+ self.onBackupInitiated();
219
+ }
220
+ },
221
+
222
+ /**
223
+ * Steps to take with the progress bar when we're adding files to the archive.
224
+ *
225
+ * @since 1.7.0
226
+ *
227
+ * @param object In progress data received from ajax call.
228
+ */
229
+ onStepAddingFiles: function( data ) {
230
+ var percentage = Math.floor( data.total_files_done / data.total_files_todo * 100 );
231
+
232
+ self.setStepActive( 2 );
233
+
234
+ self.setPercentage( percentage );
235
+
236
+ self.setLabel( percentage + '%' );
237
+
238
+ /*
239
+ * Different styles are needed as the progress bar reaches 50% and begins to overlap
240
+ * the status text.
241
+ */
242
+ if( percentage >= 50 ) {
243
+ self.$label.addClass( 'over-50' );
244
+ }
245
+
246
+ if( 100 === percentage && data.status ) {
247
+ self.setSubText();
248
+ }
249
+
250
+ /*
251
+ * If we have "last files" data within our "in progress data", loop through and use a
252
+ * setTimeout to display each one.
253
+ */
254
+ if( data.last_files ) {
255
+ for( var i = 0; i < data.last_files.length; i++ ) {
256
+ setTimeout( self.setSubText, ( i * 1000 + 1 ), data.last_files[i] );
257
+ }
258
+ }
259
+ },
260
+
261
+ /**
262
+ * Steps to take with the progress bar when we're backing up the database.
263
+ *
264
+ * @since 1.7.0
265
+ *
266
+ * @param object In progress data received from ajax call.
267
+ */
268
+ onStepDatabase: function( data ) {
269
+ var stepIsActive = self.isStepActive( 1 ),
270
+ timeout;
271
+
272
+ self.setStepActive( 1 );
273
+
274
+ /*
275
+ * Show tables being backed up.
276
+ *
277
+ * We only run this step once, the first time we know that database tables are being
278
+ * backed up.
279
+ */
280
+ if( ! stepIsActive ) {
281
+ self.setSubText( self.i18n.adding_tables );
282
+
283
+ for( var i = 0; i < data.tables.length; i++ ) {
284
+ timeout = (i+1) * 5000 / data.tables.length;
285
+ setTimeout( self.setLabel, timeout, data.tables[i] );
286
+ }
287
+
288
+ /*
289
+ * We really don't know how long the database backup will take. In the above loop,
290
+ * we show all the tables that are being backed up within a 5 second period. After
291
+ * that time, we just finish it up with a "Completing database backup" message,
292
+ * which for more users shouldn't show for too long.
293
+ */
294
+ setTimeout( function() {
295
+ self.setLabel( self.i18n.completing_database );
296
+ self.setSubText();
297
+ }, timeout + 2000 );
298
+ }
299
+ },
300
+
301
+ /**
302
+ * Steps to take with the progress bar when we're saving the archive.
303
+ *
304
+ * @since 1.7.0
305
+ *
306
+ * @param object In progress data received from ajax call.
307
+ */
308
+ onStepSaving: function( data ) {
309
+ var percentage = Math.floor( data.tmp.size / data.total_size_archived * 100 );
310
+
311
+ self.setStepActive( 3 );
312
+
313
+ self.setPercentage( percentage );
314
+
315
+ self.setLabel( ' ' + self.i18n.archive_file_size + data.tmp.size_format );
316
+
317
+ self.setSubText( self.i18n.size_before_compression + data.total_size_archived_size_format );
318
+ },
319
+
320
+ /**
321
+ * Set the text of the progress bar label.
322
+ *
323
+ * For example, if we're at 50% and the progress bar actually says "50%", it's the label
324
+ * that we're seeing.
325
+ *
326
+ * @since 1.7.0
327
+ */
328
+ setLabel: function( string ) {
329
+ self.$label.text( string );
330
+ },
331
+
332
+ /**
333
+ * Set the percentage of the progress bar.
334
+ *
335
+ * @since 1.7.0
336
+ *
337
+ * @param int percentage The percentage complete, 0 - 100.
338
+ */
339
+ setPercentage: function( percentage ) {
340
+ $( '#boldgrid-backup-in-progress-bar' )
341
+ .show()
342
+ .progressbar({
343
+ value: percentage
344
+ });
345
+
346
+ if( percentage >= 50 ) {
347
+ self.$label.addClass( 'over-50' );
348
+ } else {
349
+ self.$label.removeClass( 'over-50' );
350
+ }
351
+ },
352
+
353
+ /**
354
+ * Set a step as being active.
355
+ *
356
+ * @since 2.0.0
357
+ *
358
+ * @param string step The id of the container.
359
+ */
360
+ setStepActive: function( step ) {
361
+ var $container = $( '#boldgrid_backup_in_progress_steps' ),
362
+ $steps = $container.find( '[data-step]' );
363
+
364
+ if( step && self.isStepActive( step ) ) {
365
+ return;
366
+ }
367
+
368
+ $steps.removeClass( 'active' );
369
+
370
+ if( step ) {
371
+ $container.find( '[data-step="' + step + '"]' ).addClass( 'active' );
372
+ }
373
+ },
374
+
375
+ /**
376
+ * Set our sub text.
377
+ *
378
+ * For example, if we're adding files and we want to show each file that is being added
379
+ * (in smaller text below the progress bar), that is sub text.
380
+ *
381
+ * @since 2.0.0
382
+ *
383
+ * @param string text
384
+ */
385
+ setSubText: function( text ) {
386
+ var $lastFileArchived = $( '#last_file_archived' );
387
+
388
+ if( text ) {
389
+ $lastFileArchived.text( text );
390
+ } else {
391
+ $lastFileArchived.empty();
392
+ }
393
+ },
394
+
395
+ /**
396
+ * Modify the heartbeat and tell it we want "boldgrid_backup_in_progress" details.
397
+ *
398
+ * @since 1.7.0
399
+ */
400
+ heartbeatModify: function( e, data ) {
401
+ data.boldgrid_backup_in_progress = true;
402
+ $( 'body' ).removeClass( 'heartbeat-lost-focus' );
403
+ },
404
+
405
+ /**
406
+ * Start "In progress" Heartbeat.
407
+ *
408
+ * @since 1.7.0
409
+ */
410
+ heartbeatStart: function() {
411
+ // Increase the heartbeat so we can get an update sooner.
412
+ wp.heartbeat.interval( 'fast' );
413
+
414
+ // Modify the heartbeat and ask for an update on our in progress backup.
415
+ $( document ).on( 'heartbeat-send', self.heartbeatModify );
416
+ // Now that we've modified the heartbeat, we need to listen for its tick.
417
+ $( document ).on( 'heartbeat-tick', self.onHeartbeatTick );
418
+
419
+ /*
420
+ * When your window loses focus, the heartbeat may slow down and you may not get updates
421
+ * as quickly. If you have two windows open and you're not actively looking at the
422
+ * backup in progress, you'll think it froze because of the slower heartbeat.
423
+ *
424
+ * This method adds a class to the body to indicate that the heartbeat has lost focus.
425
+ * The class will lighten the progress bar, to show that it's not currently active.
426
+ */
427
+ window.setInterval(
428
+ function(){
429
+ var $body = $( 'body' ),
430
+ body_class = 'heartbeat-lost-focus';
431
+
432
+ if( wp.heartbeat.hasFocus() ) {
433
+ $body.removeClass( body_class );
434
+ } else {
435
+ $body.addClass( body_class );
436
+ }
437
+ },
438
+ 5000
439
+ );
440
+ }
441
+ };
442
+
443
+ self = BOLDGRID.BACKUP.InProgress;
444
+ } )( jQuery );
445
+
446
+ BOLDGRID.BACKUP.InProgress.init();
admin/js/boldgrid-backup-admin-settings-autoupdate.js ADDED
@@ -0,0 +1,195 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* global ajaxurl,jQuery */
2
+
3
+ var BOLDGRID = BOLDGRID || {};
4
+ BOLDGRID.SETTINGS = BOLDGRID.SETTINGS || {};
5
+
6
+ ( function( $ ) {
7
+ BOLDGRID.SETTINGS.AutoUpdate = {
8
+
9
+ /**
10
+ * Constructor.
11
+ *
12
+ * @since 1.7.0
13
+ */
14
+ init: function() {
15
+ $( self._onLoad );
16
+ },
17
+
18
+ /**
19
+ * On DOM load.
20
+ *
21
+ * @since 1.7.0
22
+ */
23
+ _onLoad: function() {
24
+ var $bgBox = $( '.bg-box' );
25
+
26
+ // Initialize jquery-toggles.
27
+ $bgBox.find( '.toggle' ).toggles( {
28
+ text: {
29
+ on: '',
30
+ off: ''
31
+ },
32
+ height: 15,
33
+ width: 40
34
+ } );
35
+
36
+ self._setMasterToggles();
37
+
38
+ $bgBox.find( '.toggle-group' ).on( 'click swipe contextmenu', self._toggleGroup );
39
+
40
+ $bgBox
41
+ .find( '.toggle' )
42
+ .not( '.toggle-group' )
43
+ .on( 'click swipe contextmenu', self._setMasterToggles );
44
+
45
+ $bgBox.find( '.dashicons-editor-help' ).on( 'click', self._toggleHelp );
46
+
47
+ $bgBox.find( '.bglib-collapsible-control' ).on( 'click', function() {
48
+ $( this ).toggleClass( 'bglib-collapsible-open' );
49
+ } );
50
+ },
51
+
52
+ /**
53
+ * Set inputs for toggles.
54
+ *
55
+ * @since 1.7.0
56
+ */
57
+ _setInputs: function() {
58
+ var $bgBox = $( '.bg-box' ),
59
+ $wpcoreToggles = $bgBox.find( '.wpcore-toggle' ),
60
+ $pluginToggles = $bgBox.find( '.plugin-toggle' ),
61
+ $themeToggles = $bgBox.find( '.theme-toggle' ),
62
+ $pluginsDefault = $bgBox.find( '#toggle-default-plugins' ),
63
+ $themesDefault = $bgBox.find( '#toggle-default-themes' );
64
+
65
+ // If the updates section is not in use, then just return.
66
+ if ( ! $pluginsDefault.data( 'toggles' ) ) {
67
+ return;
68
+ }
69
+
70
+ $wpcoreToggles.each( function() {
71
+ var $this = $( this );
72
+
73
+ $this
74
+ .next( 'input' )
75
+ .attr( 'name', 'autoupdate[wpcore][' + $this.data( 'wpcore' ) + ']' )
76
+ .val( $this.data( 'toggles' ).active ? 1 : 0 );
77
+ } );
78
+
79
+ $pluginToggles.each( function() {
80
+ var $this = $( this );
81
+
82
+ $this
83
+ .parent()
84
+ .next( 'input' )
85
+ .attr( 'name', 'autoupdate[plugins][' + $this.data( 'plugin' ) + ']' )
86
+ .val( $this.data( 'toggles' ).active ? 1 : 0 );
87
+ } );
88
+
89
+ $themeToggles.each( function() {
90
+ var $this = $( this );
91
+
92
+ $this
93
+ .parent()
94
+ .next( 'input' )
95
+ .attr( 'name', 'autoupdate[themes][' + $this.data( 'stylesheet' ) + ']' )
96
+ .val( $this.data( 'toggles' ).active ? 1 : 0 );
97
+ } );
98
+
99
+ $pluginsDefault
100
+ .parent()
101
+ .next( 'input' )
102
+ .val( $pluginsDefault.data( 'toggles' ).active ? 1 : 0 );
103
+
104
+ $themesDefault
105
+ .parent()
106
+ .next( 'input' )
107
+ .val( $themesDefault.data( 'toggles' ).active ? 1 : 0 );
108
+ },
109
+
110
+ /**
111
+ * Set master toggles.
112
+ *
113
+ * @since 1.7.0
114
+ */
115
+ _setMasterToggles: function() {
116
+ var $masters = $( '.bg-box' ).find( '.toggle-group' );
117
+
118
+ $masters.each( function() {
119
+ var $master = $( this ),
120
+ state = true;
121
+
122
+ $master
123
+ .closest( '.div-table-body' )
124
+ .find( '.toggle' )
125
+ .not( '.toggle-group,#toggle-default-plugins,#toggle-default-themes' )
126
+ .each( function() {
127
+ if ( ! state || ! $( this ).data( 'toggles' ).active ) {
128
+ state = false;
129
+ }
130
+ } );
131
+
132
+ $master.toggles( state );
133
+ } );
134
+
135
+ self._setInputs();
136
+ },
137
+
138
+ /**
139
+ * Toggle an entire group on/off.
140
+ *
141
+ * @since 1.7.0
142
+ */
143
+ _toggleGroup: function() {
144
+ var $this = $( this ),
145
+ $toggles = $this
146
+ .parent()
147
+ .parent()
148
+ .parent()
149
+ .find( '.toggle' )
150
+ .not( '#toggle-default-plugins,#toggle-default-themes' );
151
+
152
+ $toggles.toggles( $this.data( 'toggles' ).active );
153
+
154
+ self._setInputs();
155
+ },
156
+
157
+ /**
158
+ * Replace the notice with a clone when removed by dismissal.
159
+ *
160
+ * @since 1.7.0
161
+ */
162
+ _replaceNotice: function( $notice ) {
163
+ var $noticeClone = $notice.clone(),
164
+ $noticeNext = $notice.next();
165
+
166
+ $notice.one( 'click.wp-dismiss-notice', '.notice-dismiss', function() {
167
+ $noticeNext.before( $noticeClone );
168
+ $notice = $noticeClone;
169
+ $notice.hide();
170
+ } );
171
+ },
172
+
173
+ /**
174
+ * Handle form submission.
175
+ *
176
+ * @since 1.7.0
177
+ */
178
+ _toggleHelp: function( e ) {
179
+ var id = $( this ).attr( 'data-id' );
180
+
181
+ e.preventDefault();
182
+
183
+ if ( id === undefined ) {
184
+ return false;
185
+ }
186
+
187
+ $( '.help[data-id="' + id + '"]' ).slideToggle();
188
+
189
+ return false;
190
+ }
191
+ };
192
+
193
+ var self = BOLDGRID.SETTINGS.AutoUpdate;
194
+ BOLDGRID.SETTINGS.AutoUpdate.init();
195
+ } )( jQuery );
admin/js/boldgrid-backup-admin-settings.js CHANGED
@@ -258,30 +258,6 @@ BoldGrid.Settings = function( $ ) {
258
  }
259
  };
260
 
261
- /**
262
- * Handle click of the undismissBoldgridNotice link for the key prompt.
263
- *
264
- * @since 1.6.0
265
- */
266
- self.undismissBoldgridNotice = function() {
267
- var data, nonce, wpHttpReferer;
268
-
269
- // Get the wpnonce and referer values.
270
- nonce = $( '#set_key_auth' ).val();
271
- wpHttpReferer = $( '[name="_wp_http_referer"]' ).val();
272
-
273
- data = {
274
- action: 'undismissBoldgridNotice',
275
- notice: 'bg-key-prompt',
276
- set_key_auth: nonce,
277
- _wp_http_referer: wpHttpReferer
278
- };
279
-
280
- $.post( ajaxurl, data, function() {
281
- location.reload();
282
- } );
283
- };
284
-
285
  // Onload event listener.
286
  $( function() {
287
 
@@ -302,9 +278,6 @@ BoldGrid.Settings = function( $ ) {
302
  $body.on( 'click', '#storage_locations .thickbox', self.on_click_provider );
303
 
304
  $body.on( 'click', '#license_check_again', self.onClickCheckAgain );
305
-
306
- /** Reverse dismiss action for the Conect Key prompt **/
307
- $( '.undismissBoldgridNotice' ).on( 'click', self.undismissBoldgridNotice );
308
  } );
309
  };
310
 
258
  }
259
  };
260
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  // Onload event listener.
262
  $( function() {
263
 
278
  $body.on( 'click', '#storage_locations .thickbox', self.on_click_provider );
279
 
280
  $body.on( 'click', '#license_check_again', self.onClickCheckAgain );
 
 
 
281
  } );
282
  };
283
 
admin/js/boldgrid-backup-admin-update-selectors.js CHANGED
@@ -50,7 +50,10 @@ BOLDGRID.BACKUP = BOLDGRID.BACKUP || {};
50
  '#update-theme',
51
 
52
  // BoldGrid Backup - Update Protection > "Backup Site Now" button.
53
- '#backup-site-now'
 
 
 
54
  ],
55
 
56
  /**
50
  '#update-theme',
51
 
52
  // BoldGrid Backup - Update Protection > "Backup Site Now" button.
53
+ '.notice #backup-site-now',
54
+
55
+ // Dashboard > BoldGrid Backup > Backup Archive > "Backup Site Now" button.
56
+ '.page-title-actions .page-title-action'
57
  ],
58
 
59
  /**
admin/js/boldgrid-backup-admin.js CHANGED
@@ -78,62 +78,6 @@ BoldGrid.Backup = function( $ ) {
78
  return false;
79
  };
80
 
81
- /**
82
- * @summary Action to take if we have a backup in progress.
83
- *
84
- * If we do have a backup in progress, we'll hook into the heartbeat and find
85
- * out when that backup has been completed.
86
- *
87
- * @since 1.6.0
88
- */
89
- self.onInProgress = function() {
90
- var complete = false,
91
- $inProgressNotice = $( '.boldgrid-backup-in-progress' );
92
-
93
- // If we're not actually showing an "in progress" notice, abort.
94
- if ( 1 !== $inProgressNotice.length ) {
95
- return;
96
- }
97
-
98
- // Increase the heartbeat so we can get an update sooner.
99
- wp.heartbeat.interval( 'fast' );
100
-
101
- /*
102
- * When the heartbeat is sent, include that we're looking for an update
103
- * on the in progress backup.
104
- */
105
- $( document ).on( 'heartbeat-send', function( e, data ) {
106
- if ( ! complete ) {
107
- data['boldgrid_backup_in_progress'] = true;
108
- }
109
- } );
110
-
111
- // When the heartbeat is received, check to see if the backup has completed.
112
- $( document ).on( 'heartbeat-tick', function( e, data ) {
113
- var $notice;
114
-
115
- if ( undefined === data.boldgrid_backup_in_progress ) {
116
- return;
117
- }
118
-
119
- if ( ! data.boldgrid_backup_in_progress ) {
120
- $notice = $( data.boldgrid_backup_complete );
121
- $notice
122
- .css( 'display', 'none' )
123
- .insertBefore( $inProgressNotice )
124
- .slideDown();
125
-
126
- $inProgressNotice.slideUp();
127
-
128
- wp.heartbeat.interval( 'standard' );
129
- complete = true;
130
-
131
- $( 'body' ).trigger( 'make_notices_dismissible' );
132
- $( 'body' ).trigger( 'boldgrid_backup_complete' );
133
- }
134
- } );
135
- };
136
-
137
  /**
138
  * @summary Make an admin notice dismissible.
139
  *
@@ -173,13 +117,6 @@ BoldGrid.Backup = function( $ ) {
173
  self.hideBackupNotice();
174
  self.updatePremiumLink();
175
 
176
- /*
177
- * If and when a backup is in progress, we need to begin waiting to hear
178
- * for that backup to complete.
179
- */
180
- self.onInProgress();
181
- $( 'body' ).on( 'boldgrid_backup_progress_notice_added', self.onInProgress );
182
-
183
  $( 'body' ).on( 'click', '[data-toggle-target]', self.onClickToggle );
184
  $( 'body' ).on( 'make_notices_dismissible', self.makeNoticesDismissible );
185
 
78
  return false;
79
  };
80
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  /**
82
  * @summary Make an admin notice dismissible.
83
  *
117
  self.hideBackupNotice();
118
  self.updatePremiumLink();
119
 
 
 
 
 
 
 
 
120
  $( 'body' ).on( 'click', '[data-toggle-target]', self.onClickToggle );
121
  $( 'body' ).on( 'make_notices_dismissible', self.makeNoticesDismissible );
122
 
admin/partials/archives/add-new.php CHANGED
@@ -19,13 +19,13 @@ defined( 'WPINC' ) || die;
19
 
20
  $max_file_size = Boldgrid_Backup_Admin_Utility::get_upload_limit();
21
 
22
- $size_limit = __( 'File size limit', 'boldgrid-backup' ) . ': ' .
23
  Boldgrid_Backup_Admin_Utility::bytes_to_human(
24
  Boldgrid_Backup_Admin_Utility::get_upload_limit()
25
  );
26
 
27
  $size_info = __(
28
- 'To change the limit, you may be able to modify your server\'s php.ini or .htaccess file. Please ask your web hosting provider if you need assistance.',
29
  'boldgrid-backup'
30
  );
31
 
@@ -73,7 +73,17 @@ printf(
73
  ?>
74
  </p>
75
 
 
 
 
 
 
 
 
 
 
76
  <div id="upload-archive-section" class="wp-upload-form">
 
77
  <form id="upload-archive-form" method="POST" enctype="multipart/form-data">
78
  <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo esc_attr( $max_file_size ); ?>" />
79
  <input type="hidden" name="uploading" value="1" />
@@ -93,7 +103,7 @@ printf(
93
  </div>
94
 
95
  <p class="install-help">
96
- <?php esc_html_e( 'Have a large site or want to FTP?', 'boldgrid-backup' ); ?>
97
  <span class="dashicons dashicons-editor-help" data-id="backup-id"></span>
98
  </p>
99
 
19
 
20
  $max_file_size = Boldgrid_Backup_Admin_Utility::get_upload_limit();
21
 
22
+ $size_limit = __( 'File upload size limit', 'boldgrid-backup' ) . ': ' .
23
  Boldgrid_Backup_Admin_Utility::bytes_to_human(
24
  Boldgrid_Backup_Admin_Utility::get_upload_limit()
25
  );
26
 
27
  $size_info = __(
28
+ 'Files uploaded from your computer are limited to a maximum size. To change the limit, you may be able to modify your server\'s php.ini or .htaccess file. Please ask your web hosting provider if you need assistance. Uploads from URL addresses do not have a size limit.',
29
  'boldgrid-backup'
30
  );
31
 
73
  ?>
74
  </p>
75
 
76
+ <div id="url-import-section" class="wp-upload-form">
77
+ <p><?php esc_html_e( 'From a URL address:', 'boldgrid-backup' ); ?></p>
78
+ <input type="text" name="url"
79
+ placeholder="<?php esc_attr_e( 'Download URL address', 'boldgrid-backup' ); ?>" size="30" />
80
+ <input class="button" type="submit" value="<?php esc_attr_e( 'Upload', 'boldgrid-backup' ); ?>" />
81
+ <span class='spinner'></span>
82
+ <div id="url-import-notice" class="notice notice-success inline"></div>
83
+ </div>
84
+
85
  <div id="upload-archive-section" class="wp-upload-form">
86
+ <p><?php esc_html_e( 'From a file on your computer:', 'boldgrid-backup' ); ?></p>
87
  <form id="upload-archive-form" method="POST" enctype="multipart/form-data">
88
  <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo esc_attr( $max_file_size ); ?>" />
89
  <input type="hidden" name="uploading" value="1" />
103
  </div>
104
 
105
  <p class="install-help">
106
+ <?php esc_html_e( 'Have a large file to upload or want to use FTP?', 'boldgrid-backup' ); ?>
107
  <span class="dashicons dashicons-editor-help" data-id="backup-id"></span>
108
  </p>
109
 
admin/partials/backup-now-modal/title.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Title and Description.
4
+ *
5
+ * @link https://www.boldgrid.com
6
+ * @since 1.7.0
7
+ *
8
+ * @package Boldgrid_Backup
9
+ * @subpackage Boldgrid_Backup/admin/partials/settings
10
+ * @copyright BoldGrid
11
+ * @version $Id$
12
+ * @author BoldGrid <support@boldgrid.com>
13
+ */
14
+
15
+ defined( 'WPINC' ) || die;
16
+
17
+ return '
18
+ <div class="bg-box">
19
+ <div class="bg-box-top">
20
+ ' . esc_html__( 'Title & Description', 'boldgrid-backup' ) . '
21
+ </div>
22
+ <div class="bg-box-bottom">
23
+ <p>' . esc_html__( 'To help remember the details of this backup, you may enter a title and description.', 'boldgrid-backup' ) . '</p>
24
+ <input type="text" name="backup_title" style="width:100%" placeholder="' . esc_html__( 'Backup Title', 'boldgrid-backup' ) . '" /><br /><br />
25
+ <textarea name="backup_description" style="width:100%;height:75px;" placeholder="' . esc_html( 'Backup Description', 'boldgrid-backup' ) . '" /></textarea>
26
+ </div>
27
+ </div>
28
+ ';
admin/partials/boldgrid-backup-admin-archive-details.php CHANGED
@@ -26,6 +26,12 @@ wp_nonce_field( 'boldgrid_backup_remote_storage_upload' );
26
 
27
  $separator = '<hr class="separator">';
28
 
 
 
 
 
 
 
29
  $details = include BOLDGRID_BACKUP_PATH . '/admin/partials/archive-details/details.php';
30
  $remote_storage = include BOLDGRID_BACKUP_PATH . '/admin/partials/archive-details/remote-storage.php';
31
  $browser = include BOLDGRID_BACKUP_PATH . '/admin/partials/archive-details/browser.php';
@@ -38,12 +44,14 @@ $not_found = include BOLDGRID_BACKUP_PATH . '/admin/partials/archive-details/n
38
  $delete_link = $this->core->archive_actions->get_delete_link( $archive['filename'] );
39
  $download_button = $this->core->archive_actions->get_download_button( $archive['filename'] );
40
  $restore_button = $this->core->archive_actions->get_restore_button( $archive['filename'] );
 
41
 
42
  if ( ! $archive_found ) {
43
  $file_size = '';
44
  $backup_date = '';
45
  $more_info = '';
46
  $major_actions = '';
 
47
  } else {
48
  $file_size = sprintf(
49
  '<div class="misc-pub-section">%1$s: <strong>%2$s</strong></div>',
@@ -74,14 +82,52 @@ if ( ! $archive_found ) {
74
  $major_actions = sprintf(
75
  '
76
  <div id="major-publishing-actions">
77
- <div id="delete-action">
78
  %1$s
79
  </div>
80
-
 
 
 
81
  <div style="clear:both;"></div>
82
  </div>',
83
- $delete_link
 
84
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  }
86
 
87
  $main_meta_box = sprintf(
@@ -89,17 +135,12 @@ $main_meta_box = sprintf(
89
  <div id="submitdiv" class="postbox">
90
  <h2 class="hndle ui-sortable-handle"><span>%1$s</span></h2>
91
  <div class="inside submitbox">
92
-
93
  <div class="misc-pub-section">%2$s: <strong>%3$s</strong></div>
94
-
95
  %4$s
96
-
97
  %5$s
98
-
99
  %6$s
100
-
101
  %7$s
102
-
103
  </div>
104
  </div>',
105
  /* 1 */ __( 'Backup Archive', 'boldgrid-backup' ),
@@ -108,9 +149,11 @@ $main_meta_box = sprintf(
108
  /* 4 */ $file_size,
109
  /* 5 */ $backup_date,
110
  /* 6 */ $more_info,
111
- /* 7 */ $major_actions
 
112
  );
113
 
 
114
  $remote_meta_box = sprintf(
115
  '
116
  <div class="postbox remote-storage">
@@ -118,14 +161,10 @@ $remote_meta_box = sprintf(
118
  <span>%1$s</span>
119
  <span class="dashicons dashicons-editor-help" data-id="remote-storage-help"></span>
120
  </h2>
121
-
122
  <div class="inside">
123
-
124
  <p class="help" data-id="remote-storage-help">%4$s</p>
125
-
126
  %2$s
127
  </div>
128
-
129
  %3$s
130
  </div>',
131
  /* 1 */ __( 'Remote Storage', 'boldgrid-backup' ),
@@ -136,7 +175,7 @@ $remote_meta_box = sprintf(
136
  %1$s
137
  %2$s
138
  </div>',
139
- /* 1 */ $this->core->go_pro->get_premium_button(),
140
  /* 2 */ __( 'Upgrade to <strong>BoldGrid Backup Premium</strong> for more Storage Locations!', 'boldgrid-backup' )
141
  ),
142
  /* 4 */ __( 'Secure your backups by keeping copies of them on <a href="admin.php?page=boldgrid-backup-tools&section=section_locations">remote storage</a>.', 'boldgrid-backup' )
@@ -159,55 +198,68 @@ $editor_tools = sprintf(
159
  /* 3 */ __( 'Database', 'boldgrid-backup' )
160
  );
161
 
162
- $intro = $this->core->config->is_premium_done ? '' : sprintf(
 
163
  '
164
  <div class="bg-box-bottom premium" style="margin-bottom:15px;">
165
  <strong>%1$s</strong>
166
-
167
  <p>
168
  %2$s
169
  %3$s
170
  </p>
171
  </div>',
172
  /* 1 */ __( 'One click file restorations', 'boldgrid-backup' ),
173
- /* 2 */ $this->core->go_pro->get_premium_button(),
174
  /* 3 */ __( 'Please note that most functionality for the Archive Browser, such as one click file restorations, is contained within the Premium version. For help with restoring a single file without this one click feature, please <a href="https://www.boldgrid.com/support" target="_blank">click here</a>.', 'boldgrid-backup' )
175
  );
176
 
177
  $main_content = '
178
  <div id="postdivrich" class="postarea wp-editor-expand">
179
-
180
  <div id="wp-content-wrap" class="wp-core-ui wp-editor-wrap tmce-active has-dfw">
181
-
182
  <h2 style="font-size:initial; padding:0px;">
183
  ' . __( 'Download & Restore', 'boldgrid-backup' ) . '
184
  <span class="dashicons dashicons-editor-help" data-id="download_and_restore"></span>
185
  </h2>
186
-
187
  <p class="help" data-id="download_and_restore">
188
  <strong>' . __( 'Download to Local Machine', 'boldgrid-backup' ) . '</strong><br />
189
  ' . __( 'Backup archives generally should be stored in more locations than just your <strong>web server</strong>. Be sure to keep copies on your <strong>local machine</strong> and / or a <strong>remote storage</strong> provider. Learn more about these different locations <a href="admin.php?page=boldgrid-backup-tools&section=section_locations">here</a>.', 'boldgrid-backup' ) . '<br /><br />
190
  <strong>' . __( 'Restore', 'boldgrid-backup' ) . '</strong><br />
191
- ' . __( 'Restore this backup. This will restore all the files and the database in this backup. Use the <strong>Backup Browser</strong> below to look at the backup archive and see what will be restored.', 'boldgrid-backup' ) . '
 
 
192
  </p>
193
-
194
  <p>
195
- ' . $download_button . ' ' . $restore_button . '
196
  </p>
197
-
198
  <hr class="separator" />
199
-
200
  <h2 style="font-size:initial; padding:0px;">' . __( 'Backup Browser', 'boldgrid-backup' ) . '</h2>
201
-
202
  <p>
203
  ' . __( 'Use the File & Folders and Database tools below to browse the contents of this backup file.', 'boldgrid-backup' ) . '
204
  </p>
205
-
206
  ' . $intro . $editor_tools . $browser . $db['browser'] . '
207
  </div>
208
  </div>
209
  ';
210
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211
  if ( ! $this->core->archive->is_stored_locally() ) {
212
 
213
  if ( $this->core->archive->is_stored_remotely() ) {
26
 
27
  $separator = '<hr class="separator">';
28
 
29
+ $allowed_html = array(
30
+ 'a' => array(
31
+ 'href' => array(),
32
+ ),
33
+ );
34
+
35
  $details = include BOLDGRID_BACKUP_PATH . '/admin/partials/archive-details/details.php';
36
  $remote_storage = include BOLDGRID_BACKUP_PATH . '/admin/partials/archive-details/remote-storage.php';
37
  $browser = include BOLDGRID_BACKUP_PATH . '/admin/partials/archive-details/browser.php';
44
  $delete_link = $this->core->archive_actions->get_delete_link( $archive['filename'] );
45
  $download_button = $this->core->archive_actions->get_download_button( $archive['filename'] );
46
  $restore_button = $this->core->archive_actions->get_restore_button( $archive['filename'] );
47
+ $download_link = $this->core->archive_actions->get_download_link_button( $archive['filename'] );
48
 
49
  if ( ! $archive_found ) {
50
  $file_size = '';
51
  $backup_date = '';
52
  $more_info = '';
53
  $major_actions = '';
54
+ $protect = '';
55
  } else {
56
  $file_size = sprintf(
57
  '<div class="misc-pub-section">%1$s: <strong>%2$s</strong></div>',
82
  $major_actions = sprintf(
83
  '
84
  <div id="major-publishing-actions">
85
+ <div id="delete-action-link">
86
  %1$s
87
  </div>
88
+ <div id="publishing-action">
89
+ <span class="spinner"></span>
90
+ <button class="button button-primary button-large">%2$s</button>
91
+ </div>
92
  <div style="clear:both;"></div>
93
  </div>',
94
+ $delete_link,
95
+ esc_html__( 'Update', 'boldgrid-backup' )
96
  );
97
+
98
+ $is_protected = $this->core->archive->get_attribute( 'protect' );
99
+ $is_protected = ! empty( $is_protected );
100
+ $protect = '
101
+ <div class="misc-pub-section bglib-misc-pub-section dashicons-lock">
102
+ ' . esc_html__( 'Protect backup', 'boldgrid-backup' ) . ': <span class="value-displayed"></span>
103
+ <a class="edit" href="" style="display: inline;">
104
+ <span aria-hidden="true">' . esc_html__( 'Edit', 'boldgrid-backup' ) . '</span>
105
+ </a>
106
+ <div class="options" style="display: none;">
107
+ <p>
108
+ <em>
109
+ ' .
110
+ wp_kses( sprintf(
111
+ // translators: 1: HTML anchor open tags, 2: HTML close tag, 3: HTML anchor open tags, 4: HTML close tag.
112
+ __( 'Protect this backup from being deleted due to %1$sretention settings%2$s. Applies only to backups stored on your %3$sWeb Server%4$s.', 'boldgrid-backup' ),
113
+ '<a href="' . get_admin_url( null, 'admin.php?page=boldgrid-backup-settings&section=section_storage' ) . '">',
114
+ '</a>',
115
+ '<a href="' . get_admin_url( null, 'admin.php?page=boldgrid-backup-tools&section=section_locations' ) . '">',
116
+ '</a>'
117
+ ), $allowed_html ) . '
118
+ </em>
119
+ </p>
120
+ <select name="backup_protect">
121
+ <option value="0" ' . selected( $is_protected, false, false ) . '>' . esc_html__( 'No', 'boldgrid-backup' ) . '</option>
122
+ <option value="1" ' . selected( $is_protected, true, false ) . '>' . esc_html( 'Yes', 'boldgrid-backup' ) . '</option>
123
+ </select>
124
+ <p>
125
+ <a href="" class="button">' . esc_html__( 'OK', 'boldgrid-backup' ) . '</a>
126
+ <a href="" class="button-cancel">' . esc_html__( 'Cancel', 'boldgrid-backup' ) . '</a>
127
+ </p>
128
+ </div>
129
+ </div>
130
+ ';
131
  }
132
 
133
  $main_meta_box = sprintf(
135
  <div id="submitdiv" class="postbox">
136
  <h2 class="hndle ui-sortable-handle"><span>%1$s</span></h2>
137
  <div class="inside submitbox">
138
+ %8$s
139
  <div class="misc-pub-section">%2$s: <strong>%3$s</strong></div>
 
140
  %4$s
 
141
  %5$s
 
142
  %6$s
 
143
  %7$s
 
144
  </div>
145
  </div>',
146
  /* 1 */ __( 'Backup Archive', 'boldgrid-backup' ),
149
  /* 4 */ $file_size,
150
  /* 5 */ $backup_date,
151
  /* 6 */ $more_info,
152
+ /* 7 */ $major_actions,
153
+ /* 8 */ $protect
154
  );
155
 
156
+ $premium_url = $this->core->go_pro->get_premium_url( 'bgbkup-archive-storage' );
157
  $remote_meta_box = sprintf(
158
  '
159
  <div class="postbox remote-storage">
161
  <span>%1$s</span>
162
  <span class="dashicons dashicons-editor-help" data-id="remote-storage-help"></span>
163
  </h2>
 
164
  <div class="inside">
 
165
  <p class="help" data-id="remote-storage-help">%4$s</p>
 
166
  %2$s
167
  </div>
 
168
  %3$s
169
  </div>',
170
  /* 1 */ __( 'Remote Storage', 'boldgrid-backup' ),
175
  %1$s
176
  %2$s
177
  </div>',
178
+ /* 1 */ $this->core->go_pro->get_premium_button( $premium_url ),
179
  /* 2 */ __( 'Upgrade to <strong>BoldGrid Backup Premium</strong> for more Storage Locations!', 'boldgrid-backup' )
180
  ),
181
  /* 4 */ __( 'Secure your backups by keeping copies of them on <a href="admin.php?page=boldgrid-backup-tools&section=section_locations">remote storage</a>.', 'boldgrid-backup' )
198
  /* 3 */ __( 'Database', 'boldgrid-backup' )
199
  );
200
 
201
+ $premium_url = $this->core->go_pro->get_premium_url( 'bgbkup-archive-browser' );
202
+ $intro = $this->core->config->is_premium_done ? '' : sprintf(
203
  '
204
  <div class="bg-box-bottom premium" style="margin-bottom:15px;">
205
  <strong>%1$s</strong>
 
206
  <p>
207
  %2$s
208
  %3$s
209
  </p>
210
  </div>',
211
  /* 1 */ __( 'One click file restorations', 'boldgrid-backup' ),
212
+ /* 2 */ $this->core->go_pro->get_premium_button( $premium_url ),
213
  /* 3 */ __( 'Please note that most functionality for the Archive Browser, such as one click file restorations, is contained within the Premium version. For help with restoring a single file without this one click feature, please <a href="https://www.boldgrid.com/support" target="_blank">click here</a>.', 'boldgrid-backup' )
214
  );
215
 
216
  $main_content = '
217
  <div id="postdivrich" class="postarea wp-editor-expand">
 
218
  <div id="wp-content-wrap" class="wp-core-ui wp-editor-wrap tmce-active has-dfw">
 
219
  <h2 style="font-size:initial; padding:0px;">
220
  ' . __( 'Download & Restore', 'boldgrid-backup' ) . '
221
  <span class="dashicons dashicons-editor-help" data-id="download_and_restore"></span>
222
  </h2>
 
223
  <p class="help" data-id="download_and_restore">
224
  <strong>' . __( 'Download to Local Machine', 'boldgrid-backup' ) . '</strong><br />
225
  ' . __( 'Backup archives generally should be stored in more locations than just your <strong>web server</strong>. Be sure to keep copies on your <strong>local machine</strong> and / or a <strong>remote storage</strong> provider. Learn more about these different locations <a href="admin.php?page=boldgrid-backup-tools&section=section_locations">here</a>.', 'boldgrid-backup' ) . '<br /><br />
226
  <strong>' . __( 'Restore', 'boldgrid-backup' ) . '</strong><br />
227
+ ' . __( 'Restore this backup. This will restore all the files and the database in this backup. Use the <strong>Backup Browser</strong> below to look at the backup archive and see what will be restored.', 'boldgrid-backup' ) . '<br /><br />
228
+ <strong>' . __( 'Download Link', 'boldgrid-backup' ) . '</strong><br />
229
+ ' . __( 'A public link that is used to download a backup archive file. You can use it to migrate your website to another WordPress installation. Please keep download links private, as the download files contains sensitive data.', 'boldgrid-backup' ) . '
230
  </p>
 
231
  <p>
232
+ ' . $download_button . ' ' . $restore_button . ' ' . $download_link . '
233
  </p>
234
+ <div id="download-link-copy" class="notice notice-info inline"></div>
235
  <hr class="separator" />
 
236
  <h2 style="font-size:initial; padding:0px;">' . __( 'Backup Browser', 'boldgrid-backup' ) . '</h2>
 
237
  <p>
238
  ' . __( 'Use the File & Folders and Database tools below to browse the contents of this backup file.', 'boldgrid-backup' ) . '
239
  </p>
 
240
  ' . $intro . $editor_tools . $browser . $db['browser'] . '
241
  </div>
242
  </div>
243
  ';
244
 
245
+
246
+ /*
247
+ * Allow the user to enter a title and description for this backup.
248
+ *
249
+ * Prepend this to the main content area.
250
+ */
251
+ if ( $archive_found ) {
252
+ $main_content = '
253
+ <div id="titlediv">
254
+ <div id="titlewrap">
255
+ <input type="text" name="backup_title" size="30" value="' . esc_attr( $title ) . '" id="title" spellcheck="true" autocomplete="off" placeholder="' . esc_attr__( 'Unnamed Backup', 'boldgrid-backup' ) . '">
256
+ </div>
257
+ </div>
258
+ <textarea name="backup_description" placeholder="' . esc_attr__( 'Backup description.', 'boldgrid-backup' ) . '">' . esc_html( $description ) . '</textarea>
259
+ <hr class="separator">
260
+ ' . $main_content;
261
+ }
262
+
263
  if ( ! $this->core->archive->is_stored_locally() ) {
264
 
265
  if ( $this->core->archive->is_stored_remotely() ) {
admin/partials/boldgrid-backup-admin-backup-button.php CHANGED
@@ -40,9 +40,12 @@ return sprintf(
40
  </p>
41
  </form>
42
  </div>
43
- <div id="backup-site-now-results"></div>',
 
 
44
  wp_nonce_field( 'boldgrid_backup_now', 'backup_auth', true, false ),
45
  esc_html( 'Backup Site Now', 'boldgrid-backup' ),
46
  $update_protection_ajax || $core->auto_rollback->on_update_page ? 'data-updating="true"' : '',
47
- /* 4 */ __( 'You may leave this page, doing so will not stop your backup.', 'boldgrid-backup' )
 
48
  );
40
  </p>
41
  </form>
42
  </div>
43
+ <div id="backup-site-now-results"></div>
44
+ %5$s
45
+ ',
46
  wp_nonce_field( 'boldgrid_backup_now', 'backup_auth', true, false ),
47
  esc_html( 'Backup Site Now', 'boldgrid-backup' ),
48
  $update_protection_ajax || $core->auto_rollback->on_update_page ? 'data-updating="true"' : '',
49
+ /* 4 */ __( 'You may leave this page, doing so will not stop your backup.', 'boldgrid-backup' ),
50
+ Boldgrid_Backup_Admin_In_Progress_Data::get_markup()
51
  );
admin/partials/boldgrid-backup-admin-backup-modal.php CHANGED
@@ -21,6 +21,8 @@ return sprintf(
21
  <div id="backup_now_content" style="display:none;">
22
  <h2>%1$s</h2>
23
 
 
 
24
  <p>%2$s</p>
25
 
26
  %3$s
@@ -37,5 +39,6 @@ return sprintf(
37
  /* 2 */ __( 'The <strong>Files and Folders</strong> and <strong>Database</strong> settings below customize which parts of your site to backup.', 'boldgrid-backup' ),
38
  /* 3 */ require BOLDGRID_BACKUP_PATH . '/admin/partials/settings/folders.php',
39
  /* 4 */ require BOLDGRID_BACKUP_PATH . '/admin/partials/settings/db.php',
40
- /* 5 */ require BOLDGRID_BACKUP_PATH . '/admin/partials/boldgrid-backup-admin-backup-button.php'
 
41
  );
21
  <div id="backup_now_content" style="display:none;">
22
  <h2>%1$s</h2>
23
 
24
+ %6$s
25
+
26
  <p>%2$s</p>
27
 
28
  %3$s
39
  /* 2 */ __( 'The <strong>Files and Folders</strong> and <strong>Database</strong> settings below customize which parts of your site to backup.', 'boldgrid-backup' ),
40
  /* 3 */ require BOLDGRID_BACKUP_PATH . '/admin/partials/settings/folders.php',
41
  /* 4 */ require BOLDGRID_BACKUP_PATH . '/admin/partials/settings/db.php',
42
+ /* 5 */ require BOLDGRID_BACKUP_PATH . '/admin/partials/boldgrid-backup-admin-backup-button.php',
43
+ /* 6 */ require BOLDGRID_BACKUP_PATH . '/admin/partials/backup-now-modal/title.php'
44
  );
admin/partials/boldgrid-backup-admin-home.php CHANGED
@@ -37,13 +37,14 @@ defined( 'WPINC' ) || die;
37
  $nav = include BOLDGRID_BACKUP_PATH . '/admin/partials/boldgrid-backup-admin-nav.php';
38
 
39
  // Premium advertisement on the bottom of the archives page.
40
- $ad = $this->config->is_premium_done ? '' : sprintf(
 
41
  '
42
  <div class="bg-box-bottom premium wp-clearfix">
43
  %1$s
44
  %2$s
45
  </div>',
46
- $this->go_pro->get_premium_button(),
47
  $this->lang['want_to']
48
  );
49
 
@@ -57,9 +58,13 @@ $in_modal = false;
57
 
58
  <h1 class="wp-heading-inline"><?php esc_html_e( 'Backup Archives', 'boldgrid-backup' ); ?></h1>
59
 
60
- <a href="#TB_inline?width=800&amp;height=600&amp;inlineId=backup_now_content" class="thickbox page-title-action page-title-action-primary"><?php esc_html_e( 'Backup Site Now', 'boldgrid-backup' ); ?></a>
61
 
62
- <a class="page-title-action add-new"><?php esc_html_e( 'Upload Backup', 'boldgrid-backup' ); ?></a>
 
 
 
 
63
 
64
  <?php
65
  echo $nav; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
37
  $nav = include BOLDGRID_BACKUP_PATH . '/admin/partials/boldgrid-backup-admin-nav.php';
38
 
39
  // Premium advertisement on the bottom of the archives page.
40
+ $premium_url = $this->go_pro->get_premium_url( 'bgbkup-archives-bottom' );
41
+ $ad = $this->config->is_premium_done ? '' : sprintf(
42
  '
43
  <div class="bg-box-bottom premium wp-clearfix">
44
  %1$s
45
  %2$s
46
  </div>',
47
+ $this->go_pro->get_premium_button( $premium_url ),
48
  $this->lang['want_to']
49
  );
50
 
58
 
59
  <h1 class="wp-heading-inline"><?php esc_html_e( 'Backup Archives', 'boldgrid-backup' ); ?></h1>
60
 
61
+ <div class="page-title-actions">
62
 
63
+ <a href="#TB_inline?width=800&amp;height=600&amp;inlineId=backup_now_content" class="thickbox page-title-action page-title-action-primary"><?php esc_html_e( 'Backup Site Now', 'boldgrid-backup' ); ?></a>
64
+
65
+ <a class="page-title-action add-new"><?php esc_html_e( 'Upload Backup', 'boldgrid-backup' ); ?></a>
66
+
67
+ </div>
68
 
69
  <?php
70
  echo $nav; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
admin/partials/boldgrid-backup-admin-settings.php CHANGED
@@ -16,19 +16,21 @@
16
 
17
  defined( 'WPINC' ) || die;
18
 
19
- $nav = include BOLDGRID_BACKUP_PATH . '/admin/partials/boldgrid-backup-admin-nav.php';
20
- $scheduler = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/scheduler.php';
21
- $folders_include = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/folders.php';
22
- $db = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/db.php';
23
- $retention = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/retention.php';
24
- $auto_updates = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/auto-updates.php';
25
- $notifications = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/notifications.php';
26
- $backup_directory = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/backup-directory.php';
27
- $connect_key = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/connect-key.php';
 
 
 
 
 
28
 
29
- $days_of_week = '';
30
- $time_of_day = '';
31
- $storage = '';
32
  if ( $this->core->scheduler->is_available( 'cron' ) || $this->core->scheduler->is_available( 'wp-cron' ) ) {
33
  $days_of_week = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/days-of-week.php';
34
  $time_of_day = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/time-of-day.php';
@@ -40,33 +42,38 @@ $sections = array(
40
  array(
41
  'id' => 'section_schedule',
42
  'title' => __( 'Backup Schedule', 'boldgrid-backup' ),
43
- 'content' => $scheduler . $days_of_week . $time_of_day . $storage . $folders_include . $db,
 
 
 
 
 
44
  ),
45
  array(
46
  'id' => 'connect_key',
47
- 'title' => __( 'BoldGrid Connect Key', 'boldgrid-bacup' ),
48
  'content' => $connect_key,
49
  ),
50
  array(
51
- 'id' => 'section_retention',
52
- 'title' => __( 'Retention', 'boldgrid-backup' ),
53
- 'content' => $retention,
 
 
 
 
 
54
  ),
55
  array(
56
- 'id' => 'section_updates',
57
- 'title' => __( 'Auto Updates & Rollback', 'boldgrid-backup' ),
58
- 'content' => $auto_updates,
59
  ),
60
  array(
61
  'id' => 'section_notifications',
62
  'title' => __( 'Notifications', 'boldgrid-backup' ),
63
  'content' => $notifications,
64
  ),
65
- array(
66
- 'id' => 'section_directory',
67
- 'title' => __( 'Backup Directory', 'boldgrid-backup' ),
68
- 'content' => $backup_directory,
69
- ),
70
  ),
71
  'post_col_right' => sprintf(
72
  '
@@ -143,12 +150,14 @@ wp_nonce_field( 'boldgrid_backup_settings' );
143
  ),
144
  esc_url( admin_url( 'admin.php?page=boldgrid-backup-test' ) )
145
  );
 
 
146
  ?>
147
  </p>
148
 
149
  <hr />
150
 
151
- <form id='schedule-form' method='post'>
152
  <?php
153
  echo $col_container; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
154
  wp_nonce_field( 'boldgrid-backup-settings', 'settings_auth' );
16
 
17
  defined( 'WPINC' ) || die;
18
 
19
+ $library_dir = \Boldgrid\Library\Library\Configs::get( 'libraryDir' );
20
+ $nav = include BOLDGRID_BACKUP_PATH . '/admin/partials/boldgrid-backup-admin-nav.php';
21
+ $scheduler = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/scheduler.php';
22
+ $folders_include = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/folders.php';
23
+ $db = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/db.php';
24
+ $auto_backup = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/auto-backup.php';
25
+ $auto_rollback = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/auto-rollback.php';
26
+ $auto_updates = include $library_dir . 'src/Library/Views/Connect/AutoUpdates.php';
27
+ $update_channels = include $library_dir . 'src/Library/Views/Connect/UpdateChannels.php';
28
+ $notifications = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/notifications.php';
29
+ $connect_key = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/connect-key.php';
30
+ $days_of_week = '';
31
+ $time_of_day = '';
32
+ $storage = '';
33
 
 
 
 
34
  if ( $this->core->scheduler->is_available( 'cron' ) || $this->core->scheduler->is_available( 'wp-cron' ) ) {
35
  $days_of_week = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/days-of-week.php';
36
  $time_of_day = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/time-of-day.php';
42
  array(
43
  'id' => 'section_schedule',
44
  'title' => __( 'Backup Schedule', 'boldgrid-backup' ),
45
+ 'content' => $days_of_week . $time_of_day . $scheduler,
46
+ ),
47
+ array(
48
+ 'id' => 'section_storage',
49
+ 'title' => __( 'Backup Storage', 'boldgrid-backup' ),
50
+ 'content' => $storage . $folders_include . $db,
51
  ),
52
  array(
53
  'id' => 'connect_key',
54
+ 'title' => __( 'BoldGrid Connect Key', 'boldgrid-backup' ),
55
  'content' => $connect_key,
56
  ),
57
  array(
58
+ 'id' => 'section_auto_updates',
59
+ 'title' => __( 'Auto Updates', 'boldgrid-backup' ),
60
+ 'content' => $auto_backup . $auto_updates,
61
+ ),
62
+ array(
63
+ 'id' => 'section_auto_rollback',
64
+ 'title' => __( 'Manual Updates', 'boldgrid-backup' ),
65
+ 'content' => $auto_rollback,
66
  ),
67
  array(
68
+ 'id' => 'section_update_channels',
69
+ 'title' => __( 'Update Channels', 'boldgrid-backup' ),
70
+ 'content' => $update_channels,
71
  ),
72
  array(
73
  'id' => 'section_notifications',
74
  'title' => __( 'Notifications', 'boldgrid-backup' ),
75
  'content' => $notifications,
76
  ),
 
 
 
 
 
77
  ),
78
  'post_col_right' => sprintf(
79
  '
150
  ),
151
  esc_url( admin_url( 'admin.php?page=boldgrid-backup-test' ) )
152
  );
153
+
154
+ $show_section = ! empty( $_REQUEST['section'] ) ? sanitize_key( $_REQUEST['section'] ) : ''; // phpcs:ignore WordPress.CSRF.NonceVerification
155
  ?>
156
  </p>
157
 
158
  <hr />
159
 
160
+ <form id='bgb-settings-form' method='post'>
161
  <?php
162
  echo $col_container; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
163
  wp_nonce_field( 'boldgrid-backup-settings', 'settings_auth' );
admin/partials/boldgrid-backup-admin-test.php CHANGED
@@ -88,6 +88,8 @@ $php_zip = new Boldgrid_Backup_Admin_Compressor_Php_Zip( $this );
88
 
89
  $pcl_zip = new Boldgrid_Backup_Admin_Compressor_Pcl_Zip( $this );
90
 
 
 
91
  $valid_backup_dir = $backup_dir_perms['exists'] && $backup_dir_perms['read'] && $backup_dir_perms['write'] && $backup_dir_perms['rename'] && $backup_dir_perms['delete'] && $backup_dir_perms['dirlist'];
92
 
93
  $timezone = $this->time->get_server_timezone();
@@ -131,6 +133,14 @@ $tests = array(
131
  'k' => __( 'PHP in safe mode?', 'boldgrid-backup' ),
132
  'v' => $this->test->is_php_safemode() ? sprintf( $error_span, $lang['yes'], '' ) : $lang['no'],
133
  ),
 
 
 
 
 
 
 
 
134
  array(
135
  'k' => __( 'WordPress version:', 'boldgrid-backup' ),
136
  'v' => $wp_version,
88
 
89
  $pcl_zip = new Boldgrid_Backup_Admin_Compressor_Pcl_Zip( $this );
90
 
91
+ $filesystem_method = get_filesystem_method();
92
+
93
  $valid_backup_dir = $backup_dir_perms['exists'] && $backup_dir_perms['read'] && $backup_dir_perms['write'] && $backup_dir_perms['rename'] && $backup_dir_perms['delete'] && $backup_dir_perms['dirlist'];
94
 
95
  $timezone = $this->time->get_server_timezone();
133
  'k' => __( 'PHP in safe mode?', 'boldgrid-backup' ),
134
  'v' => $this->test->is_php_safemode() ? sprintf( $error_span, $lang['yes'], '' ) : $lang['no'],
135
  ),
136
+ array(
137
+ 'k' => __( 'Filesystem Method', 'boldgrid-backup' ),
138
+ 'v' => $this->test->is_filesystem_supported() ?
139
+ $filesystem_method : sprintf(
140
+ $error_span,
141
+ $filesystem_method, __( 'Only "direct" filesystem supported.', 'boldgrid-backup' )
142
+ ),
143
+ ),
144
  array(
145
  'k' => __( 'WordPress version:', 'boldgrid-backup' ),
146
  'v' => $wp_version,
admin/partials/remote/ftp.php CHANGED
@@ -17,15 +17,11 @@
17
  $selected = 'selected="selected"';
18
  $ftp_selected = 'ftp' === $data['type'] ? $selected : '';
19
  $sftp_selected = 'sftp' === $data['type'] ? $selected : '';
20
-
21
  ?>
22
-
23
  <form method="post">
24
-
25
  <h1><?php esc_html_e( 'BoldGrid Backup - FTP Settings', 'boldgrid-backup' ); ?></h1>
26
-
27
  <hr />
28
-
29
  <table class="widefat fixed striped">
30
  <tr>
31
  <td>
@@ -81,7 +77,6 @@ $sftp_selected = 'sftp' === $data['type'] ? $selected : '';
81
  <td></td>
82
  </tr>
83
  </table>
84
-
85
  <p>
86
  <?php
87
  echo $this->core->lang['icon_warning']; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
@@ -91,12 +86,10 @@ $sftp_selected = 'sftp' === $data['type'] ? $selected : '';
91
  );
92
  ?>
93
  </p>
94
-
95
  <p>
96
  <input type="hidden" name="action" value="save" />
97
  <input class="button button-primary" type="submit" value="<?php esc_attr_e( 'Save changes', 'boldgrid-backup' ); ?>" />
98
  <button class="button button-secondary"><?php esc_html_e( 'Delete settings', 'boldgrid-backup' ); ?></button>
99
  <span class="spinner inline middle hidden"></span>
100
  </p>
101
-
102
  </form>
17
  $selected = 'selected="selected"';
18
  $ftp_selected = 'ftp' === $data['type'] ? $selected : '';
19
  $sftp_selected = 'sftp' === $data['type'] ? $selected : '';
 
20
  ?>
 
21
  <form method="post">
22
+ <?php wp_nonce_field( 'bgb-settings-ftp', 'ftp_auth' ); ?>
23
  <h1><?php esc_html_e( 'BoldGrid Backup - FTP Settings', 'boldgrid-backup' ); ?></h1>
 
24
  <hr />
 
25
  <table class="widefat fixed striped">
26
  <tr>
27
  <td>
77
  <td></td>
78
  </tr>
79
  </table>
 
80
  <p>
81
  <?php
82
  echo $this->core->lang['icon_warning']; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
86
  );
87
  ?>
88
  </p>
 
89
  <p>
90
  <input type="hidden" name="action" value="save" />
91
  <input class="button button-primary" type="submit" value="<?php esc_attr_e( 'Save changes', 'boldgrid-backup' ); ?>" />
92
  <button class="button button-secondary"><?php esc_html_e( 'Delete settings', 'boldgrid-backup' ); ?></button>
93
  <span class="spinner inline middle hidden"></span>
94
  </p>
 
95
  </form>
admin/partials/remote/local.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File: local.php
4
+ *
5
+ * The file handles the rendering of the local web server options on the settings page.
6
+ *
7
+ * @link https://www.boldgrid.com
8
+ * @since 1.7.0
9
+ *
10
+ * @package Boldgrid_Backup
11
+ * @subpackage Boldgrid_Backup/admin/partials/remote
12
+ * @copyright BoldGrid
13
+ * @version $Id$
14
+ * @author BoldGrid <support@boldgrid.com>
15
+ *
16
+ * phpcs:disable WordPress.XSS.EscapeOutput
17
+ */
18
+
19
+ ?>
20
+
21
+ <form method="post">
22
+ <?php
23
+ wp_nonce_field( 'bgb-settings-webserver', 'webserver_auth' );
24
+
25
+ echo require BOLDGRID_BACKUP_PATH . '/admin/partials/settings/backup-directory.php';
26
+ echo require BOLDGRID_BACKUP_PATH . '/admin/partials/settings/retention.php';
27
+ ?>
28
+ <p>
29
+ <input type="hidden" name="action" value="save" />
30
+ <input class="button button-primary" type="submit" value="<?php esc_attr_e( 'Save changes', 'boldgrid-backup' ); ?>" />
31
+ <span class="spinner inline middle hidden"></span>
32
+ </p>
33
+ </form>
admin/partials/settings/auto-backup.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File: auto-backup.php
4
+ *
5
+ * Show "Auto Rollback" on settings page.
6
+ *
7
+ * @since 1.7.0
8
+ * @package Boldgrid_Backup
9
+ * @subpackage Boldgrid_Backup/admin/partials/settings
10
+ * @copyright BoldGrid
11
+ * @version $Id$
12
+ * @link https://www.boldgrid.com
13
+ * @author BoldGrid <support@boldgrid.com>
14
+ */
15
+
16
+ defined( 'WPINC' ) || die;
17
+
18
+ ob_start();
19
+ ?>
20
+ <div class="bg-box">
21
+ <div class="bg-box-top">
22
+ <?php esc_html_e( 'Auto Backup', 'boldgrid-backup' ); ?>
23
+ <span class='dashicons dashicons-editor-help' data-id='auto-backup'></span>
24
+ </div>
25
+ <div class="bg-box-bottom">
26
+ <p class='help' data-id='auto-backup'>
27
+ <?php
28
+ printf(
29
+ // translators: 1: HTML anchor open tag, 2: HTML anchor close tag.
30
+ esc_html__(
31
+ 'Automatically perform a backup before WordPress updates. When this feature is enabled, a full backup will be made during the %1$spre_auto_update action%2$s.',
32
+ 'boldgrid-backup'
33
+ ),
34
+ '<a target="_blank" href="https://developer.wordpress.org/reference/hooks/pre_auto_update/">',
35
+ '</a>'
36
+ );
37
+ ?>
38
+ </p>
39
+ <table class="form-table">
40
+ <tr>
41
+ <th>
42
+ <?php esc_html_e( 'Auto Backup Before Update', 'boldgrid-backup' ); ?>
43
+ </th>
44
+ <td>
45
+ <input id='auto-backup-enabled' type='radio' name='auto_backup' value='1'
46
+ <?php
47
+ if ( ! isset( $settings['auto_backup'] ) ||
48
+ 1 === $settings['auto_backup'] ) {
49
+ echo ' checked';
50
+ }
51
+ ?>
52
+ /> <?php esc_html_e( 'Enabled (Recommended)', 'boldgrid-backup' ); ?> &nbsp; <input
53
+ id='auto-backup-disabled' type='radio' name='auto_backup' value='0'
54
+ <?php
55
+ if ( isset( $settings['auto_backup'] ) && 0 === $settings['auto_backup'] ) {
56
+ echo ' checked';
57
+ }
58
+ ?>
59
+ /> <?php esc_html_e( 'Disabled', 'boldgrid-backup' ); ?>
60
+ </td>
61
+ </tr>
62
+ </table>
63
+ </div>
64
+ </div>
65
+ <?php
66
+ $output = ob_get_contents();
67
+ ob_end_clean();
68
+
69
+ return $output;
admin/partials/settings/auto-rollback.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File: auto-rollback.php
4
+ *
5
+ * Show "Auto Rollback" on settings page.
6
+ *
7
+ * @since 1.7.0
8
+ * @package Boldgrid_Backup
9
+ * @subpackage Boldgrid_Backup/admin/partials/settings
10
+ * @copyright BoldGrid
11
+ * @version $Id$
12
+ * @link https://www.boldgrid.com
13
+ * @author BoldGrid <support@boldgrid.com>
14
+ */
15
+
16
+ defined( 'WPINC' ) || die;
17
+ ob_start();
18
+ ?>
19
+ <div class="bg-box">
20
+ <div class="bg-box-top">
21
+ <?php esc_html_e( 'Auto Rollback', 'boldgrid-backup' ); ?>
22
+ <span class='dashicons dashicons-editor-help' data-id='auto-rollback'></span>
23
+ </div>
24
+ <div class="bg-box-bottom">
25
+ <p class='help' data-id='auto-rollback'>
26
+ <?php
27
+ esc_html_e(
28
+ 'If something goes wrong while performing WordPress updates, automatically restore the site using a backup made before updating WordPress. This feature does not apply to auto updates.',
29
+ 'boldgrid-backup'
30
+ );
31
+ ?>
32
+ </p>
33
+ <table class="form-table">
34
+ <tr>
35
+ <th><?php esc_html_e( 'Auto Rollback', 'boldgrid-backup' ); ?></th>
36
+ <td>
37
+ <input id='auto-rollback-enabled' type='radio' name='auto_rollback' value='1'
38
+ <?php
39
+ if ( ! isset( $settings['auto_rollback'] ) ||
40
+ 1 === $settings['auto_rollback'] ) {
41
+ echo ' checked';
42
+ }
43
+ ?>
44
+ /> <?php esc_html_e( 'Enabled', 'boldgrid-backup' ); ?> &nbsp; <input
45
+ id='auto-rollback-disabled' type='radio' name='auto_rollback'
46
+ value='0'
47
+ <?php
48
+ if ( isset( $settings['auto_rollback'] ) && 0 === $settings['auto_rollback'] ) {
49
+ echo ' checked';
50
+ }
51
+ ?>
52
+ /> <?php esc_html_e( 'Disabled', 'boldgrid-backup' ); ?>
53
+ </td>
54
+ </tr>
55
+ </table>
56
+ </div>
57
+ </div>
58
+ <?php
59
+ $output = ob_get_contents();
60
+ ob_end_clean();
61
+
62
+ return $output;
admin/partials/settings/auto-updates.php DELETED
@@ -1,192 +0,0 @@
1
- <?php
2
- /**
3
- * File: auto-updates.php
4
- *
5
- * Show "Auto Updates" on settings page.
6
- *
7
- * @link https://www.boldgrid.com
8
- * @since 1.6.0
9
- *
10
- * @package Boldgrid_Backup
11
- * @subpackage Boldgrid_Backup/admin/partials/settings
12
- * @copyright BoldGrid
13
- * @version $Id$
14
- * @author BoldGrid <support@boldgrid.com>
15
- */
16
-
17
- defined( 'WPINC' ) || die;
18
-
19
- ob_start();
20
- ?>
21
-
22
- <div class="bg-box">
23
- <div class="bg-box-top">
24
- <?php esc_html_e( 'Auto Updates and Rollback', 'boldgrid-inspirations' ); ?>
25
- </div>
26
- <div class="bg-box-bottom">
27
-
28
- <table class="form-table">
29
- <tr>
30
- <th>
31
- <?php esc_html_e( 'Plugin Auto-Updates', 'boldgrid-backup' ); ?>
32
- <span class="dashicons dashicons-editor-help" data-id="plugin-autoupdate"></span>
33
-
34
- <p class="help" data-id="plugin-autoupdate">
35
- <?php
36
- printf(
37
- // translators: 1: URL address.
38
- esc_html__(
39
- 'Automatically perform all plugin updates when available. Enabling this feature adds the <a target="_blank" href="%1$s">auto_update_plugin filter</a>, which enables automatic plugin updates when an update is available.',
40
- 'boldgrid-backup'
41
- ),
42
- 'https://codex.wordpress.org/Configuring_Automatic_Background_Updates#Plugin_.26_Theme_Updates_via_Filter'
43
- );
44
- ?>
45
- </p>
46
- </th>
47
- <td>
48
- <input id="plugin-autoupdate-enabled" type="radio" name="plugin_autoupdate"
49
- value="1"
50
- <?php
51
- if ( isset( $settings['plugin_autoupdate'] ) &&
52
- 1 === $settings['plugin_autoupdate'] ) {
53
- ?>
54
- checked
55
- <?php
56
- }
57
- ?>
58
- /> <?php esc_html_e( 'Enabled', 'boldgrid-backup' ); ?> &nbsp; <input
59
- id="plugin-autoupdate-disabled" type="radio" name="plugin_autoupdate" value="0"
60
- <?php
61
- if ( ! isset( $settings['plugin_autoupdate'] ) ||
62
- ! $settings['plugin_autoupdate'] ) {
63
- ?>
64
- checked
65
- <?php
66
- }
67
- ?>
68
- /> <?php esc_html_e( 'Disabled', 'boldgrid-backup' ); ?>
69
- </td>
70
- </tr>
71
-
72
- <tr>
73
- <th>
74
- <?php esc_html_e( 'Theme Auto-Updates', 'boldgrid-backup' ); ?>
75
- <span class="dashicons dashicons-editor-help" data-id="theme-autoupdate"></span>
76
-
77
- <p class="help" data-id="theme-autoupdate">
78
- <?php
79
- printf(
80
- // translators: 1: URL address.
81
- esc_html__(
82
- 'Automatically perform all theme updates when available. Enabling this feature adds the <a target="_blank" href="%1$s">auto_update_theme filter</a>, which enables automatic theme updates when an update is available.',
83
- 'boldgrid-backup'
84
- ),
85
- 'https://codex.wordpress.org/Configuring_Automatic_Background_Updates#Plugin_.26_Theme_Updates_via_Filter'
86
- );
87
- ?>
88
- <p>
89
- </th>
90
- <td>
91
- <input id="theme-autoupdate-enabled" type="radio" name="theme_autoupdate" value="1"
92
- <?php
93
- if ( isset( $settings['theme_autoupdate'] ) &&
94
- 1 === $settings['theme_autoupdate'] ) {
95
- ?>
96
- checked
97
- <?php
98
- }
99
- ?>
100
- /> <?php esc_html_e( 'Enabled', 'boldgrid-backup' ); ?> &nbsp; <input
101
- id="theme-autoupdate-disabled" type="radio" name="theme_autoupdate" value="0"
102
- <?php
103
- if ( ! isset( $settings['theme_autoupdate'] ) ||
104
- ! $settings['theme_autoupdate'] ) {
105
- ?>
106
- checked
107
- <?php
108
- }
109
- ?>
110
- /> <?php esc_html_e( 'Disabled', 'boldgrid-backup' ); ?>
111
- </td>
112
- </tr>
113
-
114
- <tr>
115
- <th>
116
- <?php esc_html_e( 'Auto Backup<br />Before Updates', 'boldgrid-backup' ); ?>
117
- <span class='dashicons dashicons-editor-help' data-id='auto-backup'></span>
118
-
119
- <p class='help' data-id='auto-backup'>
120
- <?php
121
- printf(
122
- // translators: 1: URL address.
123
- esc_html__(
124
- 'Automatically perform a backup before WordPress updates. When this feature is enabled, a full backup will be made during the <a target="_blank" href="%1$s">pre_auto_update action</a>. ',
125
- 'boldgrid-backup'
126
- ),
127
- 'https://developer.wordpress.org/reference/hooks/pre_auto_update/'
128
- );
129
- ?>
130
- <p>
131
- </th>
132
- <td>
133
- <input id='auto-backup-enabled' type='radio' name='auto_backup'
134
- value='1'
135
- <?php
136
- if ( ! isset( $settings['auto_backup'] ) ||
137
- 1 === $settings['auto_backup'] ) {
138
- echo ' checked';
139
- }
140
- ?>
141
- /> <?php esc_html_e( 'Enabled', 'boldgrid-backup' ); ?> &nbsp; <input
142
- id='auto-backup-disabled' type='radio' name='auto_backup' value='0'
143
- <?php
144
- if ( isset( $settings['auto_backup'] ) && 0 === $settings['auto_backup'] ) {
145
- echo ' checked';
146
- }
147
- ?>
148
- /> <?php esc_html_e( 'Disabled', 'boldgrid-backup' ); ?>
149
- </td>
150
- </tr>
151
-
152
- <tr>
153
- <th>
154
- <?php esc_html_e( 'Auto Rollback', 'boldgrid-backup' ); ?><span class='dashicons dashicons-editor-help' data-id='auto-rollback'></span>
155
-
156
- <p class='help' data-id='auto-rollback'>
157
- <?php
158
- esc_html_e(
159
- 'If something goes wrong while performing WordPress updates, automatically restore the site using a backup made before updating WordPress. This feature does not apply to auto updates.',
160
- 'boldgrid-backup'
161
- );
162
- ?>
163
- </p>
164
- </th>
165
- <td>
166
- <input id='auto-rollback-enabled' type='radio' name='auto_rollback'
167
- value='1'
168
- <?php
169
- if ( ! isset( $settings['auto_rollback'] ) ||
170
- 1 === $settings['auto_rollback'] ) {
171
- echo ' checked';
172
- }
173
- ?>
174
- /> <?php esc_html_e( 'Enabled', 'boldgrid-backup' ); ?> &nbsp; <input
175
- id='auto-rollback-disabled' type='radio' name='auto_rollback'
176
- value='0'
177
- <?php
178
- if ( isset( $settings['auto_rollback'] ) && 0 === $settings['auto_rollback'] ) {
179
- echo ' checked';
180
- }
181
- ?>
182
- /> <?php esc_html_e( 'Disabled', 'boldgrid-backup' ); ?>
183
- </td>
184
- </tr>
185
- </table>
186
- </div>
187
- </div>
188
-
189
- <?php
190
- $output = ob_get_contents();
191
- ob_end_clean();
192
- return $output;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
admin/partials/settings/backup-directory.php CHANGED
@@ -25,10 +25,8 @@ ob_start();
25
  <span class='dashicons dashicons-editor-help' data-id='backup-dir'></span>
26
  </div>
27
  <div class="bg-box-bottom">
28
-
29
  <p class="help" data-id="backup-dir">
30
  <?php
31
-
32
  /*
33
  * Print this text:
34
  *
@@ -37,28 +35,29 @@ ob_start();
37
  * your backup directory <a>here</a>.
38
  */
39
  printf(
40
- wp_kses(
41
- // translators: 1: URL address.
42
- esc_html__(
43
- 'For security purposes, please do not set this to a publicly available directory. Once you set this, it is not recommended that you change it again. You can find more help with setting your backup directory <a href="%s" target="_blank">here</a>.',
44
- 'boldgrid-backup'
45
- ),
46
- array(
47
- 'a' => array(
48
- 'href' => array(),
49
- 'target' => array(),
50
- ),
51
- )
52
  ),
53
- esc_url( $this->core->configs['urls']['setting_directory'] )
 
 
 
 
 
54
  );
55
  ?>
56
  </p>
57
-
58
  <table class='backup-directory form-table'>
59
  <tr>
60
- <th><?php esc_html_e( 'Directory to store backup archives', 'boldgrid-backup' ); ?>:</th>
61
- <td><input id='backup-directory-path' type='text' size='40' name='backup_directory' value='<?php echo esc_attr( $settings['backup_directory'] ); ?>'></td>
 
 
 
 
 
62
  </tr>
63
  <tr id="move-backups" class="hidden">
64
  <th><?php esc_html_e( 'If you change this directory, current backups will not show in the list. Would you like us to move the backups to the new directory?', 'boldgrid-backup' ); ?></th>
25
  <span class='dashicons dashicons-editor-help' data-id='backup-dir'></span>
26
  </div>
27
  <div class="bg-box-bottom">
 
28
  <p class="help" data-id="backup-dir">
29
  <?php
 
30
  /*
31
  * Print this text:
32
  *
35
  * your backup directory <a>here</a>.
36
  */
37
  printf(
38
+ // translators: 1: URL address link.
39
+ esc_html__(
40
+ 'For security purposes, please do not set this to a publicly available directory. Once you set this, it is not recommended that you change it again. You can find more help with setting your backup directory %1$s.',
41
+ 'boldgrid-backup'
 
 
 
 
 
 
 
 
42
  ),
43
+ sprintf(
44
+ '<a target="_blank" href="' .
45
+ esc_url( $this->core->configs['urls']['setting_directory'] ) .
46
+ '">%1$s</a>',
47
+ esc_html__( 'here', 'boldgrid-backup' )
48
+ )
49
  );
50
  ?>
51
  </p>
 
52
  <table class='backup-directory form-table'>
53
  <tr>
54
+ <th><label for="backup_directory">
55
+ <?php esc_html_e( 'Directory to store backup archives', 'boldgrid-backup' ); ?>:
56
+ </label></th>
57
+ <td>
58
+ <input id='backup-directory-path' type='text' size='40' name='backup_directory'
59
+ value='<?php echo esc_attr( $settings['backup_directory'] ); ?>'>
60
+ </td>
61
  </tr>
62
  <tr id="move-backups" class="hidden">
63
  <th><?php esc_html_e( 'If you change this directory, current backups will not show in the list. Would you like us to move the backups to the new directory?', 'boldgrid-backup' ); ?></th>
admin/partials/settings/connect-key.php CHANGED
@@ -2,9 +2,9 @@
2
  /**
3
  * File: connect-key.php
4
  *
5
- * Show Connect Key status.
6
  *
7
- * @link https://www.boldgrid.com
8
  * @since 1.6.0
9
  *
10
  * @package Boldgrid_Backup
@@ -16,68 +16,17 @@
16
 
17
  defined( 'WPINC' ) || die;
18
 
19
- /* phpcs:disable WordPress.NamingConventions.ValidHookName */
20
- $is_dismissed = apply_filters( 'Boldgrid\Library\Notice\KeyPrompt\getIsDismissed', false );
21
- $is_displayed = apply_filters( 'Boldgrid\Library\Notice\KeyPrompt\getIsDisplayed', false );
22
-
23
- $has_key_entered = ! empty( $this->core->configs['api_key'] );
24
-
25
- // Check again button to refresh license status.
26
- $refresh_key = ! $has_key_entered || $this->core->config->get_is_premium() ? '' : '<p>' .
27
- __( 'If you recently upgraded your BoldGrid Connect Key to Premium, click <strong>Check again</strong> to refresh the status of your license.', 'boldgrid-backup' ) .
28
- '<br />' .
29
- sprintf( '<a class="button" id="license_check_again">%1$s</a>', __( 'Check again', 'boldgrid-backup' ) ) .
30
- ' <strong>' . __( 'License type', 'boldgrid-backup' ) . '</strong>: <span id="license_string">' . $this->core->config->get_license_string() . '</span>' .
31
- ' <span class="spinner inline" style="display:none;vertical-align:text-bottom;"></span>' .
32
- '</p>' .
33
- '<p id="license_reload_page" class="hidden">' .
34
- $this->core->lang['icon_warning'] .
35
- __( 'Please reload this page for your new license status to take affect.', 'boldgrid-bakcup' ) .
36
- '</p>';
37
-
38
- ob_start();
39
- if ( $has_key_entered ) {
40
- printf(
41
- // translators: 1: Subscription type ("Premium" or "Free").
42
- __( 'You have entered a <strong>%1$s</strong> BoldGrid Connect Key.', 'boldgrid-backup' ),
43
- $this->core->config->get_is_premium() ?
44
- esc_html__( 'Premium', 'boldgrid-backup' ) : esc_html__( 'Free', 'boldgrid-backup' )
45
- );
46
- } elseif ( $is_dismissed ) {
47
- printf(
48
- // translators: 1: HTML anchor open tag. 2: HTML anchor close taag.
49
- esc_html__(
50
- 'You have dismissed the prompt to enter a BoldGrid Connect Key. Click %1$shere%2$s to restore the prompt.',
51
- 'boldgrid-backup'
52
- ),
53
- '<a class="undismissBoldgridNotice" href="#">',
54
- '</a>'
55
- );
56
-
57
- wp_nonce_field( 'boldgrid_set_key', 'set_key_auth' );
58
- } else {
59
- esc_html_e( 'Please enter your BoldGrid Connect Key in the form at the top of this page.', 'boldgrid-backup' );
60
- }
61
- $output = ob_get_contents();
62
- ob_end_clean();
63
-
64
- // Add a "Get Premium" section under the Connect Key.
65
- $bottom_box_premium = '';
66
- if ( ! $this->core->config->get_is_premium() && ! $is_displayed ) {
67
- $bottom_box_premium = '<div class="bg-box-bottom premium">' .
68
- $this->core->go_pro->get_premium_button() .
69
- $this->core->lang['want_to'] .
70
- '</div>';
71
- }
72
-
73
  return '
74
  <div class="bg-box">
75
  <div class="bg-box-top">
76
  ' . __( 'BoldGrid Connect Key', 'boldgrid-backup' ) . '
77
  </div>
78
  <div class="bg-box-bottom">
79
- ' . $output . $refresh_key . '
 
 
 
 
80
  </div>
81
- ' . $bottom_box_premium . '
82
  </div>
83
  ';
2
  /**
3
  * File: connect-key.php
4
  *
5
+ * Show link to Settings >> BoldGrid Connect.
6
  *
7
+ * @link https://www.boldgrid.com
8
  * @since 1.6.0
9
  *
10
  * @package Boldgrid_Backup
16
 
17
  defined( 'WPINC' ) || die;
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  return '
20
  <div class="bg-box">
21
  <div class="bg-box-top">
22
  ' . __( 'BoldGrid Connect Key', 'boldgrid-backup' ) . '
23
  </div>
24
  <div class="bg-box-bottom">
25
+ ' . sprintf(
26
+ '%1$s <a href="' . admin_url( 'options-general.php?page=boldgrid-connect.php' ) . '">%2$s</a>.',
27
+ __( 'Connect Key management has been moved to', 'boldgrid-backup' ),
28
+ __( 'Settings >> BoldGrid Connect', 'boldgrid-backup' )
29
+ ) . '
30
  </div>
 
31
  </div>
32
  ';
admin/partials/settings/retention.php CHANGED
@@ -16,9 +16,15 @@
16
 
17
  defined( 'WPINC' ) || die;
18
 
19
- ob_start();
 
 
 
 
 
 
20
 
21
- $is_retention_set = ( isset( $settings['retention_count'] ) );
22
  ?>
23
 
24
  <div class="bg-box">
@@ -26,40 +32,20 @@ $is_retention_set = ( isset( $settings['retention_count'] ) );
26
  <?php esc_html_e( 'Retention', 'boldgrid-backup' ); ?>
27
  </div>
28
  <div class="bg-box-bottom">
29
- <?php esc_html_e( 'Number of backup archives to retain', 'boldgrid-backup' ); ?>
30
-
31
- <select id='retention-count' name='retention_count'>
32
- <?php
33
- // Loop through each <option> and print it.
34
- for ( $x = 1; $x <= 10; $x ++ ) {
35
- // Is retention set and $x = that set retention?
36
- $x_is_retention = ( $is_retention_set && $x === $settings['retention_count'] );
37
-
38
- // Is retention not set and $x = the default retention?
39
- $x_is_default = ( ! $is_retention_set && $this->core->config->get_default_retention() === $x );
40
-
41
- // Should this option be 'selected'?
42
- $selected = ( ( $x_is_retention || $x_is_default ) ? ' selected' : '' );
43
-
44
- // Should we flag this option as "Requires Upgrade"?
45
- if ( ! $this->core->config->get_is_premium() && ( $this->core->config->get_default_retention() + 1 ) === $x ) {
46
- $requires_upgrade = esc_html__( '- Requires Upgrade', 'boldgrid-backup' );
47
- } else {
48
- $requires_upgrade = '';
49
- }
50
-
51
- printf(
52
- '<option value="%1$d" %2$s>%1$d</option>',
53
- esc_attr( $x ),
54
- esc_attr( $selected )
55
- );
56
- }
57
- ?>
58
- </select>
59
  </div>
60
  </div>
61
 
62
  <?php
63
  $output = ob_get_contents();
64
  ob_end_clean();
 
65
  return $output;
16
 
17
  defined( 'WPINC' ) || die;
18
 
19
+ // Get retention count setting. Limit 1-99, default is from config.
20
+ $retention_count = isset( $settings['retention_count'] ) && 99 >= $settings['retention_count'] ?
21
+ $settings['retention_count'] : $this->core->config->get_default_retention();
22
+
23
+ if ( $retention_count > 99 ) {
24
+ $retention_count = 99;
25
+ }
26
 
27
+ ob_start();
28
  ?>
29
 
30
  <div class="bg-box">
32
  <?php esc_html_e( 'Retention', 'boldgrid-backup' ); ?>
33
  </div>
34
  <div class="bg-box-bottom">
35
+ <table class='form-table'>
36
+ <tr>
37
+ <th><label for="retention_count">
38
+ <?php esc_html_e( 'Number of backup archives to retain', 'boldgrid-backup' ); ?> (1 - 99):
39
+ </label></th>
40
+ <td><input type="number" id='retention-count' name='retention_count' min="1" max="99"
41
+ value="<?php echo esc_attr( $retention_count ); ?>" required /></td>
42
+ </tr>
43
+ </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  </div>
45
  </div>
46
 
47
  <?php
48
  $output = ob_get_contents();
49
  ob_end_clean();
50
+
51
  return $output;
admin/partials/settings/scheduler.php CHANGED
@@ -17,10 +17,9 @@
17
  defined( 'WPINC' ) || die;
18
 
19
  $schedulers_available = $this->core->scheduler->get_available();
20
-
21
- $schedulers_count = count( $schedulers_available );
22
-
23
- $scheduler = ! empty( $settings['scheduler'] ) ? $settings['scheduler'] : false;
24
 
25
  // No need to show the user any options if there is only 1 scheduler available.
26
  if ( 1 === $schedulers_count ) {
@@ -32,8 +31,10 @@ $wp_cron_warning = sprintf(
32
  __( 'When using WP Cron, we cannot guarantee that backups will be created at the times you specify. Cron is the recommended scheduler.', 'boldgrid-backup' )
33
  );
34
 
35
- $scheduler_options = '';
36
  foreach ( $schedulers_available as $key => $scheduler_data ) {
 
 
 
37
  $scheduler_options .= sprintf(
38
  '<option value="%1$s" %3$s>%2$s</option>',
39
  $key,
@@ -48,7 +49,7 @@ return sprintf(
48
  '
49
  <div class="bg-box">
50
  <div class="bg-box-top">
51
- %1$s
52
  </div>
53
  <div class="bg-box-bottom">
54
  %2$s
@@ -57,5 +58,6 @@ return sprintf(
57
  </div>',
58
  __( 'Scheduler', 'boldgrid-backup' ),
59
  $scheduler_select,
60
- $wp_cron_warning
 
61
  );
17
  defined( 'WPINC' ) || die;
18
 
19
  $schedulers_available = $this->core->scheduler->get_available();
20
+ $schedulers_count = count( $schedulers_available );
21
+ $scheduler = ! empty( $settings['scheduler'] ) ? $settings['scheduler'] : false;
22
+ $scheduler_options = '';
 
23
 
24
  // No need to show the user any options if there is only 1 scheduler available.
25
  if ( 1 === $schedulers_count ) {
31
  __( 'When using WP Cron, we cannot guarantee that backups will be created at the times you specify. Cron is the recommended scheduler.', 'boldgrid-backup' )
32
  );
33
 
 
34
  foreach ( $schedulers_available as $key => $scheduler_data ) {
35
+ $scheduler_data['title'] = $scheduler_data['title'] . ( 'cron' === $key ?
36
+ ' (' . esc_html__( 'Recommended', 'boldgrid-backup' ) . ')' : '' );
37
+
38
  $scheduler_options .= sprintf(
39
  '<option value="%1$s" %3$s>%2$s</option>',
40
  $key,
49
  '
50
  <div class="bg-box">
51
  <div class="bg-box-top">
52
+ %1$s <span class="bgb-unbold">(%4$s)</span>
53
  </div>
54
  <div class="bg-box-bottom">
55
  %2$s
58
  </div>',
59
  __( 'Scheduler', 'boldgrid-backup' ),
60
  $scheduler_select,
61
+ $wp_cron_warning,
62
+ __( 'Advanced', 'boldgrid-backup' )
63
  );
admin/partials/settings/storage.php CHANGED
@@ -19,13 +19,9 @@ defined( 'WPINC' ) || die;
19
 
20
  ob_start();
21
 
 
22
  $storage_locations = array(
23
- array(
24
- 'title' => __( 'Web Server', 'boldgrid-backup' ),
25
- 'key' => 'local',
26
- 'is_setup' => true,
27
- 'enabled' => ! empty( $settings['remote']['local']['enabled'] ) && true === $settings['remote']['local']['enabled'],
28
- ),
29
  );
30
 
31
  /**
@@ -45,6 +41,7 @@ $storage_locations = array(
45
  */
46
  $storage_locations = apply_filters( 'boldgrid_backup_register_storage_location', $storage_locations );
47
 
 
48
  $premium_box = $this->core->config->is_premium_done ? '' : sprintf(
49
  '
50
  <div class="bg-box-bottom premium">
@@ -56,7 +53,7 @@ $premium_box = $this->core->config->is_premium_done ? '' : sprintf(
56
  </p>
57
  </div>',
58
  /* 1 */ __( 'Amazon S3', 'boldgrid-backup' ),
59
- /* 2 */ $this->core->go_pro->get_premium_button(),
60
  /* 3 */ __( 'Upgrade to premium for more Storage Locations!', 'boldgrid-backup' )
61
  );
62
 
@@ -79,9 +76,11 @@ $premium_box = $this->core->config->is_premium_done ? '' : sprintf(
79
  ),
80
  array( 'a' => array( 'href' => array() ) )
81
  ),
82
- esc_url( admin_url(
83
- 'admin.php?page=boldgrid-backup-tools&section=section_locations'
84
- ) )
 
 
85
  );
86
  ?>
87
  </p>
19
 
20
  ob_start();
21
 
22
+ // Add the web server storage details.
23
  $storage_locations = array(
24
+ $this->core->local->get_webserver_details(),
 
 
 
 
 
25
  );
26
 
27
  /**
41
  */
42
  $storage_locations = apply_filters( 'boldgrid_backup_register_storage_location', $storage_locations );
43
 
44
+ $premium_url = $this->core->go_pro->get_premium_url( 'bgbkup-settings-storage' );
45
  $premium_box = $this->core->config->is_premium_done ? '' : sprintf(
46
  '
47
  <div class="bg-box-bottom premium">
53
  </p>
54
  </div>',
55
  /* 1 */ __( 'Amazon S3', 'boldgrid-backup' ),
56
+ /* 2 */ $this->core->go_pro->get_premium_button( $premium_url ),
57
  /* 3 */ __( 'Upgrade to premium for more Storage Locations!', 'boldgrid-backup' )
58
  );
59
 
76
  ),
77
  array( 'a' => array( 'href' => array() ) )
78
  ),
79
+ esc_url(
80
+ admin_url(
81
+ 'admin.php?page=boldgrid-backup-tools&section=section_locations'
82
+ )
83
+ )
84
  );
85
  ?>
86
  </p>
admin/partials/tools/local-remote.php CHANGED
@@ -179,13 +179,14 @@ printf(
179
  echo '</p>';
180
 
181
  if ( ! $this->core->config->is_premium_done ) {
 
182
  printf(
183
  '
184
  <div class="bg-box-bottom premium wp-clearfix">
185
  %1$s
186
  %2$s
187
  </div>',
188
- $this->core->go_pro->get_premium_button(), // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
189
  sprintf(
190
  // translators: 1: HTML strong open tag, 2: HTML strong close tag, 3: HTML em open tag, 4: HTML em close tag.
191
  esc_html__(
179
  echo '</p>';
180
 
181
  if ( ! $this->core->config->is_premium_done ) {
182
+ $premium_url = $this->core->go_pro->get_premium_url( 'bgbkup-tools-faq-storage' );
183
  printf(
184
  '
185
  <div class="bg-box-bottom premium wp-clearfix">
186
  %1$s
187
  %2$s
188
  </div>',
189
+ $this->core->go_pro->get_premium_button( $premium_url ), // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
190
  sprintf(
191
  // translators: 1: HTML strong open tag, 2: HTML strong close tag, 3: HTML em open tag, 4: HTML em close tag.
192
  esc_html__(
admin/remote/class-boldgrid-backup-admin-ftp-hooks.php CHANGED
@@ -214,6 +214,12 @@ class Boldgrid_Backup_Admin_Ftp_Hooks {
214
  public function wp_ajax_download() {
215
  $error = __( 'Unable to download backup from FTP', 'bolgrid-bakcup' );
216
 
 
 
 
 
 
 
217
  // Validation, user role.
218
  if ( ! current_user_can( 'update_plugins' ) ) {
219
  $this->core->notice->add_user_notice(
@@ -248,13 +254,15 @@ class Boldgrid_Backup_Admin_Ftp_Hooks {
248
 
249
  if ( $result ) {
250
  $this->core->notice->add_user_notice(
251
- sprintf(
252
- // translators: 1: Filename.
253
- esc_html__(
254
- '<h2>BoldGrid Backup Premium - FTP Download</h2><p>Backup file <strong>%1$s</strong> successfully downloaded from FTP.</p>',
255
- 'boldgrid-backup'
256
- ),
257
- $filename
 
 
258
  ),
259
  'notice notice-success'
260
  );
214
  public function wp_ajax_download() {
215
  $error = __( 'Unable to download backup from FTP', 'bolgrid-bakcup' );
216
 
217
+ $allowed_html = array(
218
+ 'h2' => array(),
219
+ 'p' => array(),
220
+ 'strong' => array(),
221
+ );
222
+
223
  // Validation, user role.
224
  if ( ! current_user_can( 'update_plugins' ) ) {
225
  $this->core->notice->add_user_notice(
254
 
255
  if ( $result ) {
256
  $this->core->notice->add_user_notice(
257
+ wp_kses(
258
+ sprintf(
259
+ // translators: 1: Filename.
260
+ __(
261
+ '<h2>BoldGrid Backup Premium - FTP Download</h2><p>Backup file <strong>%1$s</strong> successfully downloaded from FTP.</p>',
262
+ 'boldgrid-backup'
263
+ ),
264
+ $filename
265
+ ), $allowed_html
266
  ),
267
  'notice notice-success'
268
  );
admin/remote/class-boldgrid-backup-admin-ftp-page.php CHANGED
@@ -46,26 +46,30 @@ class Boldgrid_Backup_Admin_Ftp_Page {
46
  * @since 1.6.0
47
  */
48
  public function enqueue_scripts() {
49
- $handle = 'boldgrid-backup-admin-ftp-settings';
50
- wp_register_script(
51
- $handle,
52
- plugin_dir_url( dirname( __FILE__ ) ) . 'js/' . $handle . '.js',
53
- array( 'jquery' ),
54
- BOLDGRID_BACKUP_VERSION,
55
- false
56
- );
57
- $translation = array(
58
- 'default_port' => $this->core->ftp->default_port,
59
- );
60
- wp_localize_script( $handle, 'BoldGridBackupAdminFtpSettings', $translation );
61
- wp_enqueue_script( $handle );
62
-
63
- wp_enqueue_style(
64
- $handle,
65
- plugin_dir_url( dirname( __FILE__ ) ) . 'css/' . $handle . '.css',
66
- array(),
67
- BOLDGRID_BACKUP_VERSION
68
- );
 
 
 
 
69
  }
70
 
71
  /**
@@ -78,8 +82,15 @@ class Boldgrid_Backup_Admin_Ftp_Page {
78
  return false;
79
  }
80
 
81
- $this->enqueue_scripts();
82
- wp_enqueue_style( 'boldgrid-backup-admin-hide-all' );
 
 
 
 
 
 
 
83
 
84
  // Blank data, used when deleting settings.
85
  $type = $this->core->ftp->default_type;
@@ -100,8 +111,10 @@ class Boldgrid_Backup_Admin_Ftp_Page {
100
 
101
  switch ( $action ) {
102
  case 'save':
103
- esc_html( $this->core->elements['long_checking_creds'] );
104
- ob_flush();
 
 
105
  flush();
106
 
107
  $this->settings_save();
@@ -148,8 +161,21 @@ class Boldgrid_Backup_Admin_Ftp_Page {
148
  * Process the user's request to update their FTP settings.
149
  *
150
  * @since 1.6.0
 
 
151
  */
152
  public function settings_save() {
 
 
 
 
 
 
 
 
 
 
 
153
 
154
  // Readability.
155
  $ftp = $this->core->ftp;
@@ -158,7 +184,7 @@ class Boldgrid_Backup_Admin_Ftp_Page {
158
  return false;
159
  }
160
 
161
- if ( empty( $_POST ) ) { // phpcs:ignore WordPress.CSRF.NonceVerification.NoNonceVerification, WordPress.Security.NonceVerification.NoNonceVerification
162
  return false;
163
  }
164
 
@@ -184,9 +210,12 @@ class Boldgrid_Backup_Admin_Ftp_Page {
184
 
185
  if ( ! empty( $ftp->errors ) ) {
186
  do_action( 'boldgrid_backup_notice', implode( '<br /><br />', $ftp->errors ) );
 
187
  } else {
188
  update_site_option( 'boldgrid_backup_settings', $settings );
189
  do_action( 'boldgrid_backup_notice', __( 'Settings saved.', 'boldgrid-backup' ), 'notice updated is-dismissible' );
190
  }
 
 
191
  }
192
  }
46
  * @since 1.6.0
47
  */
48
  public function enqueue_scripts() {
49
+ if ( $this->core->utility->is_admin_page( 'boldgrid-backup-ftp' ) ) {
50
+ $handle = 'boldgrid-backup-admin-ftp-settings';
51
+ wp_register_script(
52
+ $handle,
53
+ plugin_dir_url( dirname( __FILE__ ) ) . 'js/' . $handle . '.js',
54
+ array( 'jquery' ),
55
+ BOLDGRID_BACKUP_VERSION,
56
+ false
57
+ );
58
+ $translation = array(
59
+ 'default_port' => $this->core->ftp->default_port,
60
+ );
61
+ wp_localize_script( $handle, 'BoldGridBackupAdminFtpSettings', $translation );
62
+ wp_enqueue_script( $handle );
63
+
64
+ wp_enqueue_style(
65
+ $handle,
66
+ plugin_dir_url( dirname( __FILE__ ) ) . 'css/' . $handle . '.css',
67
+ array(),
68
+ BOLDGRID_BACKUP_VERSION
69
+ );
70
+
71
+ wp_enqueue_style( 'boldgrid-backup-admin-hide-all' );
72
+ }
73
  }
74
 
75
  /**
82
  return false;
83
  }
84
 
85
+ // Used with wp_kses call below.
86
+ $allowed_html = array(
87
+ 'div' => array(
88
+ 'class' => array(),
89
+ ),
90
+ 'span' => array(
91
+ 'class' => array(),
92
+ ),
93
+ );
94
 
95
  // Blank data, used when deleting settings.
96
  $type = $this->core->ftp->default_type;
111
 
112
  switch ( $action ) {
113
  case 'save':
114
+ echo wp_kses( $this->core->elements['long_checking_creds'], $allowed_html );
115
+ if ( ob_get_level() > 0 ) {
116
+ ob_flush();
117
+ }
118
  flush();
119
 
120
  $this->settings_save();
161
  * Process the user's request to update their FTP settings.
162
  *
163
  * @since 1.6.0
164
+ *
165
+ * @return bool
166
  */
167
  public function settings_save() {
168
+ $success = true;
169
+
170
+ if ( ! check_ajax_referer( 'bgb-settings-ftp', 'ftp_auth' ) ) {
171
+ do_action(
172
+ 'boldgrid_backup_notice',
173
+ __( 'Unauthorized request.', 'boldgrid-backup' ),
174
+ 'notice error is-dismissible'
175
+ );
176
+
177
+ return false;
178
+ }
179
 
180
  // Readability.
181
  $ftp = $this->core->ftp;
184
  return false;
185
  }
186
 
187
+ if ( empty( $_POST ) ) {
188
  return false;
189
  }
190
 
210
 
211
  if ( ! empty( $ftp->errors ) ) {
212
  do_action( 'boldgrid_backup_notice', implode( '<br /><br />', $ftp->errors ) );
213
+ $success = false;
214
  } else {
215
  update_site_option( 'boldgrid_backup_settings', $settings );
216
  do_action( 'boldgrid_backup_notice', __( 'Settings saved.', 'boldgrid-backup' ), 'notice updated is-dismissible' );
217
  }
218
+
219
+ return $success;
220
  }
221
  }
admin/remote/class-boldgrid-backup-admin-ftp.php CHANGED
@@ -508,16 +508,35 @@ class Boldgrid_Backup_Admin_Ftp {
508
  continue;
509
  }
510
 
511
- // Get the timestamp.
512
- $month = $exploded_item[ $count - 4 ];
513
- $day = $exploded_item[ $count - 3 ];
514
- $time = $exploded_item[ $count - 2 ];
515
- $time = strtotime( $month . ' ' . $day . ' ' . $time );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
516
 
517
  $backups[] = array(
518
  'time' => $time,
519
  'filename' => $filename,
520
- 'size' => $exploded_item[ $count - 5 ],
521
  );
522
  }
523
  }
@@ -535,6 +554,9 @@ class Boldgrid_Backup_Admin_Ftp {
535
  /**
536
  * Get the remote contents / listing.
537
  *
 
 
 
538
  * @since 1.6.0
539
  *
540
  * @param bool $raw Whether to get the raw contents (ftp_rawlist) or not
@@ -553,19 +575,36 @@ class Boldgrid_Backup_Admin_Ftp {
553
  switch ( $this->type ) {
554
  case 'ftp':
555
  if ( $raw ) {
556
- return ftp_rawlist( $this->connection, $dir );
557
  } else {
558
- return ftp_nlist( $this->connection, $dir );
559
  }
560
  break;
561
  case 'sftp':
562
  if ( $raw ) {
563
- return $this->connection->rawlist( $dir );
564
  } else {
565
- return $this->connection->nlist( $dir );
566
  }
567
  break;
568
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
569
  }
570
 
571
  /**
@@ -787,6 +826,26 @@ class Boldgrid_Backup_Admin_Ftp {
787
  // If we tried to login and it failed, disconnect.
788
  if ( ! $this->logged_in ) {
789
  $this->disconnect();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
790
  }
791
  }
792
 
@@ -842,6 +901,8 @@ class Boldgrid_Backup_Admin_Ftp {
842
  public function upload( $filepath ) {
843
  $remote_file = $this->remote_dir . '/' . basename( $filepath );
844
 
 
 
845
  $this->connect();
846
  $this->log_in();
847
  if ( ! $this->logged_in ) {
@@ -857,9 +918,21 @@ class Boldgrid_Backup_Admin_Ftp {
857
  switch ( $this->type ) {
858
  case 'ftp':
859
  $uploaded = ftp_put( $this->connection, $remote_file, $filepath, FTP_BINARY );
 
 
 
 
 
 
 
 
 
860
  break;
861
  case 'sftp':
862
  $uploaded = $this->connection->put( $remote_file, $filepath, 1 );
 
 
 
863
  break;
864
  }
865
 
508
  continue;
509
  }
510
 
511
+ /*
512
+ * Determine the format of our raw contents.
513
+ *
514
+ * There are for sure more than 2 formats (see notes at https://pastebin.com/eL5XpeYP),
515
+ * but for now we're currently testing for:
516
+ * # Windows 10-24-2018 11:12AM 302501 boldgrid-backup-localhost_wordpress-90d7727c-20181024-175039.zip
517
+ * # Linux -rw-r--r-- 1 boldgrid4s boldgrid4s 997834 Oct 24 10:36 boldgrid-backup-domain.com-b2cf0453-20181024-143320.zip
518
+ *
519
+ * Flag as a windows ftp server if first item is a date in xx-xx-xxxx format.
520
+ */
521
+ $is_windows = 1 === preg_match( '/(\d{2})-(\d{2})-(\d{4})/', $exploded_item[0] );
522
+
523
+ if ( $is_windows ) {
524
+ $time = strtotime( $exploded_item[0] . ' ' . $exploded_item[1] );
525
+ $size = $exploded_item[2];
526
+ } else {
527
+ // Get the timestamp.
528
+ $month = $exploded_item[ $count - 4 ];
529
+ $day = $exploded_item[ $count - 3 ];
530
+ $time = $exploded_item[ $count - 2 ];
531
+ $time = strtotime( $month . ' ' . $day . ' ' . $time );
532
+
533
+ $size = $exploded_item[ $count - 5 ];
534
+ }
535
 
536
  $backups[] = array(
537
  'time' => $time,
538
  'filename' => $filename,
539
+ 'size' => $size,
540
  );
541
  }
542
  }
554
  /**
555
  * Get the remote contents / listing.
556
  *
557
+ * This method allows for both ftp / sftp AND rawlist / nlist functions. The return data can
558
+ * vary based on server. Example return data available here: https://pastebin.com/eL5XpeYP
559
+ *
560
  * @since 1.6.0
561
  *
562
  * @param bool $raw Whether to get the raw contents (ftp_rawlist) or not
575
  switch ( $this->type ) {
576
  case 'ftp':
577
  if ( $raw ) {
578
+ $contents = ftp_rawlist( $this->connection, $dir );
579
  } else {
580
+ $contents = ftp_nlist( $this->connection, $dir );
581
  }
582
  break;
583
  case 'sftp':
584
  if ( $raw ) {
585
+ $contents = $this->connection->rawlist( $dir );
586
  } else {
587
+ $contents = $this->connection->nlist( $dir );
588
  }
589
  break;
590
  }
591
+
592
+ /*
593
+ * Some ftp servers respond with slightly different formats. In some scenarious on a Windows
594
+ * FTP server, the folders will be prepended with a "./" (See comment in this method's
595
+ * docblock). Before returning the data, remove "./" from the beginning of all items.
596
+ */
597
+ $fix_windows = function( $item ) {
598
+ if ( './' === substr( $item, 0, 2 ) ) {
599
+ $item = substr( $item, 2 );
600
+ }
601
+ return $item;
602
+ };
603
+ if ( 'ftp' === $this->type && is_array( $contents ) ) {
604
+ $contents = array_map( $fix_windows, $contents );
605
+ }
606
+
607
+ return $contents;
608
  }
609
 
610
  /**
826
  // If we tried to login and it failed, disconnect.
827
  if ( ! $this->logged_in ) {
828
  $this->disconnect();
829
+ } else {
830
+ $this->maybe_passive();
831
+ }
832
+ }
833
+
834
+ /**
835
+ * Turn on passive mode, only if needed.
836
+ *
837
+ * Turning on passive mode can only be done after a successful login. This method assumes you've
838
+ * already logged in.
839
+ *
840
+ * @since 1.7.0
841
+ */
842
+ public function maybe_passive() {
843
+ if ( 'ftp' === $this->type ) {
844
+ $contents = $this->get_contents();
845
+
846
+ if ( ! is_array( $contents ) ) {
847
+ ftp_pasv( $this->connection, true );
848
+ }
849
  }
850
  }
851
 
901
  public function upload( $filepath ) {
902
  $remote_file = $this->remote_dir . '/' . basename( $filepath );
903
 
904
+ $timestamp = filemtime( $filepath );
905
+
906
  $this->connect();
907
  $this->log_in();
908
  if ( ! $this->logged_in ) {
918
  switch ( $this->type ) {
919
  case 'ftp':
920
  $uploaded = ftp_put( $this->connection, $remote_file, $filepath, FTP_BINARY );
921
+
922
+ /*
923
+ * Ensure the timestamp is unchanged.
924
+ *
925
+ * Not 100% accurate however. In testing, when setting a remote file's timestamp to
926
+ * 11am UTC, that remote server convereted the UTC time to local time.
927
+ */
928
+ $cmd = 'MFMT ' . date( 'YmdHis', $timestamp ) . ' ' . $remote_file;
929
+ ftp_raw( $this->connection, $cmd );
930
  break;
931
  case 'sftp':
932
  $uploaded = $this->connection->put( $remote_file, $filepath, 1 );
933
+
934
+ // Adjust timestamp.
935
+ $this->connection->touch( $remote_file, $timestamp );
936
  break;
937
  }
938
 
admin/storage/class-boldgrid-backup-admin-storage-local.php CHANGED
@@ -97,4 +97,214 @@ class Boldgrid_Backup_Admin_Storage_Local {
97
 
98
  $this->core->jobs->add( $args );
99
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
  }
97
 
98
  $this->core->jobs->add( $args );
99
  }
100
+
101
+ /**
102
+ * Add submenu pages.
103
+ *
104
+ * @since 1.7.0
105
+ */
106
+ public function add_submenus() {
107
+ add_submenu_page(
108
+ null,
109
+ __( 'Web Server', 'boldgrid-backup' ),
110
+ __( 'Web Server', 'boldgrid-backup' ),
111
+ 'administrator',
112
+ 'boldgrid-backup-web-server',
113
+ array(
114
+ $this,
115
+ 'webserver_subpage',
116
+ )
117
+ );
118
+ }
119
+
120
+ /**
121
+ * Generate the submenu page for the Web Server settings page.
122
+ *
123
+ * @since 1.7.0
124
+ */
125
+ public function webserver_subpage() {
126
+ wp_enqueue_style( 'boldgrid-backup-admin-hide-all' );
127
+ wp_enqueue_style( 'bglib-ui-css' );
128
+ wp_enqueue_script( 'bglib-ui-js' );
129
+ wp_enqueue_script( 'bglib-sticky' );
130
+
131
+ wp_enqueue_script(
132
+ 'boldgrid-backup-admin-settings',
133
+ plugin_dir_url( dirname( __FILE__ ) ) . 'js/boldgrid-backup-admin-settings.js',
134
+ array( 'jquery' ),
135
+ BOLDGRID_BACKUP_VERSION,
136
+ false
137
+ );
138
+
139
+ $this->webserver_subpage_save();
140
+
141
+ $settings = $this->core->settings->get_settings();
142
+
143
+ include BOLDGRID_BACKUP_PATH . '/admin/partials/remote/local.php';
144
+ }
145
+
146
+ /**
147
+ * Process the user's request to update their Amazon S3 settings.
148
+ *
149
+ * @since 1.7.0
150
+ *
151
+ * @see Boldgrid_Backup_Admin_Test::run_functionality_tests()
152
+ * @see Boldgrid_Backup_Admin_Settings::get_settings()
153
+ * @see Boldgrid_Backup_Admin_Backup_Dir::create()
154
+ * @see Boldgrid_Backup_Admin_Backup_Dir::is_valid()
155
+ *
156
+ * @uses $_POST[] BoldGrid Backup settings.
157
+ *
158
+ * @return bool
159
+ */
160
+ public function webserver_subpage_save() {
161
+ if ( empty( $_POST ) || ! current_user_can( 'update_plugins' ) ) {
162
+ return false;
163
+ }
164
+
165
+ if ( ! check_ajax_referer( 'bgb-settings-webserver', 'webserver_auth' ) ) {
166
+ do_action(
167
+ 'boldgrid_backup_notice',
168
+ __( 'Unauthorized request.', 'boldgrid-backup' ),
169
+ 'notice error is-dismissible'
170
+ );
171
+
172
+ return false;
173
+ }
174
+
175
+ if ( ! $this->core->test->run_functionality_tests() ) {
176
+ $this->core->settings->errors[] = sprintf(
177
+ // translators: 1: HTML anchor link open tag, 2: HTML anchor closing tag.
178
+ __(
179
+ 'Functionality test has failed. You can go to %1$sFunctionality Test%2$s to view a report.',
180
+ 'boldgrid-backup'
181
+ ),
182
+ '<a href="' . admin_url( 'admin.php?page=boldgrid-backup-test' ) . '">',
183
+ '</a>'
184
+ );
185
+ } else {
186
+ $settings = $this->core->settings->get_settings();
187
+
188
+ $original_backup_directory = $settings['backup_directory'];
189
+
190
+ // For consistency, untrailingslashit the input backup dir, or use the default.
191
+ $settings['backup_directory'] = ! empty( $_POST['backup_directory'] ) ?
192
+ untrailingslashit(
193
+ str_replace( '\\\\', '\\', trim( $_POST['backup_directory'] ) )
194
+ ) : $this->core->backup_dir->get();
195
+
196
+ $this->core->backup_dir->create( $settings['backup_directory'] );
197
+
198
+ if ( ! $this->core->backup_dir->is_valid( $settings['backup_directory'] ) ) {
199
+ $this->core->settings->errors[] = __( 'Invalid backup directory', 'boldgrid-backup' );
200
+ } elseif ( $original_backup_directory !== $settings['backup_directory'] &&
201
+ isset( $_POST['move-backups'] ) && 'on' === $_POST['move-backups'] ) {
202
+ // Move backups to the new directory, if changed and opted.
203
+ $backups_moved = $this->core->settings->move_backups(
204
+ $original_backup_directory,
205
+ $settings['backup_directory']
206
+ );
207
+
208
+ if ( ! $backups_moved ) {
209
+ $this->core->settings->errors[] = sprintf(
210
+ // translators: 1: Original backup directory, 2: New backup directory.
211
+ __(
212
+ 'Unable to move backups from %1$s to %2$s',
213
+ 'boldgrid-backup'
214
+ ),
215
+ $original_backup_directory,
216
+ $settings['backup_directory']
217
+ );
218
+ }
219
+ }
220
+
221
+ $settings['retention_count'] = (
222
+ ! empty( $_POST['retention_count'] ) ?
223
+ (int) $_POST['retention_count'] : $this->core->config->get_default_retention()
224
+ );
225
+ }
226
+
227
+ $success = empty( $this->core->settings->errors );
228
+
229
+ if ( ! $success ) {
230
+ do_action( 'boldgrid_backup_notice', implode( '<br /><br />', $this->core->settings->errors ) );
231
+ } else {
232
+ update_site_option( 'boldgrid_backup_settings', $settings );
233
+
234
+ do_action(
235
+ 'boldgrid_backup_notice',
236
+ __( 'Settings saved.', 'boldgrid-backup' ),
237
+ 'notice updated is-dismissible'
238
+ );
239
+ }
240
+
241
+ return $success;
242
+ }
243
+
244
+ /**
245
+ * Are the web server settings configured?
246
+ *
247
+ * @since 1.7.0
248
+ *
249
+ * @see Boldgrid_Backup_Admin_Settings::get_settings
250
+ * @see Boldgrid_Backup_Admin_Backup_Dir::is_valid
251
+ *
252
+ * @return bool
253
+ */
254
+ public function is_webserver_setup() {
255
+ $settings = $this->core->settings->get_settings();
256
+ $has_valid_dir = $this->core->backup_dir->is_valid( $settings['backup_directory'] );
257
+ $has_valid_retention = is_int( $settings['retention_count'] ) &&
258
+ 0 < $settings['retention_count'];
259
+
260
+ return $has_valid_dir && $has_valid_retention;
261
+ }
262
+
263
+ /**
264
+ * Determine if local web server storage is setup/configured.
265
+ *
266
+ * @since 1.7.0
267
+ *
268
+ * @see self::is_webserver_setup()
269
+ * @see self::get_webserver_details()
270
+ */
271
+ public function is_setup_ajax() {
272
+ if ( ! current_user_can( 'update_plugins' ) ) {
273
+ wp_send_json_error( __( 'Permission denied.', 'boldgrid-backup' ) );
274
+ }
275
+
276
+ if ( ! check_ajax_referer( 'boldgrid_backup_settings', 'security', false ) ) {
277
+ wp_send_json_error( __( 'Invalid nonce.', 'boldgrid-backup' ) );
278
+ }
279
+
280
+ $location = $this->get_webserver_details();
281
+
282
+ $tr = include BOLDGRID_BACKUP_PATH . '/admin/partials/settings/storage-location.php';
283
+
284
+ if ( $this->is_webserver_setup() ) {
285
+ wp_send_json_success( $tr );
286
+ } else {
287
+ wp_send_json_error( $tr );
288
+ }
289
+ }
290
+
291
+ /**
292
+ * Get the web server storage details.
293
+ *
294
+ * @since 1.7.0
295
+ *
296
+ * @return array
297
+ */
298
+ public function get_webserver_details() {
299
+ $settings = $this->core->settings->get_settings();
300
+
301
+ return array(
302
+ 'title' => __( 'Web Server', 'boldgrid-backup' ),
303
+ 'key' => 'local',
304
+ 'configure' => 'admin.php?page=boldgrid-backup-web-server',
305
+ 'is_setup' => $this->is_webserver_setup(),
306
+ 'enabled' => ! empty( $settings['remote']['local']['enabled'] ) &&
307
+ true === $settings['remote']['local']['enabled'],
308
+ );
309
+ }
310
  }
boldgrid-backup.php CHANGED
@@ -16,7 +16,7 @@
16
  * Plugin Name: BoldGrid Backup
17
  * Plugin URI: https://www.boldgrid.com/boldgrid-backup/
18
  * Description: BoldGrid Backup provides WordPress backup and restoration with update protection.
19
- * Version: 1.6.6
20
  * Author: BoldGrid
21
  * Author URI: https://www.boldgrid.com/
22
  * License: GPL-2.0+
@@ -84,42 +84,20 @@ function run_boldgrid_backup() {
84
  * @return bool
85
  */
86
  function load_boldgrid_backup() {
 
 
87
 
88
- // Ensure we have our vendor/autoload.php file.
89
- $exists_composer = file_exists( BOLDGRID_BACKUP_PATH . '/composer.json' );
90
- $exists_autoload = file_exists( BOLDGRID_BACKUP_PATH . '/vendor/autoload.php' );
91
- if ( $exists_composer && ! $exists_autoload ) {
92
- add_action(
93
- 'admin_init', function() {
94
- deactivate_plugins( 'boldgrid-backup/boldgrid-backup.php', true );
95
-
96
- add_action(
97
- 'admin_notices', function() {
98
- ?>
99
- <div class="notice notice-error is-dismissible"><p>
100
- <?php
101
- printf(
102
- // translators: 1: HTML strong open tag, 2: HTML string close tag.
103
- esc_html__(
104
- '%1$sBoldGrid Backup%1$s has been deactivated because the vendor folder is missing. Please run %1$scomposer install%2$s, or contact your host for further assistance.',
105
- 'boldgrid-backup'
106
- ),
107
- '<strong>',
108
- '</strong>'
109
- );
110
- ?>
111
- </p></div>
112
- <?php
113
- }
114
- );
115
- }
116
- );
117
-
118
  return false;
119
  }
120
 
121
- register_activation_hook( __FILE__, 'activate_boldgrid_backup' );
122
- register_deactivation_hook( __FILE__, 'deactivate_boldgrid_backup' );
 
 
 
123
 
124
  // Include the autoloader to set plugin options and create instance.
125
  $loader = require plugin_dir_path( __FILE__ ) . 'vendor/autoload.php';
@@ -135,6 +113,9 @@ function load_boldgrid_backup() {
135
  )
136
  );
137
 
 
 
 
138
  return true;
139
  }
140
 
16
  * Plugin Name: BoldGrid Backup
17
  * Plugin URI: https://www.boldgrid.com/boldgrid-backup/
18
  * Description: BoldGrid Backup provides WordPress backup and restoration with update protection.
19
+ * Version: 1.7.0
20
  * Author: BoldGrid
21
  * Author URI: https://www.boldgrid.com/
22
  * License: GPL-2.0+
84
  * @return bool
85
  */
86
  function load_boldgrid_backup() {
87
+ require_once BOLDGRID_BACKUP_PATH . '/admin/class-boldgrid-backup-admin-support.php';
88
+ $support = new Boldgrid_Backup_Admin_Support();
89
 
90
+ if ( ! $support->has_composer_installed() ) {
91
+ $error = __( 'The vendor folder is missing. Please run "composer install", or contact your host for further assistance.', 'boldgrid-backup' );
92
+ $support->deactivate( $error );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  return false;
94
  }
95
 
96
+ if ( ! $support->has_been_built() ) {
97
+ $error = __( 'The "build" folder is missing. Please run "yarn install" and "gulp", or contact your host for further assistance.', 'boldgrid-backup' );
98
+ $support->deactivate( $error );
99
+ return false;
100
+ }
101
 
102
  // Include the autoloader to set plugin options and create instance.
103
  $loader = require plugin_dir_path( __FILE__ ) . 'vendor/autoload.php';
113
  )
114
  );
115
 
116
+ register_activation_hook( __FILE__, 'activate_boldgrid_backup' );
117
+ register_deactivation_hook( __FILE__, 'deactivate_boldgrid_backup' );
118
+
119
  return true;
120
  }
121
 
build/clipboard.min.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ /*!
2
+ * clipboard.js v2.0.1
3
+ * https://zenorocha.github.io/clipboard.js
4
+ *
5
+ * Licensed MIT © Zeno Rocha
6
+ */
7
+ !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=3)}([function(t,e,n){var o,r,i;!function(a,c){r=[t,n(7)],o=c,void 0!==(i="function"==typeof o?o.apply(e,r):o)&&(t.exports=i)}(0,function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var o=function(t){return t&&t.__esModule?t:{default:t}}(e),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),a=function(){function t(e){n(this,t),this.resolveOptions(e),this.initSelection()}return i(t,[{key:"resolveOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,o.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,o.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":r(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),t}();t.exports=a})},function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!c.string(e))throw new TypeError("Second argument must be a String");if(!c.fn(n))throw new TypeError("Third argument must be a Function");if(c.node(t))return r(t,e,n);if(c.nodeList(t))return i(t,e,n);if(c.string(t))return a(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function r(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function i(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function a(t,e,n){return u(document.body,t,e,n)}var c=n(6),u=n(5);t.exports=o},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){r.off(t,o),e.apply(n,arguments)}var r=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;for(o;o<r;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,a=o.length;i<a;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},t.exports=n},function(t,e,n){var o,r,i;!function(a,c){r=[t,n(0),n(2),n(1)],o=c,void 0!==(i="function"==typeof o?o.apply(e,r):o)&&(t.exports=i)}(0,function(t,e,n,o){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function c(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function u(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var l=r(e),s=r(n),f=r(o),d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},h=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),p=function(t){function e(t,n){i(this,e);var o=a(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return o.resolveOptions(n),o.listenClick(t),o}return c(e,t),h(e,[{key:"resolveOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===d(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,f.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l.default({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return u("action",t)}},{key:"defaultTarget",value:function(t){var e=u("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return u("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}]),e}(s.default);t.exports=p})},function(t,e){function n(t,e){for(;t&&t.nodeType!==o;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}var o=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var r=Element.prototype;r.matches=r.matchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector||r.webkitMatchesSelector}t.exports=n},function(t,e,n){function o(t,e,n,o,r){var a=i.apply(this,arguments);return t.addEventListener(n,a,r),{destroy:function(){t.removeEventListener(n,a,r)}}}function r(t,e,n,r,i){return"function"==typeof t.addEventListener?o.apply(null,arguments):"function"==typeof n?o.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return o(t,e,n,r,i)}))}function i(t,e,n,o){return function(n){n.delegateTarget=a(n.target,e),n.delegateTarget&&o.call(t,n)}}var a=n(4);t.exports=r},function(t,e){e.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},e.nodeList=function(t){var n=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in t&&(0===t.length||e.node(t[0]))},e.string=function(t){return"string"==typeof t||t instanceof String},e.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},function(t,e){function n(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}t.exports=n}])});
cron/cli-support.php CHANGED
@@ -23,7 +23,11 @@ require dirname( __FILE__ ) . '/class-boldgrid-backup-url-helper.php';
23
 
24
  $url_helper = new Boldgrid_Backup_Url_Helper();
25
 
26
- die( json_encode( array(
27
- 'has_curl_ssl' => $url_helper->has_curl_ssl(),
28
- 'has_url_fopen' => $url_helper->has_url_fopen(),
29
- ) ) );
 
 
 
 
23
 
24
  $url_helper = new Boldgrid_Backup_Url_Helper();
25
 
26
+ die(
27
+ json_encode(
28
+ array(
29
+ 'has_curl_ssl' => $url_helper->has_curl_ssl(),
30
+ 'has_url_fopen' => $url_helper->has_url_fopen(),
31
+ )
32
+ )
33
+ );
includes/class-boldgrid-backup-activator.php CHANGED
@@ -32,20 +32,22 @@ class Boldgrid_Backup_Activator {
32
  * @see Boldgrid_Backup_Admin_Cron::add_all_crons()
33
  */
34
  public static function activate() {
35
- $core = new Boldgrid_Backup_Admin_Core();
36
- $settings = $core->settings->get_settings();
37
- $scheduler = ! empty( $settings['scheduler'] ) ? $settings['scheduler'] : null;
 
38
 
39
- /*
40
- * Add all previous crons.
41
- *
42
- * The add_all_crons methods called include proper checks to ensure
43
- * scheduler is available and $settings include a schedule.
44
- */
45
- if ( 'cron' === $scheduler ) {
46
- $core->cron->add_all_crons( $settings );
47
- } elseif ( 'wp-cron' === $scheduler ) {
48
- $core->wp_cron->add_all_crons( $settings );
 
49
  }
50
  }
51
  }
32
  * @see Boldgrid_Backup_Admin_Cron::add_all_crons()
33
  */
34
  public static function activate() {
35
+ if ( Boldgrid_Backup_Admin_Test::is_filesystem_supported() ) {
36
+ $core = new Boldgrid_Backup_Admin_Core();
37
+ $settings = $core->settings->get_settings();
38
+ $scheduler = ! empty( $settings['scheduler'] ) ? $settings['scheduler'] : null;
39
 
40
+ /*
41
+ * Add all previous crons.
42
+ *
43
+ * The add_all_crons methods called include proper checks to ensure
44
+ * scheduler is available and $settings include a schedule.
45
+ */
46
+ if ( 'cron' === $scheduler ) {
47
+ $core->cron->add_all_crons( $settings );
48
+ } elseif ( 'wp-cron' === $scheduler ) {
49
+ $core->wp_cron->add_all_crons( $settings );
50
+ }
51
  }
52
  }
53
  }
includes/class-boldgrid-backup-authentication.php ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File: class-boldgrid-backup-authentication.php
4
+ *
5
+ * @link https://www.boldgrid.com
6
+ * @since 1.7.0
7
+ *
8
+ * @package Boldgrid_Backup
9
+ * @subpackage Boldgrid_Backup/admin
10
+ * @copyright BoldGrid
11
+ * @version $Id$
12
+ * @author BoldGrid <support@boldgrid.com>
13
+ */
14
+
15
+ /**
16
+ * Class: Boldgrid_Backup_Authentication
17
+ *
18
+ * @since 1.7.0
19
+ */
20
+ class Boldgrid_Backup_Authentication {
21
+ /**
22
+ * Generate a limited-lifetime token.
23
+ *
24
+ * @since 1.7.0
25
+ *
26
+ * @static
27
+ *
28
+ * @param string $id Identifier.
29
+ * @param int $expires Expiration time (in UNIX seconds).
30
+ * @return string
31
+ */
32
+ public static function create_token( $id, $expires ) {
33
+ $token = md5( openssl_random_pseudo_bytes( 64 ) );
34
+ $tokens = get_site_option( 'boldgrid_backup_tokens', array() );
35
+ $tokens[] = array(
36
+ 'id' => $id,
37
+ 'token' => $token,
38
+ 'expires' => $expires,
39
+ );
40
+
41
+ // Purge expired tokens.
42
+ foreach ( $tokens as $index => $row ) {
43
+ if ( time() > $row['expires'] ) {
44
+ unset( $tokens[ $index ] );
45
+ }
46
+ }
47
+
48
+ update_site_option( 'boldgrid_backup_tokens', $tokens );
49
+
50
+ return $token;
51
+ }
52
+
53
+ /**
54
+ * Validate token and return details.
55
+ *
56
+ * @since 1.7.0
57
+ *
58
+ * @static
59
+ *
60
+ * @param string $token Token.
61
+ * @return array
62
+ */
63
+ public static function get_token_details( $token ) {
64
+ $result['is_valid'] = false;
65
+ $tokens = get_site_option( 'boldgrid_backup_tokens', array() );
66
+
67
+ foreach ( $tokens as $row ) {
68
+ if ( $token === $row['token'] && time() < $row['expires'] ) {
69
+ $result = array(
70
+ 'is_valid' => true,
71
+ 'id' => $row['id'],
72
+ 'expires' => $row['expires'],
73
+ );
74
+ break;
75
+ }
76
+ }
77
+
78
+ return $result;
79
+ }
80
+ }
includes/class-boldgrid-backup-download.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File: class-boldgrid-backup-download.php
4
+ *
5
+ * @link https://www.boldgrid.com
6
+ * @since 1.7.0
7
+ *
8
+ * @package Boldgrid_Backup
9
+ * @subpackage Boldgrid_Backup/includes
10
+ * @copyright BoldGrid
11
+ * @version $Id$
12
+ * @author BoldGrid <support@boldgrid.com>
13
+ */
14
+
15
+ /**
16
+ * Class: Boldgrid_Backup_Download
17
+ *
18
+ * @since 1.7.0
19
+ */
20
+ class Boldgrid_Backup_Download {
21
+ /**
22
+ * The core class object.
23
+ *
24
+ * @since 1.7.0
25
+ * @access private
26
+ * @var Boldgrid_Backup_Admin_Core
27
+ */
28
+ private $core;
29
+
30
+ /**
31
+ * Constructor.
32
+ *
33
+ * @since 1.7.0
34
+ *
35
+ * @param Boldgrid_Backup_Admin_Core $core Core class object.
36
+ */
37
+ public function __construct( $core ) {
38
+ $this->core = $core;
39
+ }
40
+
41
+ /**
42
+ * Callback function for downloading a backup archive file using a public link.
43
+ *
44
+ * @since 1.7.0
45
+ *
46
+ * @see Boldgrid_Backup_Authentication::get_token_details()
47
+ * @see Boldgrid_Backup_Admin_Archive::get_by_name()
48
+ * @see Boldgrid_Backup_File::send_file()
49
+ *
50
+ * @uses $_GET['t'] Token.
51
+ */
52
+ public function public_download() {
53
+ $token = ! empty( $_GET['t'] ) ? sanitize_key( $_GET['t'] ) : null; // phpcs:ignore WordPress.CSRF.NonceVerification
54
+ $token_details = Boldgrid_Backup_Authentication::get_token_details( $token );
55
+
56
+ if ( $token_details['is_valid'] ) {
57
+ $archive = $this->core->archive->get_by_name( $token_details['id'] );
58
+
59
+ if ( ! empty( $archive ) ) {
60
+ // Send file and die nicely.
61
+ Boldgrid_Backup_File::send_file( $archive['filepath'], $archive['filesize'] );
62
+ }
63
+ }
64
+
65
+ wp_redirect( get_site_url(), 404 );
66
+ }
67
+ }
includes/class-boldgrid-backup-file.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File: class-boldgrid-backup-file.php
4
+ *
5
+ * @link https://www.boldgrid.com
6
+ * @since 1.7.0
7
+ *
8
+ * @package Boldgrid_Backup
9
+ * @subpackage Boldgrid_Backup/includes
10
+ * @copyright BoldGrid
11
+ * @version $Id$
12
+ * @author BoldGrid <support@boldgrid.com>
13
+ */
14
+
15
+ /**
16
+ * Class: Boldgrid_Backup_File
17
+ *
18
+ * @since 1.7.0
19
+ */
20
+ class Boldgrid_Backup_File {
21
+ /**
22
+ * Send a file for download and die.
23
+ *
24
+ * @since 1.7.0
25
+ *
26
+ * @static
27
+ * @global $wp_filesystem
28
+ *
29
+ * @param string $filepath File path.
30
+ * @param int $filesize File size (optional).
31
+ */
32
+ public static function send_file( $filepath, $filesize = null ) {
33
+ WP_Filesystem();
34
+ global $wp_filesystem;
35
+
36
+ // phpcs:disable WordPress.VIP
37
+ if ( empty( $filepath ) || ! $wp_filesystem->exists( $filepath ) ) {
38
+ wp_redirect( get_site_url(), 404 );
39
+ }
40
+
41
+ $filename = basename( $filepath );
42
+
43
+ if ( empty( $filesize ) ) {
44
+ $filesize = $wp_filesystem->size( $filepath );
45
+ }
46
+
47
+ // Send header.
48
+ header( 'Content-Disposition: attachment; filename="' . $filename . '"' );
49
+ header( 'Content-Transfer-Encoding: binary' );
50
+ header( 'Content-Type: binary/octet-stream' );
51
+ header( 'Content-Length: ' . $filesize );
52
+
53
+ // Check and flush output buffer if needed.
54
+ if ( 0 !== ob_get_level() ) {
55
+ ob_end_flush();
56
+ }
57
+
58
+ // Close any PHP session, so another session can open during the download.
59
+ session_write_close();
60
+
61
+ // Send the file. Not finding a replacement in $wp_filesystem.
62
+ // phpcs:disable
63
+ readfile( $filepath );
64
+ // phpcs:enable
65
+
66
+ wp_die();
67
+
68
+ // phpcs:enable WordPress.VIP
69
+ }
70
+ }
includes/class-boldgrid-backup.php CHANGED
@@ -142,7 +142,7 @@ class Boldgrid_Backup {
142
  require_once BOLDGRID_BACKUP_PATH . '/admin/class-boldgrid-backup-admin-core.php';
143
 
144
  /**
145
- * The class responsible for the backup settings in the admin area.
146
  */
147
  require_once BOLDGRID_BACKUP_PATH . '/admin/class-boldgrid-backup-admin-settings.php';
148
 
@@ -205,6 +205,7 @@ class Boldgrid_Backup {
205
  require_once BOLDGRID_BACKUP_PATH . '/admin/class-boldgrid-backup-admin-core-files.php';
206
 
207
  require_once BOLDGRID_BACKUP_PATH . '/admin/class-boldgrid-backup-admin-in-progress.php';
 
208
 
209
  require_once BOLDGRID_BACKUP_PATH . '/admin/remote/class-boldgrid-backup-admin-ftp.php';
210
  require_once BOLDGRID_BACKUP_PATH . '/admin/remote/class-boldgrid-backup-admin-ftp-hooks.php';
@@ -218,6 +219,10 @@ class Boldgrid_Backup {
218
 
219
  require_once BOLDGRID_BACKUP_PATH . '/admin/class-boldgrid-backup-admin-crypt.php';
220
 
 
 
 
 
221
  $this->loader = new Boldgrid_Backup_Loader();
222
  }
223
 
@@ -267,6 +272,7 @@ class Boldgrid_Backup {
267
  $this->loader->add_action( 'wp_ajax_boldgrid_backup_get_countdown_notice', $plugin_admin_core->auto_rollback, 'wp_ajax_get_countdown_notice' );
268
  $this->loader->add_action( 'wp_ajax_boldgrid_backup_get_protect_notice', $plugin_admin_core->auto_rollback, 'wp_ajax_get_protect_notice' );
269
  $this->loader->add_action( 'wp_ajax_boldgrid_backup_get_progress_notice', $plugin_admin_core->in_progress, 'wp_ajax_get_progress_notice' );
 
270
 
271
  // Add a custom action to handle AJAX callback for creating a backup archive file.
272
  $this->loader->add_action(
@@ -298,7 +304,9 @@ class Boldgrid_Backup {
298
  'wp_ajax_cancel'
299
  );
300
 
301
- $this->loader->add_action( 'admin_notices', $plugin_admin_core->auto_rollback, 'notice_backup_show' );
 
 
302
 
303
  // Add an action to add a cron job to restore after WordPress Updates, unless canceled.
304
  $this->loader->add_action(
@@ -360,6 +368,8 @@ class Boldgrid_Backup {
360
 
361
  $this->loader->add_action( 'admin_init', $plugin_admin_core->cron, 'upgrade_crontab_entries' );
362
 
 
 
363
  /* FTP */
364
 
365
  // Allow one click upload.
@@ -379,6 +389,8 @@ class Boldgrid_Backup {
379
  // Add ftp backups to the "Backups" tab.
380
  $this->loader->add_action( 'boldgrid_backup_get_all', $plugin_admin_core->ftp->hooks, 'filter_get_all' );
381
  $this->loader->add_action( 'wp_ajax_boldgrid_backup_remote_storage_download_ftp', $plugin_admin_core->ftp->hooks, 'wp_ajax_download' );
 
 
382
 
383
  $this->loader->add_action( 'admin_notices', $plugin_admin_core->go_pro, 'admin_notice_setup' );
384
 
@@ -396,7 +408,26 @@ class Boldgrid_Backup {
396
  $this->loader->add_action( 'wp_ajax_nopriv_boldgrid_backup_run_backup', $plugin_admin_core->cron, 'backup' );
397
  $this->loader->add_action( 'wp_ajax_nopriv_boldgrid_backup_run_restore', $plugin_admin_core->cron, 'restore' );
398
 
 
 
 
 
 
399
  $this->loader->add_action( 'admin_notices', $plugin_admin_core->cron_log, 'admin_notice' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
400
  }
401
 
402
  /**
142
  require_once BOLDGRID_BACKUP_PATH . '/admin/class-boldgrid-backup-admin-core.php';
143
 
144
  /**
145
+ * The class responsible for the backup in the admin area.
146
  */
147
  require_once BOLDGRID_BACKUP_PATH . '/admin/class-boldgrid-backup-admin-settings.php';
148
 
205
  require_once BOLDGRID_BACKUP_PATH . '/admin/class-boldgrid-backup-admin-core-files.php';
206
 
207
  require_once BOLDGRID_BACKUP_PATH . '/admin/class-boldgrid-backup-admin-in-progress.php';
208
+ require_once BOLDGRID_BACKUP_PATH . '/admin/class-boldgrid-backup-admin-in-progress-data.php';
209
 
210
  require_once BOLDGRID_BACKUP_PATH . '/admin/remote/class-boldgrid-backup-admin-ftp.php';
211
  require_once BOLDGRID_BACKUP_PATH . '/admin/remote/class-boldgrid-backup-admin-ftp-hooks.php';
219
 
220
  require_once BOLDGRID_BACKUP_PATH . '/admin/class-boldgrid-backup-admin-crypt.php';
221
 
222
+ require_once BOLDGRID_BACKUP_PATH . '/includes/class-boldgrid-backup-authentication.php';
223
+ require_once BOLDGRID_BACKUP_PATH . '/includes/class-boldgrid-backup-download.php';
224
+ require_once BOLDGRID_BACKUP_PATH . '/includes/class-boldgrid-backup-file.php';
225
+
226
  $this->loader = new Boldgrid_Backup_Loader();
227
  }
228
 
272
  $this->loader->add_action( 'wp_ajax_boldgrid_backup_get_countdown_notice', $plugin_admin_core->auto_rollback, 'wp_ajax_get_countdown_notice' );
273
  $this->loader->add_action( 'wp_ajax_boldgrid_backup_get_protect_notice', $plugin_admin_core->auto_rollback, 'wp_ajax_get_protect_notice' );
274
  $this->loader->add_action( 'wp_ajax_boldgrid_backup_get_progress_notice', $plugin_admin_core->in_progress, 'wp_ajax_get_progress_notice' );
275
+ $this->loader->add_action( 'core_upgrade_preamble', $plugin_admin_core->notice, 'display_autoupdate_notice' );
276
 
277
  // Add a custom action to handle AJAX callback for creating a backup archive file.
278
  $this->loader->add_action(
304
  'wp_ajax_cancel'
305
  );
306
 
307
+ if ( $plugin_admin_core->test->run_functionality_tests() ) {
308
+ $this->loader->add_action( 'admin_notices', $plugin_admin_core->auto_rollback, 'notice_backup_show' );
309
+ }
310
 
311
  // Add an action to add a cron job to restore after WordPress Updates, unless canceled.
312
  $this->loader->add_action(
368
 
369
  $this->loader->add_action( 'admin_init', $plugin_admin_core->cron, 'upgrade_crontab_entries' );
370
 
371
+ $this->loader->add_action( 'wp_ajax_boldgrid_backup_generate_download_link', $plugin_admin_core->archive_actions, 'wp_ajax_generate_download_link' );
372
+
373
  /* FTP */
374
 
375
  // Allow one click upload.
389
  // Add ftp backups to the "Backups" tab.
390
  $this->loader->add_action( 'boldgrid_backup_get_all', $plugin_admin_core->ftp->hooks, 'filter_get_all' );
391
  $this->loader->add_action( 'wp_ajax_boldgrid_backup_remote_storage_download_ftp', $plugin_admin_core->ftp->hooks, 'wp_ajax_download' );
392
+ // Styles and Scripts for FTP settings page.
393
+ $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin_core->ftp->page, 'enqueue_scripts' );
394
 
395
  $this->loader->add_action( 'admin_notices', $plugin_admin_core->go_pro, 'admin_notice_setup' );
396
 
408
  $this->loader->add_action( 'wp_ajax_nopriv_boldgrid_backup_run_backup', $plugin_admin_core->cron, 'backup' );
409
  $this->loader->add_action( 'wp_ajax_nopriv_boldgrid_backup_run_restore', $plugin_admin_core->cron, 'restore' );
410
 
411
+ // For public downloads.
412
+ $this->loader->add_action( 'wp_ajax_boldgrid_backup_download', $plugin_admin_core->download, 'public_download' );
413
+ $this->loader->add_action( 'wp_ajax_nopriv_boldgrid_backup_download', $plugin_admin_core->download, 'public_download' );
414
+
415
+ // Admin notices from cron log.
416
  $this->loader->add_action( 'admin_notices', $plugin_admin_core->cron_log, 'admin_notice' );
417
+
418
+ // For Ajax URL import.
419
+ $this->loader->add_action( 'wp_ajax_boldgrid_backup_url_upload', $plugin_admin_core->upload, 'ajax_url_import' );
420
+
421
+ // Filter the boldgrid_backup_pending_rollback site option.
422
+ $this->loader->add_filter( 'site_option_boldgrid_backup_pending_rollback', $plugin_admin_core->auto_rollback, 'validate_rollback_option', 10, 2 );
423
+
424
+ // Enable updating feature in the BoldGrid Library.
425
+ add_filter( 'Boldgrid\Library\Update\isEnalbed', '__return_true' );
426
+
427
+ $this->loader->add_filter( 'wp_ajax_boldgrid_backup_update_archive_details', $plugin_admin_core->archive_details, 'wp_ajax_update' );
428
+
429
+ $this->loader->add_action( 'admin_menu', $plugin_admin_core->local, 'add_submenus' );
430
+ $this->loader->add_action( 'wp_ajax_boldgrid_backup_is_setup_local', $plugin_admin_core->local, 'is_setup_ajax' );
431
  }
432
 
433
  /**
includes/config/config.plugin.php CHANGED
@@ -22,13 +22,7 @@ if ( ! defined( 'WPINC' ) ) {
22
  }
23
 
24
  return array(
25
- 'ajax_calls' => array(
26
- 'get_plugin_version' => '/api/open/get-plugin-version',
27
- 'get_asset' => '/api/open/get-asset',
28
- ),
29
- 'asset_server' => 'https://wp-assets.boldgrid.com',
30
-
31
- 'urls' => array(
32
  'compatibility' => 'https://www.boldgrid.com/support/advanced-tutorials/backup-compatibility-guide',
33
  'possible_issues' => 'https://www.boldgrid.com/support/advanced-tutorials/backup-userguide#possible-issues',
34
  'reduce_size_warning' => 'https://www.boldgrid.com/support/advanced-tutorials/backup-userguide#reduce-size-warning',
@@ -38,12 +32,10 @@ return array(
38
  'restore' => 'https://www.boldgrid.com/support/advanced-tutorials/restoring-boldgrid-backup/',
39
  'setting_directory' => 'https://www.boldgrid.com/support/advanced-tutorials/backup-userguide#setting-backup-directory',
40
  ),
41
- 'lang' => array(
42
  // translators: 1: Number of seconds.
43
  'est_pause' => esc_html__( 'Estimated Pause: %s seconds', 'boldgrid-backup' ),
44
  ),
45
- 'plugin_name' => 'boldgrid-backup',
46
- 'plugin_key_code' => 'backup',
47
- 'main_file_path' => BOLDGRID_BACKUP_PATH . '/boldgrid-backup.php',
48
- 'plugin_transient_name' => 'boldgrid_backup_version_data',
49
  );
22
  }
23
 
24
  return array(
25
+ 'urls' => array(
 
 
 
 
 
 
26
  'compatibility' => 'https://www.boldgrid.com/support/advanced-tutorials/backup-compatibility-guide',
27
  'possible_issues' => 'https://www.boldgrid.com/support/advanced-tutorials/backup-userguide#possible-issues',
28
  'reduce_size_warning' => 'https://www.boldgrid.com/support/advanced-tutorials/backup-userguide#reduce-size-warning',
32
  'restore' => 'https://www.boldgrid.com/support/advanced-tutorials/restoring-boldgrid-backup/',
33
  'setting_directory' => 'https://www.boldgrid.com/support/advanced-tutorials/backup-userguide#setting-backup-directory',
34
  ),
35
+ 'lang' => array(
36
  // translators: 1: Number of seconds.
37
  'est_pause' => esc_html__( 'Estimated Pause: %s seconds', 'boldgrid-backup' ),
38
  ),
39
+ 'public_link_lifetime' => '1 HOUR',
40
+ 'url_regex' => '^https?:\/\/[a-z0-9\-\.]+(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$',
 
 
41
  );
includes/config/config.sample.php CHANGED
@@ -2,10 +2,10 @@
2
  /**
3
  * File: config.sample.php
4
  *
5
- * Plugin sample configuration file.
6
  *
7
  * @link https://www.boldgrid.com
8
- * @since 1.0
9
  *
10
  * @package Boldgrid_Backup
11
  * @subpackage Boldgrid_Backup/includes
@@ -26,5 +26,5 @@ if ( ! defined( 'WPINC' ) ) {
26
  * to override.
27
  */
28
  return array(
29
- 'asset_server' => 'https://wp-assets-dev.boldgrid.com',
30
  );
2
  /**
3
  * File: config.sample.php
4
  *
5
+ * Plugin sample local override configuration file.
6
  *
7
  * @link https://www.boldgrid.com
8
+ * @since 1.0.0
9
  *
10
  * @package Boldgrid_Backup
11
  * @subpackage Boldgrid_Backup/includes
26
  * to override.
27
  */
28
  return array(
29
+ 'public_link_lifetime' => '1 HOUR',
30
  );
readme.txt CHANGED
@@ -2,9 +2,9 @@
2
  Contributors: boldgrid, joemoto, imh_brad, rramo012, timph, bgnicolepaschen
3
  Tags: boldgrid, backup, restore, migrate, migration
4
  Requires at least: 4.4
5
- Tested up to: 4.9.8
6
- Requires PHP: 5.3
7
- Stable tag: 1.6.6
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -18,9 +18,10 @@ WordPress backup and restoration with update protection.
18
 
19
  = Minimum Requirements =
20
 
21
- * PHP 5.3 or higher
22
  * At least one of the following PHP execution functions enabled: "popen", "proc_open", "exec", "shell_exec", "passthru", or "system".
23
  * A Cron system with the "crontab" utility, or WP Cron.
 
24
 
25
  = Manually =
26
  1. Upload the entire boldgrid-backup folder to the /wp-content/plugins/ directory.
@@ -28,11 +29,25 @@ WordPress backup and restoration with update protection.
28
 
29
  == Changelog ==
30
 
31
- = 1.6.6 =
32
-
33
- Release Date: October 11th, 2018
34
-
35
- * Bug fix: Fixed include path for ftp settings page.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
  = 1.6.5 =
38
 
2
  Contributors: boldgrid, joemoto, imh_brad, rramo012, timph, bgnicolepaschen
3
  Tags: boldgrid, backup, restore, migrate, migration
4
  Requires at least: 4.4
5
+ Tested up to: 5.0.0
6
+ Requires PHP: 5.4
7
+ Stable tag: 1.7.0
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
18
 
19
  = Minimum Requirements =
20
 
21
+ * PHP 5.4 or higher
22
  * At least one of the following PHP execution functions enabled: "popen", "proc_open", "exec", "shell_exec", "passthru", or "system".
23
  * A Cron system with the "crontab" utility, or WP Cron.
24
+ * A WP_Filesystem FS_METHOD being "direct".
25
 
26
  = Manually =
27
  1. Upload the entire boldgrid-backup folder to the /wp-content/plugins/ directory.
29
 
30
  == Changelog ==
31
 
32
+ = 1.7.0 =
33
+
34
+ Release date: Dec 4th, 2018
35
+
36
+ * New feature: Added auto-update settings for individual plugins and themes.
37
+ * New feature: Added limited-lifetime download links for archive files.
38
+ * New feature: Added import backup archive from URL address.
39
+ * New feature: Added progress bar to show status of backups.
40
+ * New feature: Adding the ability to set and title and description to a backup.
41
+ * New feature: Adding the ability to flag a backup as being proteced (excluded from retention).
42
+ * Update: Update protection is now valid for 1 hour after a full backup from the WordPress Updates or Plugins page.
43
+ * Update: Made the Backup Archives page the default page in the admin menu.
44
+ * Bug fix: Set a default backup directory if path in settings is not valid. Remove filters before fixing home and siteurl on restore.
45
+ * Bug fix: Some HTML was caught in translations.
46
+ * Bug fix: Duplicate emails were sent when a backup was complete, fixed.
47
+ * Bug fix: Preserve timestamp on ftp / sftp uploads.
48
+ * Bug fix: Fixed CLI support detection on some EA4 servers.
49
+ * Update: Save settings and reload to the current section.
50
+ * Update: Reorganized settings sections.
51
 
52
  = 1.6.5 =
53
 
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit776c9eeda65acd21bdfcc1a2e8fa114e::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit26ac8f21c7de312bcc7b8f89cd106a20::getLoader();
vendor/boldgrid/library/.gitignore CHANGED
@@ -1,3 +1,4 @@
 
1
  composer.phar
2
  /vendor/
3
  node_modules/
1
+ build/
2
  composer.phar
3
  /vendor/
4
  node_modules/
vendor/boldgrid/library/.travis.yml CHANGED
@@ -1,54 +1,22 @@
1
- language: php
2
-
3
- notifications:
4
- email:
5
- on_success: never
6
- on_failure: change
7
-
8
- php:
9
- - 5.6
10
-
11
- env:
12
- - WP_VERSION=latest WP_MULTISITE=0
13
-
14
- matrix:
15
- include:
16
- - php: 5.6
17
- env: WP_VERSION=latest WP_MULTISITE=0
18
- - php: 5.6
19
- env: WP_VERSION=latest WP_MULTISITE=1
20
- - php: 5.6
21
- env: WP_VERSION=4.7.5 WP_MULTISITE=0
22
- - php: 5.6
23
- env: WP_VERSION=4.7.5 WP_MULTISITE=1
24
- - php: 5.6
25
- # #
26
- # Need to fix this error before running on 4.6.1 and below:
27
- # Fatal error: __clone method called on non-object in
28
- # /tmp/wordpress-tests-lib/includes/testcase.php on line 287
29
- # #
30
- # env: WP_VERSION=4.6.1 WP_MULTISITE=0
31
- # - php: 5.6
32
- # env: WP_VERSION=4.6.2 WP_MULTISITE=1
33
- # - php: 5.6
34
- # env: WP_VERSION=4.5.3 WP_MULTISITE=0
35
- # - php: 5.6
36
- # env: WP_VERSION=4.5.3 WP_MULTISITE=1
37
- # - php: 5.6
38
- # env: WP_VERSION=4.4.2 WP_MULTISITE=0
39
- # - php: 5.6
40
- # env: WP_VERSION=4.4.2 WP_MULTISITE=1
41
- # #
42
- # It doesn't look like WP 4.3 will work.
43
- # Fatal error: Class 'WP_REST_Server' not found.
44
- # WP_REST_Server is #since 4.4.0
45
- # #
46
- # - php: 5.6
47
- # env: WP_VERSION=4.3.1 WP_MULTISITE=0
48
- # - php: 5.6
49
- # env: WP_VERSION=4.3.1 WP_MULTISITE=1
50
-
51
- before_script:
52
- - bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION
53
-
54
- script: phpunit --debug
1
+ language: php
2
+
3
+ notifications:
4
+ email:
5
+ on_success: never
6
+ on_failure: change
7
+
8
+ php:
9
+ - 5.6
10
+
11
+ env:
12
+ - WP_VERSION=latest WP_MULTISITE=0
13
+
14
+ before_script:
15
+ - npm install -g gulp-cli
16
+ - yarn install
17
+ - gulp
18
+ - bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION
19
+
20
+ script:
21
+ - phpunit --debug
22
+ - yarn run js-lint
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/boldgrid/library/README.md CHANGED
@@ -11,6 +11,47 @@ composer require boldgrid/library
11
 
12
  ## Changelog ##
13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  ### 2.4.2 ###
15
  * Bug fix: Show timeout message when saving key times out.
16
  * Bug fix: Misc bug fuxes.
@@ -92,3 +133,21 @@ composer require boldgrid/library
92
  ### 1.1.0 ###
93
  * Added action for when theme release channel changed.
94
  * Added Reseller class.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
  ## Changelog ##
13
 
14
+ ### 2.7.4 ###
15
+
16
+ * Bug fix: JIRA BGCONN-35 Prevent Connect Key notice on block editor pages.
17
+
18
+ ### 2.7.3 ###
19
+
20
+ Release date: Nov 27th, 2018
21
+
22
+ * Feature: Adding Crio's enzo to the admin icons font.
23
+
24
+ ### 2.7.2 ###
25
+
26
+ Release date: Nov 26th, 2018
27
+
28
+ * Update: Updated production build process to use composer post-autoload-dump hook.
29
+
30
+ ### 2.7.1 ###
31
+
32
+ Release date: Nov 20th, 2018
33
+
34
+ * Bug fix: JIRA BGCONN-29 Fixed API key entry form; removing inputs and displaying success message.
35
+ * Update: JIRA BGCONN-32 Removed auto-update section from settings. It is still used by the Backup plugin.
36
+ * Update: JIRA BGBKUP-285 Save settings and reload to the current section.
37
+
38
+ ### 2.7.0 ###
39
+
40
+ Release date: Oct 30th, 2018
41
+
42
+ * Feature: JIRA BGCONN-16 Added BoldGrid Connect settings for individual plugin and theme auto-updates.
43
+ * Feature: JS framework for Postbox settings.
44
+ * Bug fix: JIRA BGCONN-19 Fixed display when the library is used in a theme.
45
+ * Bug fix: JIRA BGBKUP-270 Dismissible notices are not staying dismissed.
46
+
47
+ ### 2.6.1 ###
48
+ * Update: Theme check fixes.
49
+
50
+ ### 2.6.0 ###
51
+ * Feature: JIRA BGTHEME-576 Add filter to check for is premium.
52
+ * Feature: JIRA BGCONN-23 Added mini Connect Key entry form.
53
+ * Update: Update success message after successful key entry.
54
+
55
  ### 2.4.2 ###
56
  * Bug fix: Show timeout message when saving key times out.
57
  * Bug fix: Misc bug fuxes.
133
  ### 1.1.0 ###
134
  * Added action for when theme release channel changed.
135
  * Added Reseller class.
136
+
137
+ ## Development ##
138
+
139
+ ### Installing Dependencies
140
+ Before you can use the development version of this plugin you must install the dependencies.
141
+
142
+ ```
143
+ composer install -o --prefer-source
144
+ yarn install
145
+ gulp
146
+ ```
147
+
148
+ ### Auto Updates
149
+ To test / trigger auto updates, you can run the following:
150
+
151
+ ```
152
+ wp option delete auto_updater.lock & wp transient delete --all && wp cron event run wp_version_check
153
+ ```
vendor/boldgrid/library/composer.json CHANGED
@@ -29,5 +29,10 @@
29
  "psr-4": {
30
  "Boldgrid\\Library\\Util\\": "src/Util"
31
  }
 
 
 
 
 
32
  }
33
  }
29
  "psr-4": {
30
  "Boldgrid\\Library\\Util\\": "src/Util"
31
  }
32
+ },
33
+ "scripts": {
34
+ "post-autoload-dump": [
35
+ "yarn install; gulp; rm -rf node_modules"
36
+ ]
37
  }
38
  }
vendor/boldgrid/library/gulpfile.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ var gulp = require( 'gulp' );
2
+
3
+ gulp.task( 'build', function() {
4
+ gulp.src( [ 'node_modules/jquery-toggles/toggles.min.js' ] ).pipe( gulp.dest( './build' ) );
5
+ gulp.src( [ 'node_modules/jquery-toggles/css/toggles-full.css' ] ).pipe( gulp.dest( './build' ) );
6
+ } );
7
+
8
+ gulp.task( 'default', [ 'build' ] );
vendor/boldgrid/library/package-lock.json DELETED
@@ -1,1907 +0,0 @@
1
- {
2
- "requires": true,
3
- "lockfileVersion": 1,
4
- "dependencies": {
5
- "abbrev": {
6
- "version": "1.1.1",
7
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
8
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
9
- "dev": true
10
- },
11
- "acorn": {
12
- "version": "5.5.3",
13
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
14
- "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
15
- "dev": true
16
- },
17
- "acorn-jsx": {
18
- "version": "3.0.1",
19
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
20
- "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
21
- "dev": true,
22
- "requires": {
23
- "acorn": "3.3.0"
24
- },
25
- "dependencies": {
26
- "acorn": {
27
- "version": "3.3.0",
28
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
29
- "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
30
- "dev": true
31
- }
32
- }
33
- },
34
- "ajv": {
35
- "version": "5.5.2",
36
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
37
- "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
38
- "dev": true,
39
- "requires": {
40
- "co": "4.6.0",
41
- "fast-deep-equal": "1.1.0",
42
- "fast-json-stable-stringify": "2.0.0",
43
- "json-schema-traverse": "0.3.1"
44
- }
45
- },
46
- "ajv-keywords": {
47
- "version": "2.1.1",
48
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
49
- "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
50
- "dev": true
51
- },
52
- "ansi-escapes": {
53
- "version": "3.1.0",
54
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
55
- "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
56
- "dev": true
57
- },
58
- "ansi-regex": {
59
- "version": "2.1.1",
60
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
61
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
62
- "dev": true
63
- },
64
- "ansi-styles": {
65
- "version": "2.2.1",
66
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
67
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
68
- "dev": true
69
- },
70
- "argparse": {
71
- "version": "1.0.10",
72
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
73
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
74
- "dev": true,
75
- "requires": {
76
- "sprintf-js": "1.0.3"
77
- }
78
- },
79
- "array-union": {
80
- "version": "1.0.2",
81
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
82
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
83
- "dev": true,
84
- "requires": {
85
- "array-uniq": "1.0.3"
86
- }
87
- },
88
- "array-uniq": {
89
- "version": "1.0.3",
90
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
91
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
92
- "dev": true
93
- },
94
- "arrify": {
95
- "version": "1.0.1",
96
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
97
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
98
- "dev": true
99
- },
100
- "babel-code-frame": {
101
- "version": "6.26.0",
102
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
103
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
104
- "dev": true,
105
- "requires": {
106
- "chalk": "1.1.3",
107
- "esutils": "2.0.2",
108
- "js-tokens": "3.0.2"
109
- },
110
- "dependencies": {
111
- "chalk": {
112
- "version": "1.1.3",
113
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
114
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
115
- "dev": true,
116
- "requires": {
117
- "ansi-styles": "2.2.1",
118
- "escape-string-regexp": "1.0.5",
119
- "has-ansi": "2.0.0",
120
- "strip-ansi": "3.0.1",
121
- "supports-color": "2.0.0"
122
- }
123
- },
124
- "strip-ansi": {
125
- "version": "3.0.1",
126
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
127
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
128
- "dev": true,
129
- "requires": {
130
- "ansi-regex": "2.1.1"
131
- }
132
- }
133
- }
134
- },
135
- "babel-runtime": {
136
- "version": "6.26.0",
137
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
138
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
139
- "dev": true,
140
- "requires": {
141
- "core-js": "2.5.4",
142
- "regenerator-runtime": "0.11.1"
143
- }
144
- },
145
- "balanced-match": {
146
- "version": "1.0.0",
147
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
148
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
149
- "dev": true
150
- },
151
- "boolify": {
152
- "version": "1.0.1",
153
- "resolved": "https://registry.npmjs.org/boolify/-/boolify-1.0.1.tgz",
154
- "integrity": "sha1-tcCeF8rNET0Rt7s+04TMASmU2Gs=",
155
- "dev": true
156
- },
157
- "brace-expansion": {
158
- "version": "1.1.11",
159
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
160
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
161
- "dev": true,
162
- "requires": {
163
- "balanced-match": "1.0.0",
164
- "concat-map": "0.0.1"
165
- }
166
- },
167
- "buffer-from": {
168
- "version": "1.0.0",
169
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
170
- "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==",
171
- "dev": true
172
- },
173
- "caller-path": {
174
- "version": "0.1.0",
175
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
176
- "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
177
- "dev": true,
178
- "requires": {
179
- "callsites": "0.2.0"
180
- }
181
- },
182
- "callsites": {
183
- "version": "0.2.0",
184
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
185
- "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
186
- "dev": true
187
- },
188
- "camelcase": {
189
- "version": "4.1.0",
190
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
191
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
192
- "dev": true
193
- },
194
- "camelcase-keys": {
195
- "version": "4.2.0",
196
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
197
- "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
198
- "dev": true,
199
- "requires": {
200
- "camelcase": "4.1.0",
201
- "map-obj": "2.0.0",
202
- "quick-lru": "1.1.0"
203
- }
204
- },
205
- "chalk": {
206
- "version": "2.3.2",
207
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz",
208
- "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==",
209
- "dev": true,
210
- "requires": {
211
- "ansi-styles": "3.2.1",
212
- "escape-string-regexp": "1.0.5",
213
- "supports-color": "5.3.0"
214
- },
215
- "dependencies": {
216
- "ansi-styles": {
217
- "version": "3.2.1",
218
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
219
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
220
- "dev": true,
221
- "requires": {
222
- "color-convert": "1.9.1"
223
- }
224
- },
225
- "supports-color": {
226
- "version": "5.3.0",
227
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz",
228
- "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==",
229
- "dev": true,
230
- "requires": {
231
- "has-flag": "3.0.0"
232
- }
233
- }
234
- }
235
- },
236
- "chardet": {
237
- "version": "0.4.2",
238
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
239
- "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
240
- "dev": true
241
- },
242
- "circular-json": {
243
- "version": "0.3.3",
244
- "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
245
- "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
246
- "dev": true
247
- },
248
- "cli-cursor": {
249
- "version": "2.1.0",
250
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
251
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
252
- "dev": true,
253
- "requires": {
254
- "restore-cursor": "2.0.0"
255
- }
256
- },
257
- "cli-width": {
258
- "version": "2.2.0",
259
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
260
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
261
- "dev": true
262
- },
263
- "cliui": {
264
- "version": "3.2.0",
265
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
266
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
267
- "dev": true,
268
- "requires": {
269
- "string-width": "1.0.2",
270
- "strip-ansi": "3.0.1",
271
- "wrap-ansi": "2.1.0"
272
- },
273
- "dependencies": {
274
- "is-fullwidth-code-point": {
275
- "version": "1.0.0",
276
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
277
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
278
- "dev": true,
279
- "requires": {
280
- "number-is-nan": "1.0.1"
281
- }
282
- },
283
- "string-width": {
284
- "version": "1.0.2",
285
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
286
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
287
- "dev": true,
288
- "requires": {
289
- "code-point-at": "1.1.0",
290
- "is-fullwidth-code-point": "1.0.0",
291
- "strip-ansi": "3.0.1"
292
- }
293
- },
294
- "strip-ansi": {
295
- "version": "3.0.1",
296
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
297
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
298
- "dev": true,
299
- "requires": {
300
- "ansi-regex": "2.1.1"
301
- }
302
- }
303
- }
304
- },
305
- "co": {
306
- "version": "4.6.0",
307
- "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
308
- "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
309
- "dev": true
310
- },
311
- "code-point-at": {
312
- "version": "1.1.0",
313
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
314
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
315
- "dev": true
316
- },
317
- "color-convert": {
318
- "version": "1.9.1",
319
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
320
- "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
321
- "dev": true,
322
- "requires": {
323
- "color-name": "1.1.3"
324
- }
325
- },
326
- "color-name": {
327
- "version": "1.1.3",
328
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
329
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
330
- "dev": true
331
- },
332
- "common-tags": {
333
- "version": "1.7.2",
334
- "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.7.2.tgz",
335
- "integrity": "sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ==",
336
- "dev": true,
337
- "requires": {
338
- "babel-runtime": "6.26.0"
339
- }
340
- },
341
- "concat-map": {
342
- "version": "0.0.1",
343
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
344
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
345
- "dev": true
346
- },
347
- "concat-stream": {
348
- "version": "1.6.2",
349
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
350
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
351
- "dev": true,
352
- "requires": {
353
- "buffer-from": "1.0.0",
354
- "inherits": "2.0.3",
355
- "readable-stream": "2.3.5",
356
- "typedarray": "0.0.6"
357
- }
358
- },
359
- "core-js": {
360
- "version": "2.5.4",
361
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.4.tgz",
362
- "integrity": "sha1-8si/GB8qgLkvNgEhQpzmOi8K6uA=",
363
- "dev": true
364
- },
365
- "core-util-is": {
366
- "version": "1.0.2",
367
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
368
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
369
- "dev": true
370
- },
371
- "cross-spawn": {
372
- "version": "5.1.0",
373
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
374
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
375
- "dev": true,
376
- "requires": {
377
- "lru-cache": "4.1.2",
378
- "shebang-command": "1.2.0",
379
- "which": "1.3.0"
380
- }
381
- },
382
- "debug": {
383
- "version": "3.1.0",
384
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
385
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
386
- "dev": true,
387
- "requires": {
388
- "ms": "2.0.0"
389
- }
390
- },
391
- "decamelize": {
392
- "version": "1.2.0",
393
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
394
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
395
- "dev": true
396
- },
397
- "deep-is": {
398
- "version": "0.1.3",
399
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
400
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
401
- "dev": true
402
- },
403
- "del": {
404
- "version": "2.2.2",
405
- "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
406
- "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
407
- "dev": true,
408
- "requires": {
409
- "globby": "5.0.0",
410
- "is-path-cwd": "1.0.0",
411
- "is-path-in-cwd": "1.0.1",
412
- "object-assign": "4.1.1",
413
- "pify": "2.3.0",
414
- "pinkie-promise": "2.0.1",
415
- "rimraf": "2.6.2"
416
- }
417
- },
418
- "dlv": {
419
- "version": "1.1.1",
420
- "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.1.tgz",
421
- "integrity": "sha512-b/kUB0D6RgRGG69h5ExsLnUAwfs5Jndfk1pU2ao7/9mVdsxpUBlkFdTkNJThXw1jrLXpUbIIg+h3um5zXi6sFA==",
422
- "dev": true
423
- },
424
- "doctrine": {
425
- "version": "2.1.0",
426
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
427
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
428
- "dev": true,
429
- "requires": {
430
- "esutils": "2.0.2"
431
- }
432
- },
433
- "dom-serializer": {
434
- "version": "0.1.0",
435
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
436
- "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
437
- "dev": true,
438
- "requires": {
439
- "domelementtype": "1.1.3",
440
- "entities": "1.1.1"
441
- },
442
- "dependencies": {
443
- "domelementtype": {
444
- "version": "1.1.3",
445
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
446
- "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
447
- "dev": true
448
- }
449
- }
450
- },
451
- "domelementtype": {
452
- "version": "1.3.0",
453
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
454
- "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
455
- "dev": true
456
- },
457
- "domhandler": {
458
- "version": "2.4.1",
459
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz",
460
- "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=",
461
- "dev": true,
462
- "requires": {
463
- "domelementtype": "1.3.0"
464
- }
465
- },
466
- "domutils": {
467
- "version": "1.7.0",
468
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
469
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
470
- "dev": true,
471
- "requires": {
472
- "dom-serializer": "0.1.0",
473
- "domelementtype": "1.3.0"
474
- }
475
- },
476
- "entities": {
477
- "version": "1.1.1",
478
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
479
- "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
480
- "dev": true
481
- },
482
- "escape-string-regexp": {
483
- "version": "1.0.5",
484
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
485
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
486
- "dev": true
487
- },
488
- "eslint": {
489
- "version": "4.19.1",
490
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
491
- "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
492
- "dev": true,
493
- "requires": {
494
- "ajv": "5.5.2",
495
- "babel-code-frame": "6.26.0",
496
- "chalk": "2.3.2",
497
- "concat-stream": "1.6.2",
498
- "cross-spawn": "5.1.0",
499
- "debug": "3.1.0",
500
- "doctrine": "2.1.0",
501
- "eslint-scope": "3.7.1",
502
- "eslint-visitor-keys": "1.0.0",
503
- "espree": "3.5.4",
504
- "esquery": "1.0.0",
505
- "esutils": "2.0.2",
506
- "file-entry-cache": "2.0.0",
507
- "functional-red-black-tree": "1.0.1",
508
- "glob": "7.1.2",
509
- "globals": "11.4.0",
510
- "ignore": "3.3.7",
511
- "imurmurhash": "0.1.4",
512
- "inquirer": "3.3.0",
513
- "is-resolvable": "1.1.0",
514
- "js-yaml": "3.11.0",
515
- "json-stable-stringify-without-jsonify": "1.0.1",
516
- "levn": "0.3.0",
517
- "lodash": "4.17.5",
518
- "minimatch": "3.0.4",
519
- "mkdirp": "0.5.1",
520
- "natural-compare": "1.4.0",
521
- "optionator": "0.8.2",
522
- "path-is-inside": "1.0.2",
523
- "pluralize": "7.0.0",
524
- "progress": "2.0.0",
525
- "regexpp": "1.1.0",
526
- "require-uncached": "1.0.3",
527
- "semver": "5.5.0",
528
- "strip-ansi": "4.0.0",
529
- "strip-json-comments": "2.0.1",
530
- "table": "4.0.2",
531
- "text-table": "0.2.0"
532
- }
533
- },
534
- "eslint-config-wordpress": {
535
- "version": "2.0.0",
536
- "resolved": "https://registry.npmjs.org/eslint-config-wordpress/-/eslint-config-wordpress-2.0.0.tgz",
537
- "integrity": "sha1-UgEgbGlk1kgxUjLt9t+9LpJeTNY=",
538
- "dev": true
539
- },
540
- "eslint-plugin-html": {
541
- "version": "4.0.2",
542
- "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-4.0.2.tgz",
543
- "integrity": "sha512-CrQd0F8GWdNWnu4PFrYZl+LjUCXNVy2h0uhDMtnf/7VKc9HRcnkXSrlg0BSGfptZPSzmwnnwCaREAa9+fnQhYw==",
544
- "dev": true,
545
- "requires": {
546
- "htmlparser2": "3.9.2"
547
- }
548
- },
549
- "eslint-scope": {
550
- "version": "3.7.1",
551
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
552
- "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
553
- "dev": true,
554
- "requires": {
555
- "esrecurse": "4.2.1",
556
- "estraverse": "4.2.0"
557
- }
558
- },
559
- "eslint-visitor-keys": {
560
- "version": "1.0.0",
561
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
562
- "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
563
- "dev": true
564
- },
565
- "espree": {
566
- "version": "3.5.4",
567
- "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
568
- "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
569
- "dev": true,
570
- "requires": {
571
- "acorn": "5.5.3",
572
- "acorn-jsx": "3.0.1"
573
- }
574
- },
575
- "esprima": {
576
- "version": "4.0.0",
577
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
578
- "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
579
- "dev": true
580
- },
581
- "esquery": {
582
- "version": "1.0.0",
583
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
584
- "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
585
- "dev": true,
586
- "requires": {
587
- "estraverse": "4.2.0"
588
- }
589
- },
590
- "esrecurse": {
591
- "version": "4.2.1",
592
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
593
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
594
- "dev": true,
595
- "requires": {
596
- "estraverse": "4.2.0"
597
- }
598
- },
599
- "estraverse": {
600
- "version": "4.2.0",
601
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
602
- "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
603
- "dev": true
604
- },
605
- "esutils": {
606
- "version": "2.0.2",
607
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
608
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
609
- "dev": true
610
- },
611
- "execa": {
612
- "version": "0.7.0",
613
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
614
- "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
615
- "dev": true,
616
- "requires": {
617
- "cross-spawn": "5.1.0",
618
- "get-stream": "3.0.0",
619
- "is-stream": "1.1.0",
620
- "npm-run-path": "2.0.2",
621
- "p-finally": "1.0.0",
622
- "signal-exit": "3.0.2",
623
- "strip-eof": "1.0.0"
624
- }
625
- },
626
- "external-editor": {
627
- "version": "2.1.0",
628
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
629
- "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
630
- "dev": true,
631
- "requires": {
632
- "chardet": "0.4.2",
633
- "iconv-lite": "0.4.19",
634
- "tmp": "0.0.33"
635
- }
636
- },
637
- "fast-deep-equal": {
638
- "version": "1.1.0",
639
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
640
- "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
641
- "dev": true
642
- },
643
- "fast-json-stable-stringify": {
644
- "version": "2.0.0",
645
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
646
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
647
- "dev": true
648
- },
649
- "fast-levenshtein": {
650
- "version": "2.0.6",
651
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
652
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
653
- "dev": true
654
- },
655
- "figures": {
656
- "version": "2.0.0",
657
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
658
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
659
- "dev": true,
660
- "requires": {
661
- "escape-string-regexp": "1.0.5"
662
- }
663
- },
664
- "file-entry-cache": {
665
- "version": "2.0.0",
666
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
667
- "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
668
- "dev": true,
669
- "requires": {
670
- "flat-cache": "1.3.0",
671
- "object-assign": "4.1.1"
672
- }
673
- },
674
- "find-up": {
675
- "version": "2.1.0",
676
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
677
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
678
- "dev": true,
679
- "requires": {
680
- "locate-path": "2.0.0"
681
- }
682
- },
683
- "flat-cache": {
684
- "version": "1.3.0",
685
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
686
- "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
687
- "dev": true,
688
- "requires": {
689
- "circular-json": "0.3.3",
690
- "del": "2.2.2",
691
- "graceful-fs": "4.1.11",
692
- "write": "0.2.1"
693
- }
694
- },
695
- "fs.realpath": {
696
- "version": "1.0.0",
697
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
698
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
699
- "dev": true
700
- },
701
- "functional-red-black-tree": {
702
- "version": "1.0.1",
703
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
704
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
705
- "dev": true
706
- },
707
- "get-caller-file": {
708
- "version": "1.0.2",
709
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
710
- "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
711
- "dev": true
712
- },
713
- "get-stdin": {
714
- "version": "5.0.1",
715
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz",
716
- "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=",
717
- "dev": true
718
- },
719
- "get-stream": {
720
- "version": "3.0.0",
721
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
722
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
723
- "dev": true
724
- },
725
- "glob": {
726
- "version": "7.1.2",
727
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
728
- "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
729
- "dev": true,
730
- "requires": {
731
- "fs.realpath": "1.0.0",
732
- "inflight": "1.0.6",
733
- "inherits": "2.0.3",
734
- "minimatch": "3.0.4",
735
- "once": "1.4.0",
736
- "path-is-absolute": "1.0.1"
737
- }
738
- },
739
- "globals": {
740
- "version": "11.4.0",
741
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz",
742
- "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==",
743
- "dev": true
744
- },
745
- "globby": {
746
- "version": "5.0.0",
747
- "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
748
- "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
749
- "dev": true,
750
- "requires": {
751
- "array-union": "1.0.2",
752
- "arrify": "1.0.1",
753
- "glob": "7.1.2",
754
- "object-assign": "4.1.1",
755
- "pify": "2.3.0",
756
- "pinkie-promise": "2.0.1"
757
- }
758
- },
759
- "graceful-fs": {
760
- "version": "4.1.11",
761
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
762
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
763
- "dev": true
764
- },
765
- "has-ansi": {
766
- "version": "2.0.0",
767
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
768
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
769
- "dev": true,
770
- "requires": {
771
- "ansi-regex": "2.1.1"
772
- }
773
- },
774
- "has-flag": {
775
- "version": "3.0.0",
776
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
777
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
778
- "dev": true
779
- },
780
- "htmlparser2": {
781
- "version": "3.9.2",
782
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
783
- "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
784
- "dev": true,
785
- "requires": {
786
- "domelementtype": "1.3.0",
787
- "domhandler": "2.4.1",
788
- "domutils": "1.7.0",
789
- "entities": "1.1.1",
790
- "inherits": "2.0.3",
791
- "readable-stream": "2.3.5"
792
- }
793
- },
794
- "iconv-lite": {
795
- "version": "0.4.19",
796
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
797
- "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
798
- "dev": true
799
- },
800
- "ignore": {
801
- "version": "3.3.7",
802
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
803
- "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
804
- "dev": true
805
- },
806
- "imurmurhash": {
807
- "version": "0.1.4",
808
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
809
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
810
- "dev": true
811
- },
812
- "indent-string": {
813
- "version": "3.2.0",
814
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
815
- "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
816
- "dev": true
817
- },
818
- "inflight": {
819
- "version": "1.0.6",
820
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
821
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
822
- "dev": true,
823
- "requires": {
824
- "once": "1.4.0",
825
- "wrappy": "1.0.2"
826
- }
827
- },
828
- "inherits": {
829
- "version": "2.0.3",
830
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
831
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
832
- "dev": true
833
- },
834
- "inquirer": {
835
- "version": "3.3.0",
836
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
837
- "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
838
- "dev": true,
839
- "requires": {
840
- "ansi-escapes": "3.1.0",
841
- "chalk": "2.3.2",
842
- "cli-cursor": "2.1.0",
843
- "cli-width": "2.2.0",
844
- "external-editor": "2.1.0",
845
- "figures": "2.0.0",
846
- "lodash": "4.17.5",
847
- "mute-stream": "0.0.7",
848
- "run-async": "2.3.0",
849
- "rx-lite": "4.0.8",
850
- "rx-lite-aggregates": "4.0.8",
851
- "string-width": "2.1.1",
852
- "strip-ansi": "4.0.0",
853
- "through": "2.3.8"
854
- }
855
- },
856
- "invert-kv": {
857
- "version": "1.0.0",
858
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
859
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
860
- "dev": true
861
- },
862
- "is-fullwidth-code-point": {
863
- "version": "2.0.0",
864
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
865
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
866
- "dev": true
867
- },
868
- "is-path-cwd": {
869
- "version": "1.0.0",
870
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
871
- "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
872
- "dev": true
873
- },
874
- "is-path-in-cwd": {
875
- "version": "1.0.1",
876
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
877
- "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
878
- "dev": true,
879
- "requires": {
880
- "is-path-inside": "1.0.1"
881
- }
882
- },
883
- "is-path-inside": {
884
- "version": "1.0.1",
885
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
886
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
887
- "dev": true,
888
- "requires": {
889
- "path-is-inside": "1.0.2"
890
- }
891
- },
892
- "is-promise": {
893
- "version": "2.1.0",
894
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
895
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
896
- "dev": true
897
- },
898
- "is-resolvable": {
899
- "version": "1.1.0",
900
- "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
901
- "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
902
- "dev": true
903
- },
904
- "is-stream": {
905
- "version": "1.1.0",
906
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
907
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
908
- "dev": true
909
- },
910
- "isarray": {
911
- "version": "1.0.0",
912
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
913
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
914
- "dev": true
915
- },
916
- "isexe": {
917
- "version": "2.0.0",
918
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
919
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
920
- "dev": true
921
- },
922
- "js-tokens": {
923
- "version": "3.0.2",
924
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
925
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
926
- "dev": true
927
- },
928
- "js-yaml": {
929
- "version": "3.11.0",
930
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
931
- "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
932
- "dev": true,
933
- "requires": {
934
- "argparse": "1.0.10",
935
- "esprima": "4.0.0"
936
- }
937
- },
938
- "json-schema-traverse": {
939
- "version": "0.3.1",
940
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
941
- "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
942
- "dev": true
943
- },
944
- "json-stable-stringify-without-jsonify": {
945
- "version": "1.0.1",
946
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
947
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
948
- "dev": true
949
- },
950
- "lcid": {
951
- "version": "1.0.0",
952
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
953
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
954
- "dev": true,
955
- "requires": {
956
- "invert-kv": "1.0.0"
957
- }
958
- },
959
- "levn": {
960
- "version": "0.3.0",
961
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
962
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
963
- "dev": true,
964
- "requires": {
965
- "prelude-ls": "1.1.2",
966
- "type-check": "0.3.2"
967
- }
968
- },
969
- "locate-path": {
970
- "version": "2.0.0",
971
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
972
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
973
- "dev": true,
974
- "requires": {
975
- "p-locate": "2.0.0",
976
- "path-exists": "3.0.0"
977
- }
978
- },
979
- "lodash": {
980
- "version": "4.17.5",
981
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
982
- "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
983
- "dev": true
984
- },
985
- "lodash.memoize": {
986
- "version": "4.1.2",
987
- "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
988
- "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
989
- "dev": true
990
- },
991
- "lodash.merge": {
992
- "version": "4.6.1",
993
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz",
994
- "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==",
995
- "dev": true
996
- },
997
- "lodash.unescape": {
998
- "version": "4.0.1",
999
- "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz",
1000
- "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=",
1001
- "dev": true
1002
- },
1003
- "loglevel": {
1004
- "version": "1.6.1",
1005
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
1006
- "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
1007
- "dev": true
1008
- },
1009
- "loglevel-colored-level-prefix": {
1010
- "version": "1.0.0",
1011
- "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz",
1012
- "integrity": "sha1-akAhj9x64V/HbD0PPmdsRlOIYD4=",
1013
- "dev": true,
1014
- "requires": {
1015
- "chalk": "1.1.3",
1016
- "loglevel": "1.6.1"
1017
- },
1018
- "dependencies": {
1019
- "chalk": {
1020
- "version": "1.1.3",
1021
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
1022
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
1023
- "dev": true,
1024
- "requires": {
1025
- "ansi-styles": "2.2.1",
1026
- "escape-string-regexp": "1.0.5",
1027
- "has-ansi": "2.0.0",
1028
- "strip-ansi": "3.0.1",
1029
- "supports-color": "2.0.0"
1030
- }
1031
- },
1032
- "strip-ansi": {
1033
- "version": "3.0.1",
1034
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1035
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1036
- "dev": true,
1037
- "requires": {
1038
- "ansi-regex": "2.1.1"
1039
- }
1040
- }
1041
- }
1042
- },
1043
- "lru-cache": {
1044
- "version": "4.1.2",
1045
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
1046
- "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
1047
- "dev": true,
1048
- "requires": {
1049
- "pseudomap": "1.0.2",
1050
- "yallist": "2.1.2"
1051
- }
1052
- },
1053
- "make-plural": {
1054
- "version": "4.1.1",
1055
- "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.1.1.tgz",
1056
- "integrity": "sha512-triaMVDDYiB+OU1Mz6ht74+z0Bb/bzNESeMwRboSprI3GRWbOvfxEnpWI0eDixQtMPrC2C0revd4wmuck5GcoQ==",
1057
- "dev": true,
1058
- "requires": {
1059
- "minimist": "1.2.0"
1060
- },
1061
- "dependencies": {
1062
- "minimist": {
1063
- "version": "1.2.0",
1064
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
1065
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
1066
- "dev": true,
1067
- "optional": true
1068
- }
1069
- }
1070
- },
1071
- "map-obj": {
1072
- "version": "2.0.0",
1073
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
1074
- "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
1075
- "dev": true
1076
- },
1077
- "mem": {
1078
- "version": "1.1.0",
1079
- "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
1080
- "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
1081
- "dev": true,
1082
- "requires": {
1083
- "mimic-fn": "1.2.0"
1084
- }
1085
- },
1086
- "messageformat": {
1087
- "version": "1.1.1",
1088
- "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-1.1.1.tgz",
1089
- "integrity": "sha512-Q0uXcDtF5pEZsVSyhzDOGgZZK6ykN79VY9CwU3Nv0gsqx62BjdJW0MT+63UkHQ4exe3HE33ZlxR2/YwoJarRTg==",
1090
- "dev": true,
1091
- "requires": {
1092
- "glob": "7.0.6",
1093
- "make-plural": "4.1.1",
1094
- "messageformat-parser": "1.1.0",
1095
- "nopt": "3.0.6",
1096
- "reserved-words": "0.1.2"
1097
- },
1098
- "dependencies": {
1099
- "glob": {
1100
- "version": "7.0.6",
1101
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
1102
- "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
1103
- "dev": true,
1104
- "requires": {
1105
- "fs.realpath": "1.0.0",
1106
- "inflight": "1.0.6",
1107
- "inherits": "2.0.3",
1108
- "minimatch": "3.0.4",
1109
- "once": "1.4.0",
1110
- "path-is-absolute": "1.0.1"
1111
- }
1112
- }
1113
- }
1114
- },
1115
- "messageformat-parser": {
1116
- "version": "1.1.0",
1117
- "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-1.1.0.tgz",
1118
- "integrity": "sha512-Hwem6G3MsKDLS1FtBRGIs8T50P1Q00r3srS6QJePCFbad9fq0nYxwf3rnU2BreApRGhmpKMV7oZI06Sy1c9TPA==",
1119
- "dev": true
1120
- },
1121
- "mimic-fn": {
1122
- "version": "1.2.0",
1123
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
1124
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
1125
- "dev": true
1126
- },
1127
- "minimatch": {
1128
- "version": "3.0.4",
1129
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1130
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1131
- "dev": true,
1132
- "requires": {
1133
- "brace-expansion": "1.1.11"
1134
- }
1135
- },
1136
- "minimist": {
1137
- "version": "0.0.8",
1138
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1139
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1140
- "dev": true
1141
- },
1142
- "mkdirp": {
1143
- "version": "0.5.1",
1144
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1145
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1146
- "dev": true,
1147
- "requires": {
1148
- "minimist": "0.0.8"
1149
- }
1150
- },
1151
- "ms": {
1152
- "version": "2.0.0",
1153
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1154
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1155
- "dev": true
1156
- },
1157
- "mute-stream": {
1158
- "version": "0.0.7",
1159
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
1160
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
1161
- "dev": true
1162
- },
1163
- "natural-compare": {
1164
- "version": "1.4.0",
1165
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
1166
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
1167
- "dev": true
1168
- },
1169
- "nopt": {
1170
- "version": "3.0.6",
1171
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
1172
- "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
1173
- "dev": true,
1174
- "requires": {
1175
- "abbrev": "1.1.1"
1176
- }
1177
- },
1178
- "npm-run-path": {
1179
- "version": "2.0.2",
1180
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
1181
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
1182
- "dev": true,
1183
- "requires": {
1184
- "path-key": "2.0.1"
1185
- }
1186
- },
1187
- "number-is-nan": {
1188
- "version": "1.0.1",
1189
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1190
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
1191
- "dev": true
1192
- },
1193
- "object-assign": {
1194
- "version": "4.1.1",
1195
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1196
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1197
- "dev": true
1198
- },
1199
- "once": {
1200
- "version": "1.4.0",
1201
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1202
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1203
- "dev": true,
1204
- "requires": {
1205
- "wrappy": "1.0.2"
1206
- }
1207
- },
1208
- "onetime": {
1209
- "version": "2.0.1",
1210
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
1211
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
1212
- "dev": true,
1213
- "requires": {
1214
- "mimic-fn": "1.2.0"
1215
- }
1216
- },
1217
- "optionator": {
1218
- "version": "0.8.2",
1219
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
1220
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
1221
- "dev": true,
1222
- "requires": {
1223
- "deep-is": "0.1.3",
1224
- "fast-levenshtein": "2.0.6",
1225
- "levn": "0.3.0",
1226
- "prelude-ls": "1.1.2",
1227
- "type-check": "0.3.2",
1228
- "wordwrap": "1.0.0"
1229
- }
1230
- },
1231
- "os-locale": {
1232
- "version": "2.1.0",
1233
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
1234
- "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
1235
- "dev": true,
1236
- "requires": {
1237
- "execa": "0.7.0",
1238
- "lcid": "1.0.0",
1239
- "mem": "1.1.0"
1240
- }
1241
- },
1242
- "os-tmpdir": {
1243
- "version": "1.0.2",
1244
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1245
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1246
- "dev": true
1247
- },
1248
- "p-finally": {
1249
- "version": "1.0.0",
1250
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
1251
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
1252
- "dev": true
1253
- },
1254
- "p-limit": {
1255
- "version": "1.2.0",
1256
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
1257
- "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
1258
- "dev": true,
1259
- "requires": {
1260
- "p-try": "1.0.0"
1261
- }
1262
- },
1263
- "p-locate": {
1264
- "version": "2.0.0",
1265
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
1266
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
1267
- "dev": true,
1268
- "requires": {
1269
- "p-limit": "1.2.0"
1270
- }
1271
- },
1272
- "p-try": {
1273
- "version": "1.0.0",
1274
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
1275
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
1276
- "dev": true
1277
- },
1278
- "path-exists": {
1279
- "version": "3.0.0",
1280
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
1281
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
1282
- "dev": true
1283
- },
1284
- "path-is-absolute": {
1285
- "version": "1.0.1",
1286
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1287
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1288
- "dev": true
1289
- },
1290
- "path-is-inside": {
1291
- "version": "1.0.2",
1292
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
1293
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
1294
- "dev": true
1295
- },
1296
- "path-key": {
1297
- "version": "2.0.1",
1298
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
1299
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
1300
- "dev": true
1301
- },
1302
- "pify": {
1303
- "version": "2.3.0",
1304
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1305
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
1306
- "dev": true
1307
- },
1308
- "pinkie": {
1309
- "version": "2.0.4",
1310
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
1311
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
1312
- "dev": true
1313
- },
1314
- "pinkie-promise": {
1315
- "version": "2.0.1",
1316
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
1317
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
1318
- "dev": true,
1319
- "requires": {
1320
- "pinkie": "2.0.4"
1321
- }
1322
- },
1323
- "pluralize": {
1324
- "version": "7.0.0",
1325
- "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
1326
- "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
1327
- "dev": true
1328
- },
1329
- "prelude-ls": {
1330
- "version": "1.1.2",
1331
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
1332
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
1333
- "dev": true
1334
- },
1335
- "prettier": {
1336
- "version": "1.11.1",
1337
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.11.1.tgz",
1338
- "integrity": "sha512-T/KD65Ot0PB97xTrG8afQ46x3oiVhnfGjGESSI9NWYcG92+OUPZKkwHqGWXH2t9jK1crnQjubECW0FuOth+hxw==",
1339
- "dev": true
1340
- },
1341
- "prettier-eslint": {
1342
- "version": "8.8.1",
1343
- "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-8.8.1.tgz",
1344
- "integrity": "sha512-8YMkJZnA+XVfEW6fPet05jpNmSQbD+Htbh/QyOxQcVf2GIUEZsnGP7ZScaM9Mq2Ra2261eCu60E7/TRIy9coXQ==",
1345
- "dev": true,
1346
- "requires": {
1347
- "babel-runtime": "6.26.0",
1348
- "common-tags": "1.7.2",
1349
- "dlv": "1.1.1",
1350
- "eslint": "4.19.1",
1351
- "indent-string": "3.2.0",
1352
- "lodash.merge": "4.6.1",
1353
- "loglevel-colored-level-prefix": "1.0.0",
1354
- "prettier": "1.11.1",
1355
- "pretty-format": "22.4.3",
1356
- "require-relative": "0.8.7",
1357
- "typescript": "2.8.1",
1358
- "typescript-eslint-parser": "11.0.0"
1359
- }
1360
- },
1361
- "prettier-eslint-cli": {
1362
- "version": "4.7.1",
1363
- "resolved": "https://registry.npmjs.org/prettier-eslint-cli/-/prettier-eslint-cli-4.7.1.tgz",
1364
- "integrity": "sha512-hQbsGaEVz97oBBcKdsJ46khv0kOGkMyWrXzcFOXW6X8UuetZ/j0yDJkNJgUTVc6PVFbbzBXk+qgd5vos9qzXPQ==",
1365
- "dev": true,
1366
- "requires": {
1367
- "arrify": "1.0.1",
1368
- "babel-runtime": "6.26.0",
1369
- "boolify": "1.0.1",
1370
- "camelcase-keys": "4.2.0",
1371
- "chalk": "2.3.0",
1372
- "common-tags": "1.7.2",
1373
- "eslint": "4.19.1",
1374
- "find-up": "2.1.0",
1375
- "get-stdin": "5.0.1",
1376
- "glob": "7.1.2",
1377
- "ignore": "3.3.7",
1378
- "indent-string": "3.2.0",
1379
- "lodash.memoize": "4.1.2",
1380
- "loglevel-colored-level-prefix": "1.0.0",
1381
- "messageformat": "1.1.1",
1382
- "prettier-eslint": "8.8.1",
1383
- "rxjs": "5.5.8",
1384
- "yargs": "10.0.3"
1385
- },
1386
- "dependencies": {
1387
- "ansi-styles": {
1388
- "version": "3.2.1",
1389
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
1390
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
1391
- "dev": true,
1392
- "requires": {
1393
- "color-convert": "1.9.1"
1394
- }
1395
- },
1396
- "chalk": {
1397
- "version": "2.3.0",
1398
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
1399
- "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
1400
- "dev": true,
1401
- "requires": {
1402
- "ansi-styles": "3.2.1",
1403
- "escape-string-regexp": "1.0.5",
1404
- "supports-color": "4.5.0"
1405
- }
1406
- },
1407
- "has-flag": {
1408
- "version": "2.0.0",
1409
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
1410
- "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
1411
- "dev": true
1412
- },
1413
- "supports-color": {
1414
- "version": "4.5.0",
1415
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
1416
- "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
1417
- "dev": true,
1418
- "requires": {
1419
- "has-flag": "2.0.0"
1420
- }
1421
- }
1422
- }
1423
- },
1424
- "pretty-format": {
1425
- "version": "22.4.3",
1426
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz",
1427
- "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==",
1428
- "dev": true,
1429
- "requires": {
1430
- "ansi-regex": "3.0.0",
1431
- "ansi-styles": "3.2.1"
1432
- },
1433
- "dependencies": {
1434
- "ansi-regex": {
1435
- "version": "3.0.0",
1436
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
1437
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
1438
- "dev": true
1439
- },
1440
- "ansi-styles": {
1441
- "version": "3.2.1",
1442
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
1443
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
1444
- "dev": true,
1445
- "requires": {
1446
- "color-convert": "1.9.1"
1447
- }
1448
- }
1449
- }
1450
- },
1451
- "process-nextick-args": {
1452
- "version": "2.0.0",
1453
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
1454
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
1455
- "dev": true
1456
- },
1457
- "progress": {
1458
- "version": "2.0.0",
1459
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
1460
- "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
1461
- "dev": true
1462
- },
1463
- "pseudomap": {
1464
- "version": "1.0.2",
1465
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
1466
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
1467
- "dev": true
1468
- },
1469
- "quick-lru": {
1470
- "version": "1.1.0",
1471
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
1472
- "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
1473
- "dev": true
1474
- },
1475
- "readable-stream": {
1476
- "version": "2.3.5",
1477
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
1478
- "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
1479
- "dev": true,
1480
- "requires": {
1481
- "core-util-is": "1.0.2",
1482
- "inherits": "2.0.3",
1483
- "isarray": "1.0.0",
1484
- "process-nextick-args": "2.0.0",
1485
- "safe-buffer": "5.1.1",
1486
- "string_decoder": "1.0.3",
1487
- "util-deprecate": "1.0.2"
1488
- }
1489
- },
1490
- "regenerator-runtime": {
1491
- "version": "0.11.1",
1492
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
1493
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
1494
- "dev": true
1495
- },
1496
- "regexpp": {
1497
- "version": "1.1.0",
1498
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
1499
- "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
1500
- "dev": true
1501
- },
1502
- "require-directory": {
1503
- "version": "2.1.1",
1504
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1505
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
1506
- "dev": true
1507
- },
1508
- "require-main-filename": {
1509
- "version": "1.0.1",
1510
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
1511
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
1512
- "dev": true
1513
- },
1514
- "require-relative": {
1515
- "version": "0.8.7",
1516
- "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
1517
- "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=",
1518
- "dev": true
1519
- },
1520
- "require-uncached": {
1521
- "version": "1.0.3",
1522
- "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
1523
- "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
1524
- "dev": true,
1525
- "requires": {
1526
- "caller-path": "0.1.0",
1527
- "resolve-from": "1.0.1"
1528
- }
1529
- },
1530
- "reserved-words": {
1531
- "version": "0.1.2",
1532
- "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz",
1533
- "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=",
1534
- "dev": true
1535
- },
1536
- "resolve-from": {
1537
- "version": "1.0.1",
1538
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
1539
- "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
1540
- "dev": true
1541
- },
1542
- "restore-cursor": {
1543
- "version": "2.0.0",
1544
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
1545
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
1546
- "dev": true,
1547
- "requires": {
1548
- "onetime": "2.0.1",
1549
- "signal-exit": "3.0.2"
1550
- }
1551
- },
1552
- "rimraf": {
1553
- "version": "2.6.2",
1554
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
1555
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
1556
- "dev": true,
1557
- "requires": {
1558
- "glob": "7.1.2"
1559
- }
1560
- },
1561
- "run-async": {
1562
- "version": "2.3.0",
1563
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
1564
- "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
1565
- "dev": true,
1566
- "requires": {
1567
- "is-promise": "2.1.0"
1568
- }
1569
- },
1570
- "rx-lite": {
1571
- "version": "4.0.8",
1572
- "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
1573
- "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
1574
- "dev": true
1575
- },
1576
- "rx-lite-aggregates": {
1577
- "version": "4.0.8",
1578
- "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
1579
- "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
1580
- "dev": true,
1581
- "requires": {
1582
- "rx-lite": "4.0.8"
1583
- }
1584
- },
1585
- "rxjs": {
1586
- "version": "5.5.8",
1587
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.8.tgz",
1588
- "integrity": "sha512-Bz7qou7VAIoGiglJZbzbXa4vpX5BmTTN2Dj/se6+SwADtw4SihqBIiEa7VmTXJ8pynvq0iFr5Gx9VLyye1rIxQ==",
1589
- "dev": true,
1590
- "requires": {
1591
- "symbol-observable": "1.0.1"
1592
- }
1593
- },
1594
- "safe-buffer": {
1595
- "version": "5.1.1",
1596
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
1597
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
1598
- "dev": true
1599
- },
1600
- "semver": {
1601
- "version": "5.5.0",
1602
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
1603
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
1604
- "dev": true
1605
- },
1606
- "set-blocking": {
1607
- "version": "2.0.0",
1608
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1609
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
1610
- "dev": true
1611
- },
1612
- "shebang-command": {
1613
- "version": "1.2.0",
1614
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
1615
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
1616
- "dev": true,
1617
- "requires": {
1618
- "shebang-regex": "1.0.0"
1619
- }
1620
- },
1621
- "shebang-regex": {
1622
- "version": "1.0.0",
1623
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
1624
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
1625
- "dev": true
1626
- },
1627
- "signal-exit": {
1628
- "version": "3.0.2",
1629
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1630
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1631
- "dev": true
1632
- },
1633
- "slice-ansi": {
1634
- "version": "1.0.0",
1635
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
1636
- "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
1637
- "dev": true,
1638
- "requires": {
1639
- "is-fullwidth-code-point": "2.0.0"
1640
- }
1641
- },
1642
- "sprintf-js": {
1643
- "version": "1.0.3",
1644
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1645
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1646
- "dev": true
1647
- },
1648
- "string-width": {
1649
- "version": "2.1.1",
1650
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
1651
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
1652
- "dev": true,
1653
- "requires": {
1654
- "is-fullwidth-code-point": "2.0.0",
1655
- "strip-ansi": "4.0.0"
1656
- }
1657
- },
1658
- "string_decoder": {
1659
- "version": "1.0.3",
1660
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
1661
- "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
1662
- "dev": true,
1663
- "requires": {
1664
- "safe-buffer": "5.1.1"
1665
- }
1666
- },
1667
- "strip-ansi": {
1668
- "version": "4.0.0",
1669
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
1670
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
1671
- "dev": true,
1672
- "requires": {
1673
- "ansi-regex": "3.0.0"
1674
- },
1675
- "dependencies": {
1676
- "ansi-regex": {
1677
- "version": "3.0.0",
1678
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
1679
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
1680
- "dev": true
1681
- }
1682
- }
1683
- },
1684
- "strip-eof": {
1685
- "version": "1.0.0",
1686
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
1687
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
1688
- "dev": true
1689
- },
1690
- "strip-json-comments": {
1691
- "version": "2.0.1",
1692
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1693
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1694
- "dev": true
1695
- },
1696
- "supports-color": {
1697
- "version": "2.0.0",
1698
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1699
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
1700
- "dev": true
1701
- },
1702
- "symbol-observable": {
1703
- "version": "1.0.1",
1704
- "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
1705
- "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=",
1706
- "dev": true
1707
- },
1708
- "table": {
1709
- "version": "4.0.2",
1710
- "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
1711
- "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
1712
- "dev": true,
1713
- "requires": {
1714
- "ajv": "5.5.2",
1715
- "ajv-keywords": "2.1.1",
1716
- "chalk": "2.3.2",
1717
- "lodash": "4.17.5",
1718
- "slice-ansi": "1.0.0",
1719
- "string-width": "2.1.1"
1720
- }
1721
- },
1722
- "text-table": {
1723
- "version": "0.2.0",
1724
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1725
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
1726
- "dev": true
1727
- },
1728
- "through": {
1729
- "version": "2.3.8",
1730
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1731
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
1732
- "dev": true
1733
- },
1734
- "tmp": {
1735
- "version": "0.0.33",
1736
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
1737
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
1738
- "dev": true,
1739
- "requires": {
1740
- "os-tmpdir": "1.0.2"
1741
- }
1742
- },
1743
- "type-check": {
1744
- "version": "0.3.2",
1745
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
1746
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
1747
- "dev": true,
1748
- "requires": {
1749
- "prelude-ls": "1.1.2"
1750
- }
1751
- },
1752
- "typedarray": {
1753
- "version": "0.0.6",
1754
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1755
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
1756
- "dev": true
1757
- },
1758
- "typescript": {
1759
- "version": "2.8.1",
1760
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.1.tgz",
1761
- "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==",
1762
- "dev": true
1763
- },
1764
- "typescript-eslint-parser": {
1765
- "version": "11.0.0",
1766
- "resolved": "https://registry.npmjs.org/typescript-eslint-parser/-/typescript-eslint-parser-11.0.0.tgz",
1767
- "integrity": "sha512-/fBHTBRBSorWQGKWOOjeMPkzd3o8cOPtFjTRwU5JLNGgVtmMa3KDkiw0R2n+H6ovo9y3OX30/5usm6YTqY44PQ==",
1768
- "dev": true,
1769
- "requires": {
1770
- "lodash.unescape": "4.0.1",
1771
- "semver": "5.4.1"
1772
- },
1773
- "dependencies": {
1774
- "semver": {
1775
- "version": "5.4.1",
1776
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
1777
- "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
1778
- "dev": true
1779
- }
1780
- }
1781
- },
1782
- "util-deprecate": {
1783
- "version": "1.0.2",
1784
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1785
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
1786
- "dev": true
1787
- },
1788
- "which": {
1789
- "version": "1.3.0",
1790
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
1791
- "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
1792
- "dev": true,
1793
- "requires": {
1794
- "isexe": "2.0.0"
1795
- }
1796
- },
1797
- "which-module": {
1798
- "version": "2.0.0",
1799
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
1800
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
1801
- "dev": true
1802
- },
1803
- "wordwrap": {
1804
- "version": "1.0.0",
1805
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
1806
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
1807
- "dev": true
1808
- },
1809
- "wrap-ansi": {
1810
- "version": "2.1.0",
1811
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
1812
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
1813
- "dev": true,
1814
- "requires": {
1815
- "string-width": "1.0.2",
1816
- "strip-ansi": "3.0.1"
1817
- },
1818
- "dependencies": {
1819
- "is-fullwidth-code-point": {
1820
- "version": "1.0.0",
1821
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
1822
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
1823
- "dev": true,
1824
- "requires": {
1825
- "number-is-nan": "1.0.1"
1826
- }
1827
- },
1828
- "string-width": {
1829
- "version": "1.0.2",
1830
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
1831
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
1832
- "dev": true,
1833
- "requires": {
1834
- "code-point-at": "1.1.0",
1835
- "is-fullwidth-code-point": "1.0.0",
1836
- "strip-ansi": "3.0.1"
1837
- }
1838
- },
1839
- "strip-ansi": {
1840
- "version": "3.0.1",
1841
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1842
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1843
- "dev": true,
1844
- "requires": {
1845
- "ansi-regex": "2.1.1"
1846
- }
1847
- }
1848
- }
1849
- },
1850
- "wrappy": {
1851
- "version": "1.0.2",
1852
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1853
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1854
- "dev": true
1855
- },
1856
- "write": {
1857
- "version": "0.2.1",
1858
- "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
1859
- "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
1860
- "dev": true,
1861
- "requires": {
1862
- "mkdirp": "0.5.1"
1863
- }
1864
- },
1865
- "y18n": {
1866
- "version": "3.2.1",
1867
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
1868
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
1869
- "dev": true
1870
- },
1871
- "yallist": {
1872
- "version": "2.1.2",
1873
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
1874
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
1875
- "dev": true
1876
- },
1877
- "yargs": {
1878
- "version": "10.0.3",
1879
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.0.3.tgz",
1880
- "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==",
1881
- "dev": true,
1882
- "requires": {
1883
- "cliui": "3.2.0",
1884
- "decamelize": "1.2.0",
1885
- "find-up": "2.1.0",
1886
- "get-caller-file": "1.0.2",
1887
- "os-locale": "2.1.0",
1888
- "require-directory": "2.1.1",
1889
- "require-main-filename": "1.0.1",
1890
- "set-blocking": "2.0.0",
1891
- "string-width": "2.1.1",
1892
- "which-module": "2.0.0",
1893
- "y18n": "3.2.1",
1894
- "yargs-parser": "8.1.0"
1895
- }
1896
- },
1897
- "yargs-parser": {
1898
- "version": "8.1.0",
1899
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz",
1900
- "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==",
1901
- "dev": true,
1902
- "requires": {
1903
- "camelcase": "4.1.0"
1904
- }
1905
- }
1906
- }
1907
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/boldgrid/library/package.json CHANGED
@@ -1,12 +1,15 @@
1
  {
2
  "scripts": {
3
- "js-lint": "prettier-eslint **/*.js --list-different",
4
- "js-lint-fix": "prettier-eslint **/*.js --write"
5
  },
6
  "devDependencies": {
7
  "eslint": "^4.19.1",
8
  "eslint-config-wordpress": "^2.0.0",
9
  "eslint-plugin-html": "^4.0.2",
 
 
 
10
  "prettier-eslint": "^8.8.1",
11
  "prettier-eslint-cli": "^4.7.1"
12
  }
1
  {
2
  "scripts": {
3
+ "js-lint": "prettier-eslint **/*.js --list-different --ignore **/build/**",
4
+ "js-lint-fix": "prettier-eslint **/*.js --write --ignore **/build/**"
5
  },
6
  "devDependencies": {
7
  "eslint": "^4.19.1",
8
  "eslint-config-wordpress": "^2.0.0",
9
  "eslint-plugin-html": "^4.0.2",
10
+ "gulp": "^3.9.1",
11
+ "gulp-cli": "^2.0.1",
12
+ "jquery-toggles": "^4.0.0",
13
  "prettier-eslint": "^8.8.1",
14
  "prettier-eslint-cli": "^4.7.1"
15
  }
vendor/boldgrid/library/src/Library/Api/Call.php CHANGED
@@ -173,7 +173,7 @@ class Call {
173
 
174
  // Response should be an object.
175
  if ( ! is_object( $this->response ) ) {
176
- $this->error = __( 'An invalid response was returned.', 'boldgrid-inspirations' );
177
  return false;
178
  }
179
 
173
 
174
  // Response should be an object.
175
  if ( ! is_object( $this->response ) ) {
176
+ $this->error = __( 'An invalid response was returned.', 'boldgrid-connect' );
177
  return false;
178
  }
179
 
vendor/boldgrid/library/src/Library/Editor.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File: Editor.php
4
+ *
5
+ * BoldGrid Library -- Editor
6
+ *
7
+ * @package Boldgrid\Library
8
+ *
9
+ * @since 2.7.3
10
+ * @author BoldGrid <support@boldgrid.com>
11
+ */
12
+
13
+ namespace Boldgrid\Library\Library;
14
+
15
+ /**
16
+ * Class: Editor
17
+ *
18
+ * This class is responsible for manipulating behaviors in the WordPress editor.
19
+ *
20
+ * @since 2.7.3
21
+ */
22
+ class Editor {
23
+ /**
24
+ * Constructor.
25
+ *
26
+ * @since 2.7.3
27
+ */
28
+ public function __construct() {
29
+ Filter::add( $this );
30
+ }
31
+
32
+ /**
33
+ * Disable the Connect Key notice if Gutenberg is used.
34
+ *
35
+ * @since 2.7.3
36
+ *
37
+ * @hook: enqueue_block_editor_assets
38
+ */
39
+ public function disableNotices() {
40
+ add_filter( 'Boldgrid\Library\Library\Notice\KeyPrompt_display', '__return_false', 20 );
41
+ }
42
+ }
vendor/boldgrid/library/src/Library/License.php CHANGED
@@ -70,19 +70,23 @@ class License {
70
  */
71
  public function ajaxClear() {
72
  $plugin = ! empty( $_POST['plugin'] ) ? sanitize_text_field( $_POST['plugin'] ) : null;
73
- if( empty( $plugin ) ) {
74
- wp_send_json_error( __( 'Unknown plugin.' ) );
 
75
  }
76
 
77
- if( ! current_user_can( 'manage_options' ) ) {
78
- wp_send_json_error( __( 'Access denied.', $plugin ) );
79
  }
80
 
81
  $success = $this->clearTransient();
82
- if( ! $success ) {
83
  wp_send_json_error( array(
84
  'string' => sprintf(
85
- __( 'Failed to clear license data. Unable to delete site transient "%1$s".', $plugin ),
 
 
 
86
  $this->getKey()
87
  ),
88
  ));
@@ -113,7 +117,7 @@ class License {
113
  );
114
 
115
  $translations = array(
116
- 'unknownError' => __( 'Unknown error' ),
117
  );
118
 
119
  wp_localize_script( 'bglib-license', 'bglibLicense', $translations );
@@ -140,7 +144,7 @@ class License {
140
  * @return mixed $license The response object or error string of call.
141
  */
142
  private function setLicense() {
143
- if ( ! get_option( 'boldgrid_api_key' ) ) {
144
  $license = 'Missing Connect Key';
145
  } else if ( ! ( $license = $this->getTransient() ) || ! $this->isVersionValid( $license ) ) {
146
  delete_site_transient( $this->getKey() );
@@ -323,6 +327,17 @@ class License {
323
  return $this->licenseString;
324
  }
325
 
 
 
 
 
 
 
 
 
 
 
 
326
  /**
327
  * Get the data class property.
328
  *
@@ -373,14 +388,15 @@ class License {
373
  *
374
  * @since 1.1.4
375
  *
376
- * @nohook
377
  *
378
  * @return bool
379
  */
380
  public function isPremium( $product ) {
381
  $isPremium = isset( $this->getData()->$product );
382
 
383
- $this->licenseString = $isPremium ? __( 'Premium' ) : __( 'Free' );
 
384
 
385
  return $isPremium;
386
  }
70
  */
71
  public function ajaxClear() {
72
  $plugin = ! empty( $_POST['plugin'] ) ? sanitize_text_field( $_POST['plugin'] ) : null;
73
+
74
+ if ( empty( $plugin ) ) {
75
+ wp_send_json_error( __( 'Unknown plugin.', 'boldgrid-connect' ) );
76
  }
77
 
78
+ if ( ! current_user_can( 'manage_options' ) ) {
79
+ wp_send_json_error( __( 'Access denied.', 'boldgrid-connect' ) );
80
  }
81
 
82
  $success = $this->clearTransient();
83
+ if ( ! $success ) {
84
  wp_send_json_error( array(
85
  'string' => sprintf(
86
+ __(
87
+ 'Failed to clear license data. Unable to delete site transient "%1$s".',
88
+ 'boldgrid-connect'
89
+ ),
90
  $this->getKey()
91
  ),
92
  ));
117
  );
118
 
119
  $translations = array(
120
+ 'unknownError' => __( 'Unknown error', 'boldgrid-connect' ),
121
  );
122
 
123
  wp_localize_script( 'bglib-license', 'bglibLicense', $translations );
144
  * @return mixed $license The response object or error string of call.
145
  */
146
  private function setLicense() {
147
+ if ( ! $this->getApiKey() ) {
148
  $license = 'Missing Connect Key';
149
  } else if ( ! ( $license = $this->getTransient() ) || ! $this->isVersionValid( $license ) ) {
150
  delete_site_transient( $this->getKey() );
327
  return $this->licenseString;
328
  }
329
 
330
+ /**
331
+ * Get our API Key.
332
+ *
333
+ * @since 2.6.0
334
+ *
335
+ * @hook Boldgrid\Library\License\getApiKey
336
+ */
337
+ public function getApiKey() {
338
+ return get_option( 'boldgrid_api_key' );
339
+ }
340
+
341
  /**
342
  * Get the data class property.
343
  *
388
  *
389
  * @since 1.1.4
390
  *
391
+ * @hook Boldgrid\Library\License\isPremium
392
  *
393
  * @return bool
394
  */
395
  public function isPremium( $product ) {
396
  $isPremium = isset( $this->getData()->$product );
397
 
398
+ $this->licenseString = $isPremium ?
399
+ __( 'Premium', 'boldgrid-connect' ) : __( 'Free', 'boldgrid-connect' );
400
 
401
  return $isPremium;
402
  }
vendor/boldgrid/library/src/Library/Menu/External.php CHANGED
@@ -63,7 +63,7 @@ class External {
63
  array(
64
  'id' => 'boldgrid-site-url',
65
  'parent' => 'boldgrid-adminbar-icon',
66
- 'title' => __( 'BoldGrid.com', 'boldgrid-inspirations' ),
67
  'href' => 'https://www.boldgrid.com/',
68
  'meta' => array(
69
  'class' => 'boldgrid-dropdown',
@@ -74,7 +74,7 @@ class External {
74
  array(
75
  'id' => 'boldgrid-site-documentation',
76
  'parent' => 'boldgrid-adminbar-icon',
77
- 'title' => __( 'Documentation', 'boldgrid-inspirations' ),
78
  'href' => 'https://www.boldgrid.com/docs',
79
  'meta' => array(
80
  'class' => 'boldgrid-dropdown',
@@ -85,7 +85,7 @@ class External {
85
  array(
86
  'id' => 'boldgrid-central-url',
87
  'parent' => 'boldgrid-adminbar-icon',
88
- 'title' => __( 'BoldGrid Central', 'boldgrid-inspirations' ),
89
  'href' => 'https://www.boldgrid.com/central',
90
  'meta' => array(
91
  'class' => 'boldgrid-dropdown',
@@ -96,7 +96,7 @@ class External {
96
  array(
97
  'id' => 'boldgrid-connect-url',
98
  'parent' => 'boldgrid-adminbar-icon',
99
- 'title' => __( 'BoldGrid Connect', 'boldgrid-inspirations' ),
100
  'href' => get_admin_url( null, 'options-general.php?page=boldgrid-connect.php' ),
101
  'meta' => array(
102
  'class' => 'boldgrid-dropdown',
@@ -106,7 +106,7 @@ class External {
106
  array(
107
  'id' => 'boldgrid-feedback-url',
108
  'parent' => 'boldgrid-adminbar-icon',
109
- 'title' => __( 'Feedback', 'boldgrid-inspirations' ),
110
  'href' => 'https://www.boldgrid.com/feedback',
111
  'meta' => array(
112
  'class' => 'boldgrid-dropdown',
63
  array(
64
  'id' => 'boldgrid-site-url',
65
  'parent' => 'boldgrid-adminbar-icon',
66
+ 'title' => __( 'BoldGrid.com', 'boldgrid-connect' ),
67
  'href' => 'https://www.boldgrid.com/',
68
  'meta' => array(
69
  'class' => 'boldgrid-dropdown',
74
  array(
75
  'id' => 'boldgrid-site-documentation',
76
  'parent' => 'boldgrid-adminbar-icon',
77
+ 'title' => __( 'Documentation', 'boldgrid-connect' ),
78
  'href' => 'https://www.boldgrid.com/docs',
79
  'meta' => array(
80
  'class' => 'boldgrid-dropdown',
85
  array(
86
  'id' => 'boldgrid-central-url',
87
  'parent' => 'boldgrid-adminbar-icon',
88
+ 'title' => __( 'BoldGrid Central', 'boldgrid-connect' ),
89
  'href' => 'https://www.boldgrid.com/central',
90
  'meta' => array(
91
  'class' => 'boldgrid-dropdown',
96
  array(
97
  'id' => 'boldgrid-connect-url',
98
  'parent' => 'boldgrid-adminbar-icon',
99
+ 'title' => __( 'BoldGrid Connect', 'boldgrid-connect' ),
100
  'href' => get_admin_url( null, 'options-general.php?page=boldgrid-connect.php' ),
101
  'meta' => array(
102
  'class' => 'boldgrid-dropdown',
106
  array(
107
  'id' => 'boldgrid-feedback-url',
108
  'parent' => 'boldgrid-adminbar-icon',
109
+ 'title' => __( 'Feedback', 'boldgrid-connect' ),
110
  'href' => 'https://www.boldgrid.com/feedback',
111
  'meta' => array(
112
  'class' => 'boldgrid-dropdown',
vendor/boldgrid/library/src/Library/Menu/Reseller.php CHANGED
@@ -59,7 +59,7 @@ class Reseller {
59
  esc_url( $data['reseller_website_url'] ) : 'https://www.boldgrid.com/';
60
 
61
  $data['reseller_title'] = ! empty( $data['reseller_title'] ) ?
62
- esc_html__( $data['reseller_title'] ) : esc_html__( 'BoldGrid.com' );
63
 
64
  $data['reseller_support_url'] = ! empty( $data['reseller_support_url'] ) ?
65
  esc_url( $data['reseller_support_url'] ) : 'https://www.boldgrid.com/documentation';
@@ -119,23 +119,23 @@ class Reseller {
119
  array(
120
  'id' => 'reseller-support-center',
121
  'parent' => 'reseller-adminbar-icon',
122
- 'title' => esc_html__( 'Support Center' ),
123
  'href' => $data['reseller_support_url'],
124
  'meta' => array(
125
  'class' => 'reseller-dropdown',
126
  'target' => '_blank',
127
- 'title' => __( 'Support Center' ),
128
  ),
129
  ),
130
  array(
131
  'id' => 'reseller-amp-login',
132
  'parent' => 'reseller-adminbar-icon',
133
- 'title' => esc_html__( 'AMP Login' ),
134
  'href' => $data['reseller_amp_url'],
135
  'meta' => array(
136
  'class' => 'reseller-dropdown',
137
  'target' => '_blank',
138
- 'title' => __( 'Account Management' ),
139
  ),
140
  ),
141
  ),
59
  esc_url( $data['reseller_website_url'] ) : 'https://www.boldgrid.com/';
60
 
61
  $data['reseller_title'] = ! empty( $data['reseller_title'] ) ?
62
+ esc_html( $data['reseller_title'] ) : esc_html( 'BoldGrid.com' );
63
 
64
  $data['reseller_support_url'] = ! empty( $data['reseller_support_url'] ) ?
65
  esc_url( $data['reseller_support_url'] ) : 'https://www.boldgrid.com/documentation';
119
  array(
120
  'id' => 'reseller-support-center',
121
  'parent' => 'reseller-adminbar-icon',
122
+ 'title' => esc_html__( 'Support Center', 'boldgrid-connect' ),
123
  'href' => $data['reseller_support_url'],
124
  'meta' => array(
125
  'class' => 'reseller-dropdown',
126
  'target' => '_blank',
127
+ 'title' => __( 'Support Center', 'boldgrid-connect' ),
128
  ),
129
  ),
130
  array(
131
  'id' => 'reseller-amp-login',
132
  'parent' => 'reseller-adminbar-icon',
133
+ 'title' => esc_html__( 'AMP Login', 'boldgrid-connect' ),
134
  'href' => $data['reseller_amp_url'],
135
  'meta' => array(
136
  'class' => 'reseller-dropdown',
137
  'target' => '_blank',
138
+ 'title' => __( 'Account Management', 'boldgrid-connect' ),
139
  ),
140
  ),
141
  ),
vendor/boldgrid/library/src/Library/Notice.php CHANGED
@@ -96,6 +96,15 @@ class Notice {
96
  $message,
97
  $nonce
98
  );
 
 
 
 
 
 
 
 
 
99
  }
100
 
101
  /**
@@ -226,7 +235,7 @@ class Notice {
226
  *
227
  * @hook: admin_enqueue_scripts
228
  */
229
- public function enqueue() {
230
  wp_enqueue_script(
231
  'bglib-notice-js',
232
  Configs::get( 'libraryUrl' ) . 'src/assets/js/notice.js'
96
  $message,
97
  $nonce
98
  );
99
+
100
+ /*
101
+ * Enqueue js required to allow for notices to be dismissed permanently.
102
+ *
103
+ * When notices (such as the "keyPrompt" notice) are shown by creating a new instance of
104
+ * this class, the js is enqueued by the Filter::add call in the constructor. We do however
105
+ * allow notices to be shown via this static method, and so we need to enqueue the js now.
106
+ */
107
+ self::enqueue();
108
  }
109
 
110
  /**
235
  *
236
  * @hook: admin_enqueue_scripts
237
  */
238
+ public static function enqueue() {
239
  wp_enqueue_script(
240
  'bglib-notice-js',
241
  Configs::get( 'libraryUrl' ) . 'src/assets/js/notice.js'
vendor/boldgrid/library/src/Library/Notice/KeyPrompt.php CHANGED
@@ -3,7 +3,7 @@
3
  * BoldGrid Library Key Prompt Notice
4
  *
5
  * @package Boldgrid\Library
6
- * @subpackage \Util
7
  *
8
  * @version 1.0.0
9
  * @author BoldGrid <wpb@boldgrid.com>
@@ -91,8 +91,23 @@ class KeyPrompt {
91
  * @return object $messages Messages used by key prompt.
92
  */
93
  private function setMessages() {
 
 
 
 
 
 
 
 
94
  $msg = new \stdClass();
95
- $msg->success = esc_html__( 'Your api key has been saved successfully.', 'boldgrid-inspirations' );
 
 
 
 
 
 
 
96
  $msg->error = sprintf( esc_html__( 'Your API key appears to be invalid!%sPlease try to enter your BoldGrid Connect Key again.', 'boldgrid-inspirations' ), '<br />' );
97
  $msg->nonce = esc_html__( 'Security violation! An invalid nonce was detected.', 'boldgrid-inspirations' );
98
  $msg->timeout = esc_html__( 'Connection timed out. Please try again.', 'boldgrid-inspirations' );
3
  * BoldGrid Library Key Prompt Notice
4
  *
5
  * @package Boldgrid\Library
6
+ * @subpackage \Notice
7
  *
8
  * @version 1.0.0
9
  * @author BoldGrid <wpb@boldgrid.com>
91
  * @return object $messages Messages used by key prompt.
92
  */
93
  private function setMessages() {
94
+ // Allowed html for wp_kses.
95
+ $allowed_html = array(
96
+ 'a' => array(
97
+ 'href' => array(),
98
+ ),
99
+ 'strong' => array(),
100
+ );
101
+
102
  $msg = new \stdClass();
103
+ $msg->success = sprintf(
104
+ wp_kses(
105
+ /* translators: The Url to the BoldGrid Connect settings page. */
106
+ __( 'Your api key has been saved. To change, see <strong>Settings &#187; <a href="%1$s">BoldGrid Connect</a></strong>.', 'boldgrid-inspirations' ),
107
+ $allowed_html
108
+ ),
109
+ admin_url( 'options-general.php?page=boldgrid-connect.php' )
110
+ );
111
  $msg->error = sprintf( esc_html__( 'Your API key appears to be invalid!%sPlease try to enter your BoldGrid Connect Key again.', 'boldgrid-inspirations' ), '<br />' );
112
  $msg->nonce = esc_html__( 'Security violation! An invalid nonce was detected.', 'boldgrid-inspirations' );
113
  $msg->timeout = esc_html__( 'Connection timed out. Please try again.', 'boldgrid-inspirations' );
vendor/boldgrid/library/src/Library/Page/Connect.php CHANGED
@@ -6,7 +6,7 @@
6
  * @subpackage \Library\Library\Page
7
  *
8
  * @version 2.4.0
9
- * @author BoldGrid <wpb@boldgrid.com>
10
  */
11
 
12
  namespace Boldgrid\Library\Library\Page;
@@ -98,7 +98,7 @@ class Connect {
98
  }
99
 
100
  /**
101
- * Enqueue Scripts needed for this page.
102
  *
103
  * @since 2.4.0
104
  *
@@ -106,8 +106,39 @@ class Connect {
106
  */
107
  public function addScripts() {
108
  if ( $this->isConnectScreen( get_current_screen() ) ) {
109
- wp_enqueue_script( 'boldgrid-library-connect',
110
- Configs::get( 'libraryUrl' ) . 'src/assets/js/connect.js' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
  /**
113
  * Add additional scripts to Connect page.
@@ -128,8 +159,8 @@ class Connect {
128
  public function addPage() {
129
  add_submenu_page(
130
  'options-general.php',
131
- __( 'BoldGrid Connect' ),
132
- __( 'BoldGrid Connect' ),
133
  'manage_options',
134
  'boldgrid-connect.php',
135
  function () {
@@ -137,4 +168,125 @@ class Connect {
137
  }
138
  );
139
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  }
6
  * @subpackage \Library\Library\Page
7
  *
8
  * @version 2.4.0
9
+ * @author BoldGrid <support@boldgrid.com>
10
  */
11
 
12
  namespace Boldgrid\Library\Library\Page;
98
  }
99
 
100
  /**
101
+ * Enqueue scripts needed for this page.
102
  *
103
  * @since 2.4.0
104
  *
106
  */
107
  public function addScripts() {
108
  if ( $this->isConnectScreen( get_current_screen() ) ) {
109
+ // Enqueue boldgrid-library-connect js.
110
+ $handle = 'boldgrid-library-connect';
111
+
112
+ wp_register_script(
113
+ $handle,
114
+ Configs::get( 'libraryUrl' ) . 'src/assets/js/connect.js' ,
115
+ array( 'jquery' ),
116
+ date( 'Ymd' ),
117
+ false
118
+ );
119
+
120
+ $translation = array(
121
+ 'settingsSaved' => __( 'Settings saved.', 'boldgrid-connect' ),
122
+ 'unknownError' => __( 'Unknown error.', 'boldgrid-connect' ),
123
+ 'ajaxError' => __( 'Could not reach the AJAX URL address. HTTP error: ', 'boldgrid-connect' ),
124
+ );
125
+
126
+ wp_localize_script( $handle, 'BoldGridLibraryConnect', $translation );
127
+
128
+ wp_enqueue_script( $handle );
129
+
130
+ // Enqueue jquery-toggles js.
131
+ wp_enqueue_script(
132
+ 'jquery-toggles',
133
+ Configs::get( 'libraryUrl' ) . 'build/toggles.min.js',
134
+ array( 'jquery' ),
135
+ date( 'Ymd' ),
136
+ true
137
+ );
138
+
139
+ // Enqueue jquery-toggles css.
140
+ wp_enqueue_style( 'jquery-toggles-full',
141
+ Configs::get( 'libraryUrl' ) . 'build/toggles-full.css', array(), date( 'Ymd' ) );
142
 
143
  /**
144
  * Add additional scripts to Connect page.
159
  public function addPage() {
160
  add_submenu_page(
161
  'options-general.php',
162
+ __( 'BoldGrid Connect', 'boldgrid-connect' ),
163
+ __( 'BoldGrid Connect', 'boldgrid-connect' ),
164
  'manage_options',
165
  'boldgrid-connect.php',
166
  function () {
168
  }
169
  );
170
  }
171
+
172
+ /**
173
+ * AJAX callback for the Connect Settings page.
174
+ *
175
+ * @since 2.7.0
176
+ *
177
+ * @uses $_POST['autoupdate'] Optional auto-update settings for plugins and themes.
178
+ * @uses $_POST['plugin_release_channel'] Plugin release channel.
179
+ * @uses $_POST['theme_release_channel'] Theme release channel.
180
+ *
181
+ * @see self::sanitizeSettings()
182
+ *
183
+ * @hook wp_ajax_boldgrid_library_connect_settings_save
184
+ */
185
+ public function saveSettings() {
186
+ // Check user permissions.
187
+ if ( ! current_user_can( 'update_plugins' ) ) {
188
+ wp_send_json_error( array(
189
+ 'error' => __( 'User access violation!', 'boldgrid-connect' ),
190
+ ) );
191
+ }
192
+
193
+ // Check security nonce and referer.
194
+ if ( ! check_admin_referer( 'boldgrid_library_connect_settings_save' ) ) {
195
+ wp_send_json_error( array(
196
+ 'error' => __( 'Security violation! Please try again.', 'boldgrid-connect' ),
197
+ ) );
198
+ }
199
+
200
+ // Read settings form POST request, sanitize, and merge settings with saved.
201
+ $boldgridSettings = array_merge(
202
+ get_option( 'boldgrid_settings' ),
203
+ self::sanitizeSettings(
204
+ array(
205
+ 'autoupdate' => ! empty( $_POST['autoupdate'] ) ?
206
+ (array) $_POST['autoupdate'] : array(),
207
+ 'release_channel' => ! empty( $_POST['plugin_release_channel'] ) ?
208
+ sanitize_key( $_POST['plugin_release_channel'] ) : 'stable',
209
+ 'theme_release_channel' => ! empty( $_POST['theme_release_channel'] ) ?
210
+ sanitize_key( $_POST['theme_release_channel'] ) : 'stable',
211
+ )
212
+ )
213
+ );
214
+
215
+ // If new auto-update settings were passed, then remove deprecated settings.
216
+ if ( ! empty( $_POST['autoupdate'] ) ) {
217
+ unset( $boldgridSettings['plugin_autoupdate'], $boldgridSettings['theme_autoupdate'] );
218
+ }
219
+
220
+ update_option( 'boldgrid_settings', $boldgridSettings );
221
+
222
+ wp_send_json_success();
223
+ }
224
+
225
+ /**
226
+ * Sanitize settings.
227
+ *
228
+ * @since 2.7.0
229
+ *
230
+ * @static
231
+ *
232
+ * @param array $settings {
233
+ * Settings.
234
+ *
235
+ * @type array $autoupdate {
236
+ * Optional auto-update settings. This array does not always get included.
237
+ *
238
+ * @type array $plugins {
239
+ * Plugin auto-update settings.
240
+ *
241
+ * @type string $slug Plugin auto-update setting (1=Enabled, 0=Disabled).
242
+ * }
243
+ * @type array $themes {
244
+ * Theme auto-update settings.
245
+ *
246
+ * @type string $stylesheet Theme auto-update setting (1=Enabled, 0=Disabled).
247
+ * }
248
+ * }
249
+ * @type string $release_channel Plugin release channel.
250
+ * @type string $theme_release_channel Theme release channel.
251
+ * }
252
+ * @return array
253
+ */
254
+ public static function sanitizeSettings( array $settings ) {
255
+ $result = array();
256
+
257
+ if ( ! empty( $settings['autoupdate'] ) && is_array( $settings['autoupdate'] ) ) {
258
+ foreach ( $settings['autoupdate'] as $category => $itemSetting ) {
259
+ $category = sanitize_key( $category );
260
+
261
+ foreach ( $itemSetting as $id => $val ) {
262
+ $id = sanitize_text_field( $id );
263
+
264
+ $result['autoupdate'][ $category ][ $id ] = (bool) $val;
265
+ }
266
+ }
267
+ }
268
+
269
+ // Validate release channel settings.
270
+ $channels = array(
271
+ 'stable',
272
+ 'edge',
273
+ 'candidate',
274
+ );
275
+
276
+ if ( empty( $settings['release_channel'] ) ||
277
+ ! in_array( $settings['release_channel'], $channels, true ) ) {
278
+ $result['release_channel'] = 'stable';
279
+ } else {
280
+ $result['release_channel'] = $settings['release_channel'];
281
+ }
282
+
283
+ if ( empty( $settings['theme_release_channel'] ) ||
284
+ ! in_array( $settings['theme_release_channel'], $channels, true ) ) {
285
+ $result['theme_release_channel'] = 'stable';
286
+ } else {
287
+ $result['theme_release_channel'] = $settings['theme_release_channel'];
288
+ }
289
+
290
+ return $result;
291
+ }
292
  }
vendor/boldgrid/library/src/Library/Plugin/Checker.php CHANGED
@@ -75,7 +75,7 @@ class Checker {
75
  * @since 1.0.0
76
  *
77
  * @link https://developer.wordpress.org/reference/functions/get_site_option/
78
- * @see get_site_option()
79
  * @see Boldgrid\Library\Util\Plugin::getFiltered()
80
  *
81
  * @return bool
@@ -83,7 +83,7 @@ class Checker {
83
  public function findUpdated() {
84
  $updated = array();
85
 
86
- $boldgridSettings = get_site_option( 'boldgrid_settings' );
87
 
88
  $plugins = get_site_transient( 'boldgrid_plugins_filtered' );
89
 
@@ -134,7 +134,7 @@ class Checker {
134
  do_action( 'boldgrid_plugins_updated' );
135
  }
136
 
137
- update_site_option( 'boldgrid_settings', $boldgridSettings );
138
 
139
  return $updated;
140
  }
75
  * @since 1.0.0
76
  *
77
  * @link https://developer.wordpress.org/reference/functions/get_site_option/
78
+ * @see get_option()
79
  * @see Boldgrid\Library\Util\Plugin::getFiltered()
80
  *
81
  * @return bool
83
  public function findUpdated() {
84
  $updated = array();
85
 
86
+ $boldgridSettings = get_option( 'boldgrid_settings' );
87
 
88
  $plugins = get_site_transient( 'boldgrid_plugins_filtered' );
89
 
134
  do_action( 'boldgrid_plugins_updated' );
135
  }
136
 
137
+ update_option( 'boldgrid_settings', $boldgridSettings );
138
 
139
  return $updated;
140
  }
vendor/boldgrid/library/src/Library/ReleaseChannel.php CHANGED
@@ -65,49 +65,54 @@ class ReleaseChannel {
65
  }
66
 
67
  /**
68
- * Update Plugin Channel
69
  *
70
  * This methods fires when boldgrid_settings is updated. We check the values
71
  * for the new plugin release channel to see if it changed here.
72
  *
73
  * @since 1.0.0
74
  *
75
- * @hook: update_site_option_boldgrid_settings
 
76
  *
77
- * @param string $option The option name.
78
- * @param mixed $new New option value being set.
79
- * @param mixed $old Old option value being set.
80
  *
81
- * @return mixed $new The new option being set.
 
 
 
82
  */
83
- public function updateChannel( $option, $new, $old ) {
 
 
 
 
 
 
 
 
84
 
85
  // Plugin checks.
86
- if ( ! empty( $old['release_channel'] ) || ! empty( $new['release_channel'] ) ) {
87
- if ( $old['release_channel'] !== $new['release_channel'] ) {
88
- Util\Option::deletePluginTransients();
89
- wp_update_plugins();
90
- }
91
  }
92
 
93
  // Theme checks.
94
- if ( ! empty( $old['theme_release_channel'] ) || ! empty( $new['theme_release_channel'] ) ) {
95
- if ( $old['theme_release_channel'] !== $new['theme_release_channel'] ) {
 
 
 
 
 
 
 
 
96
 
97
- /**
98
- * Action to take when theme release channel has changed.
99
- *
100
- * @since 1.1
101
- *
102
- * @param type string $old Old theme release channel.
103
- * @param type string $new New theme release channel.
104
- */
105
- do_action( 'Boldgrid\Library\Library\ReleaseChannel\theme_channel_updated', $old['theme_release_channel'], $new['theme_release_channel'] );
106
-
107
- delete_site_transient( 'boldgrid_api_data' );
108
- delete_site_transient( 'update_themes' );
109
- wp_update_themes();
110
- }
111
  }
112
 
113
  return $new;
65
  }
66
 
67
  /**
68
+ * Update Plugin Channel.
69
  *
70
  * This methods fires when boldgrid_settings is updated. We check the values
71
  * for the new plugin release channel to see if it changed here.
72
  *
73
  * @since 1.0.0
74
  *
75
+ * @link https://developer.wordpress.org/reference/hooks/update_option_option/
76
+ * @link https://developer.wordpress.org/reference/hooks/update_site_option_option/
77
  *
78
+ * @hook: update_option_boldgrid_settings
 
 
79
  *
80
+ * @param mixed $old Old option value being set.
81
+ * @param mixed $new New option value being set.
82
+ * @param string $option The option name.
83
+ * @return mixed $new The new option being set.
84
  */
85
+ public function updateChannel( $old, $new, $option ) {
86
+ $old['release_channel'] = ! empty( $old['release_channel'] ) ?
87
+ $old['release_channel'] : null;
88
+ $new['release_channel'] = ! empty( $new['release_channel'] ) ?
89
+ $new['release_channel'] : 'stable';
90
+ $old['theme_release_channel'] = ! empty( $old['theme_release_channel'] ) ?
91
+ $old['theme_release_channel'] : null;
92
+ $new['theme_release_channel'] = ! empty( $new['theme_release_channel'] ) ?
93
+ $new['theme_release_channel'] : 'stable';
94
 
95
  // Plugin checks.
96
+ if ( $old['release_channel'] !== $new['release_channel'] ) {
97
+ Util\Option::deletePluginTransients();
98
+ wp_update_plugins();
 
 
99
  }
100
 
101
  // Theme checks.
102
+ if ( $old['theme_release_channel'] !== $new['theme_release_channel'] ) {
103
+ /**
104
+ * Action to take when theme release channel has changed.
105
+ *
106
+ * @since 1.1
107
+ *
108
+ * @param string $old Old theme release channel.
109
+ * @param string $new New theme release channel.
110
+ */
111
+ do_action( 'Boldgrid\Library\Library\ReleaseChannel\theme_channel_updated', $old['theme_release_channel'], $new['theme_release_channel'] );
112
 
113
+ delete_site_transient( 'boldgrid_api_data' );
114
+ delete_site_transient( 'update_themes' );
115
+ wp_update_themes();
 
 
 
 
 
 
 
 
 
 
 
116
  }
117
 
118
  return $new;
vendor/boldgrid/library/src/Library/Start.php CHANGED
@@ -113,6 +113,7 @@ class Start {
113
  Configs::setItem( 'menu-reseller', new Menu\Reseller() );
114
  Configs::setItem( 'page-connect', new Page\Connect() );
115
  Configs::setItem( 'assets', new Asset() );
 
116
  }
117
 
118
  /**
113
  Configs::setItem( 'menu-reseller', new Menu\Reseller() );
114
  Configs::setItem( 'page-connect', new Page\Connect() );
115
  Configs::setItem( 'assets', new Asset() );
116
+ new Editor();
117
  }
118
 
119
  /**
vendor/boldgrid/library/src/Library/Ui.php CHANGED
@@ -93,6 +93,17 @@ class Ui {
93
  Library\Configs::get( 'libraryUrl' ) . 'src/assets/js/sticky.js',
94
  'jquery'
95
  );
 
 
 
 
 
 
 
 
 
 
 
96
  }
97
 
98
  /**
@@ -102,6 +113,8 @@ class Ui {
102
  *
103
  * @hook Boldgrid\Library\Ui\render_col_container
104
  *
 
 
105
  * @param array $sections {
106
  * An array of data used to create a left and right columned page.
107
  *
@@ -123,7 +136,8 @@ class Ui {
123
 
124
  $section_count = 0;
125
 
126
- $show_section = ! empty( $_GET['section'] ) ? $_GET['section'] : null;
 
127
 
128
  $content = '';
129
  $navigation = '<ul class="bg-left-nav">';
93
  Library\Configs::get( 'libraryUrl' ) . 'src/assets/js/sticky.js',
94
  'jquery'
95
  );
96
+
97
+ wp_register_style(
98
+ 'bglib-attributes-css',
99
+ Library\Configs::get( 'libraryUrl' ) . 'src/assets/css/attributes.css'
100
+ );
101
+
102
+ wp_register_script(
103
+ 'bglib-attributes-js',
104
+ Library\Configs::get( 'libraryUrl' ) . 'src/assets/js/attributes.js',
105
+ 'jquery'
106
+ );
107
  }
108
 
109
  /**
113
  *
114
  * @hook Boldgrid\Library\Ui\render_col_container
115
  *
116
+ * @uses $_REQUEST['section'] Section to switch to on load.
117
+ *
118
  * @param array $sections {
119
  * An array of data used to create a left and right columned page.
120
  *
136
 
137
  $section_count = 0;
138
 
139
+ $show_section = ! empty( $_REQUEST['section'] ) ?
140
+ sanitize_key( $_REQUEST['section'] ) : null;
141
 
142
  $content = '';
143
  $navigation = '<ul class="bg-left-nav">';
vendor/boldgrid/library/src/Library/Update.php CHANGED
@@ -24,14 +24,120 @@ use Boldgrid\Library\Library;
24
  * @see https://codex.wordpress.org/Configuring_Automatic_Background_Updates
25
  */
26
  class Update {
 
 
 
 
 
 
 
 
27
 
28
  /**
29
  * Constructor.
30
  *
31
  * @since 2.3.0
 
 
32
  */
33
  public function __construct() {
34
  Filter::add( $this );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  }
36
 
37
  /**
@@ -40,11 +146,28 @@ class Update {
40
  * @since 2.3.0
41
  *
42
  * @hook: auto_update_plugin
 
 
 
 
43
  */
44
- public function auto_update_plugin() {
 
 
 
 
 
45
  $pluginAutoupdate = \Boldgrid\Library\Util\Option::get( 'plugin_autoupdate' );
46
 
47
- return ! empty( $pluginAutoupdate );
 
 
 
 
 
 
 
 
48
  }
49
 
50
  /**
@@ -53,10 +176,27 @@ class Update {
53
  * @since 2.3.0
54
  *
55
  * @hook: auto_update_theme
 
 
 
 
56
  */
57
- public function auto_update_theme() {
 
 
 
 
 
58
  $themeAutoupdate = \Boldgrid\Library\Util\Option::get( 'theme_autoupdate' );
59
 
60
- return ! empty( $themeAutoupdate );
 
 
 
 
 
 
 
 
61
  }
62
  }
24
  * @see https://codex.wordpress.org/Configuring_Automatic_Background_Updates
25
  */
26
  class Update {
27
+ /**
28
+ * Auto-update settings.
29
+ *
30
+ * @since 2.6.0
31
+ *
32
+ * @var array
33
+ */
34
+ protected $settings;
35
 
36
  /**
37
  * Constructor.
38
  *
39
  * @since 2.3.0
40
+ *
41
+ * @see \Boldgrid\Library\Util\Option::get()
42
  */
43
  public function __construct() {
44
  Filter::add( $this );
45
+
46
+ $this->settings = (array) \Boldgrid\Library\Util\Option::get( 'autoupdate' );
47
+ }
48
+
49
+ /**
50
+ * Auto update WordPress Core: All types.
51
+ *
52
+ * @since 2.6.0
53
+ *
54
+ * @hook: auto_update_core
55
+ *
56
+ * @param bool $update Update API response.
57
+ * @return bool
58
+ */
59
+ public function auto_update_core( $update ) {
60
+ if ( ! apply_filters( 'Boldgrid\Library\Update\isEnalbed', false ) ) {
61
+ return $update;
62
+ }
63
+
64
+ return $update || ! empty( $this->settings['wpcore']['all'] );
65
+ }
66
+
67
+ /**
68
+ * Auto update WordPress Core: Major Updates.
69
+ *
70
+ * @since 2.6.0
71
+ *
72
+ * @hook: allow_major_auto_core_updates
73
+ *
74
+ * @param bool $update Update API response.
75
+ * @return bool
76
+ */
77
+ public function allow_major_auto_core_updates( $update ) {
78
+ if ( ! apply_filters( 'Boldgrid\Library\Update\isEnalbed', false ) ) {
79
+ return $update;
80
+ }
81
+
82
+ return $update || ! empty( $this->settings['wpcore']['all'] ) ||
83
+ ! empty( $this->settings['wpcore']['major'] );
84
+ }
85
+
86
+ /**
87
+ * Auto update WordPress Core: Minor Updates.
88
+ *
89
+ * @since 2.6.0
90
+ *
91
+ * @hook: allow_minor_auto_core_updates
92
+ *
93
+ * @param bool $update Update API response.
94
+ * @return bool
95
+ */
96
+ public function allow_minor_auto_core_updates( $update ) {
97
+ if ( ! apply_filters( 'Boldgrid\Library\Update\isEnalbed', false ) ) {
98
+ return $update;
99
+ }
100
+
101
+ return $update || ! empty( $this->settings['wpcore']['all'] ) ||
102
+ ! empty( $this->settings['wpcore']['minor'] );
103
+ }
104
+
105
+ /**
106
+ * Auto update WordPress Core: Development Updates.
107
+ *
108
+ * @since 2.6.0
109
+ *
110
+ * @hook: allow_dev_auto_core_updates
111
+ *
112
+ * @param bool $update Update API response.
113
+ * @return bool
114
+ */
115
+ public function allow_dev_auto_core_updates( $update ) {
116
+ if ( ! apply_filters( 'Boldgrid\Library\Update\isEnalbed', false ) ) {
117
+ return $update;
118
+ }
119
+
120
+ return $update || ! empty( $this->settings['wpcore']['all'] ) ||
121
+ ! empty( $this->settings['wpcore']['dev'] );
122
+ }
123
+
124
+ /**
125
+ * Auto update WordPress Core: Translation Updates.
126
+ *
127
+ * @since 2.6.0
128
+ *
129
+ * @hook: auto_update_translation
130
+ *
131
+ * @param bool $update Update API response.
132
+ * @return bool
133
+ */
134
+ public function auto_update_translation( $update ) {
135
+ if ( ! apply_filters( 'Boldgrid\Library\Update\isEnalbed', false ) ) {
136
+ return $update;
137
+ }
138
+
139
+ return $update || ! empty( $this->settings['wpcore']['all'] ) ||
140
+ ! empty( $this->settings['wpcore']['translation'] );
141
  }
142
 
143
  /**
146
  * @since 2.3.0
147
  *
148
  * @hook: auto_update_plugin
149
+ *
150
+ * @param bool $update Update API response.
151
+ * @param object $item Item being updated.
152
+ * @return bool
153
  */
154
+ public function auto_update_plugin( $update, $item ) {
155
+ if ( ! apply_filters( 'Boldgrid\Library\Update\isEnalbed', false ) ) {
156
+ return $update;
157
+ }
158
+
159
+ // Old settings.
160
  $pluginAutoupdate = \Boldgrid\Library\Util\Option::get( 'plugin_autoupdate' );
161
 
162
+ // Update if global setting is on, individual settings is on, or not set and default is on.
163
+ if ( ! empty( $pluginAutoupdate ) ||
164
+ ! empty( $this->settings['plugins'][ $item->plugin ] ) ||
165
+ ( ! isset( $this->settings['plugins'][ $item->plugin ] ) &&
166
+ ! empty( $this->settings['plugins']['default'] ) ) ) {
167
+ $update = true;
168
+ }
169
+
170
+ return $update;
171
  }
172
 
173
  /**
176
  * @since 2.3.0
177
  *
178
  * @hook: auto_update_theme
179
+ *
180
+ * @param bool $update Update API response.
181
+ * @param object $item Item being updated.
182
+ * @return bool
183
  */
184
+ public function auto_update_theme( $update, $item ) {
185
+ if ( ! apply_filters( 'Boldgrid\Library\Update\isEnalbed', false ) ) {
186
+ return $update;
187
+ }
188
+
189
+ // Old settings.
190
  $themeAutoupdate = \Boldgrid\Library\Util\Option::get( 'theme_autoupdate' );
191
 
192
+ // Update if global setting is on, individual settings is on, or not set and default is on.
193
+ if ( ! empty( $themeAutoupdate ) ||
194
+ ! empty( $this->settings['themes'][ $item->theme ] ) ||
195
+ ( ! isset( $this->settings['themes'][ $item->theme ] ) &&
196
+ ! empty( $this->settings['themes']['default'] ) ) ) {
197
+ $update = true;
198
+ }
199
+
200
+ return $update;
201
  }
202
  }
vendor/boldgrid/library/src/Library/Views/Connect.php CHANGED
@@ -1,6 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <div class="wrap">
2
  <h1>BoldGrid Connect</h1>
3
- <div class="card connect-key-management">
4
- <div class="connect-key-prompt"></div>
5
- </div>
6
  </div>
1
+ <?php
2
+ /**
3
+ * File: Connect.php
4
+ *
5
+ * @package Boldgrid\Library
6
+ * @subpackage Library\Views
7
+ * @version 2.4.0
8
+ * @author BoldGrid <support@boldgrid.com>
9
+ */
10
+
11
+ // Build markup container.
12
+ $sections = array(
13
+ 'sections' => array(
14
+ array(
15
+ 'id' => 'section_connect_key',
16
+ 'title' => __( 'BoldGrid Connect Key', 'boldgrid-connect' ),
17
+ 'content' => include __DIR__ . '/Connect/ConnectKey.php',
18
+ ),
19
+ ),
20
+ 'post_col_right' => '
21
+ <div id="settings-notice" class="notice notice-success is-dismissible inline"></div>
22
+ <p class="submit">
23
+ <input name="submit" id="submit" class="button button-primary" value="' .
24
+ esc_attr( 'Save Changes', 'boldgrid-connect' ) . '" type="submit">
25
+ <span class="spinner"></span>
26
+ </p>
27
+ ',
28
+ );
29
+
30
+ array_push( $sections['sections'], array(
31
+ 'id' => 'section_update_channels',
32
+ 'title' => __( 'Update Channels', 'boldgrid-connect' ),
33
+ 'content' => include __DIR__ . '/Connect/UpdateChannels.php',
34
+ ) );
35
+
36
+ /**
37
+ * Render sections into markup.
38
+ *
39
+ * @since 2.7.0
40
+ *
41
+ * @param array $sections
42
+ *
43
+ * phpcs:disable WordPress.NamingConventions.ValidHookName
44
+ */
45
+ if ( ! has_filter( 'Boldgrid\Library\Ui\render_col_container' ) ) {
46
+ $ui = new \Boldgrid\Library\Library\Ui();
47
+ $ui->enqueue();
48
+ add_filter( 'Boldgrid\Library\Ui\render_col_container' , array( $ui, 'render_col_container' ) );
49
+ }
50
+
51
+ $container = apply_filters( 'Boldgrid\Library\Ui\render_col_container', $sections );
52
+
53
+ if ( is_array( $container ) ) {
54
+ $container = '<div class="notice notice-error inline">' .
55
+ __( 'Unable to display settings page. Unknown BoldGrid Library error.', 'boldgrid-connect' ) .
56
+ '</div>';
57
+ } else {
58
+ // Enqueue styles and scripts (registered in "\Boldgrid\Library\Ui::enqueue()").
59
+ wp_enqueue_style( 'bglib-ui-css' );
60
+ wp_enqueue_script( 'bglib-ui-js' );
61
+ wp_enqueue_script( 'bglib-sticky' );
62
+ wp_nonce_field( 'boldgrid_library_connect_settings_save' );
63
+ }
64
+
65
+ // Display page.
66
+ ?>
67
  <div class="wrap">
68
  <h1>BoldGrid Connect</h1>
69
+ <?php
70
+ echo $container; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
71
+ ?>
72
  </div>
vendor/boldgrid/library/src/Library/Views/Connect/AutoUpdates.php ADDED
@@ -0,0 +1,358 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File: Connect.php
4
+ *
5
+ * @package Boldgrid\Library
6
+ * @subpackage Library\Views
7
+ * @version 2.5.0
8
+ * @author BoldGrid <support@boldgrid.com>
9
+ */
10
+
11
+ // Get BoldGrid settings.
12
+ \Boldgrid\Library\Util\Option::init();
13
+ $autoupdateSettings = \Boldgrid\Library\Util\Option::get( 'autoupdate' );
14
+ $pluginsDefault = ! empty( $autoupdateSettings['plugins']['default'] );
15
+ $themesDefault = ! empty( $autoupdateSettings['themes']['default'] );
16
+
17
+ // Get BoldGrid Backup settings.
18
+ $boldgridBackupSettings = get_site_option( 'boldgrid_backup_settings', array() );
19
+
20
+ // Get deprecated settings.
21
+ $pluginAutoupdate = (bool) \Boldgrid\Library\Util\Option::get( 'plugin_autoupdate' );
22
+ $themeAutoupdate = (bool) \Boldgrid\Library\Util\Option::get( 'theme_autoupdate' );
23
+
24
+ // Get WordPress Core auto-update setting.
25
+ $wpcoreAutoupdates = ! empty( $autoupdateSettings['wpcore'] ) ?
26
+ $autoupdateSettings['wpcore'] : array();
27
+ $wpcoreMajor = ! empty( $wpcoreAutoupdates['major'] );
28
+ $wpcoreMinor = ! isset( $wpcoreAutoupdates['minor'] ) || $wpcoreAutoupdates['minor'];
29
+ $wpcoreDev = ! empty( $wpcoreAutoupdates['dev'] );
30
+ $wpcoreTranslation = ! empty( $wpcoreAutoupdates['translation'] );
31
+ $wpcoreAll = ! empty( $wpcoreAutoupdates['all'] ) ||
32
+ ( $wpcoreMajor && $wpcoreMinor && $wpcoreDev && $wpcoreTranslation );
33
+ $translations = array(
34
+ 'active' => esc_attr__( 'Active', 'boldgrid-connect' ),
35
+ 'inactive' => esc_attr__( 'Inactive', 'boldgrid-connect' ),
36
+ 'parent' => esc_attr__( 'Parent', 'boldgrid-connect' ),
37
+ );
38
+ $return = '';
39
+ $helpMarkup = sprintf(
40
+ // translators: 1: HTML anchor open tag, 2: HTML anchor close tag.
41
+ esc_html__(
42
+ 'Automatically perform WordPress core, plugin, and theme updates. This feature utilizes %1$sWordPress filters%2$s, which enables automatic updates as they become available.',
43
+ 'boldgrid-backup'
44
+ ),
45
+ '<a target="_blank" href="https://codex.wordpress.org/Configuring_Automatic_Background_Updates">',
46
+ '</a>'
47
+ );
48
+
49
+ if ( empty( $boldgridBackupSettings['auto_backup'] ) ) {
50
+ $bbsLinkOpen = '';
51
+ $bbsLinkClose = '';
52
+
53
+ if ( empty( $_GET['page'] ) || 'boldgrid-backup-settings' !== $_GET['page'] ) {
54
+ $bbsLinkOpen = '<a href="' . admin_url( 'admin.php?page=boldgrid-backup-settings&section=section_auto_rollback' ) . '">';
55
+ $bbsLinkClose = '</a>';
56
+ }
57
+
58
+ $return .= '
59
+ <div><p>' .
60
+ sprintf(
61
+ // translators: 1: HTML anchor open tag, 2: HTML anchor close tag, 3: HTML em open tag, 4: HTML em close tag..
62
+ esc_html__(
63
+ 'You have %3$sAuto-Backup%4$s disabled in the %1$sBoldGrid Backup Settings%2$s. Please consider enabling the setting.',
64
+ 'boldgrid-backup'
65
+ ),
66
+ $bbsLinkOpen,
67
+ $bbsLinkClose,
68
+ '<em>',
69
+ '</em>'
70
+ ) .
71
+ '</p></div>' . PHP_EOL;
72
+ }
73
+
74
+ $return .= '
75
+ <div class="bg-box">
76
+ <div class="bg-box-top">
77
+ ' . esc_html__( 'WordPress Core', 'boldgrid-connect' ) . '
78
+ <span class="dashicons dashicons-editor-help" data-id="core-autoupdate"></span>
79
+ </div>
80
+ <div class="bg-box-bottom">
81
+ <p class="help" data-id="core-autoupdate">' . $helpMarkup . '</p>
82
+
83
+ <div class="auto-update-management div-table">
84
+ <div class="auto-update-settings div-table-body">
85
+ <div class="div-table-row">
86
+ <div class="div-tableCell">
87
+ <div class="div-table"><div class="div-table-body">
88
+ <div class="div-table-row">
89
+ <div class="div-tableCell">' .
90
+ esc_html__( 'All Update Types', 'boldgrid-connect' ) . '</div>
91
+ <div class="toggle toggle-light toggle-group wpcore-toggle"
92
+ data-wpcore="all"
93
+ data-toggle-on="' . ( $wpcoreAll ? 'true' : 'false' ) . '">
94
+ </div>
95
+ <input type="hidden" name="autoupdate[wpcore][all]"
96
+ value="' . ( $wpcoreAll ? 1 : 0 ) . '" />
97
+ </div>
98
+ <div class="div-table-row"><br /></div>
99
+ <div class="div-table-row">
100
+ <div class="div-tableCell">' .
101
+ esc_html__( 'Major Updates', 'boldgrid-connect' ) . '</div>
102
+ <div class="toggle toggle-light wpcore-toggle"
103
+ data-wpcore="major"
104
+ data-toggle-on="' . ( $wpcoreMajor ? 'true' : 'false' ) . '">
105
+ </div>
106
+ <input type="hidden" name="autoupdate[wpcore][major]"
107
+ value="' . ( $wpcoreMajor ? 1 : 0 ) . '" />
108
+ </div>
109
+ <div class="div-table-row">
110
+ <div class="div-tableCell">' .
111
+ esc_html__( 'Minor Updates', 'boldgrid-connect' ) . '</div>
112
+ <div class="toggle toggle-light wpcore-toggle"
113
+ data-wpcore="minor"
114
+ data-toggle-on="' . ( $wpcoreMinor ? 'true' : 'false' ) . '">
115
+ </div>
116
+ <input type="hidden" name="autoupdate[wpcore][minor]"
117
+ value="' . ( $wpcoreMinor ? 1 : 0 ) . '" />
118
+ </div>
119
+ <div class="div-table-row">
120
+ <div class="div-tableCell">' .
121
+ esc_html__( 'Development Updates', 'boldgrid-connect' ) . '</div>
122
+ <div class="toggle toggle-light wpcore-toggle"
123
+ data-wpcore="dev"
124
+ data-toggle-on="' . ( $wpcoreDev ? 'true' : 'false' ) . '">
125
+ </div>
126
+ <input type="hidden" name="autoupdate[wpcore][dev]"
127
+ value="' . ( $wpcoreDev ? 1 : 0 ) . '" />
128
+ </div>
129
+ <div class="div-table-row">
130
+ <div class="div-tableCell">' .
131
+ esc_html__( 'Translation Updates', 'boldgrid-connect' ) . '</div>
132
+ <div class="toggle toggle-light wpcore-toggle"
133
+ data-wpcore="translation"
134
+ data-toggle-on="' . ( $wpcoreTranslation ? 'true' : 'false' ) . '">
135
+ </div>
136
+ <input type="hidden" name="autoupdate[wpcore][translation]"
137
+ value="' . ( $wpcoreTranslation ? 1 : 0 ) . '" />
138
+ </div>
139
+ </div></div>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ </div>
144
+
145
+ </div>
146
+ </div>
147
+
148
+ <div class="bg-box">
149
+ <div class="bg-box-top">
150
+ ' . esc_html__( 'Plugins', 'boldgrid-connect' ) . '
151
+ <span class="dashicons dashicons-editor-help" data-id="plugins-autoupdate"></span>
152
+ </div>
153
+ <div class="bg-box-bottom">
154
+ <p class="help" data-id="plugins-autoupdate">' . $helpMarkup . '</p>
155
+
156
+ <div class="auto-update-management div-table">
157
+ <div class="auto-update-settings div-table-body">
158
+ <div class="div-table-row">
159
+ <div class="div-tableCell">
160
+
161
+ <div class="div-table"><div class="div-table-body">
162
+ <div class="div-table-row">
163
+ <div class="div-tableCell">' .
164
+ esc_html__( 'Default for New Plugins', 'boldgrid-connect' ) . '</div>
165
+ <div class="div-tableCell">
166
+ <div class="toggle toggle-light" id="toggle-default-plugins"
167
+ data-toggle-on="' . ( $pluginsDefault ? 'true' : 'false' ) . '">
168
+ </div>
169
+ </div>
170
+ <input type="hidden" name="autoupdate[plugins][default]"
171
+ value="' . ( $pluginsDefault ? 1 : 0 ) . '" />
172
+ </div>
173
+ <div class="div-table-row"><br /></div>
174
+ <div class="div-table-row">
175
+ <div class="div-tableCell">' .
176
+ esc_html__( 'All Plugins', 'boldgrid-connect' ) . '</div>
177
+ <div class="div-tableCell">
178
+ <div class="toggle toggle-light toggle-group" id="toggle-plugins"></div>
179
+ </div>
180
+ </div>
181
+ ';
182
+
183
+ $plugins = get_plugins();
184
+
185
+ // Split into groups: active/inactive.
186
+ $pluginsActive = array();
187
+ $pluginsInactive = array();
188
+
189
+ foreach ( $plugins as $slug => $pluginData ) {
190
+ if ( is_plugin_active( $slug ) ) {
191
+ $pluginsActive[ $slug ] = $pluginData;
192
+ } else {
193
+ $pluginsInactive[ $slug ] = $pluginData;
194
+ }
195
+ }
196
+
197
+ $statuses = array(
198
+ 'Active',
199
+ 'Inactive',
200
+ );
201
+
202
+ foreach ( $statuses as $status ) {
203
+ $statusLower = strtolower( $status );
204
+
205
+ $return .= '<div class="div-table-contents">
206
+ <div class="div-table-row bglib-collapsible-control' . ( 'Inactive' !== $status ?
207
+ ' bglib-collapsible-open' : '' ) . '">
208
+ <div class="div-tableCell"><h3>' . $translations[ $statusLower ] . '</h3></div>
209
+ <div class="div-tableCell">
210
+ <span class="dashicons dashicons-arrow-down-alt2 bglib-collapsible-' . $statusLower . '"></span>
211
+ </div>
212
+ </div>
213
+ ';
214
+
215
+ foreach ( ${ 'plugins' . $status } as $slug => $pluginData ) {
216
+ // Enable if global setting is on, individual settings is on, or not set and default is on.
217
+ $toggle = $pluginAutoupdate || ! empty( $autoupdateSettings['plugins'][ $slug ] ) ||
218
+ ( ! isset( $autoupdateSettings['plugins'][ $slug ] ) && $pluginsDefault );
219
+
220
+ $return .= '
221
+ <div class="div-table-row plugin-update-setting bglib-collapsible">
222
+ <div class="div-tableCell">' . $pluginData['Name'] . '</div>
223
+ <div class="div-tableCell">
224
+ <div class="toggle toggle-light plugin-toggle"
225
+ data-plugin="' . $slug . '"
226
+ data-toggle-on="' . ( $toggle ? 'true' : 'false' ) . '">
227
+ </div>
228
+ </div>
229
+ <input type="hidden" name="autoupdate[plugins][' . $slug . ']"
230
+ value="' . ( $toggle ? 1 : 0 ) . '" />
231
+ </div>
232
+ ';
233
+ }
234
+ $return .= '</div>
235
+ ';
236
+ }
237
+
238
+ $return .= '
239
+ </div></div>
240
+ </div>
241
+ </div>
242
+ </div>
243
+ </div>
244
+
245
+ </div>
246
+ </div>
247
+
248
+ <div class="bg-box">
249
+ <div class="bg-box-top">
250
+ ' . esc_html__( 'Themes', 'boldgrid-connect' ) . '
251
+ <span class="dashicons dashicons-editor-help" data-id="themes-autoupdate"></span>
252
+ </div>
253
+ <div class="bg-box-bottom">
254
+ <p class="help" data-id="themes-autoupdate">' . $helpMarkup . '</p>
255
+
256
+ <div class="auto-update-management div-table">
257
+ <div class="auto-update-settings div-table-body">
258
+ <div class="div-table-row">
259
+ <div class="div-tableCell">
260
+
261
+ <div class="div-table"><div class="div-table-body">
262
+ <div class="div-table-row">
263
+ <div class="div-tableCell">' .
264
+ esc_html__( 'Default for New Themes', 'boldgrid-connect' ) . '</div>
265
+ <div class="div-tableCell">
266
+ <div class="toggle toggle-light" id="toggle-default-themes"
267
+ data-toggle-on="' . ( $themesDefault ? 'true' : 'false' ) . '">
268
+ </div>
269
+ </div>
270
+ <input type="hidden" name="autoupdate[themes][default]"
271
+ value="' . ( 'true' === $themesDefault ? 1 : 0 ) . '" />
272
+ </div>
273
+ <div class="div-table-row"><br /></div>
274
+ <div class="div-table-row">
275
+ <div class="div-tableCell">' .
276
+ esc_html__( 'All Themes', 'boldgrid-connect' ) . '</div>
277
+ <div class="div-tableCell">
278
+ <div class="toggle toggle-light toggle-group" id="toggle-themes"></div>
279
+ </div>
280
+ </div>
281
+ ';
282
+
283
+ $activeStylesheet = get_option( 'stylesheet' );
284
+ $activeTemplate = get_option( 'template' );
285
+ $themes = wp_get_themes();
286
+
287
+ // Split into groups: active/inactive.
288
+ $themesActive = array();
289
+ $themesInactive = array();
290
+
291
+ foreach ( $themes as $stylesheet => $theme ) {
292
+ $isActive = $stylesheet === $activeStylesheet;
293
+ $isParent = ( $activeStylesheet !== $activeTemplate && $stylesheet === $activeTemplate );
294
+
295
+ if ( $isActive || $isParent ) {
296
+ $themesActive[ $stylesheet ] = $theme;
297
+ } else {
298
+ $themesInactive[ $stylesheet ] = $theme;
299
+ }
300
+ }
301
+
302
+ $statuses = array(
303
+ 'Active',
304
+ 'Inactive',
305
+ );
306
+
307
+ foreach ( $statuses as $status ) {
308
+ $statusLower = strtolower( $status );
309
+
310
+ $return .= '<div class="div-table-contents">
311
+ <div class="div-table-row bglib-collapsible-control' . ( 'Inactive' !== $status ?
312
+ ' bglib-collapsible-open' : '' ) . '">
313
+ <div class="div-tableCell"><h3>' . $translations[ $statusLower ] . '</h3></div>
314
+ <div class="div-tableCell">
315
+ <span class="dashicons dashicons-arrow-down-alt2 bglib-collapsible-' . $statusLower .'"></span>
316
+ </div>
317
+ </div>
318
+ ';
319
+
320
+ foreach ( ${ 'themes' . $status } as $stylesheet => $theme ) {
321
+ $isParent = ( $activeStylesheet !== $activeTemplate && $stylesheet === $activeTemplate );
322
+
323
+ // Enable if global setting is on, individual settings is on, or not set and default is on.
324
+ $toggle = $themeAutoupdate || ! empty( $autoupdateSettings['themes'][ $stylesheet ] ) ||
325
+ ( ! isset( $autoupdateSettings['themes'][ $stylesheet ] ) && $themesDefault );
326
+
327
+ $return .= '
328
+ <div class="div-table-row theme-update-setting bglib-collapsible">
329
+ <div class="div-tableCell">' . $theme->get( 'Name' ) .
330
+ ( $isParent ? ' (' . $translations['parent'] . ')' : '' ) . '</div>
331
+ <div class="div-tableCell">
332
+ <div class="toggle toggle-light theme-toggle"
333
+ data-stylesheet="' . $stylesheet . '"
334
+ data-toggle-on="' . ( $toggle ? 'true' : 'false' ) . '">
335
+ </div>
336
+ </div>
337
+ <input type="hidden" name="autoupdate[themes][' . $stylesheet . ']"
338
+ value="' . ( $toggle ? 1 : 0 ) . '" />
339
+ </div>
340
+ ';
341
+ }
342
+
343
+ $return .= '</div>
344
+ ';
345
+ }
346
+
347
+ $return .= '
348
+ </div></div>
349
+ </div>
350
+ </div>
351
+ </div>
352
+ </div>
353
+
354
+ </div>
355
+ </div>
356
+ ';
357
+
358
+ return $return;
vendor/boldgrid/library/src/Library/Views/Connect/ConnectKey.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File: ConnectKey.php
4
+ *
5
+ * @package Boldgrid\Library
6
+ * @subpackage Library\Views
7
+ * @version 2.5.0
8
+ * @author BoldGrid <support@boldgrid.com>
9
+ */
10
+
11
+ return '
12
+ <div class="card connect-key-management">
13
+ <div class="connect-key-prompt"></div>
14
+ </div>
15
+ ';
vendor/boldgrid/library/src/Library/Views/Connect/UpdateChannels.php ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File: UpdateChannels.php
4
+ *
5
+ * @package Boldgrid\Library
6
+ * @subpackage Library\Views
7
+ * @version 2.5.0
8
+ * @author BoldGrid <support@boldgrid.com>
9
+ */
10
+
11
+ // Get settings.
12
+ \Boldgrid\Library\Util\Option::init();
13
+ $pluginReleaseChannel = \Boldgrid\Library\Util\Option::get( 'release_channel' );
14
+ $themeReleaseChannel = \Boldgrid\Library\Util\Option::get( 'theme_release_channel' );
15
+
16
+ // Validate release channel settings.
17
+ $channels = array(
18
+ 'stable',
19
+ 'edge',
20
+ 'candidate',
21
+ );
22
+
23
+ if ( ! in_array( $pluginReleaseChannel, $channels, true ) ) {
24
+ $pluginReleaseChannel = 'stable';
25
+ }
26
+
27
+ if ( ! in_array( $themeReleaseChannel, $channels, true ) ) {
28
+ $themeReleaseChannel = 'stable';
29
+ }
30
+
31
+ $showCandidateChoice = false;
32
+
33
+ if ( 'candidate' === $pluginReleaseChannel || 'candidate' === $themeReleaseChannel ||
34
+ ! empty( $_GET['channels'] ) ) {
35
+ $showCandidateChoice = true;
36
+ }
37
+
38
+ $helpMarkup = esc_html__(
39
+ 'Update release channels determine which versions are retrieved from the BoldGrid Connect system.',
40
+ 'boldgrid-backup'
41
+ );
42
+
43
+ $return = '
44
+ <div class="bg-box">
45
+ <div class="bg-box-top">
46
+ ' . esc_html__( 'Plugins', 'boldgrid-connect' ) . '
47
+ <span class="dashicons dashicons-editor-help" data-id="plugins-update-channels"></span>
48
+ </div>
49
+ <div class="bg-box-bottom">
50
+
51
+ <p class="help" data-id="plugins-update-channels">' . $helpMarkup . '</p>
52
+
53
+ <div class="auto-update-management div-table">
54
+ <div class="auto-update-settings div-table-body">
55
+ <div class="div-table-row">
56
+ <div class="div-tableCell">
57
+ <div class="div-table"><div class="div-table-body">
58
+ <div class="div-table-row plugin-update-channel">
59
+ <div class="div-tableCell">
60
+ <input type="radio" name="plugin_release_channel" value="stable"';
61
+
62
+ if ( 'stable' === $pluginReleaseChannel ) {
63
+ $return .= ' checked="checked"';
64
+ }
65
+
66
+ $return .= '> Stable
67
+ </div>
68
+ <div class="div-tableCell">
69
+ <input type="radio" name="plugin_release_channel" value="edge"';
70
+
71
+ if ( 'edge' === $pluginReleaseChannel ) {
72
+ $return .= ' checked="checked"';
73
+ }
74
+
75
+ $return .='> Edge
76
+ </div>
77
+ ';
78
+
79
+ if ( $showCandidateChoice ) {
80
+ $return .='
81
+ <div class="div-tableCell">
82
+ <input type="radio" name="plugin_release_channel" value="candidate"';
83
+
84
+ if ( 'candidate' === $pluginReleaseChannel ) {
85
+ $return .= ' checked="checked"';
86
+ }
87
+
88
+ $return .= '> Candidate
89
+ </div>
90
+ ';
91
+ }
92
+
93
+ $return .= '
94
+ </div>
95
+ </div></div>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </div>
100
+
101
+ </div>
102
+ </div>
103
+
104
+ <div class="bg-box">
105
+ <div class="bg-box-top">
106
+ ' . esc_html__( 'Themes', 'boldgrid-connect' ) . '
107
+ <span class="dashicons dashicons-editor-help" data-id="themes-update-channels"></span>
108
+ </div>
109
+ <div class="bg-box-bottom">
110
+
111
+ <p class="help" data-id="themes-update-channels">' . $helpMarkup . '</p>
112
+
113
+ <div class="auto-update-management div-table">
114
+ <div class="auto-update-settings div-table-body">
115
+ <div class="div-table-row">
116
+ <div class="div-tableCell">
117
+ <div class="div-table"><div class="div-table-body">
118
+ <div class="div-table-row theme-update-channel">
119
+ <div class="div-tableCell">
120
+ <input type="radio" name="theme_release_channel" value="stable"';
121
+
122
+ if ( 'stable' === $themeReleaseChannel ) {
123
+ $return .= ' checked="checked"';
124
+ }
125
+
126
+ $return .= '> Stable
127
+ </div>
128
+ <div class="div-tableCell">
129
+ <input type="radio" name="theme_release_channel" value="edge"';
130
+
131
+ if ( 'edge' === $themeReleaseChannel ) {
132
+ $return .= ' checked="checked"';
133
+ }
134
+
135
+ $return .= '> Edge
136
+ </div>
137
+ ';
138
+
139
+ if ( $showCandidateChoice ) {
140
+ $return .= '
141
+ <div class="div-tableCell">
142
+ <input type="radio" name="theme_release_channel" value="candidate"';
143
+
144
+ if ( 'candidate' === $themeReleaseChannel ) {
145
+ $return .= ' checked="checked"';
146
+ }
147
+
148
+ $return .= '> Candidate
149
+ </div>
150
+ ';
151
+ }
152
+
153
+ $return .= '
154
+ </div>
155
+ </div></div>
156
+ </div>
157
+ </div>
158
+ </div>
159
+ </div>
160
+
161
+ </div>
162
+ </div>
163
+ ';
164
+
165
+ return $return;
vendor/boldgrid/library/src/Library/Views/EnvatoFreeKey.php CHANGED
@@ -1,12 +1,12 @@
1
  <!-- User has free key entered and should claim their free key -->
2
  <div class="envato-claim-message">
3
  <p>
4
- <?php _e( 'Thank you for your Envato Market purchase. You currently have a Free Connect Key entered,
5
- but your Envato purchase entitles you to a Premium Connect Key.' ) ?>
6
  </p>
7
  <p>
8
  <?php printf( __( 'Please visit %sBoldGrid Central%s
9
- to link your accounts and claim your Premium Connect Key.' ),
10
  '<a target="_blank" href="https://www.boldgrid.com/central/code/envato">',
11
  '</a>' ) ?>
12
  </p>
1
  <!-- User has free key entered and should claim their free key -->
2
  <div class="envato-claim-message">
3
  <p>
4
+ <?php esc_html_e( 'Thank you for your Envato Market purchase. You currently have a Free Connect Key entered,
5
+ but your Envato purchase entitles you to a Premium Connect Key.', 'boldgrid-connect' ) ?>
6
  </p>
7
  <p>
8
  <?php printf( __( 'Please visit %sBoldGrid Central%s
9
+ to link your accounts and claim your Premium Connect Key.', 'boldgrid-connect' ),
10
  '<a target="_blank" href="https://www.boldgrid.com/central/code/envato">',
11
  '</a>' ) ?>
12
  </p>
vendor/boldgrid/library/src/Library/Views/KeyPrompt.php CHANGED
@@ -5,51 +5,51 @@
5
  >
6
  <div class="premium-key-active key-entry-message">
7
  <h2 class="dashicons-before dashicons-admin-network">
8
- <?php esc_html_e( 'Premium BoldGrid Connect Key', 'boldgrid-inspirations' )?></h2>
9
  <p>
10
- <?php esc_html_e( 'Awesome! You have Premium Connect Key saved on this site.' ) ?>
11
  </p>
12
  <p>
13
- <?php printf( esc_html__( 'Make sure you\'re getting the most out of your premium subscription by installing our other %sBoldGrid plugins%s. As a Premium user, you also have unlimited access to %sCloud WordPress%s where you can create new WordPress sites for free. If you need any help, our support team is eager to serve!', 'boldgrid-inspirations' ),
14
  '<a href="https://www.boldgrid.com/wordpress-plugins/" target="_blank">', '</a>',
15
- '<a href="https://www.boldgrid.com/central/get-it-now" target="_blank">', '</a>'
16
  ) ?>
17
  </p>
18
- <p class='change-key'><a href="#" data-action="change-connect-key"><?php _e( 'Click here to change your Connect Key' ) ?></a></p>
19
  </div>
20
  <div class="basic-key-active key-entry-message">
21
  <h2 class="dashicons-before dashicons-admin-network">
22
- <?php esc_html_e( 'Free BoldGrid Connect Key', 'boldgrid-inspirations' )?></h2>
23
 
24
  <?php if ( ! $enableClaimMessage ) { ?>
25
  <p>
26
- <?php esc_html_e( 'Thank you for adding your Connect Key. Try upgrading to a Premium subscription for full access to BoldGrid!', 'boldgrid-inspirations' ); ?>
27
  </p>
28
  <p><a target="_blank" href="https://www.boldgrid.com/connect-keys?source=library-prompt"
29
- class="button button-primary"><?php _e( 'Upgrade' ) ?></a>
30
  </p>
31
  <?php } else {
32
  include __DIR__ . '/EnvatoFreeKey.php';
33
  } ?>
34
- <p class='change-key'><a href="#" data-action="change-connect-key"><?php _e( 'Click here to change your Connect Key' ) ?></a></p>
35
  </div>
36
  <div class="api-notice">
37
  <h2 class="dashicons-before dashicons-admin-network">
38
- <?php esc_html_e( 'Enter Your BoldGrid Connect Key', 'boldgrid-inspirations' ); ?>
39
  </h2>
40
  <p id="boldgrid_api_key_notice_message">
41
- <?php printf( esc_html__( 'Please enter your %s32 digit BoldGrid Connect Key%s below and click submit.', 'boldgrid-inspirations' ), '<b>', '</b>' ); ?>
42
  </p>
43
  <form id="boldgrid-api-form" autocomplete="off">
44
  <?php wp_nonce_field( 'boldgrid_set_key', 'set_key_auth' ); ?>
45
  <div class="tos-box">
46
  <label><input id="tos-box" type="checkbox" value="0">
47
- <?php printf( esc_html__( 'I agree to the %sTerms of Use and Privacy Policy%s.', 'boldgrid-inspirations' ), '<a href="https://www.boldgrid.com/software-privacy-policy/" target="_blank">', '</a>' ); ?></label>
48
  </div>
49
  <br />
50
  <input type="text" id="boldgrid_api_key" maxlength="37" placeholder="XXXXXXXX - XXXXXXXX - XXXXXXXX - XXXXXXXX" autocomplete="off" />
51
  <button id="submit_api_key" class="button button-primary">
52
- <?php esc_html_e( 'Submit', 'boldgrid-inspirations' ); ?>
53
  </button>
54
  <span>
55
  <div id="boldgrid-api-loading" class="boldgrid-wp-spin"></div>
@@ -63,7 +63,7 @@
63
  ?>
64
  <p><a href="#" class="boldgridApiKeyLink">
65
  <?php
66
- esc_html_e( 'Don\'t have a Connect Key yet or lost your Key?', 'boldgrid-inspirations' );
67
  ?>
68
  </a></p>
69
  <?php } ?>
@@ -74,10 +74,10 @@
74
  ?>
75
  <div class="new-api-key hidden">
76
  <h2 class="dashicons-before dashicons-admin-network">
77
- <?php esc_html_e( 'Request a BoldGrid Connect Key', 'boldgrid-inspirations' ); ?>
78
  </h2>
79
  <a href="#" class="enterKeyLink">
80
- <?php esc_html_e( 'Have a Connect Key to enter?', 'boldgrid-inspirations' ); ?>
81
  </a>
82
  <br />
83
  <br />
@@ -90,7 +90,7 @@
90
  If you do not have a Premium Connect Key, then you may request a free key below.
91
  Please visit %sour site%s for full details.%s
92
  If you have lost your key, you can have it resent by entering your information below.',
93
- 'boldgrid-inspirations'
94
  ),
95
  '<b>',
96
  '</b>',
@@ -103,22 +103,22 @@
103
  <p class="error-alerts"></p>
104
  <form id="requestKeyForm">
105
  <label>
106
- <?php esc_html_e( 'First Name', 'boldgrid-inspirations' ); ?>:
107
  </label>
108
- <input type="text" id="firstName" maxlength="50" placeholder="<?php esc_html_e( 'First Name', 'boldgrid-inspirations' ); ?>" value="<?php echo esc_attr( $first_name ); ?>" />
109
  <label>
110
- <?php esc_html_e( 'Last Name', 'boldgrid-inspirations' ); ?>:
111
  </label>
112
- <input type="text" id="lastName" maxlength="50" placeholder="<?php esc_html_e( 'Last Name', 'boldgrid-inspirations' ); ?>" value="<?php echo esc_attr( $last_name ); ?>" />
113
  <label>
114
- <?php esc_html_e( 'E-mail', 'boldgrid-inspirations' ); ?>:
115
  </label>
116
  <input type="text" id="emailAddr" maxlength="50" placeholder="your@name.com" value="<?php echo esc_attr( $email ); ?>" />
117
  <br />
118
  <input type="hidden" id="siteUrl" value="<?php echo get_admin_url(); ?>" />
119
  <br />
120
  <button id="requestKey" class="button button-primary">
121
- <?php esc_html_e( 'Submit', 'boldgrid-inspirations' ); ?>
122
  </button>
123
  <span class="spinner"></span>
124
  <input type="hidden" id="generate-api-key" value="<?php echo esc_attr( $api ); ?>" />
5
  >
6
  <div class="premium-key-active key-entry-message">
7
  <h2 class="dashicons-before dashicons-admin-network">
8
+ <?php esc_html_e( 'Premium BoldGrid Connect Key', 'boldgrid-connect' )?></h2>
9
  <p>
10
+ <?php esc_html_e( 'Awesome! You have a Premium Connect Key saved on this site.', 'boldgrid-connect' ) ?>
11
  </p>
12
  <p>
13
+ <?php printf( esc_html__( 'Make sure you\'re getting the most out of your premium subscription by installing our other %sBoldGrid plugins%s. As a Premium user, you also have access to %sCloud WordPress%s where you can create new WordPress sites for free. If you need any help, our support team is eager to serve!', 'boldgrid-connect' ),
14
  '<a href="https://www.boldgrid.com/wordpress-plugins/" target="_blank">', '</a>',
15
+ '<a href="https://www.boldgrid.com/central/" target="_blank">', '</a>'
16
  ) ?>
17
  </p>
18
+ <p class='change-key'><a href="#" data-action="change-connect-key"><?php _e( 'Click here to change your Connect Key', 'boldgrid-connect' ) ?></a></p>
19
  </div>
20
  <div class="basic-key-active key-entry-message">
21
  <h2 class="dashicons-before dashicons-admin-network">
22
+ <?php esc_html_e( 'Free BoldGrid Connect Key', 'boldgrid-connect' )?></h2>
23
 
24
  <?php if ( ! $enableClaimMessage ) { ?>
25
  <p>
26
+ <?php esc_html_e( 'Thank you for adding your Connect Key. Try upgrading to a Premium subscription for full access to BoldGrid!', 'boldgrid-connect' ); ?>
27
  </p>
28
  <p><a target="_blank" href="https://www.boldgrid.com/connect-keys?source=library-prompt"
29
+ class="button button-primary"><?php esc_html_e( 'Upgrade', 'boldgrid-connect' ) ?></a>
30
  </p>
31
  <?php } else {
32
  include __DIR__ . '/EnvatoFreeKey.php';
33
  } ?>
34
+ <p class='change-key'><a href="#" data-action="change-connect-key"><?php _e( 'Click here to change your Connect Key', 'boldgrid-connect' ) ?></a></p>
35
  </div>
36
  <div class="api-notice">
37
  <h2 class="dashicons-before dashicons-admin-network">
38
+ <?php esc_html_e( 'Enter Your BoldGrid Connect Key', 'boldgrid-connect' ); ?>
39
  </h2>
40
  <p id="boldgrid_api_key_notice_message">
41
+ <?php printf( esc_html__( 'Please enter your %s32 digit BoldGrid Connect Key%s below and click submit.', 'boldgrid-connect' ), '<b>', '</b>' ); ?>
42
  </p>
43
  <form id="boldgrid-api-form" autocomplete="off">
44
  <?php wp_nonce_field( 'boldgrid_set_key', 'set_key_auth' ); ?>
45
  <div class="tos-box">
46
  <label><input id="tos-box" type="checkbox" value="0">
47
+ <?php printf( esc_html__( 'I agree to the %sTerms of Use and Privacy Policy%s.', 'boldgrid-connect' ), '<a href="https://www.boldgrid.com/software-privacy-policy/" target="_blank">', '</a>' ); ?></label>
48
  </div>
49
  <br />
50
  <input type="text" id="boldgrid_api_key" maxlength="37" placeholder="XXXXXXXX - XXXXXXXX - XXXXXXXX - XXXXXXXX" autocomplete="off" />
51
  <button id="submit_api_key" class="button button-primary">
52
+ <?php esc_html_e( 'Submit', 'boldgrid-connect' ); ?>
53
  </button>
54
  <span>
55
  <div id="boldgrid-api-loading" class="boldgrid-wp-spin"></div>
63
  ?>
64
  <p><a href="#" class="boldgridApiKeyLink">
65
  <?php
66
+ esc_html_e( 'Don\'t have a Connect Key yet or lost your Key?', 'boldgrid-connect' );
67
  ?>
68
  </a></p>
69
  <?php } ?>
74
  ?>
75
  <div class="new-api-key hidden">
76
  <h2 class="dashicons-before dashicons-admin-network">
77
+ <?php esc_html_e( 'Request a BoldGrid Connect Key', 'boldgrid-connect' ); ?>
78
  </h2>
79
  <a href="#" class="enterKeyLink">
80
+ <?php esc_html_e( 'Have a Connect Key to enter?', 'boldgrid-connect' ); ?>
81
  </a>
82
  <br />
83
  <br />
90
  If you do not have a Premium Connect Key, then you may request a free key below.
91
  Please visit %sour site%s for full details.%s
92
  If you have lost your key, you can have it resent by entering your information below.',
93
+ 'boldgrid-connect'
94
  ),
95
  '<b>',
96
  '</b>',
103
  <p class="error-alerts"></p>
104
  <form id="requestKeyForm">
105
  <label>
106
+ <?php esc_html_e( 'First Name', 'boldgrid-connect' ); ?>:
107
  </label>
108
+ <input type="text" id="firstName" maxlength="50" placeholder="<?php esc_html_e( 'First Name', 'boldgrid-connect' ); ?>" value="<?php echo esc_attr( $first_name ); ?>" />
109
  <label>
110
+ <?php esc_html_e( 'Last Name', 'boldgrid-connect' ); ?>:
111
  </label>
112
+ <input type="text" id="lastName" maxlength="50" placeholder="<?php esc_html_e( 'Last Name', 'boldgrid-connect' ); ?>" value="<?php echo esc_attr( $last_name ); ?>" />
113
  <label>
114
+ <?php esc_html_e( 'E-mail', 'boldgrid-connect' ); ?>:
115
  </label>
116
  <input type="text" id="emailAddr" maxlength="50" placeholder="your@name.com" value="<?php echo esc_attr( $email ); ?>" />
117
  <br />
118
  <input type="hidden" id="siteUrl" value="<?php echo get_admin_url(); ?>" />
119
  <br />
120
  <button id="requestKey" class="button button-primary">
121
+ <?php esc_html_e( 'Submit', 'boldgrid-connect' ); ?>
122
  </button>
123
  <span class="spinner"></span>
124
  <input type="hidden" id="generate-api-key" value="<?php echo esc_attr( $api ); ?>" />
vendor/boldgrid/library/src/Library/Views/KeyPromptMini.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * File: KeyPromptMini.php
4
+ *
5
+ * @package Boldgrid\Library
6
+ * @subpackage Library\Views
7
+ * @version 2.6.0
8
+ * @author BoldGrid <support@boldgrid.com>
9
+ */
10
+
11
+ namespace Boldgrid\Library\Library\Views;
12
+
13
+ use Boldgrid\Library\Library;
14
+
15
+ /**
16
+ * Class: KeyPromptMini
17
+ *
18
+ * Print a mini Connect Key entry prompt.
19
+ *
20
+ * @since 2.6.0.
21
+ */
22
+ class KeyPromptMini {
23
+ /**
24
+ * Display form.
25
+ *
26
+ * @since 2.6.0
27
+ *
28
+ * @static
29
+ *
30
+ * @see self::enqueue()
31
+ */
32
+ public static function displayForm() {
33
+ self::enqueue();
34
+ ?>
35
+ <div id="container_boldgrid_api_key_notice" class="library is-dismissible keyprompt-mini"
36
+ data-notice-id="bg-key-prompt"
37
+ data-notice-state="<?php echo \Boldgrid\Library\Library\Notice\KeyPrompt::getState() ?>">
38
+ <div>
39
+ <form id="boldgrid-api-form" autocomplete="off">
40
+ <?php wp_nonce_field( 'boldgrid_set_key', 'set_key_auth' ); ?>
41
+ <input id="tos-box" class="hidden" type="checkbox" value="0" checked="checked" />
42
+ <input type="text" id="boldgrid_api_key" maxlength="37" placeholder="XXXXXXXX - XXXXXXXX - XXXXXXXX - XXXXXXXX" autocomplete="off" />
43
+ <button id="submit_api_key" class="button button-primary">
44
+ <?php esc_html_e( 'Submit', 'boldgrid-inspirations' ); ?>
45
+ </button>
46
+ <span>
47
+ <div id="boldgrid-api-loading" class="boldgrid-wp-spin"></div>
48
+ </span>
49
+ <p id="boldgrid_api_key_notice_message"></p>
50
+ </form>
51
+ </div>
52
+ </div>
53
+ <?php
54
+ }
55
+
56
+ /**
57
+ * Adds the required CSS and JS.
58
+ *
59
+ * @since 2.6.0
60
+ *
61
+ * @static
62
+ */
63
+ public static function enqueue() {
64
+ wp_enqueue_style(
65
+ 'bglib-api-notice-css',
66
+ Library\Configs::get( 'libraryUrl' ) . 'src/assets/css/api-notice.css'
67
+ );
68
+ wp_enqueue_script(
69
+ 'bglib-api-notice-js',
70
+ Library\Configs::get( 'libraryUrl' ) . 'src/assets/js/api-notice.js'
71
+ );
72
+ }
73
+ }
vendor/boldgrid/library/src/Util/Load.php CHANGED
@@ -52,6 +52,8 @@ class Load {
52
  // Build the registration class.
53
  $class = __NAMESPACE__ . '\\Registration\\' . ucfirst( $this->configs['type'] );
54
 
 
 
55
  // Add hooks for registration.
56
  $this->registration = new $class( $this->configs['file'] );
57
 
@@ -74,6 +76,21 @@ class Load {
74
  $this->load( $this->configs['loader'] );
75
  }
76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  /**
78
  * Sets the product and version of library to load.
79
  *
52
  // Build the registration class.
53
  $class = __NAMESPACE__ . '\\Registration\\' . ucfirst( $this->configs['type'] );
54
 
55
+ $this->filesystemFixes();
56
+
57
  // Add hooks for registration.
58
  $this->registration = new $class( $this->configs['file'] );
59
 
76
  $this->load( $this->configs['loader'] );
77
  }
78
 
79
+ /**
80
+ * Avoid fatal errors due to certain filesystem types.
81
+ *
82
+ * This fix is only to prevent fatal errors. It is up to the plugins including this library to
83
+ * test the filesystem and determine whether or not they're compatible.
84
+ *
85
+ * ftpext
86
+ * Fatal error: Call to undefined function wp_generate_password() in wp-admin/includes/file.php
87
+ */
88
+ public function filesystemFixes() {
89
+ if ( ! function_exists( 'wp_generate_password' ) ) {
90
+ require( ABSPATH . WPINC . '/pluggable.php' );
91
+ }
92
+ }
93
+
94
  /**
95
  * Sets the product and version of library to load.
96
  *
vendor/boldgrid/library/src/Util/Option.php CHANGED
@@ -6,7 +6,7 @@
6
  * @subpackage \Util
7
  *
8
  * @version 1.0.0
9
- * @author BoldGrid <wpb@boldgrid.com>
10
  */
11
 
12
  namespace Boldgrid\Library\Util;
@@ -19,7 +19,6 @@ namespace Boldgrid\Library\Util;
19
  * @since 1.0.0
20
  */
21
  class Option {
22
-
23
  /**
24
  * @access public
25
  *
@@ -57,7 +56,7 @@ class Option {
57
  * @return array Returns the option data from WordPress database.
58
  */
59
  public static function getOption() {
60
- return get_site_option( self::$name, array() );
61
  }
62
 
63
  /**
@@ -72,7 +71,7 @@ class Option {
72
  */
73
  public static function set( $key, $value ) {
74
  self::$option[ self::$key ][ $key ] = $value;
75
- return update_site_option( self::$name, self::$option );
76
  }
77
 
78
  /**
@@ -86,7 +85,7 @@ class Option {
86
  */
87
  public static function delete( $key ) {
88
  unset( self::$option[ self::$key ][ $key ] );
89
- return update_site_option( self::$name, self::$option );
90
  }
91
 
92
  /**
6
  * @subpackage \Util
7
  *
8
  * @version 1.0.0
9
+ * @author BoldGrid <support@boldgrid.com>
10
  */
11
 
12
  namespace Boldgrid\Library\Util;
19
  * @since 1.0.0
20
  */
21
  class Option {
 
22
  /**
23
  * @access public
24
  *
56
  * @return array Returns the option data from WordPress database.
57
  */
58
  public static function getOption() {
59
+ return get_option( self::$name, array() );
60
  }
61
 
62
  /**
71
  */
72
  public static function set( $key, $value ) {
73
  self::$option[ self::$key ][ $key ] = $value;
74
+ return update_option( self::$name, self::$option );
75
  }
76
 
77
  /**
85
  */
86
  public static function delete( $key ) {
87
  unset( self::$option[ self::$key ][ $key ] );
88
+ return update_option( self::$name, self::$option );
89
  }
90
 
91
  /**
vendor/boldgrid/library/src/Util/Version.php CHANGED
@@ -65,8 +65,15 @@ class Version {
65
  }
66
 
67
  // Get installed composer package data.
68
- $vendor = wp_normalize_path( realpath( __DIR__ . '/../../../../' ) );
69
- $file = $wp_filesystem->get_contents( $vendor . '/composer/installed.json' );
 
 
 
 
 
 
 
70
  $installed = json_decode( $file, true );
71
 
72
  // Check for dep's installed version.
65
  }
66
 
67
  // Get installed composer package data.
68
+ $installedFile = wp_normalize_path( realpath( __DIR__ . '/../../../../' ) ) . '/composer/installed.json';
69
+
70
+ if ( 'direct' === get_filesystem_method() ) {
71
+ $file = $wp_filesystem->get_contents( $installedFile );
72
+ } else {
73
+ $installedUrl = str_replace( ABSPATH, get_site_url() . '/', $installedFile );
74
+ $file = wp_remote_retrieve_body( wp_remote_get( $installedUrl ) );
75
+ }
76
+
77
  $installed = json_decode( $file, true );
78
 
79
  // Check for dep's installed version.
vendor/boldgrid/library/src/assets/css/admin.css CHANGED
@@ -11,7 +11,9 @@
11
  display: none;
12
  }
13
  .settings_page_boldgrid-connect .connect-key-management {
 
14
  max-width: 590px;
 
15
  }
16
  /** BoldGrid Connect Page End **/
17
 
@@ -129,4 +131,132 @@
129
  -webkit-font-smoothing: antialiased;
130
  -moz-osx-font-smoothing: grayscale;
131
  }
132
- /** Admin Bar Icons **/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  display: none;
12
  }
13
  .settings_page_boldgrid-connect .connect-key-management {
14
+ margin: 0;
15
  max-width: 590px;
16
+ padding: 0;
17
  }
18
  /** BoldGrid Connect Page End **/
19
 
131
  -webkit-font-smoothing: antialiased;
132
  -moz-osx-font-smoothing: grayscale;
133
  }
134
+ /** Admin Bar Icons End **/
135
+
136
+ /** div-table classes Start **/
137
+ .div-table {
138
+ display: table;
139
+ }
140
+
141
+ .div-table-row {
142
+ display: table-row;
143
+ }
144
+
145
+ .div-table-heading {
146
+ background-color: #EEE;
147
+ display: table-header-group;
148
+ font-weight: bold;
149
+ }
150
+
151
+ .div-tableCell, .div-tableHead {
152
+ display: table-cell;
153
+ padding: 3px 10px;
154
+ }
155
+
156
+ .div-table-foot {
157
+ background-color: #EEE;
158
+ display: table-footer-group;
159
+ font-weight: bold;
160
+ }
161
+
162
+ .div-table-body {
163
+ display: table-row-group;
164
+ }
165
+
166
+ .div-table-contents {
167
+ display: contents;
168
+ }
169
+ /** div-table classes End **/
170
+
171
+ .auto-update-settings .toggle {
172
+ width: 50px;
173
+ }
174
+
175
+ #settings-notice {
176
+ display: none;
177
+ }
178
+
179
+ /* Create an inline spinner. */
180
+ .spinner.inline {
181
+ float: none;
182
+ visibility: visible;
183
+ vertical-align: bottom;
184
+ margin-left: 0px;
185
+ }
186
+ .spinner.inline.middle {
187
+ vertical-align: middle;
188
+ }
189
+ .spinner.hidden {
190
+ display: none;
191
+ }
192
+
193
+ div .dashicons {
194
+ vertical-align: bottom;
195
+ }
196
+
197
+ .dashicons-editor-help {
198
+ display: inline-block;
199
+ position: relative;
200
+ cursor: pointer;
201
+ }
202
+
203
+ .help[data-id] {
204
+ display: none;
205
+ }
206
+
207
+ .toggle .toggle-on {
208
+ background-color: #009CCD;
209
+ }
210
+
211
+ .bglib-collapsible-control:not(.bglib-collapsible-open) ~ .bglib-collapsible {
212
+ display: none;
213
+ }
214
+
215
+ .bglib-collapsible-control .dashicons {
216
+ transform: rotateZ(0deg);
217
+ }
218
+
219
+ .bglib-collapsible-open .dashicons {
220
+ transform: rotateZ(-180deg);
221
+ }
222
+
223
+ .bglib-collapsible-control .dashicons {
224
+ vertical-align: middle;
225
+ }
226
+
227
+ .bglib-collapsible-control {
228
+ cursor: pointer;
229
+ }
230
+
231
+ .auto-update-settings .div-table-contents::before {
232
+ content: "";
233
+ display: table-row;
234
+ height: 20px;
235
+ }
236
+
237
+ .bglib-collapsible-control .div-tableCell {
238
+ border-bottom: 1px solid #e2e4e7;
239
+ border-top: 1px solid #e2e4e7;
240
+ }
241
+
242
+ .bglib-collapsible-control h3 {
243
+ font-size: 13px;
244
+ font-weight: bold;
245
+ margin: 12px 0px;
246
+ }
247
+
248
+ .bglib-collapsible-control:hover {
249
+ background-color: #f2f2f2;
250
+ }
251
+
252
+ .bglib-collapsible-control span {
253
+ right: 0;
254
+ }
255
+
256
+ .bglib-collapsible-control .div-tableCell:last-of-type {
257
+ text-align: center;
258
+ }
259
+
260
+ .bglib-collapsible-control + .div-table-row > .div-tableCell:first-of-type {
261
+ padding-top: 10px;
262
+ }
vendor/boldgrid/library/src/assets/css/api-notice.css CHANGED
@@ -1,19 +1,23 @@
1
  #container_boldgrid_api_key_notice:not(.is-dismissible) {
2
  display: none;
3
  }
 
4
  #container_boldgrid_api_key_notice .dashicons-before:before {
5
  padding-right: .8em !important;
6
  font-size: 58px !important;
7
  color: #ff6600;
8
  }
 
9
  #container_boldgrid_api_key_notice {
10
  width: 563px;
11
  padding: 1.4em;
12
  }
 
13
  #requestKeyForm input {
14
  width: 83%;
15
  margin: .5em 0;
16
  }
 
17
  #requestKeyForm label {
18
  display: block;
19
  }
@@ -43,14 +47,17 @@
43
  #container_boldgrid_api_key_notice[data-notice-state="basic-key-active"] .basic-key-active {
44
  display: block;
45
  }
 
46
  #container_boldgrid_api_key_notice .boldgridApiKeyLink {
47
  margin-top: 10px;
48
  display: inline-block;
49
  }
 
50
  #container_boldgrid_api_key_notice[data-notice-state="basic-key-active"] .envato-claim-message {
51
  padding-left: 0;
52
  margin-bottom: 10px;
53
  }
 
54
  #container_boldgrid_api_key_notice.success-add-key .tos-box,
55
  #container_boldgrid_api_key_notice.success-add-key .envato-claim-message {
56
  display: none;
@@ -105,12 +112,15 @@
105
  .boldgridApiKeyLink {
106
  margin-left: 66px;
107
  }
 
108
  #requestKeyMessage {
109
  margin-right: 66px;
110
  }
 
111
  .error-alerts {
112
  color: red;
113
  }
 
114
  .error-color::before {
115
  content: '*';
116
  padding-right: 5px;
@@ -118,10 +128,12 @@
118
  .error-color {
119
  color: red;
120
  }
 
121
  input#boldgrid_api_key {
122
  margin-left: 66px !important;
123
  width: 59%;
124
  }
 
125
  .boldgrid-wp-spin {
126
  width: 20px;
127
  height: 20px;
@@ -132,6 +144,7 @@ input#boldgrid_api_key {
132
  -moz-animation: rotation 1.5s infinite linear;
133
  -animation: rotation 1.5s infinite linear;
134
  }
 
135
  .boldgrid-wp-spin::after {
136
  width: 4px;
137
  height: 4px;
@@ -143,6 +156,7 @@ input#boldgrid_api_key {
143
  display: block;
144
  content: '';
145
  }
 
146
  @ -webkit-keyframes rotation {
147
  from {
148
  -webkit-transform: rotate(0deg);
@@ -151,6 +165,7 @@ input#boldgrid_api_key {
151
  -webkit-transform: rotate(359deg);
152
  }
153
  }
 
154
  @ -moz-keyframes rotation {
155
  from {
156
  -moz-transform: rotate(0deg);
@@ -159,6 +174,7 @@ input#boldgrid_api_key {
159
  -moz-transform: rotate(359deg);
160
  }
161
  }
 
162
  @ -keyframes rotation {
163
  from {
164
  -transform: rotate(0deg);
@@ -167,13 +183,31 @@ input#boldgrid_api_key {
167
  -transform: rotate(359deg);
168
  }
169
  }
 
170
  #boldgrid-api-loading {
171
  margin-left: 423px;
172
  margin-top: -2em;
173
  display: none;
174
  }
 
175
  #requestKeyForm .spinner.inline {
176
  visibility: visible;
177
  float: none;
178
  vertical-align: bottom;
179
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  #container_boldgrid_api_key_notice:not(.is-dismissible) {
2
  display: none;
3
  }
4
+
5
  #container_boldgrid_api_key_notice .dashicons-before:before {
6
  padding-right: .8em !important;
7
  font-size: 58px !important;
8
  color: #ff6600;
9
  }
10
+
11
  #container_boldgrid_api_key_notice {
12
  width: 563px;
13
  padding: 1.4em;
14
  }
15
+
16
  #requestKeyForm input {
17
  width: 83%;
18
  margin: .5em 0;
19
  }
20
+
21
  #requestKeyForm label {
22
  display: block;
23
  }
47
  #container_boldgrid_api_key_notice[data-notice-state="basic-key-active"] .basic-key-active {
48
  display: block;
49
  }
50
+
51
  #container_boldgrid_api_key_notice .boldgridApiKeyLink {
52
  margin-top: 10px;
53
  display: inline-block;
54
  }
55
+
56
  #container_boldgrid_api_key_notice[data-notice-state="basic-key-active"] .envato-claim-message {
57
  padding-left: 0;
58
  margin-bottom: 10px;
59
  }
60
+
61
  #container_boldgrid_api_key_notice.success-add-key .tos-box,
62
  #container_boldgrid_api_key_notice.success-add-key .envato-claim-message {
63
  display: none;
112
  .boldgridApiKeyLink {
113
  margin-left: 66px;
114
  }
115
+
116
  #requestKeyMessage {
117
  margin-right: 66px;
118
  }
119
+
120
  .error-alerts {
121
  color: red;
122
  }
123
+
124
  .error-color::before {
125
  content: '*';
126
  padding-right: 5px;
128
  .error-color {
129
  color: red;
130
  }
131
+
132
  input#boldgrid_api_key {
133
  margin-left: 66px !important;
134
  width: 59%;
135
  }
136
+
137
  .boldgrid-wp-spin {
138
  width: 20px;
139
  height: 20px;
144
  -moz-animation: rotation 1.5s infinite linear;
145
  -animation: rotation 1.5s infinite linear;
146
  }
147
+
148
  .boldgrid-wp-spin::after {
149
  width: 4px;
150
  height: 4px;
156
  display: block;
157
  content: '';
158
  }
159
+
160
  @ -webkit-keyframes rotation {
161
  from {
162
  -webkit-transform: rotate(0deg);
165
  -webkit-transform: rotate(359deg);
166
  }
167
  }
168
+
169
  @ -moz-keyframes rotation {
170
  from {
171
  -moz-transform: rotate(0deg);
174
  -moz-transform: rotate(359deg);
175
  }
176
  }
177
+
178
  @ -keyframes rotation {
179
  from {
180
  -transform: rotate(0deg);
183
  -transform: rotate(359deg);
184
  }
185
  }
186
+
187
  #boldgrid-api-loading {
188
  margin-left: 423px;
189
  margin-top: -2em;
190
  display: none;
191
  }
192
+
193
  #requestKeyForm .spinner.inline {
194
  visibility: visible;
195
  float: none;
196
  vertical-align: bottom;
197
  }
198
+
199
+ .keyprompt-mini {
200
+ padding: 0 !important;
201
+ }
202
+
203
+ .keyprompt-mini input#boldgrid_api_key {
204
+ margin-left: 0 !important;
205
+ }
206
+
207
+ .keyprompt-mini .hidden {
208
+ display: none;
209
+ }
210
+
211
+ .keyprompt-mini #boldgrid_api_key_notice_message.error-color {
212
+ color: #dc3232;
213
+ }
vendor/boldgrid/library/src/assets/css/attributes.css ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .bglib-misc-pub-section:before {
2
+ /* Taken from wp-admin/css/edit.css */
3
+ font: normal 20px/1 dashicons;
4
+ speak: none;
5
+ display: inline-block;
6
+ margin-left: -1px;
7
+ vertical-align: top;
8
+ -webkit-font-smoothing: antialiased;
9
+ -moz-osx-font-smoothing: grayscale;
10
+ color: #82878c;
11
+ }
12
+
13
+ .bglib-misc-pub-section .dashicons-lock:before {
14
+ content: "\f160";
15
+ }
16
+
17
+ .bglib-misc-pub-section .options {
18
+ margin: 10px 0px;
19
+ display: none;
20
+ }
21
+
22
+ .bglib-misc-pub-section .options > label {
23
+ display: block;
24
+ }
25
+
26
+ .bglib-misc-pub-section .value-displayed {
27
+ font-weight: bold;
28
+ }
29
+
30
+ .bglib-misc-pub-section .value-displayed .template-subtitle,
31
+ .bglib-page-title .template-subtitle {
32
+ display: inline;
33
+ margin: 0;
34
+ }
35
+
36
+ #bglib-attributes-meta-box div.inside {
37
+ margin: 0px;
38
+ padding: 0px;
39
+ }
vendor/boldgrid/library/src/assets/css/ui.css CHANGED
@@ -19,6 +19,10 @@
19
  padding: 10px;
20
  }
21
 
 
 
 
 
22
  .bg-box-bottom.premium {
23
  border-left: 4px solid #46b450;
24
  }
19
  padding: 10px;
20
  }
21
 
22
+ .bg-box-bottom > p:first-child {
23
+ margin-top: 0px;
24
+ }
25
+
26
  .bg-box-bottom.premium {
27
  border-left: 4px solid #46b450;
28
  }
vendor/boldgrid/library/src/assets/fonts/boldgrid.eot CHANGED
Binary file
vendor/boldgrid/library/src/assets/fonts/boldgrid.svg CHANGED
@@ -6,8 +6,9 @@
6
  <font id="icomoon" horiz-adv-x="1024">
7
  <font-face units-per-em="1024" ascent="960" descent="-64" />
8
  <missing-glyph horiz-adv-x="1024" />
9
- <glyph unicode="&#x20;" d="" horiz-adv-x="512" />
10
- <glyph unicode="&#xe600;" d="M524.8 524.8c0-19.2-12.8-32-32-32h-220.8c-19.2 0-32 16-32 32v179.2c0 19.2 12.8 32 32 32h220.8c19.2 0 32-16 32-32v-179.2zM665.6 192c0-19.2-22.4-32-48-32h-329.6c-28.8 0-48 16-48 32v179.2c0 19.2 22.4 32 48 32h329.6c28.8 0 48-16 48-32v-179.2zM832 902.4c83.2 0 131.2-57.6 128-140.8 0-25.6-6.4-48-35.2-44.8-25.6 0-35.2 19.2-32 41.6 3.2 57.6-32 76.8-83.2 76.8-198.4 0-396.8 0-595.2 0-67.2 0-83.2-19.2-83.2-86.4 0-201.6 0-400 0-601.6 0-73.6 16-86.4 86.4-86.4 195.2 0 393.6 0 588.8 0 67.2 0 83.2 16 83.2 83.2 0 92.8 0 182.4 0 272 0 57.6-19.2 76.8-76.8 76.8-35.2 0-73.6 0-108.8 0-19.2 0-35.2 9.6-38.4 32 0 25.6 16 35.2 38.4 35.2 48 0 99.2 3.2 147.2-3.2 57.6-3.2 102.4-54.4 102.4-112 3.2-112 3.2-227.2 0-339.2 0-70.4-51.2-118.4-121.6-118.4-108.8 0-217.6 0-326.4 0-105.6 0-211.2 0-316.8 0-80 0-131.2 48-131.2 131.2 0 217.6 0 435.2 0 649.6 0 80 48 131.2 124.8 131.2z" />
11
- <glyph unicode="&#xe601;" d="M814.933 162.133c-25.6 0-51.2 4.267-76.8 17.067-68.267-51.2-145.067-81.067-226.133-81.067-25.6 0-51.2 4.267-76.8 8.533-46.933-46.933-106.667-68.267-170.667-68.267-68.267 0-123.733 25.6-174.933 72.533s-72.533 106.667-72.533 174.933c0 42.667 12.8 85.333 34.133 123.733s51.2 68.267 89.6 89.6c4.267 64 25.6 119.467 55.467 170.667 38.4 51.2 81.067 89.6 136.533 119.467s115.2 46.933 174.933 46.933c93.867 0 170.667-29.867 243.2-89.6 68.267-59.733 110.933-136.533 123.733-226.133 38.4-12.8 68.267-34.133 89.6-68.267s34.133-68.267 34.133-106.667c0-51.2-17.067-93.867-55.467-132.267s-76.8-51.2-128-51.2zM512 772.267c-76.8 0-140.8-25.6-196.267-72.533-59.733-46.933-93.867-106.667-106.667-179.2 17.067 4.267 38.4 8.533 55.467 8.533 68.267 0 123.733-25.6 174.933-72.533s72.533-106.667 72.533-174.933c0-42.667-8.533-81.067-29.867-119.467 12.8 0 21.333 0 29.867 0 64 0 123.733 17.067 174.933 55.467-34.133 34.133-51.2 76.8-51.2 128s17.067 93.867 51.2 128 76.8 55.467 128 55.467c-12.8 72.533-51.2 128-106.667 174.933-59.733 46.933-123.733 68.267-196.267 68.267zM605.867 554.667c-17.067-17.067-38.4-25.6-64-25.6s-46.933 8.533-64 25.6c-17.067 17.067-25.6 38.4-25.6 64s8.533 46.933 25.6 64c17.067 17.067 38.4 25.6 64 25.6s46.933-8.533 64-25.6c17.067-17.067 25.6-38.4 25.6-64 0-21.333-8.533-46.933-25.6-64z" />
12
- <glyph unicode="&#xe602;" d="M315.733 622.933l1668.267 4.267-34.133-174.933zM64 601.6l1868.8-204.8-34.133-149.333z" horiz-adv-x="2048" />
 
13
  </font></defs></svg>
6
  <font id="icomoon" horiz-adv-x="1024">
7
  <font-face units-per-em="1024" ascent="960" descent="-64" />
8
  <missing-glyph horiz-adv-x="1024" />
9
+ <glyph unicode="&#x20;" horiz-adv-x="512" d="" />
10
+ <glyph unicode="&#xe600;" glyph-name="boldgrid" d="M524.8 524.8c0-19.2-12.8-32-32-32h-220.8c-19.2 0-32 16-32 32v179.2c0 19.2 12.8 32 32 32h220.8c19.2 0 32-16 32-32v-179.2zM665.6 192c0-19.2-22.4-32-48-32h-329.6c-28.8 0-48 16-48 32v179.2c0 19.2 22.4 32 48 32h329.6c28.8 0 48-16 48-32v-179.2zM832 902.4c83.2 0 131.2-57.6 128-140.8 0-25.6-6.4-48-35.2-44.8-25.6 0-35.2 19.2-32 41.6 3.2 57.6-32 76.8-83.2 76.8-198.4 0-396.8 0-595.2 0-67.2 0-83.2-19.2-83.2-86.4 0-201.6 0-400 0-601.6 0-73.6 16-86.4 86.4-86.4 195.2 0 393.6 0 588.8 0 67.2 0 83.2 16 83.2 83.2 0 92.8 0 182.4 0 272 0 57.6-19.2 76.8-76.8 76.8-35.2 0-73.6 0-108.8 0-19.2 0-35.2 9.6-38.4 32 0 25.6 16 35.2 38.4 35.2 48 0 99.2 3.2 147.2-3.2 57.6-3.2 102.4-54.4 102.4-112 3.2-112 3.2-227.2 0-339.2 0-70.4-51.2-118.4-121.6-118.4-108.8 0-217.6 0-326.4 0-105.6 0-211.2 0-316.8 0-80 0-131.2 48-131.2 131.2 0 217.6 0 435.2 0 649.6 0 80 48 131.2 124.8 131.2z" />
11
+ <glyph unicode="&#xe601;" glyph-name="whh" d="M814.933 162.133c-25.6 0-51.2 4.267-76.8 17.067-68.267-51.2-145.067-81.067-226.133-81.067-25.6 0-51.2 4.267-76.8 8.533-46.933-46.933-106.667-68.267-170.667-68.267-68.267 0-123.733 25.6-174.933 72.533s-72.533 106.667-72.533 174.933c0 42.667 12.8 85.333 34.133 123.733s51.2 68.267 89.6 89.6c4.267 64 25.6 119.467 55.467 170.667 38.4 51.2 81.067 89.6 136.533 119.467s115.2 46.933 174.933 46.933c93.867 0 170.667-29.867 243.2-89.6 68.267-59.733 110.933-136.533 123.733-226.133 38.4-12.8 68.267-34.133 89.6-68.267s34.133-68.267 34.133-106.667c0-51.2-17.067-93.867-55.467-132.267s-76.8-51.2-128-51.2zM512 772.267c-76.8 0-140.8-25.6-196.267-72.533-59.733-46.933-93.867-106.667-106.667-179.2 17.067 4.267 38.4 8.533 55.467 8.533 68.267 0 123.733-25.6 174.933-72.533s72.533-106.667 72.533-174.933c0-42.667-8.533-81.067-29.867-119.467 12.8 0 21.333 0 29.867 0 64 0 123.733 17.067 174.933 55.467-34.133 34.133-51.2 76.8-51.2 128s17.067 93.867 51.2 128 76.8 55.467 128 55.467c-12.8 72.533-51.2 128-106.667 174.933-59.733 46.933-123.733 68.267-196.267 68.267zM605.867 554.667c-17.067-17.067-38.4-25.6-64-25.6s-46.933 8.533-64 25.6c-17.067 17.067-25.6 38.4-25.6 64s8.533 46.933 25.6 64c17.067 17.067 38.4 25.6 64 25.6s46.933-8.533 64-25.6c17.067-17.067 25.6-38.4 25.6-64 0-21.333-8.533-46.933-25.6-64z" />
12
+ <glyph unicode="&#xe602;" glyph-name="imh" horiz-adv-x="2048" d="M315.733 622.933l1668.267 4.267-34.133-174.933zM64 601.6l1868.8-204.8-34.133-149.333z" />
13
+ <glyph unicode="&#xe900;" glyph-name="crio-enzo" d="M33.010 387.478c0 7.196-1.799 14.393 1.799 21.589 1.799 3.598 0 12.594-1.799 17.991-10.795 26.987-8.996 52.174-1.799 79.16 5.397 17.991 7.196 35.982 10.795 53.973 1.799 0 3.598 0 3.598 0-1.799-10.795-3.598-19.79-5.397-30.585 1.799 0 1.799 0 3.598-1.799 5.397 14.393 10.795 28.786 16.192 43.178 12.594 32.384 25.187 62.969 35.982 95.352 14.393 35.982 35.982 66.567 61.169 93.553 43.178 46.777 93.553 84.558 152.924 107.946 14.393 5.397 26.987 14.393 43.178 17.991 17.991 3.598 35.982 10.795 55.772 7.196 7.196-1.799 16.192 0 23.388-1.799-16.192-7.196-30.585-12.594-46.777-19.79-7.196-1.799-14.393-3.598-21.589-5.397-3.598-1.799-10.795-1.799-12.594-5.397-5.397-8.996-12.594-8.996-21.589-5.397-1.799 0-3.598 0-5.397-1.799 1.799-1.799 1.799-5.397 1.799-5.397-10.795-7.196-23.388-12.594-34.183-19.79-5.397-1.799-8.996-5.397-14.393-5.397-16.192 1.799-30.585-5.397-43.178-16.192-21.589-17.991-41.379-39.58-62.969-57.571-41.379-39.58-64.768-88.156-86.357-140.33-16.192-39.58-25.187-82.759-23.388-127.736 1.799-23.388 0-48.576 3.598-71.964 5.397-28.786 12.594-59.37 23.388-86.357 8.996-17.991 26.987-32.384 41.379-48.576 5.397-5.397 10.795-10.795 16.192-17.991-10.795 35.982-23.388 70.165-34.183 104.348 1.799 1.799 5.397 1.799 8.996 3.598 3.598-14.393 5.397-30.585 12.594-44.978 3.598-8.996 12.594-16.192 19.79-25.187 1.799 0 3.598 1.799 3.598 1.799-7.196 14.393-14.393 28.786-21.589 43.178-3.598 7.196-5.397 10.795 3.598 10.795-7.196 21.589-14.393 41.379-21.589 62.969 0 0-1.799 0-1.799 0 0-12.594 0-23.388 0-35.982 0 0-1.799 0-1.799 0 0 14.393 0 26.987-1.799 41.379-1.799 21.589 0 43.178-5.397 64.768-7.196 30.585-3.598 59.37 5.397 88.156 3.598 14.393 7.196 30.585 12.594 44.978s10.795 30.585 19.79 44.978c23.388 37.781 48.576 75.562 82.759 106.147 8.996 8.996 19.79 14.393 30.585 21.589s21.589 16.192 32.384 23.388c10.795 7.196 25.187 10.795 35.982 16.192 3.598 1.799 7.196 1.799 8.996 3.598 7.196 8.996 17.991 8.996 28.786 8.996 3.598-1.799 8.996-3.598 12.594-3.598 5.397 0 8.996 1.799 14.393 1.799 0-1.799 1.799-1.799 1.799-3.598-7.196-3.598-12.594-8.996-19.79-12.594-17.991-8.996-37.781-14.393-55.772-25.187s-37.781-21.589-48.576-37.781c-12.594-19.79-35.982-30.585-43.178-52.174 0-1.799-1.799-3.598-3.598-3.598-19.79-14.393-30.585-35.982-41.379-55.772-10.795-17.991-17.991-37.781-28.786-55.772-3.598-7.196-8.996-12.594-12.594-19.79s-7.196-16.192-8.996-25.187c-3.598-14.393-3.598-30.585-7.196-48.576-1.799 5.397-1.799 7.196-3.598 8.996-1.799 0-1.799 0-3.598 0 1.799-25.187 3.598-50.375 5.397-73.763 1.799 0 3.598 0 3.598 0 0 1.799 1.799 3.598 1.799 5.397 7.196-19.79 14.393-39.58 21.589-59.37 1.799 0 1.799 0 3.598 0-1.799 10.795-1.799 23.388-3.598 34.183 1.799 0 1.799 0 3.598 0 8.996-12.594 16.192-25.187 25.187-37.781 1.799 0 1.799 1.799 3.598 1.799-1.799 8.996-3.598 16.192-5.397 25.187 34.183-109.745 93.553-197.901 203.299-244.678 0-1.799-1.799-7.196-3.598-12.594-17.991 8.996-35.982 17.991-53.973 25.187-1.799 0-3.598-1.799-5.397-1.799s-5.397 0-5.397 0c5.397-5.397 10.795-12.594 16.192-17.991 0 0-1.799-1.799-1.799-1.799-12.594 7.196-26.987 14.393-39.58 21.589-1.799-1.799-1.799-3.598-3.598-5.397 3.598-3.598 7.196-5.397 8.996-8.996 30.585-21.589 62.969-35.982 98.951-46.777 43.178-14.393 88.156-14.393 133.134-17.991 34.183-1.799 64.768 14.393 97.152 21.589s61.169 21.589 89.955 37.781c35.982 21.589 68.366 50.375 93.553 86.357 17.991 25.187 37.781 52.174 43.178 84.558 1.799 10.795 8.996 19.79 12.594 30.585s5.397 21.589 3.598 30.585c0 5.397-10.795 8.996-17.991 14.393 0-10.795 0-17.991 0-23.388-23.388-17.991-26.987-46.777-35.982-75.562-5.397 19.79 1.799 32.384 7.196 44.978s5.397 26.987 8.996 41.379c1.799 8.996 3.598 19.79 5.397 28.786-1.799 0-3.598 0-3.598 1.799-7.196-17.991-12.594-35.982-19.79-53.973 0 0-1.799 0-1.799 0 3.598 17.991 5.397 37.781 8.996 55.772 3.598 21.589 1.799 41.379-7.196 61.169-1.799-1.799-3.598-3.598-5.397-5.397-3.598 17.991-5.397 34.183-8.996 50.375-1.799 7.196-3.598 12.594-3.598 19.79 0 5.397 0 10.795 1.799 16.192 0 1.799 1.799 5.397 1.799 7.196-3.598 12.594-7.196 23.388-8.996 35.982-7.196 26.987-21.589 46.777-39.58 66.567-3.598 3.598-3.598 14.393-5.397 21.589-1.799 3.598-3.598 7.196-7.196 8.996-28.786 17.991-48.576 46.777-79.16 62.969 3.598 1.799 5.397 1.799 5.397 3.598-5.397 5.397-12.594 10.795-19.79 17.991 3.598 1.799 5.397 1.799 8.996 3.598-12.594 7.196-23.388 12.594-34.183 17.991 16.192 16.192 26.987-10.795 43.178-1.799-17.991 19.79-25.187 48.576-53.973 57.571 1.799 1.799 5.397 3.598 8.996 5.397-3.598 1.799-7.196 5.397-10.795 7.196-10.795 3.598-21.589 5.397-30.585 7.196-8.996 16.192-17.991 30.585-28.786 46.777 17.991 0 37.781 3.598 55.772 1.799 19.79-1.799 41.379-7.196 61.169-14.393 8.996-3.598 17.991-10.795 26.987-16.192 10.795-5.397 21.589-8.996 32.384-12.594 7.196-3.598 10.795-7.196 7.196-16.192-1.799-3.598 3.598-10.795 3.598-12.594 14.393 1.799 23.388 3.598 34.183 5.397 1.799-1.799 1.799-3.598 3.598-5.397-5.397-8.996-10.795-16.192-16.192-25.187-3.598-7.196-3.598-10.795 3.598-14.393 3.598 5.397 5.397 10.795 8.996 17.991 1.799 0 1.799-1.799 3.598-1.799 0-3.598 0-7.196 1.799-10.795 7.196 3.598 14.393 8.996 19.79 12.594 0 1.799 1.799 1.799 1.799 3.598 5.397-5.397 8.996-10.795 16.192-17.991-7.196-3.598-12.594-7.196-19.79-12.594 5.397-3.598 12.594-7.196 17.991-10.795 1.799 5.397 1.799 10.795 3.598 16.192 8.996-7.196 14.393-12.594 21.589-17.991 0 0 0 0 1.799 1.799-1.799 3.598-3.598 7.196-5.397 10.795 0 1.799 1.799 1.799 1.799 3.598 5.397-1.799 12.594-3.598 17.991-7.196 12.594-10.795 25.187-23.388 35.982-35.982 7.196-7.196 16.192-12.594 3.598-23.388-1.799-1.799 0-5.397 0-10.795 7.196 7.196 14.393 12.594 21.589 19.79 3.598-5.397 7.196-10.795 10.795-16.192 7.196-8.996 12.594-19.79 21.589-28.786 7.196-7.196 3.598-12.594 0-19.79-3.598-5.397-3.598-10.795-5.397-16.192 1.799 0 1.799 0 3.598-1.799 5.397 5.397 12.594 8.996 16.192 16.192 1.799 3.598 0 10.795-1.799 16.192-3.598 8.996-10.795 16.192-16.192 28.786 21.589-12.594 25.187-34.183 34.183-50.375 5.397-10.795 14.393-19.79 16.192-28.786 1.799-10.795 10.795-17.991 12.594-26.987 10.795-37.781 23.388-73.763 21.589-113.343-1.799-21.589 7.196-41.379 3.598-59.37-1.799-14.393-1.799-26.987-1.799-41.379-1.799-43.178-16.192-80.96-34.183-118.741-1.799-3.598-1.799-7.196-1.799-12.594-3.598-10.795-8.996-23.388-14.393-34.183-5.397-12.594-8.996-25.187-16.192-37.781-1.799-5.397-8.996-7.196-12.594-12.594-1.799-1.799-3.598-3.598-5.397-5.397-17.991-23.388-34.183-46.777-52.174-68.366-10.795-12.594-26.987-23.388-41.379-35.982-14.393-10.795-28.786-23.388-43.178-34.183-17.991-14.393-37.781-26.987-57.571-34.183-14.393-5.397-28.786-14.393-43.178-19.79-34.183-14.393-68.366-26.987-104.348-30.585-10.795-1.799-19.79-3.598-30.585-3.598-17.991-1.799-35.982-1.799-53.973-1.799-26.987 0-53.973 0-80.96 3.598-34.183 5.397-68.366 16.192-100.75 25.187-12.594 3.598-25.187 8.996-37.781 16.192-16.192 8.996-32.384 17.991-48.576 26.987-48.576 26.987-88.156 62.969-125.937 104.348-10.795 12.594-17.991 26.987-26.987 41.379s-21.589 26.987-28.786 43.178c-10.795 19.79-17.991 41.379-25.187 62.969-8.996 23.388-16.192 46.777-23.388 70.165-3.598 8.996-3.598 19.79-3.598 30.585-1.799 7.196-1.799 16.192-1.799 23.388 0 14.393 0 28.786-1.799 43.178 0 7.196-3.598 14.393-3.598 21.589 0 3.598 1.799 8.996 1.799 12.594 0 1.799 3.598 5.397 1.799 7.196-3.598 14.393 1.799 28.786 5.397 41.379 5.397 14.393 8.996 28.786 16.192 41.379 0-8.996 0-16.192 0-25.187-1.799-23.388-7.196-44.978-7.196-68.366 0-19.79 1.799-41.379 3.598-61.169 0-7.196 0-14.393 0-19.79 3.598-3.598 7.196-10.795 10.795-17.991 0-3.598-1.799-7.196-1.799-10.795 0-25.187 12.594-46.777 25.187-68.366 0 0 1.799 0 5.397 1.799-10.795 26.987-19.79 52.174-28.786 77.361zM702.276 112.216c0-1.799 0-1.799 0-3.598 5.397 0 12.594-3.598 16.192-1.799 16.192 8.996 30.585 19.79 46.777 30.585-3.598 5.397-7.196 8.996-8.996 12.594-17.991-10.795-35.982-23.388-53.973-37.781zM153.55 376.684c-1.799-1.799-3.598-1.799-5.397-3.598 8.996-19.79 17.991-37.781 26.987-57.571 1.799 0 3.598 1.799 5.397 1.799-8.996 21.589-17.991 39.58-26.987 59.37zM743.655 51.046c0 1.799-1.799 3.598-1.799 3.598-17.991-8.996-34.183-16.192-52.174-25.187 0-1.799 1.799-3.598 1.799-3.598 17.991 8.996 34.183 16.192 52.174 25.187zM855.199 781.481c-1.799 0-3.598 0-5.397 0-1.799-7.196-3.598-16.192-5.397-26.987 8.996 5.397 14.393 8.996 19.79 12.594-5.397 5.397-7.196 8.996-8.996 14.393zM45.604 490.027c1.799 0 3.598 0 5.397 0 0 10.795 1.799 21.589 1.799 34.183-1.799 0-3.598 0-3.598 0 0-10.795-1.799-23.388-3.598-34.183zM633.91 909.218c-1.799-5.397-1.799-7.196-1.799-10.795s0-7.196 0-10.795c1.799 0 1.799 0 3.598 0 3.598 7.196 5.397 12.594 8.996 19.79-3.598 0-7.196 1.799-10.795 1.799zM590.731 187.778c-21.589-10.795-43.178-14.393-66.567-17.991-21.589-1.799-43.178 0-66.567 1.799-7.196 0-14.393-1.799-23.388 0-1.799 0-5.397 5.397-7.196 7.196-23.388 8.996-46.777 17.991-70.165 25.187-7.196 1.799-14.393 3.598-21.589 3.598-1.799-1.799-1.799-1.799-3.598-3.598 7.196-3.598 12.594-5.397 19.79-8.996-1.799-1.799-3.598-3.598-5.397-5.397-30.585 8.996-48.576 35.982-70.165 59.37 0 0 0 0 0 0 1.799 0 3.598 0 7.196 0-8.996 10.795-17.991 21.589-26.987 30.585-5.397 5.397-14.393 7.196-16.192 14.393-7.196 16.192-10.795 32.384-16.192 50.375-19.79 3.598-1.799 19.79-5.397 28.786 1.799-1.799 3.598-3.598 7.196-5.397-1.799 8.996-1.799 16.192-3.598 25.187 0 0 1.799 0 1.799 0 1.799-7.196 5.397-14.393 7.196-21.589 12.594-35.982 39.58-62.969 59.37-93.553 14.393-19.79 37.781-34.183 59.37-48.576 35.982-26.987 75.562-39.58 120.54-44.978 37.781-3.598 73.763-5.397 109.745 7.196 5.397 0 8.996-1.799 10.795-3.598zM587.133 139.202c-5.397-1.799-8.996-3.598-14.393-5.397-28.786-3.598-59.37-8.996-88.156-8.996-17.991 0-35.982 1.799-52.174 7.196-8.996 3.598-17.991 7.196-26.987 7.196-5.397 0-8.996 8.996-14.393 14.393 8.996 0 10.795-7.196 12.594-7.196 7.196-3.598 16.192-3.598 25.187-5.397 7.196 0 14.393 1.799 21.589 0 43.178-7.196 86.357-8.996 129.535 0 3.598 0 5.397 0 8.996 0-1.799 1.799-1.799 0-1.799-1.799zM380.237 175.184c37.781-7.196 77.361-14.393 115.143-23.388-41.379-3.598-79.16 8.996-115.143 23.388zM731.061 655.544c-16.192 16.192-32.384 28.786-46.777 43.178 12.594 5.397 44.978-23.388 46.777-43.178zM731.061 686.129c-19.79 14.393-37.781 30.585-57.571 44.978 0 1.799 1.799 1.799 1.799 3.598 19.79-14.393 39.58-30.585 57.571-44.978 0 0-1.799-1.799-1.799-3.598zM896.579 774.285c-10.795 8.996-23.388 19.79-37.781 28.786 19.79-3.598 30.585-16.192 37.781-28.786zM378.437 840.852c-3.598 1.799-8.996 3.598-12.594 3.598 12.594 3.598 25.187 8.996 39.58 12.594 0-1.799 0-1.799 1.799-3.598-10.795-3.598-19.79-7.196-28.786-12.594zM865.994 826.459c-12.594 10.795-23.388 21.589-35.982 32.384 0 1.799 1.799 1.799 1.799 3.598 12.594-10.795 23.388-21.589 35.982-32.384 0 0-1.799-1.799-1.799-3.598z" />
14
  </font></defs></svg>
vendor/boldgrid/library/src/assets/fonts/boldgrid.ttf CHANGED
Binary file
vendor/boldgrid/library/src/assets/fonts/boldgrid.woff CHANGED
Binary file
vendor/boldgrid/library/src/assets/js/api-notice.js CHANGED
@@ -20,11 +20,11 @@ BOLDGRID.LIBRARY.Api = function( $ ) {
20
  $( '.boldgridApiKeyLink', notice ).on( 'click', function() {
21
  $( '.api-notice', notice ).hide();
22
  $( '.new-api-key', notice ).fadeIn( 'slow' );
23
- });
24
  $( '.enterKeyLink', notice ).on( 'click', function() {
25
  $( '.new-api-key', notice ).hide();
26
  $( '.api-notice', notice ).fadeIn( 'slow' );
27
- });
28
 
29
  /** Submit action **/
30
  $( '#requestKeyForm' ).submit( function( event ) {
@@ -37,88 +37,106 @@ BOLDGRID.LIBRARY.Api = function( $ ) {
37
  $email = $form.find( '#emailAddr' ).val(),
38
  $link = $form.find( '#siteUrl' ).val(),
39
  $alertBox = $( '.error-alerts' ),
40
- $genericError = 'There was an error communicating with the BoldGrid Connect Key server. Please try again.',
 
41
  $submit = $form.find( '#requestKey' ),
42
  $spinner = $form.find( '.spinner' );
43
 
44
-
45
-
46
- $('.error-color').removeClass( 'error-color' );
47
 
48
  // Basic js checks before server-side verification.
49
  if ( ! $firstName ) {
50
  $alertBox.text( 'First name is required.' );
51
- $form.find( '#firstName' ).prev().addClass( 'error-color' );
 
 
 
52
  return false;
53
  }
54
  if ( ! $lastName ) {
55
  $alertBox.text( 'Last name is required.' );
56
- $form.find( '#lastName' ).prev().addClass( 'error-color' );
 
 
 
57
  return false;
58
  }
59
- if ( ! ( $email.indexOf( '@' ) > -1 && $email.indexOf( '.' ) > -1 ) ) {
60
  $alertBox.text( 'Please enter a valid e-mail address.' );
61
- $form.find( '#emailAddr' ).prev().addClass( 'error-color' );
 
 
 
62
  return false;
63
  }
64
 
65
  $submit.prop( 'disabled', 'disabled' );
66
  $spinner.addClass( 'inline' );
67
 
68
- posting = $.post( $( '#generate-api-key' ).val(),
69
- {
70
- first: $firstName,
71
- last: $lastName,
72
- email: $email,
73
- link: $link,
74
- }
75
- );
76
-
77
- posting.done( function( response ) {
78
- $alertBox.text( $genericError );
79
- if ( 200 === response.status ) {
80
- $( '.key-request-content' ).text( response.message );
81
- }
82
- }).fail( function( post ) {
83
- var message = post.responseJSON.message
84
- if ( message.indexOf( 'First name' ) >= 0 ) {
85
- $form.find( '#firstName' ).prev().addClass( 'error-color' );
86
- }
87
- if ( message.indexOf( 'Last name' ) >= 0 ) {
88
- $form.find( '#lastName' ).prev().addClass( 'error-color' );
89
- }
90
- if ( message.indexOf( 'e-mail' ) >= 0 ) {
91
- $form.find( '#emailAddr' ).prev().addClass( 'error-color' );
92
- }
93
- $alertBox.text( message );
94
-
95
- $submit.prop( 'disabled', false );
96
- $spinner.removeClass( 'inline' );
97
- });
98
- });
 
 
 
 
 
 
 
 
 
99
 
100
  /**
101
  * When the submit button is pressed.
102
  */
103
- $( '#boldgrid-api-form' ).submit( function( e ){
104
  e.preventDefault();
105
- });
106
 
107
  $( '#boldgrid-api-loading', notice ).hide();
108
 
109
- $( '#submit_api_key', notice ).on('click', function() {
110
  $( '#boldgrid_api_key_notice_message' ).empty();
111
- if ( ! $( '#tos-box:checked').length ) {
112
  $( '#boldgrid_api_key_notice_message', notice )
113
  .html( 'You must agree to the Terms of Service before continuing.' )
114
  .addClass( 'error-color' );
115
  return false;
116
  }
117
- var key = $( '#boldgrid_api_key', notice ).val()
118
- .replace( /[^a-z0-9]/gi,'' )
119
- .replace( /(.{8})/g,"$1\-" )
 
120
  .slice( 0, -1 );
121
- if ( ! key || key.length !== 35 ) {
122
  $( '#boldgrid_api_key_notice_message', notice )
123
  .html( 'You must enter a valid BoldGrid Connect Key.' )
124
  .addClass( 'error-color' );
@@ -133,10 +151,10 @@ BOLDGRID.LIBRARY.Api = function( $ ) {
133
 
134
  // show the loading graphic.
135
  $( '#boldgrid-api-loading', notice ).show();
136
- });
137
 
138
  self._setupChangeKey();
139
- });
140
 
141
  /**
142
  * When a user clicks on change connect key, change the presentation to key input.
@@ -144,7 +162,7 @@ BOLDGRID.LIBRARY.Api = function( $ ) {
144
  * @since 2.4.0
145
  */
146
  this._setupChangeKey = function() {
147
- notice.find( 'a[data-action="change-connect-key"]' ).on( 'click', function ( e ) {
148
  e.preventDefault();
149
  notice.attr( 'data-notice-state', 'no-key-added' );
150
  } );
@@ -170,22 +188,30 @@ BOLDGRID.LIBRARY.Api = function( $ ) {
170
  }
171
  };
172
 
173
- this.trackActivation = function () {
 
174
  // Create iframe element.
175
  var iframe = document.createElement( 'iframe' );
 
176
  // Assign iframe ID.
177
  iframe.setAttribute( 'id', 'tracking' );
 
178
  // Assign iframe width.
179
  iframe.setAttribute( 'width', 0 );
 
180
  // Assign iframe height.
181
  iframe.setAttribute( 'height', 0 );
 
182
  // Assign iframe tabindex.
183
  iframe.setAttribute( 'tabindex', -1 );
 
184
  // Place iframe before response message.
185
  var el = document.getElementById( 'boldgrid_api_key_notice_message' );
186
  el.parentNode.insertBefore( iframe, el );
 
187
  // Assign src URL to iframe.
188
  iframe.setAttribute( 'src', 'https://www.boldgrid.com/activation/' );
 
189
  // Set display:none to iframe;
190
  iframe.style.display = 'none';
191
  };
@@ -195,19 +221,20 @@ BOLDGRID.LIBRARY.Api = function( $ ) {
195
  */
196
  this.set = function( key ) {
197
  var data, nonce, wpHttpReferer, $noticeContainer;
 
198
  // Get the wpnonce and referer values.
199
  nonce = $( '#set_key_auth', notice ).val();
200
  wpHttpReferer = $( '[name="_wp_http_referer"]', notice ).val();
201
  data = {
202
- 'action' : 'addKey',
203
- 'api_key' : key,
204
- 'set_key_auth' : nonce,
205
- '_wp_http_referer' : wpHttpReferer,
206
  };
207
 
208
  $noticeContainer = $( '#container_boldgrid_api_key_notice' );
209
 
210
- var fail = function ( message ) {
211
  message = message || 'An unexpected error occured. Please try again later.';
212
 
213
  $( '#boldgrid-api-loading', $noticeContainer ).hide();
@@ -218,20 +245,28 @@ BOLDGRID.LIBRARY.Api = function( $ ) {
218
  };
219
 
220
  $.post( ajaxurl, data, function( response ) {
 
221
  // Declare variables.
222
- var message;
 
223
 
224
  // If the key was saved successfully.
225
  if ( response.success ) {
226
- // Change the notice from red to green.
227
- $noticeContainer.toggleClass( 'error' ).toggleClass( 'updated' );
228
- $noticeContainer.addClass( 'success-add-key' );
 
 
 
 
 
 
 
229
 
230
  // Initiate tracking iframe.
231
  self.trackActivation();
232
 
233
- $( '#boldgrid_api_key_notice_message', $noticeContainer )
234
- .html( response.data.message + ' <a class="dismiss-notification" onClick="window.location.reload(true)" style="cursor:pointer;"> Dismiss Notification</a>' );
235
 
236
  // Remove the loading graphic since success.
237
  $( '#boldgrid-api-loading', $noticeContainer ).fadeOut();
@@ -239,10 +274,15 @@ BOLDGRID.LIBRARY.Api = function( $ ) {
239
  // Finally hide the input elements as we do not need them anymore.
240
  $( '#boldgrid_api_key', $noticeContainer ).fadeOut();
241
 
242
- // Reload page after 3 seconds.
243
- setTimeout( function() {
244
- window.location.reload();
245
- }, 2000 );
 
 
 
 
 
246
  } else {
247
  fail( response.data ? response.data.message : null );
248
  }
20
  $( '.boldgridApiKeyLink', notice ).on( 'click', function() {
21
  $( '.api-notice', notice ).hide();
22
  $( '.new-api-key', notice ).fadeIn( 'slow' );
23
+ } );
24
  $( '.enterKeyLink', notice ).on( 'click', function() {
25
  $( '.new-api-key', notice ).hide();
26
  $( '.api-notice', notice ).fadeIn( 'slow' );
27
+ } );
28
 
29
  /** Submit action **/
30
  $( '#requestKeyForm' ).submit( function( event ) {
37
  $email = $form.find( '#emailAddr' ).val(),
38
  $link = $form.find( '#siteUrl' ).val(),
39
  $alertBox = $( '.error-alerts' ),
40
+ $genericError =
41
+ 'There was an error communicating with the BoldGrid Connect Key server. Please try again.',
42
  $submit = $form.find( '#requestKey' ),
43
  $spinner = $form.find( '.spinner' );
44
 
45
+ $( '.error-color' ).removeClass( 'error-color' );
 
 
46
 
47
  // Basic js checks before server-side verification.
48
  if ( ! $firstName ) {
49
  $alertBox.text( 'First name is required.' );
50
+ $form
51
+ .find( '#firstName' )
52
+ .prev()
53
+ .addClass( 'error-color' );
54
  return false;
55
  }
56
  if ( ! $lastName ) {
57
  $alertBox.text( 'Last name is required.' );
58
+ $form
59
+ .find( '#lastName' )
60
+ .prev()
61
+ .addClass( 'error-color' );
62
  return false;
63
  }
64
+ if ( ! ( -1 < $email.indexOf( '@' ) && -1 < $email.indexOf( '.' ) ) ) {
65
  $alertBox.text( 'Please enter a valid e-mail address.' );
66
+ $form
67
+ .find( '#emailAddr' )
68
+ .prev()
69
+ .addClass( 'error-color' );
70
  return false;
71
  }
72
 
73
  $submit.prop( 'disabled', 'disabled' );
74
  $spinner.addClass( 'inline' );
75
 
76
+ posting = $.post( $( '#generate-api-key' ).val(), {
77
+ first: $firstName,
78
+ last: $lastName,
79
+ email: $email,
80
+ link: $link
81
+ } );
82
+
83
+ posting
84
+ .done( function( response ) {
85
+ $alertBox.text( $genericError );
86
+ if ( 200 === response.status ) {
87
+ $( '.key-request-content' ).text( response.message );
88
+ }
89
+ } )
90
+ .fail( function( post ) {
91
+ var message = post.responseJSON.message;
92
+ if ( 0 <= message.indexOf( 'First name' ) ) {
93
+ $form
94
+ .find( '#firstName' )
95
+ .prev()
96
+ .addClass( 'error-color' );
97
+ }
98
+ if ( 0 <= message.indexOf( 'Last name' ) ) {
99
+ $form
100
+ .find( '#lastName' )
101
+ .prev()
102
+ .addClass( 'error-color' );
103
+ }
104
+ if ( 0 <= message.indexOf( 'e-mail' ) ) {
105
+ $form
106
+ .find( '#emailAddr' )
107
+ .prev()
108
+ .addClass( 'error-color' );
109
+ }
110
+ $alertBox.text( message );
111
+
112
+ $submit.prop( 'disabled', false );
113
+ $spinner.removeClass( 'inline' );
114
+ } );
115
+ } );
116
 
117
  /**
118
  * When the submit button is pressed.
119
  */
120
+ $( '#boldgrid-api-form' ).submit( function( e ) {
121
  e.preventDefault();
122
+ } );
123
 
124
  $( '#boldgrid-api-loading', notice ).hide();
125
 
126
+ $( '#submit_api_key', notice ).on( 'click', function() {
127
  $( '#boldgrid_api_key_notice_message' ).empty();
128
+ if ( ! $( '#tos-box:checked' ).length ) {
129
  $( '#boldgrid_api_key_notice_message', notice )
130
  .html( 'You must agree to the Terms of Service before continuing.' )
131
  .addClass( 'error-color' );
132
  return false;
133
  }
134
+ var key = $( '#boldgrid_api_key', notice )
135
+ .val()
136
+ .replace( /[^a-z0-9]/gi, '' )
137
+ .replace( /(.{8})/g, '$1-' )
138
  .slice( 0, -1 );
139
+ if ( ! key || 35 !== key.length ) {
140
  $( '#boldgrid_api_key_notice_message', notice )
141
  .html( 'You must enter a valid BoldGrid Connect Key.' )
142
  .addClass( 'error-color' );
151
 
152
  // show the loading graphic.
153
  $( '#boldgrid-api-loading', notice ).show();
154
+ } );
155
 
156
  self._setupChangeKey();
157
+ } );
158
 
159
  /**
160
  * When a user clicks on change connect key, change the presentation to key input.
162
  * @since 2.4.0
163
  */
164
  this._setupChangeKey = function() {
165
+ notice.find( 'a[data-action="change-connect-key"]' ).on( 'click', function( e ) {
166
  e.preventDefault();
167
  notice.attr( 'data-notice-state', 'no-key-added' );
168
  } );
188
  }
189
  };
190
 
191
+ this.trackActivation = function() {
192
+
193
  // Create iframe element.
194
  var iframe = document.createElement( 'iframe' );
195
+
196
  // Assign iframe ID.
197
  iframe.setAttribute( 'id', 'tracking' );
198
+
199
  // Assign iframe width.
200
  iframe.setAttribute( 'width', 0 );
201
+
202
  // Assign iframe height.
203
  iframe.setAttribute( 'height', 0 );
204
+
205
  // Assign iframe tabindex.
206
  iframe.setAttribute( 'tabindex', -1 );
207
+
208
  // Place iframe before response message.
209
  var el = document.getElementById( 'boldgrid_api_key_notice_message' );
210
  el.parentNode.insertBefore( iframe, el );
211
+
212
  // Assign src URL to iframe.
213
  iframe.setAttribute( 'src', 'https://www.boldgrid.com/activation/' );
214
+
215
  // Set display:none to iframe;
216
  iframe.style.display = 'none';
217
  };
221
  */
222
  this.set = function( key ) {
223
  var data, nonce, wpHttpReferer, $noticeContainer;
224
+
225
  // Get the wpnonce and referer values.
226
  nonce = $( '#set_key_auth', notice ).val();
227
  wpHttpReferer = $( '[name="_wp_http_referer"]', notice ).val();
228
  data = {
229
+ action: 'addKey',
230
+ api_key: key,
231
+ set_key_auth: nonce,
232
+ _wp_http_referer: wpHttpReferer
233
  };
234
 
235
  $noticeContainer = $( '#container_boldgrid_api_key_notice' );
236
 
237
+ var fail = function( message ) {
238
  message = message || 'An unexpected error occured. Please try again later.';
239
 
240
  $( '#boldgrid-api-loading', $noticeContainer ).hide();
245
  };
246
 
247
  $.post( ajaxurl, data, function( response ) {
248
+
249
  // Declare variables.
250
+ var message,
251
+ isKeypromptMini = $( '.keyprompt-mini', $noticeContainer );
252
 
253
  // If the key was saved successfully.
254
  if ( response.success ) {
255
+ message = response.data.message;
256
+
257
+ // Change the notice from red to green, and hide the form.
258
+ if ( ! isKeypromptMini.length ) {
259
+ $noticeContainer.toggleClass( 'error' ).toggleClass( 'updated' );
260
+ $noticeContainer.addClass( 'success-add-key' );
261
+ message +=
262
+ ' <a class="dismiss-notification" onClick="window.location.reload(true)" style="cursor:pointer;"> Dismiss Notification</a>';
263
+ $( '.tos-box', $noticeContainer ).fadeOut();
264
+ }
265
 
266
  // Initiate tracking iframe.
267
  self.trackActivation();
268
 
269
+ $( '#boldgrid_api_key_notice_message', $noticeContainer ).html( message );
 
270
 
271
  // Remove the loading graphic since success.
272
  $( '#boldgrid-api-loading', $noticeContainer ).fadeOut();
274
  // Finally hide the input elements as we do not need them anymore.
275
  $( '#boldgrid_api_key', $noticeContainer ).fadeOut();
276
 
277
+ // Trigger an event, for others to do things.
278
+ $( 'body' ).trigger( 'boldgrid-key-saved' );
279
+
280
+ // Reload page after 2 seconds, if not a mini key entry prompt.
281
+ if ( ! isKeypromptMini.length ) {
282
+ setTimeout( function() {
283
+ window.location.reload();
284
+ }, 2000 );
285
+ }
286
  } else {
287
  fail( response.data ? response.data.message : null );
288
  }
vendor/boldgrid/library/src/assets/js/attributes.js ADDED
@@ -0,0 +1,255 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Handle page attributes within the editor.
3
+ *
4
+ * Specifically, handle the edit, ok, and cancel options. This replicates the options native to
5
+ * meta boxes (such as the status and visibility settings in the publish meta box).
6
+ *
7
+ * @since 2.7.0
8
+ */
9
+
10
+ /* global jQuery */
11
+
12
+ var BOLDGRID = BOLDGRID || {};
13
+ BOLDGRID.LIBRARY = BOLDGRID.LIBRARY || {};
14
+
15
+ ( function( $ ) {
16
+ 'use strict';
17
+
18
+ var self;
19
+
20
+ BOLDGRID.LIBRARY.Attributes = {
21
+
22
+ /**
23
+ * @summary Get the default option element.
24
+ *
25
+ * Either we explicity flagged an element with data-default-option="1", or we get the
26
+ * selected value.
27
+ *
28
+ * @since 2.7.0
29
+ *
30
+ * @param Object $section A ".misc-pub-section" section.
31
+ * @return Object The default option.
32
+ */
33
+ getDefaultOption: function( $section ) {
34
+ var $defaultOption = $section.find( '[data-default-option="1"]' );
35
+
36
+ if( 0 === $defaultOption.length ) {
37
+ $defaultOption = self.getSectionChecked( $section );
38
+ $defaultOption.attr( 'data-default-option', '1' );
39
+ }
40
+
41
+ return $defaultOption;
42
+ },
43
+
44
+ /**
45
+ * @summary Get the display value of an element.
46
+ *
47
+ * @see self.initValueDisplayed().
48
+ *
49
+ * @since 2.7.0
50
+ *
51
+ * @param Object $element The element to determine the display value of.
52
+ * @return string
53
+ */
54
+ getDisplayValue: function( $element ) {
55
+ var displayValue = $element.attr( 'data-value-displayed' ),
56
+ inputType,
57
+ $parent;
58
+
59
+ if( displayValue === undefined ) {
60
+ $parent = $element.closest( '.bglib-misc-pub-section' );
61
+ inputType = self.getSectionInput( $parent );
62
+
63
+ switch( inputType ) {
64
+ case 'select':
65
+ displayValue = $element.text();
66
+ break;
67
+ case 'radio':
68
+ // This is a guess.
69
+ displayValue = $element.parent().text();
70
+ break;
71
+ }
72
+ }
73
+
74
+ return displayValue;
75
+ },
76
+
77
+ /**
78
+ * @summary Get the selected value of a section.
79
+ *
80
+ * Determine whether we're dealing with a radio button or a select, and get the selected /
81
+ * checked option.
82
+ *
83
+ * @since 2.7.0
84
+ *
85
+ * @param Object $section A ".misc-pub-section" section.
86
+ * @return Object
87
+ */
88
+ getSectionChecked: function( $section ) {
89
+ var inputType = self.getSectionInput( $section ),
90
+ $checked;
91
+
92
+ switch( inputType ) {
93
+ case 'select':
94
+ $checked = $section.find( ':selected' );
95
+ break;
96
+ case 'radio':
97
+ $checked = $section.find( '[type="radio"]:checked' );
98
+ break;
99
+ }
100
+
101
+ return $checked;
102
+ },
103
+
104
+ /**
105
+ * @summary Get the type of input available in this section.
106
+ *
107
+ * For example, when selecting a status value, you may have a "select". Or, when selecting
108
+ * visibility value, you may have a "radio".
109
+ *
110
+ * @since 2.7.0
111
+ *
112
+ * @param Object $section A ".misc-pub-section" section.
113
+ * @return string
114
+ */
115
+ getSectionInput: function( $section ) {
116
+ var types = {
117
+ select: 'select',
118
+ radio : 'input[type="radio"]'
119
+ },
120
+ inputType = false,
121
+ key;
122
+
123
+ for( key in types ) {
124
+ if( 0 < $section.find( types[key] ).length ) {
125
+ inputType = key;
126
+ break;
127
+ }
128
+ }
129
+
130
+ return inputType;
131
+ },
132
+
133
+ /**
134
+ * @summary Initialize the "value displayed" element.
135
+ *
136
+ * The value displayed is the "VALUE" in the below example:
137
+ * Key: VALUE Edit
138
+ *
139
+ * The above example can be further broken down with the following markup example:
140
+ * <div class="misc-pub-section bglib-misc-pub-section">
141
+ * Status: <span class="value-displayed">Published</span> <a>Edit</a>
142
+ * </div>
143
+ *
144
+ * The reason we need to initialize it is because there may be no value set at all, but we
145
+ * need to show the user what the default value is. The text for the value-displayed element
146
+ * is retrieved via self.getDisplayValue.
147
+ *
148
+ * @since 2.7.0
149
+ *
150
+ * @param Object $section A ".misc-pub-section" section.
151
+ */
152
+ initValueDisplayed: function( $section ) {
153
+ var $defaultOption = self.getDefaultOption( $section ),
154
+ displayValue = self.getDisplayValue( $defaultOption ),
155
+ inputType = self.getSectionInput( $section );
156
+
157
+ // Set the "value-displayed" text.
158
+ $section.find( '.value-displayed' ).html( displayValue );
159
+
160
+ /*
161
+ * Usually the $defaultOption is already selected. In the event of the user clicking
162
+ * cancel, we'll have to reset the selected value.
163
+ */
164
+ switch( inputType ) {
165
+ case 'select':
166
+ $defaultOption.prop( 'selected', true );
167
+ break;
168
+ case 'radio':
169
+ $defaultOption.prop( 'checked', true );
170
+ break;
171
+ }
172
+ },
173
+
174
+ /**
175
+ * Initialize all .bglib-misc-pub-section feilds.
176
+ *
177
+ * @since 2.7.0
178
+ */
179
+ initValuesDisplayed: function() {
180
+ $( '.bglib-misc-pub-section' ).each( function() {
181
+ self.initValueDisplayed( $( this ) );
182
+ });
183
+ },
184
+
185
+ /**
186
+ * @summary Handle the click of the Edit link.
187
+ *
188
+ * When the Edit link is clicked, we need to show the available options to the user.
189
+ *
190
+ * @since 2.7.0
191
+ *
192
+ * @memberOf BOLDGRID.LIBRARY.Attributes
193
+ */
194
+ onClickEdit: function() {
195
+ var $edit = $( this ),
196
+ $section = $edit.closest( '.bglib-misc-pub-section' );
197
+
198
+ $section.find( '.options' ).slideToggle( 'fast' );
199
+ $edit.toggle();
200
+
201
+ // This is a button / anchor click. Return false.
202
+ return false;
203
+ },
204
+
205
+ /**
206
+ * @summary Handle the click of the Cancel link.
207
+ *
208
+ * When the cancel link is clicked, the selected value needs to be reset.
209
+ *
210
+ * @since 2.7.0
211
+ */
212
+ onClickCancel: function() {
213
+ var $cancel = $( this ),
214
+ $section = $cancel.closest( '.bglib-misc-pub-section' );
215
+
216
+ $section
217
+ .find( '.options' ).slideToggle( 'fast' ).end()
218
+ .find( '.edit' ).toggle();
219
+
220
+ self.initValueDisplayed( $section );
221
+
222
+ // This is a button / anchor click. Return false.
223
+ return false;
224
+ },
225
+
226
+ /**
227
+ * @summary Handle the click of the OK button.
228
+ *
229
+ * @since 2.7.0
230
+ */
231
+ onClickOk: function() {
232
+ var $ok = $( this ),
233
+ $section = $ok.closest( '.bglib-misc-pub-section' ),
234
+ $selected = self.getSectionChecked( $section ),
235
+ displayValue = self.getDisplayValue( $selected );
236
+
237
+ $section
238
+ .find( '.options' ).slideToggle( 'fast' ).end()
239
+ .find( '.edit' ).toggle().end()
240
+ .find( '.value-displayed' ).html( displayValue );
241
+
242
+ // This is a button / anchor click. Return false.
243
+ return false;
244
+ }
245
+ };
246
+
247
+ self = BOLDGRID.LIBRARY.Attributes;
248
+
249
+ $( function() {
250
+ $( 'body' ).on( 'click', '.bglib-misc-pub-section a.edit', BOLDGRID.LIBRARY.Attributes.onClickEdit );
251
+ $( 'body' ).on( 'click', '.bglib-misc-pub-section a.button-cancel', BOLDGRID.LIBRARY.Attributes.onClickCancel );
252
+ $( 'body' ).on( 'click', '.bglib-misc-pub-section a.button', BOLDGRID.LIBRARY.Attributes.onClickOk );
253
+ self.initValuesDisplayed();
254
+ } );
255
+ })( jQuery );
vendor/boldgrid/library/src/assets/js/connect.js CHANGED
@@ -1,9 +1,17 @@
 
 
 
 
 
 
 
 
1
  /* global ajaxurl,jQuery */
2
 
3
  var BOLDGRID = BOLDGRID || {};
4
  BOLDGRID.LIBRARY = BOLDGRID.LIBRARY || {};
5
 
6
- ( function ( $ ) {
7
  BOLDGRID.LIBRARY.Connect = {
8
 
9
  /**
@@ -11,7 +19,7 @@ BOLDGRID.LIBRARY = BOLDGRID.LIBRARY || {};
11
  *
12
  * @since 2.4.0
13
  */
14
- init: function () {
15
  $( self._onLoad );
16
  },
17
 
@@ -22,6 +30,8 @@ BOLDGRID.LIBRARY = BOLDGRID.LIBRARY || {};
22
  */
23
  _onLoad: function() {
24
  self._repositionNotice();
 
 
25
  },
26
 
27
  /**
@@ -32,10 +42,107 @@ BOLDGRID.LIBRARY = BOLDGRID.LIBRARY || {};
32
  _repositionNotice: function() {
33
  var $connectKeySection = $( '.connect-key-prompt' );
34
 
35
- setTimeout( function () {
36
  $connectKeySection.after( $( '#container_boldgrid_api_key_notice' ) );
37
  } );
38
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  };
40
 
41
  var self = BOLDGRID.LIBRARY.Connect;
1
+ /**
2
+ * BoldGrid Library Connect.
3
+ *
4
+ * @summary JavaScript to handle UI/UX.
5
+ *
6
+ * @since 2.4.0
7
+ */
8
+
9
  /* global ajaxurl,jQuery */
10
 
11
  var BOLDGRID = BOLDGRID || {};
12
  BOLDGRID.LIBRARY = BOLDGRID.LIBRARY || {};
13
 
14
+ ( function( $ ) {
15
  BOLDGRID.LIBRARY.Connect = {
16
 
17
  /**
19
  *
20
  * @since 2.4.0
21
  */
22
+ init: function() {
23
  $( self._onLoad );
24
  },
25
 
30
  */
31
  _onLoad: function() {
32
  self._repositionNotice();
33
+
34
+ $( '#submit' ).on( 'click', self._submit );
35
  },
36
 
37
  /**
42
  _repositionNotice: function() {
43
  var $connectKeySection = $( '.connect-key-prompt' );
44
 
45
+ setTimeout( function() {
46
  $connectKeySection.after( $( '#container_boldgrid_api_key_notice' ) );
47
  } );
48
+ },
49
+
50
+ /**
51
+ * Handle form submission.
52
+ *
53
+ * @since 2.7.0
54
+ */
55
+ _submit: function() {
56
+ var $this = $( this ),
57
+ $spinner = $this.next(),
58
+ $notice = $( '#settings-notice' ),
59
+ data = {
60
+ action: 'boldgrid_library_connect_settings_save',
61
+ _wpnonce: $( '[name="_wpnonce"]' ).val(),
62
+ _wp_http_referer: $( '[name="_wp_http_referer"]' ).val(),
63
+ plugin_release_channel: $( 'input[name="plugin_release_channel"]:checked' ).val(),
64
+ theme_release_channel: $( 'input[name="theme_release_channel"]:checked' ).val()
65
+ };
66
+
67
+ $this.attr( 'disabled', 'disabled' );
68
+
69
+ $spinner.addClass( 'inline' );
70
+
71
+ $.post(
72
+ ajaxurl,
73
+ data,
74
+ function( response ) {
75
+ if ( response.success !== undefined && true === response.success ) {
76
+ $notice
77
+ .removeClass( 'notice-error' )
78
+ .addClass( 'notice-success' )
79
+ .html( BoldGridLibraryConnect.settingsSaved );
80
+ } else if ( response.data !== undefined && response.data.error !== undefined ) {
81
+ $notice
82
+ .removeClass( 'notice-success' )
83
+ .addClass( 'notice-error' )
84
+ .html( response.data.error );
85
+ $this.removeAttr( 'disabled' );
86
+ } else {
87
+ $notice
88
+ .removeClass( 'notice-success' )
89
+ .addClass( 'notice-error' )
90
+ .html( BoldGridLibraryConnect.unknownError );
91
+ $this.removeAttr( 'disabled' );
92
+ }
93
+ },
94
+ 'json'
95
+ )
96
+ .fail( function( jqXHR ) {
97
+ $notice
98
+ .removeClass( 'notice-success' )
99
+ .addClass( 'notice-error' )
100
+ .html( BoldGridLibraryConnect.ajaxError + jqXHR.status + ' (' + jqXHR.statusText + ')' );
101
+ } )
102
+ .always( function() {
103
+ self._replaceNotice( $notice );
104
+
105
+ $notice.wrapInner( '<p></p>' ).show();
106
+ $spinner.removeClass( 'inline' );
107
+ $this.removeAttr( 'disabled' );
108
+ $( 'body' ).trigger( 'make_notices_dismissible' );
109
+ } );
110
+ },
111
+
112
+ /**
113
+ * Replace the notice with a clone when removed by dismissal.
114
+ *
115
+ * @since 2.7.0
116
+ */
117
+ _replaceNotice: function( $notice ) {
118
+ var $noticeClone = $notice.clone(),
119
+ $noticeNext = $notice.next();
120
+
121
+ $notice.one( 'click.wp-dismiss-notice', '.notice-dismiss', function() {
122
+ $noticeNext.before( $noticeClone );
123
+ $notice = $noticeClone;
124
+ $notice.hide();
125
+ } );
126
+ },
127
+
128
+ /**
129
+ * Handle form submission.
130
+ *
131
+ * @since 2.7.0
132
+ */
133
+ _toggleHelp: function( e ) {
134
+ var id = $( this ).attr( 'data-id' );
135
+
136
+ e.preventDefault();
137
+
138
+ if ( id === undefined ) {
139
+ return false;
140
+ }
141
+
142
+ $( '.help[data-id="' + id + '"]' ).slideToggle();
143
+
144
+ return false;
145
+ },
146
  };
147
 
148
  var self = BOLDGRID.LIBRARY.Connect;
vendor/boldgrid/library/src/assets/js/license.js CHANGED
@@ -19,17 +19,15 @@ BOLDGRID.LIBRARY = BOLDGRID.LIBRARY || {};
19
  */
20
  clear: function( plugin, onSuccess, onError ) {
21
  var data = {
22
- 'action' : 'bg_clear_license',
23
- 'plugin' : plugin,
24
  };
25
 
26
  $.post( ajaxurl, data, function( response ) {
27
  onSuccess( response );
28
- }).error( function() {
29
  onError();
30
- });
31
- },
32
  };
33
-
34
- })( jQuery );
35
-
19
  */
20
  clear: function( plugin, onSuccess, onError ) {
21
  var data = {
22
+ action: 'bg_clear_license',
23
+ plugin: plugin
24
  };
25
 
26
  $.post( ajaxurl, data, function( response ) {
27
  onSuccess( response );
28
+ } ).error( function() {
29
  onError();
30
+ } );
31
+ }
32
  };
33
+ } )( jQuery );
 
 
vendor/boldgrid/library/src/assets/js/notice.js CHANGED
@@ -10,7 +10,6 @@ BOLDGRID.LIBRARY.Notice = function( $ ) {
10
 
11
  /** Dismissible action **/
12
  $notices.on( 'click', '.notice-dismiss', self.dismiss );
13
-
14
  } );
15
 
16
  /**
@@ -22,10 +21,10 @@ BOLDGRID.LIBRARY.Notice = function( $ ) {
22
  var $notice = $( this ).closest( '.boldgrid-notice' );
23
 
24
  $.post( ajaxurl, {
25
- 'action' : 'dismissBoldgridNotice',
26
- 'notice' : $notice.data( 'notice-id' ),
27
- 'set_key_auth' : $( '#set_key_auth', $notice ).val(),
28
- '_wp_http_referer' : $( '[name="_wp_http_referer"]', $notice ).val(),
29
  } );
30
  };
31
  };
10
 
11
  /** Dismissible action **/
12
  $notices.on( 'click', '.notice-dismiss', self.dismiss );
 
13
  } );
14
 
15
  /**
21
  var $notice = $( this ).closest( '.boldgrid-notice' );
22
 
23
  $.post( ajaxurl, {
24
+ action: 'dismissBoldgridNotice',
25
+ notice: $notice.data( 'notice-id' ),
26
+ set_key_auth: $( '#set_key_auth', $notice ).val(),
27
+ _wp_http_referer: $( '[name="_wp_http_referer"]', $notice ).val()
28
  } );
29
  };
30
  };
vendor/boldgrid/library/src/assets/js/sticky.js CHANGED
@@ -10,279 +10,309 @@
10
  // It will only set the 'top' and 'position' of your element, you
11
  // might need to adjust the width in some cases.
12
 
13
- (function (factory) {
14
- if (typeof define === 'function' && define.amd) {
15
- // AMD. Register as an anonymous module.
16
- define(['jquery'], factory);
17
- } else if (typeof module === 'object' && module.exports) {
18
- // Node/CommonJS
19
- module.exports = factory(require('jquery'));
20
- } else {
21
- // Browser globals
22
- factory(jQuery);
23
- }
24
- }(function ($) {
25
- var slice = Array.prototype.slice; // save ref to original slice()
26
- var splice = Array.prototype.splice; // save ref to original slice()
27
-
28
- var defaults = {
29
- topSpacing: 0,
30
- bottomSpacing: 0,
31
- className: 'is-sticky',
32
- wrapperClassName: 'sticky-wrapper',
33
- center: false,
34
- getWidthFrom: '',
35
- widthFromWrapper: true, // works only when .getWidthFrom is empty
36
- responsiveWidth: false,
37
- zIndex: 'inherit'
38
- },
39
- $window = $(window),
40
- $document = $(document),
41
- sticked = [],
42
- windowHeight = $window.height(),
43
- scroller = function() {
44
- var scrollTop = $window.scrollTop(),
45
- documentHeight = $document.height(),
46
- dwh = documentHeight - windowHeight,
47
- extra = (scrollTop > dwh) ? dwh - scrollTop : 0;
48
-
49
- for (var i = 0, l = sticked.length; i < l; i++) {
50
- var s = sticked[i],
51
- elementTop = s.stickyWrapper.offset().top,
52
- etse = elementTop - s.topSpacing - extra;
53
-
54
- //update height in case of dynamic content
55
- s.stickyWrapper.css('height', s.stickyElement.outerHeight());
56
-
57
- if (scrollTop <= etse) {
58
- if (s.currentTop !== null) {
59
- s.stickyElement
60
- .css({
61
- 'width': '',
62
- 'position': '',
63
- 'top': '',
64
- 'z-index': ''
65
- });
66
- s.stickyElement.parent().removeClass(s.className);
67
- s.stickyElement.trigger('sticky-end', [s]);
68
- s.currentTop = null;
69
- }
70
- }
71
- else {
72
- var newTop = documentHeight - s.stickyElement.outerHeight()
73
- - s.topSpacing - s.bottomSpacing - scrollTop - extra;
74
- if (newTop < 0) {
75
- newTop = newTop + s.topSpacing;
76
- } else {
77
- newTop = s.topSpacing;
78
- }
79
- if (s.currentTop !== newTop) {
80
- var newWidth;
81
- if (s.getWidthFrom) {
82
- padding = s.stickyElement.innerWidth() - s.stickyElement.width();
83
- newWidth = $(s.getWidthFrom).width() - padding || null;
84
- } else if (s.widthFromWrapper) {
85
- newWidth = s.stickyWrapper.width();
86
- }
87
- if (newWidth == null) {
88
- newWidth = s.stickyElement.width();
89
- }
90
- s.stickyElement
91
- .css('width', newWidth)
92
- .css('position', 'fixed')
93
- .css('top', newTop)
94
- .css('z-index', s.zIndex);
95
-
96
- s.stickyElement.parent().addClass(s.className);
97
-
98
- if (s.currentTop === null) {
99
- s.stickyElement.trigger('sticky-start', [s]);
100
- } else {
101
- // sticky is started but it have to be repositioned
102
- s.stickyElement.trigger('sticky-update', [s]);
103
- }
104
-
105
- if (s.currentTop === s.topSpacing && s.currentTop > newTop || s.currentTop === null && newTop < s.topSpacing) {
106
- // just reached bottom || just started to stick but bottom is already reached
107
- s.stickyElement.trigger('sticky-bottom-reached', [s]);
108
- } else if(s.currentTop !== null && newTop === s.topSpacing && s.currentTop < newTop) {
109
- // sticky is started && sticked at topSpacing && overflowing from top just finished
110
- s.stickyElement.trigger('sticky-bottom-unreached', [s]);
111
- }
112
-
113
- s.currentTop = newTop;
114
- }
115
-
116
- // Check if sticky has reached end of container and stop sticking
117
- var stickyWrapperContainer = s.stickyWrapper.parent();
118
- var unstick = (s.stickyElement.offset().top + s.stickyElement.outerHeight() >= stickyWrapperContainer.offset().top + stickyWrapperContainer.outerHeight()) && (s.stickyElement.offset().top <= s.topSpacing);
119
-
120
- if( unstick ) {
121
- s.stickyElement
122
- .css('position', 'absolute')
123
- .css('top', '')
124
- .css('bottom', 0)
125
- .css('z-index', '');
126
- } else {
127
- s.stickyElement
128
- .css('position', 'fixed')
129
- .css('top', newTop)
130
- .css('bottom', '')
131
- .css('z-index', s.zIndex);
132
- }
133
- }
134
- }
135
- },
136
- resizer = function() {
137
- windowHeight = $window.height();
138
-
139
- for (var i = 0, l = sticked.length; i < l; i++) {
140
- var s = sticked[i];
141
- var newWidth = null;
142
- if (s.getWidthFrom) {
143
- if (s.responsiveWidth) {
144
- newWidth = $(s.getWidthFrom).width();
145
- }
146
- } else if(s.widthFromWrapper) {
147
- newWidth = s.stickyWrapper.width();
148
- }
149
- if (newWidth != null) {
150
- s.stickyElement.css('width', newWidth);
151
- }
152
- }
153
- },
154
- methods = {
155
- init: function(options) {
156
- return this.each(function() {
157
- var o = $.extend({}, defaults, options);
158
- var stickyElement = $(this);
159
-
160
- var stickyId = stickyElement.attr('id');
161
- var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName;
162
- var wrapper = $('<div></div>')
163
- .attr('id', wrapperId)
164
- .addClass(o.wrapperClassName);
165
-
166
- stickyElement.wrapAll(function() {
167
- if ($(this).parent("#" + wrapperId).length == 0) {
168
- return wrapper;
169
- }
170
- });
171
-
172
- var stickyWrapper = stickyElement.parent();
173
-
174
- if (o.center) {
175
- stickyWrapper.css({width:stickyElement.outerWidth(),marginLeft:"auto",marginRight:"auto"});
176
- }
177
-
178
- if (stickyElement.css("float") === "right") {
179
- stickyElement.css({"float":"none"}).parent().css({"float":"right"});
180
- }
181
-
182
- o.stickyElement = stickyElement;
183
- o.stickyWrapper = stickyWrapper;
184
- o.currentTop = null;
185
-
186
- sticked.push(o);
187
-
188
- methods.setWrapperHeight(this);
189
- methods.setupChangeListeners(this);
190
- });
191
- },
192
-
193
- setWrapperHeight: function(stickyElement) {
194
- var element = $(stickyElement);
195
- var stickyWrapper = element.parent();
196
- if (stickyWrapper) {
197
- stickyWrapper.css('height', element.outerHeight());
198
- }
199
- },
200
-
201
- setupChangeListeners: function(stickyElement) {
202
- if (window.MutationObserver) {
203
- var mutationObserver = new window.MutationObserver(function(mutations) {
204
- if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) {
205
- methods.setWrapperHeight(stickyElement);
206
- }
207
- });
208
- mutationObserver.observe(stickyElement, {subtree: true, childList: true});
209
- } else {
210
- if (window.addEventListener) {
211
- stickyElement.addEventListener('DOMNodeInserted', function() {
212
- methods.setWrapperHeight(stickyElement);
213
- }, false);
214
- stickyElement.addEventListener('DOMNodeRemoved', function() {
215
- methods.setWrapperHeight(stickyElement);
216
- }, false);
217
- } else if (window.attachEvent) {
218
- stickyElement.attachEvent('onDOMNodeInserted', function() {
219
- methods.setWrapperHeight(stickyElement);
220
- });
221
- stickyElement.attachEvent('onDOMNodeRemoved', function() {
222
- methods.setWrapperHeight(stickyElement);
223
- });
224
- }
225
- }
226
- },
227
- update: scroller,
228
- unstick: function(options) {
229
- return this.each(function() {
230
- var that = this;
231
- var unstickyElement = $(that);
232
-
233
- var removeIdx = -1;
234
- var i = sticked.length;
235
- while (i-- > 0) {
236
- if (sticked[i].stickyElement.get(0) === that) {
237
- splice.call(sticked,i,1);
238
- removeIdx = i;
239
- }
240
- }
241
- if(removeIdx !== -1) {
242
- unstickyElement.unwrap();
243
- unstickyElement
244
- .css({
245
- 'width': '',
246
- 'position': '',
247
- 'top': '',
248
- 'float': '',
249
- 'z-index': ''
250
- })
251
- ;
252
- }
253
- });
254
- }
255
- };
256
-
257
- // should be more efficient than using $window.scroll(scroller) and $window.resize(resizer):
258
- if (window.addEventListener) {
259
- window.addEventListener('scroll', scroller, false);
260
- window.addEventListener('resize', resizer, false);
261
- } else if (window.attachEvent) {
262
- window.attachEvent('onscroll', scroller);
263
- window.attachEvent('onresize', resizer);
264
- }
265
-
266
- $.fn.sticky = function(method) {
267
- if (methods[method]) {
268
- return methods[method].apply(this, slice.call(arguments, 1));
269
- } else if (typeof method === 'object' || !method ) {
270
- return methods.init.apply( this, arguments );
271
- } else {
272
- $.error('Method ' + method + ' does not exist on jQuery.sticky');
273
- }
274
- };
275
-
276
- $.fn.unstick = function(method) {
277
- if (methods[method]) {
278
- return methods[method].apply(this, slice.call(arguments, 1));
279
- } else if (typeof method === 'object' || !method ) {
280
- return methods.unstick.apply( this, arguments );
281
- } else {
282
- $.error('Method ' + method + ' does not exist on jQuery.sticky');
283
- }
284
- };
285
- $(function() {
286
- setTimeout(scroller, 0);
287
- });
288
- }));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  // It will only set the 'top' and 'position' of your element, you
11
  // might need to adjust the width in some cases.
12
 
13
+ ( function( factory ) {
14
+ if ( 'function' === typeof define && define.amd ) {
15
+
16
+ // AMD. Register as an anonymous module.
17
+ define( [ 'jquery' ], factory );
18
+ } else if ( 'object' === typeof module && module.exports ) {
19
+
20
+ // Node/CommonJS
21
+ module.exports = factory( require( 'jquery' ) );
22
+ } else {
23
+
24
+ // Browser globals
25
+ factory( jQuery );
26
+ }
27
+ } )( function( $ ) {
28
+ var slice = Array.prototype.slice; // save ref to original slice()
29
+ var splice = Array.prototype.splice; // save ref to original slice()
30
+
31
+ var defaults = {
32
+ topSpacing: 0,
33
+ bottomSpacing: 0,
34
+ className: 'is-sticky',
35
+ wrapperClassName: 'sticky-wrapper',
36
+ center: false,
37
+ getWidthFrom: '',
38
+ widthFromWrapper: true, // works only when .getWidthFrom is empty
39
+ responsiveWidth: false,
40
+ zIndex: 'inherit'
41
+ },
42
+ $window = $( window ),
43
+ $document = $( document ),
44
+ sticked = [],
45
+ windowHeight = $window.height(),
46
+ scroller = function() {
47
+ var scrollTop = $window.scrollTop(),
48
+ documentHeight = $document.height(),
49
+ dwh = documentHeight - windowHeight,
50
+ extra = scrollTop > dwh ? dwh - scrollTop : 0;
51
+
52
+ for ( var i = 0, l = sticked.length; i < l; i++ ) {
53
+ var s = sticked[i],
54
+ elementTop = s.stickyWrapper.offset().top,
55
+ etse = elementTop - s.topSpacing - extra;
56
+
57
+ //update height in case of dynamic content
58
+ s.stickyWrapper.css( 'height', s.stickyElement.outerHeight() );
59
+
60
+ if ( scrollTop <= etse ) {
61
+ if ( null !== s.currentTop ) {
62
+ s.stickyElement.css( {
63
+ width: '',
64
+ position: '',
65
+ top: '',
66
+ 'z-index': ''
67
+ } );
68
+ s.stickyElement.parent().removeClass( s.className );
69
+ s.stickyElement.trigger( 'sticky-end', [ s ] );
70
+ s.currentTop = null;
71
+ }
72
+ } else {
73
+ var newTop =
74
+ documentHeight -
75
+ s.stickyElement.outerHeight() -
76
+ s.topSpacing -
77
+ s.bottomSpacing -
78
+ scrollTop -
79
+ extra;
80
+ if ( 0 > newTop ) {
81
+ newTop = newTop + s.topSpacing;
82
+ } else {
83
+ newTop = s.topSpacing;
84
+ }
85
+ if ( s.currentTop !== newTop ) {
86
+ var newWidth;
87
+ if ( s.getWidthFrom ) {
88
+ padding = s.stickyElement.innerWidth() - s.stickyElement.width();
89
+ newWidth = $( s.getWidthFrom ).width() - padding || null;
90
+ } else if ( s.widthFromWrapper ) {
91
+ newWidth = s.stickyWrapper.width();
92
+ }
93
+ if ( null == newWidth ) {
94
+ newWidth = s.stickyElement.width();
95
+ }
96
+ s.stickyElement
97
+ .css( 'width', newWidth )
98
+ .css( 'position', 'fixed' )
99
+ .css( 'top', newTop )
100
+ .css( 'z-index', s.zIndex );
101
+
102
+ s.stickyElement.parent().addClass( s.className );
103
+
104
+ if ( null === s.currentTop ) {
105
+ s.stickyElement.trigger( 'sticky-start', [ s ] );
106
+ } else {
107
+
108
+ // sticky is started but it have to be repositioned
109
+ s.stickyElement.trigger( 'sticky-update', [ s ] );
110
+ }
111
+
112
+ if (
113
+ ( s.currentTop === s.topSpacing && s.currentTop > newTop ) ||
114
+ ( null === s.currentTop && newTop < s.topSpacing )
115
+ ) {
116
+
117
+ // just reached bottom || just started to stick but bottom is already reached
118
+ s.stickyElement.trigger( 'sticky-bottom-reached', [ s ] );
119
+ } else if ( null !== s.currentTop && newTop === s.topSpacing && s.currentTop < newTop ) {
120
+
121
+ // sticky is started && sticked at topSpacing && overflowing from top just finished
122
+ s.stickyElement.trigger( 'sticky-bottom-unreached', [ s ] );
123
+ }
124
+
125
+ s.currentTop = newTop;
126
+ }
127
+
128
+ // Check if sticky has reached end of container and stop sticking
129
+ var stickyWrapperContainer = s.stickyWrapper.parent();
130
+ var unstick =
131
+ s.stickyElement.offset().top + s.stickyElement.outerHeight() >=
132
+ stickyWrapperContainer.offset().top + stickyWrapperContainer.outerHeight() &&
133
+ s.stickyElement.offset().top <= s.topSpacing;
134
+
135
+ if ( unstick ) {
136
+ s.stickyElement
137
+ .css( 'position', 'absolute' )
138
+ .css( 'top', '' )
139
+ .css( 'bottom', 0 )
140
+ .css( 'z-index', '' );
141
+ } else {
142
+ s.stickyElement
143
+ .css( 'position', 'fixed' )
144
+ .css( 'top', newTop )
145
+ .css( 'bottom', '' )
146
+ .css( 'z-index', s.zIndex );
147
+ }
148
+ }
149
+ }
150
+ },
151
+ resizer = function() {
152
+ windowHeight = $window.height();
153
+
154
+ for ( var i = 0, l = sticked.length; i < l; i++ ) {
155
+ var s = sticked[i];
156
+ var newWidth = null;
157
+ if ( s.getWidthFrom ) {
158
+ if ( s.responsiveWidth ) {
159
+ newWidth = $( s.getWidthFrom ).width();
160
+ }
161
+ } else if ( s.widthFromWrapper ) {
162
+ newWidth = s.stickyWrapper.width();
163
+ }
164
+ if ( null != newWidth ) {
165
+ s.stickyElement.css( 'width', newWidth );
166
+ }
167
+ }
168
+ },
169
+ methods = {
170
+ init: function( options ) {
171
+ return this.each( function() {
172
+ var o = $.extend( {}, defaults, options );
173
+ var stickyElement = $( this );
174
+
175
+ var stickyId = stickyElement.attr( 'id' );
176
+ var wrapperId = stickyId ?
177
+ stickyId + '-' + defaults.wrapperClassName :
178
+ defaults.wrapperClassName;
179
+ var wrapper = $( '<div></div>' )
180
+ .attr( 'id', wrapperId )
181
+ .addClass( o.wrapperClassName );
182
+
183
+ stickyElement.wrapAll( function() {
184
+ if ( 0 == $( this ).parent( '#' + wrapperId ).length ) {
185
+ return wrapper;
186
+ }
187
+ } );
188
+
189
+ var stickyWrapper = stickyElement.parent();
190
+
191
+ if ( o.center ) {
192
+ stickyWrapper.css( {
193
+ width: stickyElement.outerWidth(),
194
+ marginLeft: 'auto',
195
+ marginRight: 'auto'
196
+ } );
197
+ }
198
+
199
+ if ( 'right' === stickyElement.css( 'float' ) ) {
200
+ stickyElement
201
+ .css( { float: 'none' } )
202
+ .parent()
203
+ .css( { float: 'right' } );
204
+ }
205
+
206
+ o.stickyElement = stickyElement;
207
+ o.stickyWrapper = stickyWrapper;
208
+ o.currentTop = null;
209
+
210
+ sticked.push( o );
211
+
212
+ methods.setWrapperHeight( this );
213
+ methods.setupChangeListeners( this );
214
+ } );
215
+ },
216
+
217
+ setWrapperHeight: function( stickyElement ) {
218
+ var element = $( stickyElement );
219
+ var stickyWrapper = element.parent();
220
+ if ( stickyWrapper ) {
221
+ stickyWrapper.css( 'height', element.outerHeight() );
222
+ }
223
+ },
224
+
225
+ setupChangeListeners: function( stickyElement ) {
226
+ if ( window.MutationObserver ) {
227
+ var mutationObserver = new window.MutationObserver( function( mutations ) {
228
+ if ( mutations[0].addedNodes.length || mutations[0].removedNodes.length ) {
229
+ methods.setWrapperHeight( stickyElement );
230
+ }
231
+ } );
232
+ mutationObserver.observe( stickyElement, { subtree: true, childList: true } );
233
+ } else {
234
+ if ( window.addEventListener ) {
235
+ stickyElement.addEventListener(
236
+ 'DOMNodeInserted',
237
+ function() {
238
+ methods.setWrapperHeight( stickyElement );
239
+ },
240
+ false
241
+ );
242
+ stickyElement.addEventListener(
243
+ 'DOMNodeRemoved',
244
+ function() {
245
+ methods.setWrapperHeight( stickyElement );
246
+ },
247
+ false
248
+ );
249
+ } else if ( window.attachEvent ) {
250
+ stickyElement.attachEvent( 'onDOMNodeInserted', function() {
251
+ methods.setWrapperHeight( stickyElement );
252
+ } );
253
+ stickyElement.attachEvent( 'onDOMNodeRemoved', function() {
254
+ methods.setWrapperHeight( stickyElement );
255
+ } );
256
+ }
257
+ }
258
+ },
259
+ update: scroller,
260
+ unstick: function( options ) {
261
+ return this.each( function() {
262
+ var that = this;
263
+ var unstickyElement = $( that );
264
+
265
+ var removeIdx = -1;
266
+ var i = sticked.length;
267
+ while ( 0 < i-- ) {
268
+ if ( sticked[i].stickyElement.get( 0 ) === that ) {
269
+ splice.call( sticked, i, 1 );
270
+ removeIdx = i;
271
+ }
272
+ }
273
+ if ( -1 !== removeIdx ) {
274
+ unstickyElement.unwrap();
275
+ unstickyElement.css( {
276
+ width: '',
277
+ position: '',
278
+ top: '',
279
+ float: '',
280
+ 'z-index': ''
281
+ } );
282
+ }
283
+ } );
284
+ }
285
+ };
286
+
287
+ // should be more efficient than using $window.scroll(scroller) and $window.resize(resizer):
288
+ if ( window.addEventListener ) {
289
+ window.addEventListener( 'scroll', scroller, false );
290
+ window.addEventListener( 'resize', resizer, false );
291
+ } else if ( window.attachEvent ) {
292
+ window.attachEvent( 'onscroll', scroller );
293
+ window.attachEvent( 'onresize', resizer );
294
+ }
295
+
296
+ $.fn.sticky = function( method ) {
297
+ if ( methods[method] ) {
298
+ return methods[method].apply( this, slice.call( arguments, 1 ) );
299
+ } else if ( 'object' === typeof method || ! method ) {
300
+ return methods.init.apply( this, arguments );
301
+ } else {
302
+ $.error( 'Method ' + method + ' does not exist on jQuery.sticky' );
303
+ }
304
+ };
305
+
306
+ $.fn.unstick = function( method ) {
307
+ if ( methods[method] ) {
308
+ return methods[method].apply( this, slice.call( arguments, 1 ) );
309
+ } else if ( 'object' === typeof method || ! method ) {
310
+ return methods.unstick.apply( this, arguments );
311
+ } else {
312
+ $.error( 'Method ' + method + ' does not exist on jQuery.sticky' );
313
+ }
314
+ };
315
+ $( function() {
316
+ setTimeout( scroller, 0 );
317
+ } );
318
+ } );
vendor/boldgrid/library/src/assets/js/ui.js CHANGED
@@ -41,13 +41,31 @@ BOLDGRID.LIBRARY.Ui = function( $ ) {
41
  var width = document.body.clientWidth,
42
  $leftNav = $( '.bg-left-nav' );
43
 
44
- if( width >= 782 ) {
45
- $leftNav.sticky( { topSpacing : 33 } );
46
  } else {
47
  $leftNav.unstick();
48
  }
49
  };
50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  /**
52
  * @summary Init.
53
  *
@@ -62,7 +80,9 @@ BOLDGRID.LIBRARY.Ui = function( $ ) {
62
  self.setSticky();
63
 
64
  $( window ).resize( self.setSticky );
65
- });
 
 
66
  };
67
 
68
- new BOLDGRID.LIBRARY.Ui( jQuery );
41
  var width = document.body.clientWidth,
42
  $leftNav = $( '.bg-left-nav' );
43
 
44
+ if ( 782 <= width ) {
45
+ $leftNav.sticky( { topSpacing: 33 } );
46
  } else {
47
  $leftNav.unstick();
48
  }
49
  };
50
 
51
+ /**
52
+ * @summary Take action when a form is submitted.
53
+ *
54
+ * @since 1.7.0
55
+ */
56
+ self.onFormSubmit = function() {
57
+ var $form = $( this ),
58
+ activeSection,
59
+ sectionInput = $( '<input type="hidden" name="section" />' );
60
+
61
+ // If the form does not already have a section, add it.
62
+ if( ! $form.find( '[name="section"]' ).length ) {
63
+ activeSection = $( '.bg-left-nav .active' ).attr( 'data-section-id' );
64
+ sectionInput.val( activeSection );
65
+ $form.append( sectionInput );
66
+ }
67
+ };
68
+
69
  /**
70
  * @summary Init.
71
  *
80
  self.setSticky();
81
 
82
  $( window ).resize( self.setSticky );
83
+
84
+ $( 'form' ).on( 'submit', self.onFormSubmit );
85
+ } );
86
  };
87
 
88
+ BOLDGRID.LIBRARY.Ui( jQuery );
vendor/boldgrid/library/yarn.lock CHANGED
@@ -5,79 +5,166 @@
5
  abbrev@1:
6
  version "1.1.1"
7
  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
 
8
 
9
  acorn-jsx@^3.0.0:
10
  version "3.0.1"
11
  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
 
12
  dependencies:
13
  acorn "^3.0.4"
14
 
15
  acorn@^3.0.4:
16
  version "3.3.0"
17
  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
 
18
 
19
  acorn@^5.5.0:
20
- version "5.5.3"
21
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9"
 
22
 
23
  ajv-keywords@^2.1.0:
24
  version "2.1.1"
25
  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
 
26
 
27
  ajv@^5.2.3, ajv@^5.3.0:
28
  version "5.5.2"
29
  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
 
30
  dependencies:
31
  co "^4.6.0"
32
  fast-deep-equal "^1.0.0"
33
  fast-json-stable-stringify "^2.0.0"
34
  json-schema-traverse "^0.3.0"
35
 
 
 
 
 
 
 
 
36
  ansi-escapes@^3.0.0:
37
  version "3.1.0"
38
  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
 
 
 
 
 
 
 
 
39
 
40
  ansi-regex@^2.0.0:
41
  version "2.1.1"
42
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
 
43
 
44
  ansi-regex@^3.0.0:
45
  version "3.0.0"
46
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
 
47
 
48
  ansi-styles@^2.2.1:
49
  version "2.2.1"
50
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
 
51
 
52
  ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1:
53
  version "3.2.1"
54
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
 
55
  dependencies:
56
  color-convert "^1.9.0"
57
 
 
 
 
 
 
 
 
 
 
 
58
  argparse@^1.0.7:
59
  version "1.0.10"
60
  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
 
61
  dependencies:
62
  sprintf-js "~1.0.2"
63
 
64
- array-union@^1.0.1:
65
- version "1.0.2"
66
- resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  dependencies:
68
- array-uniq "^1.0.1"
 
 
69
 
70
- array-uniq@^1.0.1:
71
  version "1.0.3"
72
  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
 
73
 
74
- arrify@^1.0.0, arrify@^1.0.1:
 
 
 
 
 
75
  version "1.0.1"
76
  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
 
 
 
 
 
 
 
 
 
 
 
77
 
78
  babel-code-frame@^6.22.0:
79
  version "6.26.0"
80
  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
 
81
  dependencies:
82
  chalk "^1.1.3"
83
  esutils "^2.0.2"
@@ -86,6 +173,7 @@ babel-code-frame@^6.22.0:
86
  babel-runtime@^6.23.0, babel-runtime@^6.26.0:
87
  version "6.26.0"
88
  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
 
89
  dependencies:
90
  core-js "^2.4.0"
91
  regenerator-runtime "^0.11.0"
@@ -93,55 +181,124 @@ babel-runtime@^6.23.0, babel-runtime@^6.26.0:
93
  balanced-match@^1.0.0:
94
  version "1.0.0"
95
  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96
 
97
  boolify@^1.0.0:
98
  version "1.0.1"
99
  resolved "https://registry.yarnpkg.com/boolify/-/boolify-1.0.1.tgz#b5c09e17cacd113d11b7bb3ed384cc012994d86b"
 
100
 
101
- brace-expansion@^1.1.7:
102
  version "1.1.11"
103
  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
 
104
  dependencies:
105
  balanced-match "^1.0.0"
106
  concat-map "0.0.1"
107
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  buffer-from@^1.0.0:
109
- version "1.0.0"
110
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
 
112
  caller-path@^0.1.0:
113
  version "0.1.0"
114
  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
 
115
  dependencies:
116
  callsites "^0.2.0"
117
 
118
  callsites@^0.2.0:
119
  version "0.2.0"
120
  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
 
121
 
122
  camelcase-keys@^4.1.0:
123
  version "4.2.0"
124
  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77"
 
125
  dependencies:
126
  camelcase "^4.1.0"
127
  map-obj "^2.0.0"
128
  quick-lru "^1.0.0"
129
 
 
 
 
 
 
130
  camelcase@^4.1.0:
131
  version "4.1.0"
132
  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
 
133
 
134
  chalk@2.3.0:
135
  version "2.3.0"
136
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba"
 
137
  dependencies:
138
  ansi-styles "^3.1.0"
139
  escape-string-regexp "^1.0.5"
140
  supports-color "^4.0.0"
141
 
142
- chalk@^1.1.3:
143
  version "1.1.3"
144
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
 
145
  dependencies:
146
  ansi-styles "^2.2.1"
147
  escape-string-regexp "^1.0.2"
@@ -150,8 +307,9 @@ chalk@^1.1.3:
150
  supports-color "^2.0.0"
151
 
152
  chalk@^2.0.0, chalk@^2.1.0:
153
- version "2.3.2"
154
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65"
 
155
  dependencies:
156
  ansi-styles "^3.2.1"
157
  escape-string-regexp "^1.0.5"
@@ -160,167 +318,369 @@ chalk@^2.0.0, chalk@^2.1.0:
160
  chardet@^0.4.0:
161
  version "0.4.2"
162
  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
 
163
 
164
  circular-json@^0.3.1:
165
  version "0.3.3"
166
  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
 
 
 
 
 
 
 
 
 
 
 
167
 
168
  cli-cursor@^2.1.0:
169
  version "2.1.0"
170
  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
 
171
  dependencies:
172
  restore-cursor "^2.0.0"
173
 
174
  cli-width@^2.0.0:
175
  version "2.2.0"
176
  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
 
177
 
178
  cliui@^3.2.0:
179
  version "3.2.0"
180
  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
 
181
  dependencies:
182
  string-width "^1.0.1"
183
  strip-ansi "^3.0.1"
184
  wrap-ansi "^2.0.0"
185
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
  co@^4.6.0:
187
  version "4.6.0"
188
  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
 
189
 
190
  code-point-at@^1.0.0:
191
  version "1.1.0"
192
  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
 
 
 
 
 
 
 
 
 
193
 
194
  color-convert@^1.9.0:
195
- version "1.9.1"
196
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed"
 
197
  dependencies:
198
- color-name "^1.1.1"
199
 
200
- color-name@^1.1.1:
201
  version "1.1.3"
202
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
 
 
 
 
 
 
203
 
204
  common-tags@^1.4.0:
205
- version "1.7.2"
206
- resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.7.2.tgz#24d9768c63d253a56ecff93845b44b4df1d52771"
207
- dependencies:
208
- babel-runtime "^6.26.0"
 
 
 
 
209
 
210
  concat-map@0.0.1:
211
  version "0.0.1"
212
  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
 
213
 
214
  concat-stream@^1.6.0:
215
  version "1.6.2"
216
  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
 
217
  dependencies:
218
  buffer-from "^1.0.0"
219
  inherits "^2.0.3"
220
  readable-stream "^2.2.2"
221
  typedarray "^0.0.6"
222
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
  core-js@^2.4.0:
224
- version "2.5.4"
225
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.4.tgz#f2c8bf181f2a80b92f360121429ce63a2f0aeae0"
 
226
 
227
  core-util-is@~1.0.0:
228
  version "1.0.2"
229
  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
 
230
 
231
  cross-spawn@^5.0.1, cross-spawn@^5.1.0:
232
  version "5.1.0"
233
  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
 
234
  dependencies:
235
  lru-cache "^4.0.1"
236
  shebang-command "^1.2.0"
237
  which "^1.2.9"
238
 
239
- debug@^3.1.0:
240
- version "3.1.0"
241
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
 
 
 
 
 
 
 
 
 
 
 
 
 
242
  dependencies:
243
  ms "2.0.0"
244
 
 
 
 
 
 
 
 
245
  decamelize@^1.1.1:
246
  version "1.2.0"
247
  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
 
 
 
 
 
 
248
 
249
  deep-is@~0.1.3:
250
  version "0.1.3"
251
  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
 
252
 
253
- del@^2.0.2:
254
- version "2.2.2"
255
- resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
 
256
  dependencies:
257
- globby "^5.0.0"
258
- is-path-cwd "^1.0.0"
259
- is-path-in-cwd "^1.0.0"
260
- object-assign "^4.0.1"
261
- pify "^2.0.0"
262
- pinkie-promise "^2.0.0"
263
- rimraf "^2.2.8"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
264
 
265
  dlv@^1.1.0:
266
- version "1.1.1"
267
- resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.1.tgz#c79d96bfe659a5568001250ed2aaf653992bdd3f"
 
268
 
269
  doctrine@^2.1.0:
270
  version "2.1.0"
271
  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
 
272
  dependencies:
273
  esutils "^2.0.2"
274
 
275
  dom-serializer@0:
276
  version "0.1.0"
277
  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
 
278
  dependencies:
279
  domelementtype "~1.1.1"
280
  entities "~1.1.1"
281
 
282
- domelementtype@1, domelementtype@^1.3.0:
 
 
 
 
 
283
  version "1.3.0"
284
  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
 
285
 
286
  domelementtype@~1.1.1:
287
  version "1.1.3"
288
  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
 
289
 
290
  domhandler@^2.3.0:
291
- version "2.4.1"
292
- resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259"
 
293
  dependencies:
294
  domelementtype "1"
295
 
296
  domutils@^1.5.1:
297
  version "1.7.0"
298
  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
 
299
  dependencies:
300
  dom-serializer "0"
301
  domelementtype "1"
302
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
303
  entities@^1.1.1, entities@~1.1.1:
304
- version "1.1.1"
305
- resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
306
 
307
  escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
308
  version "1.0.5"
309
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
 
310
 
311
  eslint-config-wordpress@^2.0.0:
312
  version "2.0.0"
313
  resolved "https://registry.yarnpkg.com/eslint-config-wordpress/-/eslint-config-wordpress-2.0.0.tgz#5201206c6964d648315232edf6dfbd2e925e4cd6"
 
314
 
315
  eslint-plugin-html@^4.0.2:
316
- version "4.0.2"
317
- resolved "https://registry.yarnpkg.com/eslint-plugin-html/-/eslint-plugin-html-4.0.2.tgz#0e56149e42c2ffc3f0df6261a8bb96b1a9f2280d"
 
318
  dependencies:
319
  htmlparser2 "^3.8.2"
320
 
321
  eslint-scope@^3.7.1:
322
- version "3.7.1"
323
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
 
324
  dependencies:
325
  esrecurse "^4.1.0"
326
  estraverse "^4.1.1"
@@ -328,10 +688,12 @@ eslint-scope@^3.7.1:
328
  eslint-visitor-keys@^1.0.0:
329
  version "1.0.0"
330
  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
 
331
 
332
  eslint@^4.0.0, eslint@^4.19.1, eslint@^4.5.0:
333
  version "4.19.1"
334
  resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
 
335
  dependencies:
336
  ajv "^5.3.0"
337
  babel-code-frame "^6.22.0"
@@ -372,40 +734,47 @@ eslint@^4.0.0, eslint@^4.19.1, eslint@^4.5.0:
372
  table "4.0.2"
373
  text-table "~0.2.0"
374
 
375
- espree@^3.5.4:
376
  version "3.5.4"
377
  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
 
378
  dependencies:
379
  acorn "^5.5.0"
380
  acorn-jsx "^3.0.0"
381
 
382
  esprima@^4.0.0:
383
- version "4.0.0"
384
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
 
385
 
386
  esquery@^1.0.0:
387
- version "1.0.0"
388
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
 
389
  dependencies:
390
  estraverse "^4.0.0"
391
 
392
  esrecurse@^4.1.0:
393
  version "4.2.1"
394
  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
 
395
  dependencies:
396
  estraverse "^4.1.0"
397
 
398
  estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1:
399
  version "4.2.0"
400
  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
 
401
 
402
  esutils@^2.0.2:
403
  version "2.0.2"
404
  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
 
405
 
406
  execa@^0.7.0:
407
  version "0.7.0"
408
  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
 
409
  dependencies:
410
  cross-spawn "^5.0.1"
411
  get-stream "^3.0.0"
@@ -415,77 +784,275 @@ execa@^0.7.0:
415
  signal-exit "^3.0.0"
416
  strip-eof "^1.0.0"
417
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
418
  external-editor@^2.0.4:
419
- version "2.1.0"
420
- resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48"
 
421
  dependencies:
422
  chardet "^0.4.0"
423
  iconv-lite "^0.4.17"
424
  tmp "^0.0.33"
425
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
426
  fast-deep-equal@^1.0.0:
427
  version "1.1.0"
428
  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
 
429
 
430
  fast-json-stable-stringify@^2.0.0:
431
  version "2.0.0"
432
  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
 
433
 
434
  fast-levenshtein@~2.0.4:
435
  version "2.0.6"
436
  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
 
437
 
438
  figures@^2.0.0:
439
  version "2.0.0"
440
  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
 
441
  dependencies:
442
  escape-string-regexp "^1.0.5"
443
 
444
  file-entry-cache@^2.0.0:
445
  version "2.0.0"
446
  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
 
447
  dependencies:
448
  flat-cache "^1.2.1"
449
  object-assign "^4.0.1"
450
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
451
  find-up@^2.1.0:
452
  version "2.1.0"
453
  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
 
454
  dependencies:
455
  locate-path "^2.0.0"
456
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
457
  flat-cache@^1.2.1:
458
- version "1.3.0"
459
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
 
460
  dependencies:
461
  circular-json "^0.3.1"
462
- del "^2.0.2"
463
  graceful-fs "^4.1.2"
 
464
  write "^0.2.1"
465
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
466
  fs.realpath@^1.0.0:
467
  version "1.0.0"
468
  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
 
469
 
470
  functional-red-black-tree@^1.0.1:
471
  version "1.0.1"
472
  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
 
 
 
 
 
 
 
 
473
 
474
  get-caller-file@^1.0.1:
475
- version "1.0.2"
476
- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
 
477
 
478
  get-stdin@^5.0.1:
479
  version "5.0.1"
480
  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398"
 
481
 
482
  get-stream@^3.0.0:
483
  version "3.0.0"
484
  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
 
485
 
486
- glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
487
- version "7.1.2"
488
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
489
  dependencies:
490
  fs.realpath "^1.0.0"
491
  inflight "^1.0.4"
@@ -494,9 +1061,19 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
494
  once "^1.3.0"
495
  path-is-absolute "^1.0.0"
496
 
 
 
 
 
 
 
 
 
 
497
  glob@~7.0.6:
498
  version "7.0.6"
499
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
 
500
  dependencies:
501
  fs.realpath "^1.0.0"
502
  inflight "^1.0.4"
@@ -505,80 +1082,266 @@ glob@~7.0.6:
505
  once "^1.3.0"
506
  path-is-absolute "^1.0.0"
507
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
508
  globals@^11.0.1:
509
- version "11.4.0"
510
- resolved "https://registry.yarnpkg.com/globals/-/globals-11.4.0.tgz#b85c793349561c16076a3c13549238a27945f1bc"
 
511
 
512
- globby@^5.0.0:
513
- version "5.0.0"
514
- resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
 
515
  dependencies:
516
- array-union "^1.0.1"
517
- arrify "^1.0.0"
518
- glob "^7.0.3"
519
- object-assign "^4.0.1"
520
- pify "^2.0.0"
521
- pinkie-promise "^2.0.0"
 
 
 
 
 
 
 
 
 
 
 
522
 
523
  graceful-fs@^4.1.2:
524
- version "4.1.11"
525
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
526
 
527
  has-ansi@^2.0.0:
528
  version "2.0.0"
529
  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
 
530
  dependencies:
531
  ansi-regex "^2.0.0"
532
 
533
  has-flag@^2.0.0:
534
  version "2.0.0"
535
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
 
536
 
537
  has-flag@^3.0.0:
538
  version "3.0.0"
539
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
540
 
541
  htmlparser2@^3.8.2:
542
- version "3.9.2"
543
- resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
 
544
  dependencies:
545
  domelementtype "^1.3.0"
546
  domhandler "^2.3.0"
547
  domutils "^1.5.1"
548
  entities "^1.1.1"
549
  inherits "^2.0.1"
550
- readable-stream "^2.0.2"
551
 
552
  iconv-lite@^0.4.17:
553
- version "0.4.19"
554
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
 
 
 
555
 
556
  ignore@^3.2.7, ignore@^3.3.3:
557
- version "3.3.7"
558
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
 
559
 
560
  imurmurhash@^0.1.4:
561
  version "0.1.4"
562
  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
 
563
 
564
  indent-string@^3.1.0, indent-string@^3.2.0:
565
  version "3.2.0"
566
  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
 
567
 
568
  inflight@^1.0.4:
569
  version "1.0.6"
570
  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
 
571
  dependencies:
572
  once "^1.3.0"
573
  wrappy "1"
574
 
575
- inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
 
 
 
 
 
576
  version "2.0.3"
577
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
 
 
 
 
 
 
578
 
579
  inquirer@^3.0.6:
580
  version "3.3.0"
581
  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
 
582
  dependencies:
583
  ansi-escapes "^3.0.0"
584
  chalk "^2.0.0"
@@ -595,63 +1358,217 @@ inquirer@^3.0.6:
595
  strip-ansi "^4.0.0"
596
  through "^2.3.6"
597
 
 
 
 
 
 
598
  invert-kv@^1.0.0:
599
  version "1.0.0"
600
  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
601
 
602
  is-fullwidth-code-point@^1.0.0:
603
  version "1.0.0"
604
  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
 
605
  dependencies:
606
  number-is-nan "^1.0.0"
607
 
608
  is-fullwidth-code-point@^2.0.0:
609
  version "2.0.0"
610
  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
 
611
 
612
- is-path-cwd@^1.0.0:
613
- version "1.0.0"
614
- resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
 
 
 
615
 
616
- is-path-in-cwd@^1.0.0:
617
- version "1.0.1"
618
- resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52"
 
619
  dependencies:
620
- is-path-inside "^1.0.0"
621
 
622
- is-path-inside@^1.0.0:
623
- version "1.0.1"
624
- resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
 
625
  dependencies:
626
- path-is-inside "^1.0.1"
627
 
628
  is-promise@^2.1.0:
629
  version "2.1.0"
630
  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
 
 
 
 
 
 
 
 
631
 
632
  is-resolvable@^1.0.0:
633
  version "1.1.0"
634
  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
 
635
 
636
  is-stream@^1.1.0:
637
  version "1.1.0"
638
  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
639
 
640
- isarray@~1.0.0:
 
 
 
 
 
641
  version "1.0.0"
642
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
 
643
 
644
  isexe@^2.0.0:
645
  version "2.0.0"
646
  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
647
 
648
  js-tokens@^3.0.2:
649
  version "3.0.2"
650
  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
 
651
 
652
  js-yaml@^3.9.1:
653
- version "3.11.0"
654
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef"
 
655
  dependencies:
656
  argparse "^1.0.7"
657
  esprima "^4.0.0"
@@ -659,50 +1576,213 @@ js-yaml@^3.9.1:
659
  json-schema-traverse@^0.3.0:
660
  version "0.3.1"
661
  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
 
662
 
663
  json-stable-stringify-without-jsonify@^1.0.1:
664
  version "1.0.1"
665
  resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
666
 
667
  lcid@^1.0.0:
668
  version "1.0.0"
669
  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
 
670
  dependencies:
671
  invert-kv "^1.0.0"
672
 
673
  levn@^0.3.0, levn@~0.3.0:
674
  version "0.3.0"
675
  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
 
676
  dependencies:
677
  prelude-ls "~1.1.2"
678
  type-check "~0.3.2"
679
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
680
  locate-path@^2.0.0:
681
  version "2.0.0"
682
  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
 
683
  dependencies:
684
  p-locate "^2.0.0"
685
  path-exists "^3.0.0"
686
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
687
  lodash.memoize@^4.1.2:
688
  version "4.1.2"
689
  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
 
690
 
691
  lodash.merge@^4.6.0:
692
  version "4.6.1"
693
  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
694
 
695
  lodash.unescape@4.0.1:
696
  version "4.0.1"
697
  resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
 
698
 
699
  lodash@^4.17.4, lodash@^4.3.0:
700
- version "4.17.5"
701
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
 
 
 
 
 
 
702
 
703
  loglevel-colored-level-prefix@^1.0.0:
704
  version "1.0.0"
705
  resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e"
 
706
  dependencies:
707
  chalk "^1.1.3"
708
  loglevel "^1.4.1"
@@ -710,37 +1790,78 @@ loglevel-colored-level-prefix@^1.0.0:
710
  loglevel@^1.4.1:
711
  version "1.6.1"
712
  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"
 
 
 
 
 
 
713
 
714
  lru-cache@^4.0.1:
715
- version "4.1.2"
716
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f"
 
717
  dependencies:
718
  pseudomap "^1.0.2"
719
- yallist "^2.1.2"
 
 
 
 
 
 
 
720
 
721
  make-plural@^4.1.1:
722
- version "4.1.1"
723
- resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.1.1.tgz#5658ce9d337487077daed221854c8cef9dd75749"
 
724
  optionalDependencies:
725
  minimist "^1.2.0"
726
 
 
 
 
 
 
727
  map-obj@^2.0.0:
728
  version "2.0.0"
729
  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
730
 
731
  mem@^1.1.0:
732
  version "1.1.0"
733
  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
 
734
  dependencies:
735
  mimic-fn "^1.0.0"
736
 
737
  messageformat-parser@^1.1.0:
738
  version "1.1.0"
739
  resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-1.1.0.tgz#13ba2250a76bbde8e0fca0dbb3475f95c594a90a"
 
740
 
741
  messageformat@^1.0.2:
742
  version "1.1.1"
743
  resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-1.1.1.tgz#ceaa2e6c86929d4807058275a7372b1bd963bdf6"
 
744
  dependencies:
745
  glob "~7.0.6"
746
  make-plural "^4.1.1"
@@ -748,77 +1869,241 @@ messageformat@^1.0.2:
748
  nopt "~3.0.6"
749
  reserved-words "^0.1.2"
750
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
751
  mimic-fn@^1.0.0:
752
  version "1.2.0"
753
  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
 
 
 
 
 
 
 
 
754
 
755
  minimatch@^3.0.2, minimatch@^3.0.4:
756
  version "3.0.4"
757
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
 
758
  dependencies:
759
  brace-expansion "^1.1.7"
760
 
 
 
 
 
 
 
 
 
761
  minimist@0.0.8:
762
  version "0.0.8"
763
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
 
764
 
765
- minimist@^1.2.0:
766
  version "1.2.0"
767
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
 
 
 
 
 
 
 
 
 
768
 
769
- mkdirp@^0.5.1:
770
  version "0.5.1"
771
  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
 
772
  dependencies:
773
  minimist "0.0.8"
774
 
775
  ms@2.0.0:
776
  version "2.0.0"
777
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
778
 
779
  mute-stream@0.0.7:
780
  version "0.0.7"
781
  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
782
 
783
  natural-compare@^1.4.0:
784
  version "1.4.0"
785
  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
 
 
 
 
 
 
786
 
787
  nopt@~3.0.6:
788
  version "3.0.6"
789
  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
 
790
  dependencies:
791
  abbrev "1"
792
 
 
 
 
 
 
 
 
 
 
 
793
  npm-run-path@^2.0.0:
794
  version "2.0.2"
795
  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
 
796
  dependencies:
797
  path-key "^2.0.0"
798
 
799
  number-is-nan@^1.0.0:
800
  version "1.0.1"
801
  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
 
 
 
 
 
 
802
 
803
  object-assign@^4.0.1:
804
  version "4.1.1"
805
  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
806
 
807
  once@^1.3.0:
808
  version "1.4.0"
809
  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
 
 
 
 
 
 
 
 
810
  dependencies:
811
  wrappy "1"
812
 
813
  onetime@^2.0.0:
814
  version "2.0.1"
815
  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
 
816
  dependencies:
817
  mimic-fn "^1.0.0"
818
 
819
  optionator@^0.8.2:
820
  version "0.8.2"
821
  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
 
822
  dependencies:
823
  deep-is "~0.1.3"
824
  fast-levenshtein "~2.0.4"
@@ -827,9 +2112,36 @@ optionator@^0.8.2:
827
  type-check "~0.3.2"
828
  wordwrap "~1.0.0"
829
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
830
  os-locale@^2.0.0:
831
  version "2.1.0"
832
  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
 
833
  dependencies:
834
  execa "^0.7.0"
835
  lcid "^1.0.0"
@@ -838,68 +2150,147 @@ os-locale@^2.0.0:
838
  os-tmpdir@~1.0.2:
839
  version "1.0.2"
840
  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
 
841
 
842
  p-finally@^1.0.0:
843
  version "1.0.0"
844
  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
 
845
 
846
  p-limit@^1.1.0:
847
- version "1.2.0"
848
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
 
849
  dependencies:
850
  p-try "^1.0.0"
851
 
852
  p-locate@^2.0.0:
853
  version "2.0.0"
854
  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
 
855
  dependencies:
856
  p-limit "^1.1.0"
857
 
858
  p-try@^1.0.0:
859
  version "1.0.0"
860
  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
861
 
862
  path-exists@^3.0.0:
863
  version "3.0.0"
864
  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
 
865
 
866
  path-is-absolute@^1.0.0:
867
  version "1.0.1"
868
  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
 
869
 
870
- path-is-inside@^1.0.1, path-is-inside@^1.0.2:
871
  version "1.0.2"
872
  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
 
873
 
874
  path-key@^2.0.0:
875
  version "2.0.1"
876
  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
877
 
878
  pify@^2.0.0:
879
  version "2.3.0"
880
  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
 
881
 
882
  pinkie-promise@^2.0.0:
883
  version "2.0.1"
884
  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
 
885
  dependencies:
886
  pinkie "^2.0.0"
887
 
888
  pinkie@^2.0.0:
889
  version "2.0.4"
890
  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
 
891
 
892
  pluralize@^7.0.0:
893
  version "7.0.0"
894
  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
 
 
 
 
 
 
895
 
896
  prelude-ls@~1.1.2:
897
  version "1.1.2"
898
  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
 
899
 
900
  prettier-eslint-cli@^4.7.1:
901
  version "4.7.1"
902
  resolved "https://registry.yarnpkg.com/prettier-eslint-cli/-/prettier-eslint-cli-4.7.1.tgz#3d103c494baa4e80b99ad53e2b9db7620101859f"
 
903
  dependencies:
904
  arrify "^1.0.1"
905
  babel-runtime "^6.23.0"
@@ -921,8 +2312,9 @@ prettier-eslint-cli@^4.7.1:
921
  yargs "10.0.3"
922
 
923
  prettier-eslint@^8.5.0, prettier-eslint@^8.8.1:
924
- version "8.8.1"
925
- resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.8.1.tgz#38505163274742f2a0b31653c39e40f37ebd07da"
 
926
  dependencies:
927
  babel-runtime "^6.26.0"
928
  common-tags "^1.4.0"
@@ -932,73 +2324,182 @@ prettier-eslint@^8.5.0, prettier-eslint@^8.8.1:
932
  lodash.merge "^4.6.0"
933
  loglevel-colored-level-prefix "^1.0.0"
934
  prettier "^1.7.0"
935
- pretty-format "^22.0.3"
936
  require-relative "^0.8.7"
937
  typescript "^2.5.1"
938
- typescript-eslint-parser "^11.0.0"
 
939
 
940
  prettier@^1.7.0:
941
- version "1.11.1"
942
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.11.1.tgz#61e43fc4cd44e68f2b0dfc2c38cd4bb0fccdcc75"
 
943
 
944
- pretty-format@^22.0.3:
945
- version "22.4.3"
946
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f"
 
947
  dependencies:
948
  ansi-regex "^3.0.0"
949
  ansi-styles "^3.2.0"
950
 
 
 
 
 
 
951
  process-nextick-args@~2.0.0:
952
  version "2.0.0"
953
  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
 
954
 
955
  progress@^2.0.0:
956
- version "2.0.0"
957
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
 
958
 
959
  pseudomap@^1.0.2:
960
  version "1.0.2"
961
  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
 
962
 
963
  quick-lru@^1.0.0:
964
  version "1.1.0"
965
  resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
 
 
 
 
 
 
 
 
 
966
 
967
- readable-stream@^2.0.2, readable-stream@^2.2.2:
968
- version "2.3.5"
969
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
970
  dependencies:
971
  core-util-is "~1.0.0"
972
  inherits "~2.0.3"
973
  isarray "~1.0.0"
974
  process-nextick-args "~2.0.0"
975
  safe-buffer "~5.1.1"
976
- string_decoder "~1.0.3"
977
  util-deprecate "~1.0.1"
978
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
979
  regenerator-runtime@^0.11.0:
980
  version "0.11.1"
981
  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
 
 
 
 
 
 
 
 
 
982
 
983
  regexpp@^1.0.1:
984
  version "1.1.0"
985
  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
986
 
987
  require-directory@^2.1.1:
988
  version "2.1.1"
989
  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
 
990
 
991
  require-main-filename@^1.0.1:
992
  version "1.0.1"
993
  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
 
994
 
995
  require-relative@^0.8.7:
996
  version "0.8.7"
997
  resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de"
 
998
 
999
  require-uncached@^1.0.3:
1000
  version "1.0.3"
1001
  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
 
1002
  dependencies:
1003
  caller-path "^0.1.0"
1004
  resolve-from "^1.0.0"
@@ -1006,89 +2507,293 @@ require-uncached@^1.0.3:
1006
  reserved-words@^0.1.2:
1007
  version "0.1.2"
1008
  resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1"
 
 
 
 
 
 
 
 
 
1009
 
1010
  resolve-from@^1.0.0:
1011
  version "1.0.1"
1012
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
 
 
 
 
 
 
 
 
 
 
 
 
 
1013
 
1014
  restore-cursor@^2.0.0:
1015
  version "2.0.0"
1016
  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
 
1017
  dependencies:
1018
  onetime "^2.0.0"
1019
  signal-exit "^3.0.2"
1020
 
1021
- rimraf@^2.2.8:
 
 
 
 
 
1022
  version "2.6.2"
1023
  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
 
1024
  dependencies:
1025
  glob "^7.0.5"
1026
 
1027
  run-async@^2.2.0:
1028
  version "2.3.0"
1029
  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
 
1030
  dependencies:
1031
  is-promise "^2.1.0"
1032
 
1033
  rx-lite-aggregates@^4.0.8:
1034
  version "4.0.8"
1035
  resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
 
1036
  dependencies:
1037
  rx-lite "*"
1038
 
1039
  rx-lite@*, rx-lite@^4.0.8:
1040
  version "4.0.8"
1041
  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
 
1042
 
1043
  rxjs@^5.3.0:
1044
- version "5.5.8"
1045
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.8.tgz#b2b0809a57614ad6254c03d7446dea0d83ca3791"
 
1046
  dependencies:
1047
  symbol-observable "1.0.1"
1048
 
1049
  safe-buffer@~5.1.0, safe-buffer@~5.1.1:
1050
- version "5.1.1"
1051
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
 
 
 
 
 
 
 
 
1052
 
1053
- semver@5.4.1:
1054
- version "5.4.1"
1055
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
 
 
 
 
 
 
 
 
1056
 
1057
- semver@^5.3.0:
 
 
 
 
 
1058
  version "5.5.0"
1059
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
 
 
 
 
 
 
 
 
 
 
 
1060
 
1061
  set-blocking@^2.0.0:
1062
  version "2.0.0"
1063
  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1064
 
1065
  shebang-command@^1.2.0:
1066
  version "1.2.0"
1067
  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
 
1068
  dependencies:
1069
  shebang-regex "^1.0.0"
1070
 
1071
  shebang-regex@^1.0.0:
1072
  version "1.0.0"
1073
  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
 
 
 
 
 
 
1074
 
1075
  signal-exit@^3.0.0, signal-exit@^3.0.2:
1076
  version "3.0.2"
1077
  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
 
1078
 
1079
  slice-ansi@1.0.0:
1080
  version "1.0.0"
1081
  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
 
1082
  dependencies:
1083
  is-fullwidth-code-point "^2.0.0"
1084
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1085
  sprintf-js@~1.0.2:
1086
  version "1.0.3"
1087
  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1088
 
1089
- string-width@^1.0.1:
1090
  version "1.0.2"
1091
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
 
1092
  dependencies:
1093
  code-point-at "^1.0.0"
1094
  is-fullwidth-code-point "^1.0.0"
@@ -1097,59 +2802,98 @@ string-width@^1.0.1:
1097
  string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
1098
  version "2.1.1"
1099
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
 
1100
  dependencies:
1101
  is-fullwidth-code-point "^2.0.0"
1102
  strip-ansi "^4.0.0"
1103
 
1104
- string_decoder@~1.0.3:
1105
- version "1.0.3"
1106
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
 
1107
  dependencies:
1108
  safe-buffer "~5.1.0"
1109
 
 
 
 
 
 
1110
  strip-ansi@^3.0.0, strip-ansi@^3.0.1:
1111
  version "3.0.1"
1112
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
 
1113
  dependencies:
1114
  ansi-regex "^2.0.0"
1115
 
1116
  strip-ansi@^4.0.0:
1117
  version "4.0.0"
1118
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
 
1119
  dependencies:
1120
  ansi-regex "^3.0.0"
1121
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1122
  strip-eof@^1.0.0:
1123
  version "1.0.0"
1124
  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
 
1125
 
1126
  strip-json-comments@~2.0.1:
1127
  version "2.0.1"
1128
  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
 
1129
 
1130
  supports-color@^2.0.0:
1131
  version "2.0.0"
1132
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
 
1133
 
1134
  supports-color@^4.0.0:
1135
  version "4.5.0"
1136
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
 
1137
  dependencies:
1138
  has-flag "^2.0.0"
1139
 
1140
  supports-color@^5.3.0:
1141
- version "5.3.0"
1142
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0"
 
1143
  dependencies:
1144
  has-flag "^3.0.0"
1145
 
 
 
 
 
 
 
 
 
1146
  symbol-observable@1.0.1:
1147
  version "1.0.1"
1148
  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
 
1149
 
1150
  table@4.0.2:
1151
  version "4.0.2"
1152
  resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
 
1153
  dependencies:
1154
  ajv "^5.2.3"
1155
  ajv-keywords "^2.1.0"
@@ -1161,59 +2905,237 @@ table@4.0.2:
1161
  text-table@~0.2.0:
1162
  version "0.2.0"
1163
  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1164
 
1165
  through@^2.3.6:
1166
  version "2.3.8"
1167
  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
 
 
 
 
 
 
 
 
 
 
 
 
 
1168
 
1169
  tmp@^0.0.33:
1170
  version "0.0.33"
1171
  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
 
1172
  dependencies:
1173
  os-tmpdir "~1.0.2"
1174
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1175
  type-check@~0.3.2:
1176
  version "0.3.2"
1177
  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
 
1178
  dependencies:
1179
  prelude-ls "~1.1.2"
1180
 
1181
  typedarray@^0.0.6:
1182
  version "0.0.6"
1183
  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
 
1184
 
1185
- typescript-eslint-parser@^11.0.0:
1186
- version "11.0.0"
1187
- resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-11.0.0.tgz#37dba6a0130dd307504aa4b4b21b0d3dc7d4e9f2"
 
1188
  dependencies:
1189
  lodash.unescape "4.0.1"
1190
- semver "5.4.1"
1191
 
1192
  typescript@^2.5.1:
1193
- version "2.8.1"
1194
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.1.tgz#6160e4f8f195d5ba81d4876f9c0cc1fbc0820624"
 
1195
 
1196
- util-deprecate@~1.0.1:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1197
  version "1.0.2"
1198
  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1199
 
1200
  which-module@^2.0.0:
1201
  version "2.0.0"
1202
  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
 
1203
 
1204
- which@^1.2.9:
1205
- version "1.3.0"
1206
- resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
 
1207
  dependencies:
1208
  isexe "^2.0.0"
1209
 
1210
  wordwrap@~1.0.0:
1211
  version "1.0.0"
1212
  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
 
1213
 
1214
  wrap-ansi@^2.0.0:
1215
  version "2.1.0"
1216
  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
 
1217
  dependencies:
1218
  string-width "^1.0.1"
1219
  strip-ansi "^3.0.1"
@@ -1221,30 +3143,48 @@ wrap-ansi@^2.0.0:
1221
  wrappy@1:
1222
  version "1.0.2"
1223
  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
 
1224
 
1225
  write@^0.2.1:
1226
  version "0.2.1"
1227
  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
 
1228
  dependencies:
1229
  mkdirp "^0.5.1"
1230
 
 
 
 
 
 
1231
  y18n@^3.2.1:
1232
  version "3.2.1"
1233
  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
 
1234
 
1235
- yallist@^2.1.2:
1236
- version "2.1.2"
1237
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
 
 
 
 
 
 
 
 
1238
 
1239
  yargs-parser@^8.0.0:
1240
  version "8.1.0"
1241
  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
 
1242
  dependencies:
1243
  camelcase "^4.1.0"
1244
 
1245
  yargs@10.0.3:
1246
  version "10.0.3"
1247
  resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae"
 
1248
  dependencies:
1249
  cliui "^3.2.0"
1250
  decamelize "^1.1.1"
@@ -1258,3 +3198,22 @@ yargs@10.0.3:
1258
  which-module "^2.0.0"
1259
  y18n "^3.2.1"
1260
  yargs-parser "^8.0.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  abbrev@1:
6
  version "1.1.1"
7
  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
8
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
9
 
10
  acorn-jsx@^3.0.0:
11
  version "3.0.1"
12
  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
13
+ integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=
14
  dependencies:
15
  acorn "^3.0.4"
16
 
17
  acorn@^3.0.4:
18
  version "3.3.0"
19
  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
20
+ integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=
21
 
22
  acorn@^5.5.0:
23
+ version "5.7.3"
24
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
25
+ integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
26
 
27
  ajv-keywords@^2.1.0:
28
  version "2.1.1"
29
  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
30
+ integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=
31
 
32
  ajv@^5.2.3, ajv@^5.3.0:
33
  version "5.5.2"
34
  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
35
+ integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=
36
  dependencies:
37
  co "^4.6.0"
38
  fast-deep-equal "^1.0.0"
39
  fast-json-stable-stringify "^2.0.0"
40
  json-schema-traverse "^0.3.0"
41
 
42
+ ansi-colors@^1.0.1:
43
+ version "1.1.0"
44
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9"
45
+ integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==
46
+ dependencies:
47
+ ansi-wrap "^0.1.0"
48
+
49
  ansi-escapes@^3.0.0:
50
  version "3.1.0"
51
  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
52
+ integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==
53
+
54
+ ansi-gray@^0.1.1:
55
+ version "0.1.1"
56
+ resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
57
+ integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE=
58
+ dependencies:
59
+ ansi-wrap "0.1.0"
60
 
61
  ansi-regex@^2.0.0:
62
  version "2.1.1"
63
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
64
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
65
 
66
  ansi-regex@^3.0.0:
67
  version "3.0.0"
68
  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
69
+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
70
 
71
  ansi-styles@^2.2.1:
72
  version "2.2.1"
73
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
74
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
75
 
76
  ansi-styles@^3.1.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1:
77
  version "3.2.1"
78
  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
79
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
80
  dependencies:
81
  color-convert "^1.9.0"
82
 
83
+ ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
84
+ version "0.1.0"
85
+ resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
86
+ integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768=
87
+
88
+ archy@^1.0.0:
89
+ version "1.0.0"
90
+ resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
91
+ integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=
92
+
93
  argparse@^1.0.7:
94
  version "1.0.10"
95
  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
96
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
97
  dependencies:
98
  sprintf-js "~1.0.2"
99
 
100
+ arr-diff@^4.0.0:
101
+ version "4.0.0"
102
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
103
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
104
+
105
+ arr-flatten@^1.1.0:
106
+ version "1.1.0"
107
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
108
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
109
+
110
+ arr-union@^3.1.0:
111
+ version "3.1.0"
112
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
113
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
114
+
115
+ array-differ@^1.0.0:
116
+ version "1.0.0"
117
+ resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
118
+ integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=
119
+
120
+ array-each@^1.0.1:
121
+ version "1.0.1"
122
+ resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
123
+ integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8=
124
+
125
+ array-slice@^1.0.0:
126
+ version "1.1.0"
127
+ resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
128
+ integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==
129
+
130
+ array-sort@^1.0.0:
131
+ version "1.0.0"
132
+ resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a"
133
+ integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==
134
  dependencies:
135
+ default-compare "^1.0.0"
136
+ get-value "^2.0.6"
137
+ kind-of "^5.0.2"
138
 
139
+ array-uniq@^1.0.2:
140
  version "1.0.3"
141
  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
142
+ integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
143
 
144
+ array-unique@^0.3.2:
145
+ version "0.3.2"
146
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
147
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
148
+
149
+ arrify@^1.0.1:
150
  version "1.0.1"
151
  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
152
+ integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
153
+
154
+ assign-symbols@^1.0.0:
155
+ version "1.0.0"
156
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
157
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
158
+
159
+ atob@^2.1.1:
160
+ version "2.1.2"
161
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
162
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
163
 
164
  babel-code-frame@^6.22.0:
165
  version "6.26.0"
166
  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
167
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
168
  dependencies:
169
  chalk "^1.1.3"
170
  esutils "^2.0.2"
173
  babel-runtime@^6.23.0, babel-runtime@^6.26.0:
174
  version "6.26.0"
175
  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
176
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
177
  dependencies:
178
  core-js "^2.4.0"
179
  regenerator-runtime "^0.11.0"
181
  balanced-match@^1.0.0:
182
  version "1.0.0"
183
  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
184
+ integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
185
+
186
+ base@^0.11.1:
187
+ version "0.11.2"
188
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
189
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
190
+ dependencies:
191
+ cache-base "^1.0.1"
192
+ class-utils "^0.3.5"
193
+ component-emitter "^1.2.1"
194
+ define-property "^1.0.0"
195
+ isobject "^3.0.1"
196
+ mixin-deep "^1.2.0"
197
+ pascalcase "^0.1.1"
198
+
199
+ beeper@^1.0.0:
200
+ version "1.1.1"
201
+ resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809"
202
+ integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=
203
 
204
  boolify@^1.0.0:
205
  version "1.0.1"
206
  resolved "https://registry.yarnpkg.com/boolify/-/boolify-1.0.1.tgz#b5c09e17cacd113d11b7bb3ed384cc012994d86b"
207
+ integrity sha1-tcCeF8rNET0Rt7s+04TMASmU2Gs=
208
 
209
+ brace-expansion@^1.0.0, brace-expansion@^1.1.7:
210
  version "1.1.11"
211
  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
212
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
213
  dependencies:
214
  balanced-match "^1.0.0"
215
  concat-map "0.0.1"
216
 
217
+ braces@^2.3.1:
218
+ version "2.3.2"
219
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
220
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
221
+ dependencies:
222
+ arr-flatten "^1.1.0"
223
+ array-unique "^0.3.2"
224
+ extend-shallow "^2.0.1"
225
+ fill-range "^4.0.0"
226
+ isobject "^3.0.1"
227
+ repeat-element "^1.1.2"
228
+ snapdragon "^0.8.1"
229
+ snapdragon-node "^2.0.1"
230
+ split-string "^3.0.2"
231
+ to-regex "^3.0.1"
232
+
233
  buffer-from@^1.0.0:
234
+ version "1.1.1"
235
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
236
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
237
+
238
+ builtin-modules@^1.0.0:
239
+ version "1.1.1"
240
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
241
+ integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
242
+
243
+ cache-base@^1.0.1:
244
+ version "1.0.1"
245
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
246
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
247
+ dependencies:
248
+ collection-visit "^1.0.0"
249
+ component-emitter "^1.2.1"
250
+ get-value "^2.0.6"
251
+ has-value "^1.0.0"
252
+ isobject "^3.0.1"
253
+ set-value "^2.0.0"
254
+ to-object-path "^0.3.0"
255
+ union-value "^1.0.0"
256
+ unset-value "^1.0.0"
257
 
258
  caller-path@^0.1.0:
259
  version "0.1.0"
260
  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
261
+ integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=
262
  dependencies:
263
  callsites "^0.2.0"
264
 
265
  callsites@^0.2.0:
266
  version "0.2.0"
267
  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
268
+ integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=
269
 
270
  camelcase-keys@^4.1.0:
271
  version "4.2.0"
272
  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77"
273
+ integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=
274
  dependencies:
275
  camelcase "^4.1.0"
276
  map-obj "^2.0.0"
277
  quick-lru "^1.0.0"
278
 
279
+ camelcase@^3.0.0:
280
+ version "3.0.0"
281
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
282
+ integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
283
+
284
  camelcase@^4.1.0:
285
  version "4.1.0"
286
  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
287
+ integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
288
 
289
  chalk@2.3.0:
290
  version "2.3.0"
291
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba"
292
+ integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==
293
  dependencies:
294
  ansi-styles "^3.1.0"
295
  escape-string-regexp "^1.0.5"
296
  supports-color "^4.0.0"
297
 
298
+ chalk@^1.0.0, chalk@^1.1.3:
299
  version "1.1.3"
300
  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
301
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
302
  dependencies:
303
  ansi-styles "^2.2.1"
304
  escape-string-regexp "^1.0.2"
307
  supports-color "^2.0.0"
308
 
309
  chalk@^2.0.0, chalk@^2.1.0:
310
+ version "2.4.1"
311
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
312
+ integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==
313
  dependencies:
314
  ansi-styles "^3.2.1"
315
  escape-string-regexp "^1.0.5"
318
  chardet@^0.4.0:
319
  version "0.4.2"
320
  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
321
+ integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=
322
 
323
  circular-json@^0.3.1:
324
  version "0.3.3"
325
  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
326
+ integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
327
+
328
+ class-utils@^0.3.5:
329
+ version "0.3.6"
330
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
331
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
332
+ dependencies:
333
+ arr-union "^3.1.0"
334
+ define-property "^0.2.5"
335
+ isobject "^3.0.0"
336
+ static-extend "^0.1.1"
337
 
338
  cli-cursor@^2.1.0:
339
  version "2.1.0"
340
  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
341
+ integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
342
  dependencies:
343
  restore-cursor "^2.0.0"
344
 
345
  cli-width@^2.0.0:
346
  version "2.2.0"
347
  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
348
+ integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
349
 
350
  cliui@^3.2.0:
351
  version "3.2.0"
352
  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
353
+ integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
354
  dependencies:
355
  string-width "^1.0.1"
356
  strip-ansi "^3.0.1"
357
  wrap-ansi "^2.0.0"
358
 
359
+ clone-stats@^0.0.1:
360
+ version "0.0.1"
361
+ resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
362
+ integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=
363
+
364
+ clone@^0.2.0:
365
+ version "0.2.0"
366
+ resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
367
+ integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=
368
+
369
+ clone@^1.0.0, clone@^1.0.2:
370
+ version "1.0.4"
371
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
372
+ integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
373
+
374
  co@^4.6.0:
375
  version "4.6.0"
376
  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
377
+ integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
378
 
379
  code-point-at@^1.0.0:
380
  version "1.1.0"
381
  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
382
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
383
+
384
+ collection-visit@^1.0.0:
385
+ version "1.0.0"
386
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
387
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
388
+ dependencies:
389
+ map-visit "^1.0.0"
390
+ object-visit "^1.0.0"
391
 
392
  color-convert@^1.9.0:
393
+ version "1.9.3"
394
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
395
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
396
  dependencies:
397
+ color-name "1.1.3"
398
 
399
+ color-name@1.1.3:
400
  version "1.1.3"
401
  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
402
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
403
+
404
+ color-support@^1.1.3:
405
+ version "1.1.3"
406
+ resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
407
+ integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
408
 
409
  common-tags@^1.4.0:
410
+ version "1.8.0"
411
+ resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
412
+ integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==
413
+
414
+ component-emitter@^1.2.1:
415
+ version "1.2.1"
416
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
417
+ integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
418
 
419
  concat-map@0.0.1:
420
  version "0.0.1"
421
  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
422
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
423
 
424
  concat-stream@^1.6.0:
425
  version "1.6.2"
426
  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
427
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
428
  dependencies:
429
  buffer-from "^1.0.0"
430
  inherits "^2.0.3"
431
  readable-stream "^2.2.2"
432
  typedarray "^0.0.6"
433
 
434
+ copy-descriptor@^0.1.0:
435
+ version "0.1.1"
436
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
437
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
438
+
439
+ copy-props@^2.0.1:
440
+ version "2.0.4"
441
+ resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe"
442
+ integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==
443
+ dependencies:
444
+ each-props "^1.3.0"
445
+ is-plain-object "^2.0.1"
446
+
447
  core-js@^2.4.0:
448
+ version "2.5.7"
449
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
450
+ integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==
451
 
452
  core-util-is@~1.0.0:
453
  version "1.0.2"
454
  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
455
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
456
 
457
  cross-spawn@^5.0.1, cross-spawn@^5.1.0:
458
  version "5.1.0"
459
  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
460
+ integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
461
  dependencies:
462
  lru-cache "^4.0.1"
463
  shebang-command "^1.2.0"
464
  which "^1.2.9"
465
 
466
+ d@1:
467
+ version "1.0.0"
468
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
469
+ integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=
470
+ dependencies:
471
+ es5-ext "^0.10.9"
472
+
473
+ dateformat@^2.0.0:
474
+ version "2.2.0"
475
+ resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
476
+ integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=
477
+
478
+ debug@^2.2.0, debug@^2.3.3:
479
+ version "2.6.9"
480
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
481
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
482
  dependencies:
483
  ms "2.0.0"
484
 
485
+ debug@^3.1.0:
486
+ version "3.2.6"
487
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
488
+ integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
489
+ dependencies:
490
+ ms "^2.1.1"
491
+
492
  decamelize@^1.1.1:
493
  version "1.2.0"
494
  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
495
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
496
+
497
+ decode-uri-component@^0.2.0:
498
+ version "0.2.0"
499
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
500
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
501
 
502
  deep-is@~0.1.3:
503
  version "0.1.3"
504
  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
505
+ integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
506
 
507
+ default-compare@^1.0.0:
508
+ version "1.0.0"
509
+ resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f"
510
+ integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==
511
  dependencies:
512
+ kind-of "^5.0.2"
513
+
514
+ defaults@^1.0.0:
515
+ version "1.0.3"
516
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
517
+ integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
518
+ dependencies:
519
+ clone "^1.0.2"
520
+
521
+ define-property@^0.2.5:
522
+ version "0.2.5"
523
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
524
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
525
+ dependencies:
526
+ is-descriptor "^0.1.0"
527
+
528
+ define-property@^1.0.0:
529
+ version "1.0.0"
530
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
531
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
532
+ dependencies:
533
+ is-descriptor "^1.0.0"
534
+
535
+ define-property@^2.0.2:
536
+ version "2.0.2"
537
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
538
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
539
+ dependencies:
540
+ is-descriptor "^1.0.2"
541
+ isobject "^3.0.1"
542
+
543
+ deprecated@^0.0.1:
544
+ version "0.0.1"
545
+ resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
546
+ integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=
547
+
548
+ detect-file@^1.0.0:
549
+ version "1.0.0"
550
+ resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
551
+ integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
552
 
553
  dlv@^1.1.0:
554
+ version "1.1.2"
555
+ resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.2.tgz#270f6737b30d25b6657a7e962c784403f85137e5"
556
+ integrity sha512-xxD4VSH67GbRvSGUrckvha94RD7hjgOH7rqGxiytLpkaeMvixOHFZTGFK6EkIm3T761OVHT8ABHmGkq9gXgu6Q==
557
 
558
  doctrine@^2.1.0:
559
  version "2.1.0"
560
  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
561
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
562
  dependencies:
563
  esutils "^2.0.2"
564
 
565
  dom-serializer@0:
566
  version "0.1.0"
567
  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
568
+ integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=
569
  dependencies:
570
  domelementtype "~1.1.1"
571
  entities "~1.1.1"
572
 
573
+ domelementtype@1:
574
+ version "1.2.1"
575
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.2.1.tgz#578558ef23befac043a1abb0db07635509393479"
576
+ integrity sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA==
577
+
578
+ domelementtype@^1.3.0:
579
  version "1.3.0"
580
  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
581
+ integrity sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=
582
 
583
  domelementtype@~1.1.1:
584
  version "1.1.3"
585
  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
586
+ integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=
587
 
588
  domhandler@^2.3.0:
589
+ version "2.4.2"
590
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
591
+ integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
592
  dependencies:
593
  domelementtype "1"
594
 
595
  domutils@^1.5.1:
596
  version "1.7.0"
597
  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
598
+ integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
599
  dependencies:
600
  dom-serializer "0"
601
  domelementtype "1"
602
 
603
+ duplexer2@0.0.2:
604
+ version "0.0.2"
605
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db"
606
+ integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=
607
+ dependencies:
608
+ readable-stream "~1.1.9"
609
+
610
+ each-props@^1.3.0:
611
+ version "1.3.2"
612
+ resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333"
613
+ integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==
614
+ dependencies:
615
+ is-plain-object "^2.0.1"
616
+ object.defaults "^1.1.0"
617
+
618
+ end-of-stream@~0.1.5:
619
+ version "0.1.5"
620
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf"
621
+ integrity sha1-jhdyBsPICDfYVjLouTWd/osvbq8=
622
+ dependencies:
623
+ once "~1.3.0"
624
+
625
  entities@^1.1.1, entities@~1.1.1:
626
+ version "1.1.2"
627
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
628
+ integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
629
+
630
+ error-ex@^1.2.0:
631
+ version "1.3.2"
632
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
633
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
634
+ dependencies:
635
+ is-arrayish "^0.2.1"
636
+
637
+ es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
638
+ version "0.10.46"
639
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572"
640
+ integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==
641
+ dependencies:
642
+ es6-iterator "~2.0.3"
643
+ es6-symbol "~3.1.1"
644
+ next-tick "1"
645
+
646
+ es6-iterator@^2.0.1, es6-iterator@~2.0.3:
647
+ version "2.0.3"
648
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
649
+ integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
650
+ dependencies:
651
+ d "1"
652
+ es5-ext "^0.10.35"
653
+ es6-symbol "^3.1.1"
654
+
655
+ es6-symbol@^3.1.1, es6-symbol@~3.1.1:
656
+ version "3.1.1"
657
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
658
+ integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=
659
+ dependencies:
660
+ d "1"
661
+ es5-ext "~0.10.14"
662
 
663
  escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
664
  version "1.0.5"
665
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
666
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
667
 
668
  eslint-config-wordpress@^2.0.0:
669
  version "2.0.0"
670
  resolved "https://registry.yarnpkg.com/eslint-config-wordpress/-/eslint-config-wordpress-2.0.0.tgz#5201206c6964d648315232edf6dfbd2e925e4cd6"
671
+ integrity sha1-UgEgbGlk1kgxUjLt9t+9LpJeTNY=
672
 
673
  eslint-plugin-html@^4.0.2:
674
+ version "4.0.6"
675
+ resolved "https://registry.yarnpkg.com/eslint-plugin-html/-/eslint-plugin-html-4.0.6.tgz#724bb9272efb4df007dfee8dfb269ed83577e5b4"
676
+ integrity sha512-nj6A9oK+7BKnMm0E7dMRH3r75BfpkXtcVIb3pFC4AcDdBTNyg2NGxHXyFNT1emW4VsR7P2SZvRXXQtUR+kY08w==
677
  dependencies:
678
  htmlparser2 "^3.8.2"
679
 
680
  eslint-scope@^3.7.1:
681
+ version "3.7.3"
682
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535"
683
+ integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==
684
  dependencies:
685
  esrecurse "^4.1.0"
686
  estraverse "^4.1.1"
688
  eslint-visitor-keys@^1.0.0:
689
  version "1.0.0"
690
  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
691
+ integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==
692
 
693
  eslint@^4.0.0, eslint@^4.19.1, eslint@^4.5.0:
694
  version "4.19.1"
695
  resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
696
+ integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==
697
  dependencies:
698
  ajv "^5.3.0"
699
  babel-code-frame "^6.22.0"
734
  table "4.0.2"
735
  text-table "~0.2.0"
736
 
737
+ espree@^3.5.2, espree@^3.5.4:
738
  version "3.5.4"
739
  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
740
+ integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==
741
  dependencies:
742
  acorn "^5.5.0"
743
  acorn-jsx "^3.0.0"
744
 
745
  esprima@^4.0.0:
746
+ version "4.0.1"
747
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
748
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
749
 
750
  esquery@^1.0.0:
751
+ version "1.0.1"
752
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
753
+ integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
754
  dependencies:
755
  estraverse "^4.0.0"
756
 
757
  esrecurse@^4.1.0:
758
  version "4.2.1"
759
  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
760
+ integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
761
  dependencies:
762
  estraverse "^4.1.0"
763
 
764
  estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1:
765
  version "4.2.0"
766
  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
767
+ integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=
768
 
769
  esutils@^2.0.2:
770
  version "2.0.2"
771
  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
772
+ integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
773
 
774
  execa@^0.7.0:
775
  version "0.7.0"
776
  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
777
+ integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=
778
  dependencies:
779
  cross-spawn "^5.0.1"
780
  get-stream "^3.0.0"
784
  signal-exit "^3.0.0"
785
  strip-eof "^1.0.0"
786
 
787
+ expand-brackets@^2.1.4:
788
+ version "2.1.4"
789
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
790
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
791
+ dependencies:
792
+ debug "^2.3.3"
793
+ define-property "^0.2.5"
794
+ extend-shallow "^2.0.1"
795
+ posix-character-classes "^0.1.0"
796
+ regex-not "^1.0.0"
797
+ snapdragon "^0.8.1"
798
+ to-regex "^3.0.1"
799
+
800
+ expand-tilde@^2.0.0, expand-tilde@^2.0.2:
801
+ version "2.0.2"
802
+ resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
803
+ integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
804
+ dependencies:
805
+ homedir-polyfill "^1.0.1"
806
+
807
+ extend-shallow@^2.0.1:
808
+ version "2.0.1"
809
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
810
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
811
+ dependencies:
812
+ is-extendable "^0.1.0"
813
+
814
+ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
815
+ version "3.0.2"
816
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
817
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
818
+ dependencies:
819
+ assign-symbols "^1.0.0"
820
+ is-extendable "^1.0.1"
821
+
822
+ extend@^3.0.0:
823
+ version "3.0.2"
824
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
825
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
826
+
827
  external-editor@^2.0.4:
828
+ version "2.2.0"
829
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
830
+ integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==
831
  dependencies:
832
  chardet "^0.4.0"
833
  iconv-lite "^0.4.17"
834
  tmp "^0.0.33"
835
 
836
+ extglob@^2.0.4:
837
+ version "2.0.4"
838
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
839
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
840
+ dependencies:
841
+ array-unique "^0.3.2"
842
+ define-property "^1.0.0"
843
+ expand-brackets "^2.1.4"
844
+ extend-shallow "^2.0.1"
845
+ fragment-cache "^0.2.1"
846
+ regex-not "^1.0.0"
847
+ snapdragon "^0.8.1"
848
+ to-regex "^3.0.1"
849
+
850
+ fancy-log@^1.1.0, fancy-log@^1.3.2:
851
+ version "1.3.2"
852
+ resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1"
853
+ integrity sha1-9BEl49hPLn2JpD0G2VjI94vha+E=
854
+ dependencies:
855
+ ansi-gray "^0.1.1"
856
+ color-support "^1.1.3"
857
+ time-stamp "^1.0.0"
858
+
859
  fast-deep-equal@^1.0.0:
860
  version "1.1.0"
861
  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
862
+ integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=
863
 
864
  fast-json-stable-stringify@^2.0.0:
865
  version "2.0.0"
866
  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
867
+ integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
868
 
869
  fast-levenshtein@~2.0.4:
870
  version "2.0.6"
871
  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
872
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
873
 
874
  figures@^2.0.0:
875
  version "2.0.0"
876
  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
877
+ integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
878
  dependencies:
879
  escape-string-regexp "^1.0.5"
880
 
881
  file-entry-cache@^2.0.0:
882
  version "2.0.0"
883
  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
884
+ integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=
885
  dependencies:
886
  flat-cache "^1.2.1"
887
  object-assign "^4.0.1"
888
 
889
+ fill-range@^4.0.0:
890
+ version "4.0.0"
891
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
892
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
893
+ dependencies:
894
+ extend-shallow "^2.0.1"
895
+ is-number "^3.0.0"
896
+ repeat-string "^1.6.1"
897
+ to-regex-range "^2.1.0"
898
+
899
+ find-index@^0.1.1:
900
+ version "0.1.1"
901
+ resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
902
+ integrity sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=
903
+
904
+ find-up@^1.0.0:
905
+ version "1.1.2"
906
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
907
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
908
+ dependencies:
909
+ path-exists "^2.0.0"
910
+ pinkie-promise "^2.0.0"
911
+
912
  find-up@^2.1.0:
913
  version "2.1.0"
914
  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
915
+ integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
916
  dependencies:
917
  locate-path "^2.0.0"
918
 
919
+ findup-sync@^2.0.0:
920
+ version "2.0.0"
921
+ resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
922
+ integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=
923
+ dependencies:
924
+ detect-file "^1.0.0"
925
+ is-glob "^3.1.0"
926
+ micromatch "^3.0.4"
927
+ resolve-dir "^1.0.1"
928
+
929
+ fined@^1.0.1:
930
+ version "1.1.0"
931
+ resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476"
932
+ integrity sha1-s33IRLdqL15wgeiE98CuNE8VNHY=
933
+ dependencies:
934
+ expand-tilde "^2.0.2"
935
+ is-plain-object "^2.0.3"
936
+ object.defaults "^1.1.0"
937
+ object.pick "^1.2.0"
938
+ parse-filepath "^1.0.1"
939
+
940
+ first-chunk-stream@^1.0.0:
941
+ version "1.0.0"
942
+ resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
943
+ integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=
944
+
945
+ flagged-respawn@^1.0.0:
946
+ version "1.0.0"
947
+ resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7"
948
+ integrity sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=
949
+
950
  flat-cache@^1.2.1:
951
+ version "1.3.4"
952
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
953
+ integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
954
  dependencies:
955
  circular-json "^0.3.1"
 
956
  graceful-fs "^4.1.2"
957
+ rimraf "~2.6.2"
958
  write "^0.2.1"
959
 
960
+ for-in@^1.0.1, for-in@^1.0.2:
961
+ version "1.0.2"
962
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
963
+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
964
+
965
+ for-own@^1.0.0:
966
+ version "1.0.0"
967
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
968
+ integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
969
+ dependencies:
970
+ for-in "^1.0.1"
971
+
972
+ fragment-cache@^0.2.1:
973
+ version "0.2.1"
974
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
975
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
976
+ dependencies:
977
+ map-cache "^0.2.2"
978
+
979
  fs.realpath@^1.0.0:
980
  version "1.0.0"
981
  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
982
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
983
 
984
  functional-red-black-tree@^1.0.1:
985
  version "1.0.1"
986
  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
987
+ integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
988
+
989
+ gaze@^0.5.1:
990
+ version "0.5.2"
991
+ resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f"
992
+ integrity sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=
993
+ dependencies:
994
+ globule "~0.1.0"
995
 
996
  get-caller-file@^1.0.1:
997
+ version "1.0.3"
998
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
999
+ integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
1000
 
1001
  get-stdin@^5.0.1:
1002
  version "5.0.1"
1003
  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398"
1004
+ integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=
1005
 
1006
  get-stream@^3.0.0:
1007
  version "3.0.0"
1008
  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
1009
+ integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
1010
 
1011
+ get-value@^2.0.3, get-value@^2.0.6:
1012
+ version "2.0.6"
1013
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
1014
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
1015
+
1016
+ glob-stream@^3.1.5:
1017
+ version "3.1.18"
1018
+ resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b"
1019
+ integrity sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=
1020
+ dependencies:
1021
+ glob "^4.3.1"
1022
+ glob2base "^0.0.12"
1023
+ minimatch "^2.0.1"
1024
+ ordered-read-streams "^0.1.0"
1025
+ through2 "^0.6.1"
1026
+ unique-stream "^1.0.0"
1027
+
1028
+ glob-watcher@^0.0.6:
1029
+ version "0.0.6"
1030
+ resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b"
1031
+ integrity sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=
1032
+ dependencies:
1033
+ gaze "^0.5.1"
1034
+
1035
+ glob2base@^0.0.12:
1036
+ version "0.0.12"
1037
+ resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
1038
+ integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=
1039
+ dependencies:
1040
+ find-index "^0.1.1"
1041
+
1042
+ glob@^4.3.1:
1043
+ version "4.5.3"
1044
+ resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f"
1045
+ integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=
1046
+ dependencies:
1047
+ inflight "^1.0.4"
1048
+ inherits "2"
1049
+ minimatch "^2.0.1"
1050
+ once "^1.3.0"
1051
+
1052
+ glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
1053
+ version "7.1.3"
1054
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
1055
+ integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
1056
  dependencies:
1057
  fs.realpath "^1.0.0"
1058
  inflight "^1.0.4"
1061
  once "^1.3.0"
1062
  path-is-absolute "^1.0.0"
1063
 
1064
+ glob@~3.1.21:
1065
+ version "3.1.21"
1066
+ resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
1067
+ integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=
1068
+ dependencies:
1069
+ graceful-fs "~1.2.0"
1070
+ inherits "1"
1071
+ minimatch "~0.2.11"
1072
+
1073
  glob@~7.0.6:
1074
  version "7.0.6"
1075
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
1076
+ integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=
1077
  dependencies:
1078
  fs.realpath "^1.0.0"
1079
  inflight "^1.0.4"
1082
  once "^1.3.0"
1083
  path-is-absolute "^1.0.0"
1084
 
1085
+ global-modules@^1.0.0:
1086
+ version "1.0.0"
1087
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
1088
+ integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
1089
+ dependencies:
1090
+ global-prefix "^1.0.1"
1091
+ is-windows "^1.0.1"
1092
+ resolve-dir "^1.0.0"
1093
+
1094
+ global-prefix@^1.0.1:
1095
+ version "1.0.2"
1096
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
1097
+ integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
1098
+ dependencies:
1099
+ expand-tilde "^2.0.2"
1100
+ homedir-polyfill "^1.0.1"
1101
+ ini "^1.3.4"
1102
+ is-windows "^1.0.1"
1103
+ which "^1.2.14"
1104
+
1105
  globals@^11.0.1:
1106
+ version "11.9.0"
1107
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249"
1108
+ integrity sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==
1109
 
1110
+ globule@~0.1.0:
1111
+ version "0.1.0"
1112
+ resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5"
1113
+ integrity sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=
1114
  dependencies:
1115
+ glob "~3.1.21"
1116
+ lodash "~1.0.1"
1117
+ minimatch "~0.2.11"
1118
+
1119
+ glogg@^1.0.0:
1120
+ version "1.0.1"
1121
+ resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810"
1122
+ integrity sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==
1123
+ dependencies:
1124
+ sparkles "^1.0.0"
1125
+
1126
+ graceful-fs@^3.0.0:
1127
+ version "3.0.11"
1128
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818"
1129
+ integrity sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=
1130
+ dependencies:
1131
+ natives "^1.1.0"
1132
 
1133
  graceful-fs@^4.1.2:
1134
+ version "4.1.15"
1135
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
1136
+ integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
1137
+
1138
+ graceful-fs@~1.2.0:
1139
+ version "1.2.3"
1140
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
1141
+ integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=
1142
+
1143
+ gulp-cli@^2.0.1:
1144
+ version "2.0.1"
1145
+ resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.0.1.tgz#7847e220cb3662f2be8a6d572bf14e17be5a994b"
1146
+ integrity sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ==
1147
+ dependencies:
1148
+ ansi-colors "^1.0.1"
1149
+ archy "^1.0.0"
1150
+ array-sort "^1.0.0"
1151
+ color-support "^1.1.3"
1152
+ concat-stream "^1.6.0"
1153
+ copy-props "^2.0.1"
1154
+ fancy-log "^1.3.2"
1155
+ gulplog "^1.0.0"
1156
+ interpret "^1.1.0"
1157
+ isobject "^3.0.1"
1158
+ liftoff "^2.5.0"
1159
+ matchdep "^2.0.0"
1160
+ mute-stdout "^1.0.0"
1161
+ pretty-hrtime "^1.0.0"
1162
+ replace-homedir "^1.0.0"
1163
+ semver-greatest-satisfied-range "^1.1.0"
1164
+ v8flags "^3.0.1"
1165
+ yargs "^7.1.0"
1166
+
1167
+ gulp-util@^3.0.0:
1168
+ version "3.0.8"
1169
+ resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
1170
+ integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08=
1171
+ dependencies:
1172
+ array-differ "^1.0.0"
1173
+ array-uniq "^1.0.2"
1174
+ beeper "^1.0.0"
1175
+ chalk "^1.0.0"
1176
+ dateformat "^2.0.0"
1177
+ fancy-log "^1.1.0"
1178
+ gulplog "^1.0.0"
1179
+ has-gulplog "^0.1.0"
1180
+ lodash._reescape "^3.0.0"
1181
+ lodash._reevaluate "^3.0.0"
1182
+ lodash._reinterpolate "^3.0.0"
1183
+ lodash.template "^3.0.0"
1184
+ minimist "^1.1.0"
1185
+ multipipe "^0.1.2"
1186
+ object-assign "^3.0.0"
1187
+ replace-ext "0.0.1"
1188
+ through2 "^2.0.0"
1189
+ vinyl "^0.5.0"
1190
+
1191
+ gulp@^3.9.1:
1192
+ version "3.9.1"
1193
+ resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4"
1194
+ integrity sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=
1195
+ dependencies:
1196
+ archy "^1.0.0"
1197
+ chalk "^1.0.0"
1198
+ deprecated "^0.0.1"
1199
+ gulp-util "^3.0.0"
1200
+ interpret "^1.0.0"
1201
+ liftoff "^2.1.0"
1202
+ minimist "^1.1.0"
1203
+ orchestrator "^0.3.0"
1204
+ pretty-hrtime "^1.0.0"
1205
+ semver "^4.1.0"
1206
+ tildify "^1.0.0"
1207
+ v8flags "^2.0.2"
1208
+ vinyl-fs "^0.3.0"
1209
+
1210
+ gulplog@^1.0.0:
1211
+ version "1.0.0"
1212
+ resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5"
1213
+ integrity sha1-4oxNRdBey77YGDY86PnFkmIp/+U=
1214
+ dependencies:
1215
+ glogg "^1.0.0"
1216
 
1217
  has-ansi@^2.0.0:
1218
  version "2.0.0"
1219
  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
1220
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
1221
  dependencies:
1222
  ansi-regex "^2.0.0"
1223
 
1224
  has-flag@^2.0.0:
1225
  version "2.0.0"
1226
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
1227
+ integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=
1228
 
1229
  has-flag@^3.0.0:
1230
  version "3.0.0"
1231
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
1232
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
1233
+
1234
+ has-gulplog@^0.1.0:
1235
+ version "0.1.0"
1236
+ resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce"
1237
+ integrity sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=
1238
+ dependencies:
1239
+ sparkles "^1.0.0"
1240
+
1241
+ has-value@^0.3.1:
1242
+ version "0.3.1"
1243
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
1244
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
1245
+ dependencies:
1246
+ get-value "^2.0.3"
1247
+ has-values "^0.1.4"
1248
+ isobject "^2.0.0"
1249
+
1250
+ has-value@^1.0.0:
1251
+ version "1.0.0"
1252
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
1253
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
1254
+ dependencies:
1255
+ get-value "^2.0.6"
1256
+ has-values "^1.0.0"
1257
+ isobject "^3.0.0"
1258
+
1259
+ has-values@^0.1.4:
1260
+ version "0.1.4"
1261
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
1262
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
1263
+
1264
+ has-values@^1.0.0:
1265
+ version "1.0.0"
1266
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
1267
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
1268
+ dependencies:
1269
+ is-number "^3.0.0"
1270
+ kind-of "^4.0.0"
1271
+
1272
+ homedir-polyfill@^1.0.1:
1273
+ version "1.0.1"
1274
+ resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
1275
+ integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw=
1276
+ dependencies:
1277
+ parse-passwd "^1.0.0"
1278
+
1279
+ hosted-git-info@^2.1.4:
1280
+ version "2.7.1"
1281
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
1282
+ integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==
1283
 
1284
  htmlparser2@^3.8.2:
1285
+ version "3.10.0"
1286
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464"
1287
+ integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==
1288
  dependencies:
1289
  domelementtype "^1.3.0"
1290
  domhandler "^2.3.0"
1291
  domutils "^1.5.1"
1292
  entities "^1.1.1"
1293
  inherits "^2.0.1"
1294
+ readable-stream "^3.0.6"
1295
 
1296
  iconv-lite@^0.4.17:
1297
+ version "0.4.24"
1298
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
1299
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
1300
+ dependencies:
1301
+ safer-buffer ">= 2.1.2 < 3"
1302
 
1303
  ignore@^3.2.7, ignore@^3.3.3:
1304
+ version "3.3.10"
1305
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
1306
+ integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
1307
 
1308
  imurmurhash@^0.1.4:
1309
  version "0.1.4"
1310
  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
1311
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
1312
 
1313
  indent-string@^3.1.0, indent-string@^3.2.0:
1314
  version "3.2.0"
1315
  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
1316
+ integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=
1317
 
1318
  inflight@^1.0.4:
1319
  version "1.0.6"
1320
  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
1321
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
1322
  dependencies:
1323
  once "^1.3.0"
1324
  wrappy "1"
1325
 
1326
+ inherits@1:
1327
+ version "1.0.2"
1328
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
1329
+ integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=
1330
+
1331
+ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
1332
  version "2.0.3"
1333
  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
1334
+ integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
1335
+
1336
+ ini@^1.3.4:
1337
+ version "1.3.5"
1338
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
1339
+ integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
1340
 
1341
  inquirer@^3.0.6:
1342
  version "3.3.0"
1343
  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
1344
+ integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==
1345
  dependencies:
1346
  ansi-escapes "^3.0.0"
1347
  chalk "^2.0.0"
1358
  strip-ansi "^4.0.0"
1359
  through "^2.3.6"
1360
 
1361
+ interpret@^1.0.0, interpret@^1.1.0:
1362
+ version "1.1.0"
1363
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
1364
+ integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=
1365
+
1366
  invert-kv@^1.0.0:
1367
  version "1.0.0"
1368
  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
1369
+ integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
1370
+
1371
+ is-absolute@^1.0.0:
1372
+ version "1.0.0"
1373
+ resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
1374
+ integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
1375
+ dependencies:
1376
+ is-relative "^1.0.0"
1377
+ is-windows "^1.0.1"
1378
+
1379
+ is-accessor-descriptor@^0.1.6:
1380
+ version "0.1.6"
1381
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
1382
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
1383
+ dependencies:
1384
+ kind-of "^3.0.2"
1385
+
1386
+ is-accessor-descriptor@^1.0.0:
1387
+ version "1.0.0"
1388
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
1389
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
1390
+ dependencies:
1391
+ kind-of "^6.0.0"
1392
+
1393
+ is-arrayish@^0.2.1:
1394
+ version "0.2.1"
1395
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
1396
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
1397
+
1398
+ is-buffer@^1.1.5:
1399
+ version "1.1.6"
1400
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
1401
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
1402
+
1403
+ is-builtin-module@^1.0.0:
1404
+ version "1.0.0"
1405
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
1406
+ integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74=
1407
+ dependencies:
1408
+ builtin-modules "^1.0.0"
1409
+
1410
+ is-data-descriptor@^0.1.4:
1411
+ version "0.1.4"
1412
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
1413
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
1414
+ dependencies:
1415
+ kind-of "^3.0.2"
1416
+
1417
+ is-data-descriptor@^1.0.0:
1418
+ version "1.0.0"
1419
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
1420
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
1421
+ dependencies:
1422
+ kind-of "^6.0.0"
1423
+
1424
+ is-descriptor@^0.1.0:
1425
+ version "0.1.6"
1426
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
1427
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
1428
+ dependencies:
1429
+ is-accessor-descriptor "^0.1.6"
1430
+ is-data-descriptor "^0.1.4"
1431
+ kind-of "^5.0.0"
1432
+
1433
+ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
1434
+ version "1.0.2"
1435
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
1436
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
1437
+ dependencies:
1438
+ is-accessor-descriptor "^1.0.0"
1439
+ is-data-descriptor "^1.0.0"
1440
+ kind-of "^6.0.2"
1441
+
1442
+ is-extendable@^0.1.0, is-extendable@^0.1.1:
1443
+ version "0.1.1"
1444
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
1445
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
1446
+
1447
+ is-extendable@^1.0.1:
1448
+ version "1.0.1"
1449
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
1450
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
1451
+ dependencies:
1452
+ is-plain-object "^2.0.4"
1453
+
1454
+ is-extglob@^2.1.0:
1455
+ version "2.1.1"
1456
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
1457
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
1458
 
1459
  is-fullwidth-code-point@^1.0.0:
1460
  version "1.0.0"
1461
  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
1462
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
1463
  dependencies:
1464
  number-is-nan "^1.0.0"
1465
 
1466
  is-fullwidth-code-point@^2.0.0:
1467
  version "2.0.0"
1468
  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
1469
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
1470
 
1471
+ is-glob@^3.1.0:
1472
+ version "3.1.0"
1473
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
1474
+ integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
1475
+ dependencies:
1476
+ is-extglob "^2.1.0"
1477
 
1478
+ is-number@^3.0.0:
1479
+ version "3.0.0"
1480
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
1481
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
1482
  dependencies:
1483
+ kind-of "^3.0.2"
1484
 
1485
+ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
1486
+ version "2.0.4"
1487
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
1488
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
1489
  dependencies:
1490
+ isobject "^3.0.1"
1491
 
1492
  is-promise@^2.1.0:
1493
  version "2.1.0"
1494
  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
1495
+ integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
1496
+
1497
+ is-relative@^1.0.0:
1498
+ version "1.0.0"
1499
+ resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
1500
+ integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
1501
+ dependencies:
1502
+ is-unc-path "^1.0.0"
1503
 
1504
  is-resolvable@^1.0.0:
1505
  version "1.1.0"
1506
  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
1507
+ integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
1508
 
1509
  is-stream@^1.1.0:
1510
  version "1.1.0"
1511
  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
1512
+ integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
1513
+
1514
+ is-unc-path@^1.0.0:
1515
+ version "1.0.0"
1516
+ resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
1517
+ integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
1518
+ dependencies:
1519
+ unc-path-regex "^0.1.2"
1520
+
1521
+ is-utf8@^0.2.0:
1522
+ version "0.2.1"
1523
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
1524
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
1525
+
1526
+ is-windows@^1.0.1, is-windows@^1.0.2:
1527
+ version "1.0.2"
1528
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
1529
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
1530
 
1531
+ isarray@0.0.1:
1532
+ version "0.0.1"
1533
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
1534
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
1535
+
1536
+ isarray@1.0.0, isarray@~1.0.0:
1537
  version "1.0.0"
1538
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
1539
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
1540
 
1541
  isexe@^2.0.0:
1542
  version "2.0.0"
1543
  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
1544
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
1545
+
1546
+ isobject@^2.0.0:
1547
+ version "2.1.0"
1548
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
1549
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
1550
+ dependencies:
1551
+ isarray "1.0.0"
1552
+
1553
+ isobject@^3.0.0, isobject@^3.0.1:
1554
+ version "3.0.1"
1555
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
1556
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
1557
+
1558
+ jquery-toggles@^4.0.0:
1559
+ version "4.0.0"
1560
+ resolved "https://registry.yarnpkg.com/jquery-toggles/-/jquery-toggles-4.0.0.tgz#820eebffb63dade7644eb5bc56198f0214726c19"
1561
+ integrity sha1-gg7r/7Y9redkTrW8VhmPAhRybBk=
1562
 
1563
  js-tokens@^3.0.2:
1564
  version "3.0.2"
1565
  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
1566
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
1567
 
1568
  js-yaml@^3.9.1:
1569
+ version "3.12.0"
1570
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
1571
+ integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==
1572
  dependencies:
1573
  argparse "^1.0.7"
1574
  esprima "^4.0.0"
1576
  json-schema-traverse@^0.3.0:
1577
  version "0.3.1"
1578
  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
1579
+ integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=
1580
 
1581
  json-stable-stringify-without-jsonify@^1.0.1:
1582
  version "1.0.1"
1583
  resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
1584
+ integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
1585
+
1586
+ kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
1587
+ version "3.2.2"
1588
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
1589
+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
1590
+ dependencies:
1591
+ is-buffer "^1.1.5"
1592
+
1593
+ kind-of@^4.0.0:
1594
+ version "4.0.0"
1595
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
1596
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
1597
+ dependencies:
1598
+ is-buffer "^1.1.5"
1599
+
1600
+ kind-of@^5.0.0, kind-of@^5.0.2:
1601
+ version "5.1.0"
1602
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
1603
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
1604
+
1605
+ kind-of@^6.0.0, kind-of@^6.0.2:
1606
+ version "6.0.2"
1607
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
1608
+ integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
1609
 
1610
  lcid@^1.0.0:
1611
  version "1.0.0"
1612
  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
1613
+ integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
1614
  dependencies:
1615
  invert-kv "^1.0.0"
1616
 
1617
  levn@^0.3.0, levn@~0.3.0:
1618
  version "0.3.0"
1619
  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
1620
+ integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
1621
  dependencies:
1622
  prelude-ls "~1.1.2"
1623
  type-check "~0.3.2"
1624
 
1625
+ liftoff@^2.1.0, liftoff@^2.5.0:
1626
+ version "2.5.0"
1627
+ resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec"
1628
+ integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=
1629
+ dependencies:
1630
+ extend "^3.0.0"
1631
+ findup-sync "^2.0.0"
1632
+ fined "^1.0.1"
1633
+ flagged-respawn "^1.0.0"
1634
+ is-plain-object "^2.0.4"
1635
+ object.map "^1.0.0"
1636
+ rechoir "^0.6.2"
1637
+ resolve "^1.1.7"
1638
+
1639
+ load-json-file@^1.0.0:
1640
+ version "1.1.0"
1641
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
1642
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
1643
+ dependencies:
1644
+ graceful-fs "^4.1.2"
1645
+ parse-json "^2.2.0"
1646
+ pify "^2.0.0"
1647
+ pinkie-promise "^2.0.0"
1648
+ strip-bom "^2.0.0"
1649
+
1650
  locate-path@^2.0.0:
1651
  version "2.0.0"
1652
  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
1653
+ integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
1654
  dependencies:
1655
  p-locate "^2.0.0"
1656
  path-exists "^3.0.0"
1657
 
1658
+ lodash._basecopy@^3.0.0:
1659
+ version "3.0.1"
1660
+ resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
1661
+ integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=
1662
+
1663
+ lodash._basetostring@^3.0.0:
1664
+ version "3.0.1"
1665
+ resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
1666
+ integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=
1667
+
1668
+ lodash._basevalues@^3.0.0:
1669
+ version "3.0.0"
1670
+ resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7"
1671
+ integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=
1672
+
1673
+ lodash._getnative@^3.0.0:
1674
+ version "3.9.1"
1675
+ resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
1676
+ integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=
1677
+
1678
+ lodash._isiterateecall@^3.0.0:
1679
+ version "3.0.9"
1680
+ resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c"
1681
+ integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=
1682
+
1683
+ lodash._reescape@^3.0.0:
1684
+ version "3.0.0"
1685
+ resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a"
1686
+ integrity sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=
1687
+
1688
+ lodash._reevaluate@^3.0.0:
1689
+ version "3.0.0"
1690
+ resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
1691
+ integrity sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=
1692
+
1693
+ lodash._reinterpolate@^3.0.0:
1694
+ version "3.0.0"
1695
+ resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
1696
+ integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
1697
+
1698
+ lodash._root@^3.0.0:
1699
+ version "3.0.1"
1700
+ resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
1701
+ integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=
1702
+
1703
+ lodash.escape@^3.0.0:
1704
+ version "3.2.0"
1705
+ resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
1706
+ integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=
1707
+ dependencies:
1708
+ lodash._root "^3.0.0"
1709
+
1710
+ lodash.isarguments@^3.0.0:
1711
+ version "3.1.0"
1712
+ resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
1713
+ integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=
1714
+
1715
+ lodash.isarray@^3.0.0:
1716
+ version "3.0.4"
1717
+ resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
1718
+ integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=
1719
+
1720
+ lodash.keys@^3.0.0:
1721
+ version "3.1.2"
1722
+ resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
1723
+ integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=
1724
+ dependencies:
1725
+ lodash._getnative "^3.0.0"
1726
+ lodash.isarguments "^3.0.0"
1727
+ lodash.isarray "^3.0.0"
1728
+
1729
  lodash.memoize@^4.1.2:
1730
  version "4.1.2"
1731
  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
1732
+ integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
1733
 
1734
  lodash.merge@^4.6.0:
1735
  version "4.6.1"
1736
  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54"
1737
+ integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==
1738
+
1739
+ lodash.restparam@^3.0.0:
1740
+ version "3.6.1"
1741
+ resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
1742
+ integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=
1743
+
1744
+ lodash.template@^3.0.0:
1745
+ version "3.6.2"
1746
+ resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f"
1747
+ integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=
1748
+ dependencies:
1749
+ lodash._basecopy "^3.0.0"
1750
+ lodash._basetostring "^3.0.0"
1751
+ lodash._basevalues "^3.0.0"
1752
+ lodash._isiterateecall "^3.0.0"
1753
+ lodash._reinterpolate "^3.0.0"
1754
+ lodash.escape "^3.0.0"
1755
+ lodash.keys "^3.0.0"
1756
+ lodash.restparam "^3.0.0"
1757
+ lodash.templatesettings "^3.0.0"
1758
+
1759
+ lodash.templatesettings@^3.0.0:
1760
+ version "3.1.1"
1761
+ resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
1762
+ integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=
1763
+ dependencies:
1764
+ lodash._reinterpolate "^3.0.0"
1765
+ lodash.escape "^3.0.0"
1766
 
1767
  lodash.unescape@4.0.1:
1768
  version "4.0.1"
1769
  resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
1770
+ integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=
1771
 
1772
  lodash@^4.17.4, lodash@^4.3.0:
1773
+ version "4.17.11"
1774
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
1775
+ integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
1776
+
1777
+ lodash@~1.0.1:
1778
+ version "1.0.2"
1779
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
1780
+ integrity sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=
1781
 
1782
  loglevel-colored-level-prefix@^1.0.0:
1783
  version "1.0.0"
1784
  resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e"
1785
+ integrity sha1-akAhj9x64V/HbD0PPmdsRlOIYD4=
1786
  dependencies:
1787
  chalk "^1.1.3"
1788
  loglevel "^1.4.1"
1790
  loglevel@^1.4.1:
1791
  version "1.6.1"
1792
  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"
1793
+ integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=
1794
+
1795
+ lru-cache@2:
1796
+ version "2.7.3"
1797
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
1798
+ integrity sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=
1799
 
1800
  lru-cache@^4.0.1:
1801
+ version "4.1.4"
1802
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.4.tgz#51cc46e8e6d9530771c857e24ccc720ecdbcc031"
1803
+ integrity sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA==
1804
  dependencies:
1805
  pseudomap "^1.0.2"
1806
+ yallist "^3.0.2"
1807
+
1808
+ make-iterator@^1.0.0:
1809
+ version "1.0.1"
1810
+ resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
1811
+ integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==
1812
+ dependencies:
1813
+ kind-of "^6.0.2"
1814
 
1815
  make-plural@^4.1.1:
1816
+ version "4.3.0"
1817
+ resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.3.0.tgz#f23de08efdb0cac2e0c9ba9f315b0dff6b4c2735"
1818
+ integrity sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==
1819
  optionalDependencies:
1820
  minimist "^1.2.0"
1821
 
1822
+ map-cache@^0.2.0, map-cache@^0.2.2:
1823
+ version "0.2.2"
1824
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
1825
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
1826
+
1827
  map-obj@^2.0.0:
1828
  version "2.0.0"
1829
  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9"
1830
+ integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk=
1831
+
1832
+ map-visit@^1.0.0:
1833
+ version "1.0.0"
1834
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
1835
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
1836
+ dependencies:
1837
+ object-visit "^1.0.0"
1838
+
1839
+ matchdep@^2.0.0:
1840
+ version "2.0.0"
1841
+ resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e"
1842
+ integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4=
1843
+ dependencies:
1844
+ findup-sync "^2.0.0"
1845
+ micromatch "^3.0.4"
1846
+ resolve "^1.4.0"
1847
+ stack-trace "0.0.10"
1848
 
1849
  mem@^1.1.0:
1850
  version "1.1.0"
1851
  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
1852
+ integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=
1853
  dependencies:
1854
  mimic-fn "^1.0.0"
1855
 
1856
  messageformat-parser@^1.1.0:
1857
  version "1.1.0"
1858
  resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-1.1.0.tgz#13ba2250a76bbde8e0fca0dbb3475f95c594a90a"
1859
+ integrity sha512-Hwem6G3MsKDLS1FtBRGIs8T50P1Q00r3srS6QJePCFbad9fq0nYxwf3rnU2BreApRGhmpKMV7oZI06Sy1c9TPA==
1860
 
1861
  messageformat@^1.0.2:
1862
  version "1.1.1"
1863
  resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-1.1.1.tgz#ceaa2e6c86929d4807058275a7372b1bd963bdf6"
1864
+ integrity sha512-Q0uXcDtF5pEZsVSyhzDOGgZZK6ykN79VY9CwU3Nv0gsqx62BjdJW0MT+63UkHQ4exe3HE33ZlxR2/YwoJarRTg==
1865
  dependencies:
1866
  glob "~7.0.6"
1867
  make-plural "^4.1.1"
1869
  nopt "~3.0.6"
1870
  reserved-words "^0.1.2"
1871
 
1872
+ micromatch@^3.0.4:
1873
+ version "3.1.10"
1874
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
1875
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
1876
+ dependencies:
1877
+ arr-diff "^4.0.0"
1878
+ array-unique "^0.3.2"
1879
+ braces "^2.3.1"
1880
+ define-property "^2.0.2"
1881
+ extend-shallow "^3.0.2"
1882
+ extglob "^2.0.4"
1883
+ fragment-cache "^0.2.1"
1884
+ kind-of "^6.0.2"
1885
+ nanomatch "^1.2.9"
1886
+ object.pick "^1.3.0"
1887
+ regex-not "^1.0.0"
1888
+ snapdragon "^0.8.1"
1889
+ to-regex "^3.0.2"
1890
+
1891
  mimic-fn@^1.0.0:
1892
  version "1.2.0"
1893
  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
1894
+ integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
1895
+
1896
+ minimatch@^2.0.1:
1897
+ version "2.0.10"
1898
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
1899
+ integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=
1900
+ dependencies:
1901
+ brace-expansion "^1.0.0"
1902
 
1903
  minimatch@^3.0.2, minimatch@^3.0.4:
1904
  version "3.0.4"
1905
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
1906
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
1907
  dependencies:
1908
  brace-expansion "^1.1.7"
1909
 
1910
+ minimatch@~0.2.11:
1911
+ version "0.2.14"
1912
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a"
1913
+ integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=
1914
+ dependencies:
1915
+ lru-cache "2"
1916
+ sigmund "~1.0.0"
1917
+
1918
  minimist@0.0.8:
1919
  version "0.0.8"
1920
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
1921
+ integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
1922
 
1923
+ minimist@^1.1.0, minimist@^1.2.0:
1924
  version "1.2.0"
1925
  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
1926
+ integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
1927
+
1928
+ mixin-deep@^1.2.0:
1929
+ version "1.3.1"
1930
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
1931
+ integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==
1932
+ dependencies:
1933
+ for-in "^1.0.2"
1934
+ is-extendable "^1.0.1"
1935
 
1936
+ mkdirp@^0.5.0, mkdirp@^0.5.1:
1937
  version "0.5.1"
1938
  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
1939
+ integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
1940
  dependencies:
1941
  minimist "0.0.8"
1942
 
1943
  ms@2.0.0:
1944
  version "2.0.0"
1945
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
1946
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
1947
+
1948
+ ms@^2.1.1:
1949
+ version "2.1.1"
1950
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
1951
+ integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
1952
+
1953
+ multipipe@^0.1.2:
1954
+ version "0.1.2"
1955
+ resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
1956
+ integrity sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=
1957
+ dependencies:
1958
+ duplexer2 "0.0.2"
1959
+
1960
+ mute-stdout@^1.0.0:
1961
+ version "1.0.1"
1962
+ resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331"
1963
+ integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==
1964
 
1965
  mute-stream@0.0.7:
1966
  version "0.0.7"
1967
  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
1968
+ integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
1969
+
1970
+ nanomatch@^1.2.9:
1971
+ version "1.2.13"
1972
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
1973
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
1974
+ dependencies:
1975
+ arr-diff "^4.0.0"
1976
+ array-unique "^0.3.2"
1977
+ define-property "^2.0.2"
1978
+ extend-shallow "^3.0.2"
1979
+ fragment-cache "^0.2.1"
1980
+ is-windows "^1.0.2"
1981
+ kind-of "^6.0.2"
1982
+ object.pick "^1.3.0"
1983
+ regex-not "^1.0.0"
1984
+ snapdragon "^0.8.1"
1985
+ to-regex "^3.0.1"
1986
+
1987
+ natives@^1.1.0:
1988
+ version "1.1.6"
1989
+ resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb"
1990
+ integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==
1991
 
1992
  natural-compare@^1.4.0:
1993
  version "1.4.0"
1994
  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
1995
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
1996
+
1997
+ next-tick@1:
1998
+ version "1.0.0"
1999
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
2000
+ integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
2001
 
2002
  nopt@~3.0.6:
2003
  version "3.0.6"
2004
  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
2005
+ integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
2006
  dependencies:
2007
  abbrev "1"
2008
 
2009
+ normalize-package-data@^2.3.2:
2010
+ version "2.4.0"
2011
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
2012
+ integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==
2013
+ dependencies:
2014
+ hosted-git-info "^2.1.4"
2015
+ is-builtin-module "^1.0.0"
2016
+ semver "2 || 3 || 4 || 5"
2017
+ validate-npm-package-license "^3.0.1"
2018
+
2019
  npm-run-path@^2.0.0:
2020
  version "2.0.2"
2021
  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
2022
+ integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
2023
  dependencies:
2024
  path-key "^2.0.0"
2025
 
2026
  number-is-nan@^1.0.0:
2027
  version "1.0.1"
2028
  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
2029
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
2030
+
2031
+ object-assign@^3.0.0:
2032
+ version "3.0.0"
2033
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
2034
+ integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=
2035
 
2036
  object-assign@^4.0.1:
2037
  version "4.1.1"
2038
  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
2039
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
2040
+
2041
+ object-copy@^0.1.0:
2042
+ version "0.1.0"
2043
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
2044
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
2045
+ dependencies:
2046
+ copy-descriptor "^0.1.0"
2047
+ define-property "^0.2.5"
2048
+ kind-of "^3.0.3"
2049
+
2050
+ object-visit@^1.0.0:
2051
+ version "1.0.1"
2052
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
2053
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
2054
+ dependencies:
2055
+ isobject "^3.0.0"
2056
+
2057
+ object.defaults@^1.1.0:
2058
+ version "1.1.0"
2059
+ resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
2060
+ integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=
2061
+ dependencies:
2062
+ array-each "^1.0.1"
2063
+ array-slice "^1.0.0"
2064
+ for-own "^1.0.0"
2065
+ isobject "^3.0.0"
2066
+
2067
+ object.map@^1.0.0:
2068
+ version "1.0.1"
2069
+ resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
2070
+ integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=
2071
+ dependencies:
2072
+ for-own "^1.0.0"
2073
+ make-iterator "^1.0.0"
2074
+
2075
+ object.pick@^1.2.0, object.pick@^1.3.0:
2076
+ version "1.3.0"
2077
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
2078
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
2079
+ dependencies:
2080
+ isobject "^3.0.1"
2081
 
2082
  once@^1.3.0:
2083
  version "1.4.0"
2084
  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
2085
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
2086
+ dependencies:
2087
+ wrappy "1"
2088
+
2089
+ once@~1.3.0:
2090
+ version "1.3.3"
2091
+ resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
2092
+ integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=
2093
  dependencies:
2094
  wrappy "1"
2095
 
2096
  onetime@^2.0.0:
2097
  version "2.0.1"
2098
  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
2099
+ integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
2100
  dependencies:
2101
  mimic-fn "^1.0.0"
2102
 
2103
  optionator@^0.8.2:
2104
  version "0.8.2"
2105
  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
2106
+ integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
2107
  dependencies:
2108
  deep-is "~0.1.3"
2109
  fast-levenshtein "~2.0.4"
2112
  type-check "~0.3.2"
2113
  wordwrap "~1.0.0"
2114
 
2115
+ orchestrator@^0.3.0:
2116
+ version "0.3.8"
2117
+ resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e"
2118
+ integrity sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=
2119
+ dependencies:
2120
+ end-of-stream "~0.1.5"
2121
+ sequencify "~0.0.7"
2122
+ stream-consume "~0.1.0"
2123
+
2124
+ ordered-read-streams@^0.1.0:
2125
+ version "0.1.0"
2126
+ resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126"
2127
+ integrity sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=
2128
+
2129
+ os-homedir@^1.0.0:
2130
+ version "1.0.2"
2131
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
2132
+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
2133
+
2134
+ os-locale@^1.4.0:
2135
+ version "1.4.0"
2136
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
2137
+ integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
2138
+ dependencies:
2139
+ lcid "^1.0.0"
2140
+
2141
  os-locale@^2.0.0:
2142
  version "2.1.0"
2143
  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
2144
+ integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==
2145
  dependencies:
2146
  execa "^0.7.0"
2147
  lcid "^1.0.0"
2150
  os-tmpdir@~1.0.2:
2151
  version "1.0.2"
2152
  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
2153
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
2154
 
2155
  p-finally@^1.0.0:
2156
  version "1.0.0"
2157
  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
2158
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
2159
 
2160
  p-limit@^1.1.0:
2161
+ version "1.3.0"
2162
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
2163
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
2164
  dependencies:
2165
  p-try "^1.0.0"
2166
 
2167
  p-locate@^2.0.0:
2168
  version "2.0.0"
2169
  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
2170
+ integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
2171
  dependencies:
2172
  p-limit "^1.1.0"
2173
 
2174
  p-try@^1.0.0:
2175
  version "1.0.0"
2176
  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
2177
+ integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
2178
+
2179
+ parse-filepath@^1.0.1:
2180
+ version "1.0.2"
2181
+ resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
2182
+ integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=
2183
+ dependencies:
2184
+ is-absolute "^1.0.0"
2185
+ map-cache "^0.2.0"
2186
+ path-root "^0.1.1"
2187
+
2188
+ parse-json@^2.2.0:
2189
+ version "2.2.0"
2190
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
2191
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
2192
+ dependencies:
2193
+ error-ex "^1.2.0"
2194
+
2195
+ parse-passwd@^1.0.0:
2196
+ version "1.0.0"
2197
+ resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
2198
+ integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
2199
+
2200
+ pascalcase@^0.1.1:
2201
+ version "0.1.1"
2202
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
2203
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
2204
+
2205
+ path-exists@^2.0.0:
2206
+ version "2.1.0"
2207
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
2208
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
2209
+ dependencies:
2210
+ pinkie-promise "^2.0.0"
2211
 
2212
  path-exists@^3.0.0:
2213
  version "3.0.0"
2214
  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
2215
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
2216
 
2217
  path-is-absolute@^1.0.0:
2218
  version "1.0.1"
2219
  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
2220
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
2221
 
2222
+ path-is-inside@^1.0.2:
2223
  version "1.0.2"
2224
  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
2225
+ integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
2226
 
2227
  path-key@^2.0.0:
2228
  version "2.0.1"
2229
  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
2230
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
2231
+
2232
+ path-parse@^1.0.5:
2233
+ version "1.0.6"
2234
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
2235
+ integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
2236
+
2237
+ path-root-regex@^0.1.0:
2238
+ version "0.1.2"
2239
+ resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
2240
+ integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=
2241
+
2242
+ path-root@^0.1.1:
2243
+ version "0.1.1"
2244
+ resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
2245
+ integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=
2246
+ dependencies:
2247
+ path-root-regex "^0.1.0"
2248
+
2249
+ path-type@^1.0.0:
2250
+ version "1.1.0"
2251
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
2252
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
2253
+ dependencies:
2254
+ graceful-fs "^4.1.2"
2255
+ pify "^2.0.0"
2256
+ pinkie-promise "^2.0.0"
2257
 
2258
  pify@^2.0.0:
2259
  version "2.3.0"
2260
  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
2261
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
2262
 
2263
  pinkie-promise@^2.0.0:
2264
  version "2.0.1"
2265
  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
2266
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
2267
  dependencies:
2268
  pinkie "^2.0.0"
2269
 
2270
  pinkie@^2.0.0:
2271
  version "2.0.4"
2272
  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
2273
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
2274
 
2275
  pluralize@^7.0.0:
2276
  version "7.0.0"
2277
  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
2278
+ integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==
2279
+
2280
+ posix-character-classes@^0.1.0:
2281
+ version "0.1.1"
2282
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
2283
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
2284
 
2285
  prelude-ls@~1.1.2:
2286
  version "1.1.2"
2287
  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
2288
+ integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
2289
 
2290
  prettier-eslint-cli@^4.7.1:
2291
  version "4.7.1"
2292
  resolved "https://registry.yarnpkg.com/prettier-eslint-cli/-/prettier-eslint-cli-4.7.1.tgz#3d103c494baa4e80b99ad53e2b9db7620101859f"
2293
+ integrity sha512-hQbsGaEVz97oBBcKdsJ46khv0kOGkMyWrXzcFOXW6X8UuetZ/j0yDJkNJgUTVc6PVFbbzBXk+qgd5vos9qzXPQ==
2294
  dependencies:
2295
  arrify "^1.0.1"
2296
  babel-runtime "^6.23.0"
2312
  yargs "10.0.3"
2313
 
2314
  prettier-eslint@^8.5.0, prettier-eslint@^8.8.1:
2315
+ version "8.8.2"
2316
+ resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.8.2.tgz#fcb29a48ab4524e234680797fe70e9d136ccaf0b"
2317
+ integrity sha512-2UzApPuxi2yRoyMlXMazgR6UcH9DKJhNgCviIwY3ixZ9THWSSrUww5vkiZ3C48WvpFl1M1y/oU63deSy1puWEA==
2318
  dependencies:
2319
  babel-runtime "^6.26.0"
2320
  common-tags "^1.4.0"
2324
  lodash.merge "^4.6.0"
2325
  loglevel-colored-level-prefix "^1.0.0"
2326
  prettier "^1.7.0"
2327
+ pretty-format "^23.0.1"
2328
  require-relative "^0.8.7"
2329
  typescript "^2.5.1"
2330
+ typescript-eslint-parser "^16.0.0"
2331
+ vue-eslint-parser "^2.0.2"
2332
 
2333
  prettier@^1.7.0:
2334
+ version "1.15.2"
2335
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.15.2.tgz#d31abe22afa4351efa14c7f8b94b58bb7452205e"
2336
+ integrity sha512-YgPLFFA0CdKL4Eg2IHtUSjzj/BWgszDHiNQAe0VAIBse34148whfdzLagRL+QiKS+YfK5ftB6X4v/MBw8yCoug==
2337
 
2338
+ pretty-format@^23.0.1:
2339
+ version "23.6.0"
2340
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760"
2341
+ integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==
2342
  dependencies:
2343
  ansi-regex "^3.0.0"
2344
  ansi-styles "^3.2.0"
2345
 
2346
+ pretty-hrtime@^1.0.0:
2347
+ version "1.0.3"
2348
+ resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
2349
+ integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
2350
+
2351
  process-nextick-args@~2.0.0:
2352
  version "2.0.0"
2353
  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
2354
+ integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
2355
 
2356
  progress@^2.0.0:
2357
+ version "2.0.1"
2358
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31"
2359
+ integrity sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==
2360
 
2361
  pseudomap@^1.0.2:
2362
  version "1.0.2"
2363
  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
2364
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
2365
 
2366
  quick-lru@^1.0.0:
2367
  version "1.1.0"
2368
  resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
2369
+ integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=
2370
+
2371
+ read-pkg-up@^1.0.1:
2372
+ version "1.0.1"
2373
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
2374
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
2375
+ dependencies:
2376
+ find-up "^1.0.0"
2377
+ read-pkg "^1.0.0"
2378
 
2379
+ read-pkg@^1.0.0:
2380
+ version "1.1.0"
2381
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
2382
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
2383
+ dependencies:
2384
+ load-json-file "^1.0.0"
2385
+ normalize-package-data "^2.3.2"
2386
+ path-type "^1.0.0"
2387
+
2388
+ "readable-stream@>=1.0.33-1 <1.1.0-0":
2389
+ version "1.0.34"
2390
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
2391
+ integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
2392
+ dependencies:
2393
+ core-util-is "~1.0.0"
2394
+ inherits "~2.0.1"
2395
+ isarray "0.0.1"
2396
+ string_decoder "~0.10.x"
2397
+
2398
+ readable-stream@^2.2.2, readable-stream@~2.3.6:
2399
+ version "2.3.6"
2400
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
2401
+ integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
2402
  dependencies:
2403
  core-util-is "~1.0.0"
2404
  inherits "~2.0.3"
2405
  isarray "~1.0.0"
2406
  process-nextick-args "~2.0.0"
2407
  safe-buffer "~5.1.1"
2408
+ string_decoder "~1.1.1"
2409
  util-deprecate "~1.0.1"
2410
 
2411
+ readable-stream@^3.0.6:
2412
+ version "3.0.6"
2413
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.0.6.tgz#351302e4c68b5abd6a2ed55376a7f9a25be3057a"
2414
+ integrity sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==
2415
+ dependencies:
2416
+ inherits "^2.0.3"
2417
+ string_decoder "^1.1.1"
2418
+ util-deprecate "^1.0.1"
2419
+
2420
+ readable-stream@~1.1.9:
2421
+ version "1.1.14"
2422
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
2423
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
2424
+ dependencies:
2425
+ core-util-is "~1.0.0"
2426
+ inherits "~2.0.1"
2427
+ isarray "0.0.1"
2428
+ string_decoder "~0.10.x"
2429
+
2430
+ rechoir@^0.6.2:
2431
+ version "0.6.2"
2432
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
2433
+ integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
2434
+ dependencies:
2435
+ resolve "^1.1.6"
2436
+
2437
  regenerator-runtime@^0.11.0:
2438
  version "0.11.1"
2439
  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
2440
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
2441
+
2442
+ regex-not@^1.0.0, regex-not@^1.0.2:
2443
+ version "1.0.2"
2444
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
2445
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
2446
+ dependencies:
2447
+ extend-shallow "^3.0.2"
2448
+ safe-regex "^1.1.0"
2449
 
2450
  regexpp@^1.0.1:
2451
  version "1.1.0"
2452
  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
2453
+ integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==
2454
+
2455
+ remove-trailing-separator@^1.1.0:
2456
+ version "1.1.0"
2457
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
2458
+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
2459
+
2460
+ repeat-element@^1.1.2:
2461
+ version "1.1.3"
2462
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
2463
+ integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
2464
+
2465
+ repeat-string@^1.6.1:
2466
+ version "1.6.1"
2467
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
2468
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
2469
+
2470
+ replace-ext@0.0.1:
2471
+ version "0.0.1"
2472
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
2473
+ integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=
2474
+
2475
+ replace-homedir@^1.0.0:
2476
+ version "1.0.0"
2477
+ resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c"
2478
+ integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=
2479
+ dependencies:
2480
+ homedir-polyfill "^1.0.1"
2481
+ is-absolute "^1.0.0"
2482
+ remove-trailing-separator "^1.1.0"
2483
 
2484
  require-directory@^2.1.1:
2485
  version "2.1.1"
2486
  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
2487
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
2488
 
2489
  require-main-filename@^1.0.1:
2490
  version "1.0.1"
2491
  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
2492
+ integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
2493
 
2494
  require-relative@^0.8.7:
2495
  version "0.8.7"
2496
  resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de"
2497
+ integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=
2498
 
2499
  require-uncached@^1.0.3:
2500
  version "1.0.3"
2501
  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
2502
+ integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=
2503
  dependencies:
2504
  caller-path "^0.1.0"
2505
  resolve-from "^1.0.0"
2507
  reserved-words@^0.1.2:
2508
  version "0.1.2"
2509
  resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1"
2510
+ integrity sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=
2511
+
2512
+ resolve-dir@^1.0.0, resolve-dir@^1.0.1:
2513
+ version "1.0.1"
2514
+ resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
2515
+ integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
2516
+ dependencies:
2517
+ expand-tilde "^2.0.0"
2518
+ global-modules "^1.0.0"
2519
 
2520
  resolve-from@^1.0.0:
2521
  version "1.0.1"
2522
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
2523
+ integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=
2524
+
2525
+ resolve-url@^0.2.1:
2526
+ version "0.2.1"
2527
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
2528
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
2529
+
2530
+ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.4.0:
2531
+ version "1.8.1"
2532
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
2533
+ integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==
2534
+ dependencies:
2535
+ path-parse "^1.0.5"
2536
 
2537
  restore-cursor@^2.0.0:
2538
  version "2.0.0"
2539
  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
2540
+ integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
2541
  dependencies:
2542
  onetime "^2.0.0"
2543
  signal-exit "^3.0.2"
2544
 
2545
+ ret@~0.1.10:
2546
+ version "0.1.15"
2547
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
2548
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
2549
+
2550
+ rimraf@~2.6.2:
2551
  version "2.6.2"
2552
  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
2553
+ integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==
2554
  dependencies:
2555
  glob "^7.0.5"
2556
 
2557
  run-async@^2.2.0:
2558
  version "2.3.0"
2559
  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
2560
+ integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA=
2561
  dependencies:
2562
  is-promise "^2.1.0"
2563
 
2564
  rx-lite-aggregates@^4.0.8:
2565
  version "4.0.8"
2566
  resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
2567
+ integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=
2568
  dependencies:
2569
  rx-lite "*"
2570
 
2571
  rx-lite@*, rx-lite@^4.0.8:
2572
  version "4.0.8"
2573
  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
2574
+ integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=
2575
 
2576
  rxjs@^5.3.0:
2577
+ version "5.5.12"
2578
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc"
2579
+ integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==
2580
  dependencies:
2581
  symbol-observable "1.0.1"
2582
 
2583
  safe-buffer@~5.1.0, safe-buffer@~5.1.1:
2584
+ version "5.1.2"
2585
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
2586
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
2587
+
2588
+ safe-regex@^1.1.0:
2589
+ version "1.1.0"
2590
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
2591
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
2592
+ dependencies:
2593
+ ret "~0.1.10"
2594
 
2595
+ "safer-buffer@>= 2.1.2 < 3":
2596
+ version "2.1.2"
2597
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
2598
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
2599
+
2600
+ semver-greatest-satisfied-range@^1.1.0:
2601
+ version "1.1.0"
2602
+ resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b"
2603
+ integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els=
2604
+ dependencies:
2605
+ sver-compat "^1.5.0"
2606
 
2607
+ "semver@2 || 3 || 4 || 5", semver@^5.3.0:
2608
+ version "5.6.0"
2609
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
2610
+ integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
2611
+
2612
+ semver@5.5.0:
2613
  version "5.5.0"
2614
  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
2615
+ integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==
2616
+
2617
+ semver@^4.1.0:
2618
+ version "4.3.6"
2619
+ resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
2620
+ integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=
2621
+
2622
+ sequencify@~0.0.7:
2623
+ version "0.0.7"
2624
+ resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c"
2625
+ integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=
2626
 
2627
  set-blocking@^2.0.0:
2628
  version "2.0.0"
2629
  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
2630
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
2631
+
2632
+ set-value@^0.4.3:
2633
+ version "0.4.3"
2634
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
2635
+ integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE=
2636
+ dependencies:
2637
+ extend-shallow "^2.0.1"
2638
+ is-extendable "^0.1.1"
2639
+ is-plain-object "^2.0.1"
2640
+ to-object-path "^0.3.0"
2641
+
2642
+ set-value@^2.0.0:
2643
+ version "2.0.0"
2644
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
2645
+ integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==
2646
+ dependencies:
2647
+ extend-shallow "^2.0.1"
2648
+ is-extendable "^0.1.1"
2649
+ is-plain-object "^2.0.3"
2650
+ split-string "^3.0.1"
2651
 
2652
  shebang-command@^1.2.0:
2653
  version "1.2.0"
2654
  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
2655
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
2656
  dependencies:
2657
  shebang-regex "^1.0.0"
2658
 
2659
  shebang-regex@^1.0.0:
2660
  version "1.0.0"
2661
  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
2662
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
2663
+
2664
+ sigmund@~1.0.0:
2665
+ version "1.0.1"
2666
+ resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
2667
+ integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
2668
 
2669
  signal-exit@^3.0.0, signal-exit@^3.0.2:
2670
  version "3.0.2"
2671
  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
2672
+ integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
2673
 
2674
  slice-ansi@1.0.0:
2675
  version "1.0.0"
2676
  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
2677
+ integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==
2678
  dependencies:
2679
  is-fullwidth-code-point "^2.0.0"
2680
 
2681
+ snapdragon-node@^2.0.1:
2682
+ version "2.1.1"
2683
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
2684
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
2685
+ dependencies:
2686
+ define-property "^1.0.0"
2687
+ isobject "^3.0.0"
2688
+ snapdragon-util "^3.0.1"
2689
+
2690
+ snapdragon-util@^3.0.1:
2691
+ version "3.0.1"
2692
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
2693
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
2694
+ dependencies:
2695
+ kind-of "^3.2.0"
2696
+
2697
+ snapdragon@^0.8.1:
2698
+ version "0.8.2"
2699
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
2700
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
2701
+ dependencies:
2702
+ base "^0.11.1"
2703
+ debug "^2.2.0"
2704
+ define-property "^0.2.5"
2705
+ extend-shallow "^2.0.1"
2706
+ map-cache "^0.2.2"
2707
+ source-map "^0.5.6"
2708
+ source-map-resolve "^0.5.0"
2709
+ use "^3.1.0"
2710
+
2711
+ source-map-resolve@^0.5.0:
2712
+ version "0.5.2"
2713
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
2714
+ integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
2715
+ dependencies:
2716
+ atob "^2.1.1"
2717
+ decode-uri-component "^0.2.0"
2718
+ resolve-url "^0.2.1"
2719
+ source-map-url "^0.4.0"
2720
+ urix "^0.1.0"
2721
+
2722
+ source-map-url@^0.4.0:
2723
+ version "0.4.0"
2724
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
2725
+ integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
2726
+
2727
+ source-map@^0.5.6:
2728
+ version "0.5.7"
2729
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
2730
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
2731
+
2732
+ sparkles@^1.0.0:
2733
+ version "1.0.1"
2734
+ resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"
2735
+ integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==
2736
+
2737
+ spdx-correct@^3.0.0:
2738
+ version "3.0.2"
2739
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e"
2740
+ integrity sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==
2741
+ dependencies:
2742
+ spdx-expression-parse "^3.0.0"
2743
+ spdx-license-ids "^3.0.0"
2744
+
2745
+ spdx-exceptions@^2.1.0:
2746
+ version "2.2.0"
2747
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
2748
+ integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==
2749
+
2750
+ spdx-expression-parse@^3.0.0:
2751
+ version "3.0.0"
2752
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
2753
+ integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==
2754
+ dependencies:
2755
+ spdx-exceptions "^2.1.0"
2756
+ spdx-license-ids "^3.0.0"
2757
+
2758
+ spdx-license-ids@^3.0.0:
2759
+ version "3.0.2"
2760
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2"
2761
+ integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==
2762
+
2763
+ split-string@^3.0.1, split-string@^3.0.2:
2764
+ version "3.1.0"
2765
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
2766
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
2767
+ dependencies:
2768
+ extend-shallow "^3.0.0"
2769
+
2770
  sprintf-js@~1.0.2:
2771
  version "1.0.3"
2772
  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
2773
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
2774
+
2775
+ stack-trace@0.0.10:
2776
+ version "0.0.10"
2777
+ resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
2778
+ integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
2779
+
2780
+ static-extend@^0.1.1:
2781
+ version "0.1.2"
2782
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
2783
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
2784
+ dependencies:
2785
+ define-property "^0.2.5"
2786
+ object-copy "^0.1.0"
2787
+
2788
+ stream-consume@~0.1.0:
2789
+ version "0.1.1"
2790
+ resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48"
2791
+ integrity sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==
2792
 
2793
+ string-width@^1.0.1, string-width@^1.0.2:
2794
  version "1.0.2"
2795
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
2796
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
2797
  dependencies:
2798
  code-point-at "^1.0.0"
2799
  is-fullwidth-code-point "^1.0.0"
2802
  string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
2803
  version "2.1.1"
2804
  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
2805
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
2806
  dependencies:
2807
  is-fullwidth-code-point "^2.0.0"
2808
  strip-ansi "^4.0.0"
2809
 
2810
+ string_decoder@^1.1.1, string_decoder@~1.1.1:
2811
+ version "1.1.1"
2812
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
2813
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
2814
  dependencies:
2815
  safe-buffer "~5.1.0"
2816
 
2817
+ string_decoder@~0.10.x:
2818
+ version "0.10.31"
2819
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
2820
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
2821
+
2822
  strip-ansi@^3.0.0, strip-ansi@^3.0.1:
2823
  version "3.0.1"
2824
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
2825
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
2826
  dependencies:
2827
  ansi-regex "^2.0.0"
2828
 
2829
  strip-ansi@^4.0.0:
2830
  version "4.0.0"
2831
  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
2832
+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
2833
  dependencies:
2834
  ansi-regex "^3.0.0"
2835
 
2836
+ strip-bom@^1.0.0:
2837
+ version "1.0.0"
2838
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794"
2839
+ integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=
2840
+ dependencies:
2841
+ first-chunk-stream "^1.0.0"
2842
+ is-utf8 "^0.2.0"
2843
+
2844
+ strip-bom@^2.0.0:
2845
+ version "2.0.0"
2846
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
2847
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
2848
+ dependencies:
2849
+ is-utf8 "^0.2.0"
2850
+
2851
  strip-eof@^1.0.0:
2852
  version "1.0.0"
2853
  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
2854
+ integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
2855
 
2856
  strip-json-comments@~2.0.1:
2857
  version "2.0.1"
2858
  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
2859
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
2860
 
2861
  supports-color@^2.0.0:
2862
  version "2.0.0"
2863
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
2864
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
2865
 
2866
  supports-color@^4.0.0:
2867
  version "4.5.0"
2868
  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
2869
+ integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=
2870
  dependencies:
2871
  has-flag "^2.0.0"
2872
 
2873
  supports-color@^5.3.0:
2874
+ version "5.5.0"
2875
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
2876
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
2877
  dependencies:
2878
  has-flag "^3.0.0"
2879
 
2880
+ sver-compat@^1.5.0:
2881
+ version "1.5.0"
2882
+ resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8"
2883
+ integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=
2884
+ dependencies:
2885
+ es6-iterator "^2.0.1"
2886
+ es6-symbol "^3.1.1"
2887
+
2888
  symbol-observable@1.0.1:
2889
  version "1.0.1"
2890
  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
2891
+ integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=
2892
 
2893
  table@4.0.2:
2894
  version "4.0.2"
2895
  resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
2896
+ integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==
2897
  dependencies:
2898
  ajv "^5.2.3"
2899
  ajv-keywords "^2.1.0"
2905
  text-table@~0.2.0:
2906
  version "0.2.0"
2907
  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
2908
+ integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
2909
+
2910
+ through2@^0.6.1:
2911
+ version "0.6.5"
2912
+ resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
2913
+ integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=
2914
+ dependencies:
2915
+ readable-stream ">=1.0.33-1 <1.1.0-0"
2916
+ xtend ">=4.0.0 <4.1.0-0"
2917
+
2918
+ through2@^2.0.0:
2919
+ version "2.0.5"
2920
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
2921
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
2922
+ dependencies:
2923
+ readable-stream "~2.3.6"
2924
+ xtend "~4.0.1"
2925
 
2926
  through@^2.3.6:
2927
  version "2.3.8"
2928
  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
2929
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
2930
+
2931
+ tildify@^1.0.0:
2932
+ version "1.2.0"
2933
+ resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
2934
+ integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=
2935
+ dependencies:
2936
+ os-homedir "^1.0.0"
2937
+
2938
+ time-stamp@^1.0.0:
2939
+ version "1.1.0"
2940
+ resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
2941
+ integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=
2942
 
2943
  tmp@^0.0.33:
2944
  version "0.0.33"
2945
  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
2946
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
2947
  dependencies:
2948
  os-tmpdir "~1.0.2"
2949
 
2950
+ to-object-path@^0.3.0:
2951
+ version "0.3.0"
2952
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
2953
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
2954
+ dependencies:
2955
+ kind-of "^3.0.2"
2956
+
2957
+ to-regex-range@^2.1.0:
2958
+ version "2.1.1"
2959
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
2960
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
2961
+ dependencies:
2962
+ is-number "^3.0.0"
2963
+ repeat-string "^1.6.1"
2964
+
2965
+ to-regex@^3.0.1, to-regex@^3.0.2:
2966
+ version "3.0.2"
2967
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
2968
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
2969
+ dependencies:
2970
+ define-property "^2.0.2"
2971
+ extend-shallow "^3.0.2"
2972
+ regex-not "^1.0.2"
2973
+ safe-regex "^1.1.0"
2974
+
2975
  type-check@~0.3.2:
2976
  version "0.3.2"
2977
  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
2978
+ integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
2979
  dependencies:
2980
  prelude-ls "~1.1.2"
2981
 
2982
  typedarray@^0.0.6:
2983
  version "0.0.6"
2984
  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
2985
+ integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
2986
 
2987
+ typescript-eslint-parser@^16.0.0:
2988
+ version "16.0.1"
2989
+ resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-16.0.1.tgz#b40681c7043b222b9772748b700a000b241c031b"
2990
+ integrity sha512-IKawLTu4A2xN3aN/cPLxvZ0bhxZHILGDKTZWvWNJ3sLNhJ3PjfMEDQmR2VMpdRPrmWOadgWXRwjLBzSA8AGsaQ==
2991
  dependencies:
2992
  lodash.unescape "4.0.1"
2993
+ semver "5.5.0"
2994
 
2995
  typescript@^2.5.1:
2996
+ version "2.9.2"
2997
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c"
2998
+ integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==
2999
 
3000
+ unc-path-regex@^0.1.2:
3001
+ version "0.1.2"
3002
+ resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
3003
+ integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=
3004
+
3005
+ union-value@^1.0.0:
3006
+ version "1.0.0"
3007
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
3008
+ integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=
3009
+ dependencies:
3010
+ arr-union "^3.1.0"
3011
+ get-value "^2.0.6"
3012
+ is-extendable "^0.1.1"
3013
+ set-value "^0.4.3"
3014
+
3015
+ unique-stream@^1.0.0:
3016
+ version "1.0.0"
3017
+ resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b"
3018
+ integrity sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=
3019
+
3020
+ unset-value@^1.0.0:
3021
+ version "1.0.0"
3022
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
3023
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
3024
+ dependencies:
3025
+ has-value "^0.3.1"
3026
+ isobject "^3.0.0"
3027
+
3028
+ urix@^0.1.0:
3029
+ version "0.1.0"
3030
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
3031
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
3032
+
3033
+ use@^3.1.0:
3034
+ version "3.1.1"
3035
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
3036
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
3037
+
3038
+ user-home@^1.1.1:
3039
+ version "1.1.1"
3040
+ resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
3041
+ integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA=
3042
+
3043
+ util-deprecate@^1.0.1, util-deprecate@~1.0.1:
3044
  version "1.0.2"
3045
  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
3046
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
3047
+
3048
+ v8flags@^2.0.2:
3049
+ version "2.1.1"
3050
+ resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
3051
+ integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=
3052
+ dependencies:
3053
+ user-home "^1.1.1"
3054
+
3055
+ v8flags@^3.0.1:
3056
+ version "3.1.1"
3057
+ resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.1.tgz#42259a1461c08397e37fe1d4f1cfb59cad85a053"
3058
+ integrity sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==
3059
+ dependencies:
3060
+ homedir-polyfill "^1.0.1"
3061
+
3062
+ validate-npm-package-license@^3.0.1:
3063
+ version "3.0.4"
3064
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
3065
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
3066
+ dependencies:
3067
+ spdx-correct "^3.0.0"
3068
+ spdx-expression-parse "^3.0.0"
3069
+
3070
+ vinyl-fs@^0.3.0:
3071
+ version "0.3.14"
3072
+ resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6"
3073
+ integrity sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=
3074
+ dependencies:
3075
+ defaults "^1.0.0"
3076
+ glob-stream "^3.1.5"
3077
+ glob-watcher "^0.0.6"
3078
+ graceful-fs "^3.0.0"
3079
+ mkdirp "^0.5.0"
3080
+ strip-bom "^1.0.0"
3081
+ through2 "^0.6.1"
3082
+ vinyl "^0.4.0"
3083
+
3084
+ vinyl@^0.4.0:
3085
+ version "0.4.6"
3086
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847"
3087
+ integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc=
3088
+ dependencies:
3089
+ clone "^0.2.0"
3090
+ clone-stats "^0.0.1"
3091
+
3092
+ vinyl@^0.5.0:
3093
+ version "0.5.3"
3094
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde"
3095
+ integrity sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=
3096
+ dependencies:
3097
+ clone "^1.0.0"
3098
+ clone-stats "^0.0.1"
3099
+ replace-ext "0.0.1"
3100
+
3101
+ vue-eslint-parser@^2.0.2:
3102
+ version "2.0.3"
3103
+ resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1"
3104
+ integrity sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw==
3105
+ dependencies:
3106
+ debug "^3.1.0"
3107
+ eslint-scope "^3.7.1"
3108
+ eslint-visitor-keys "^1.0.0"
3109
+ espree "^3.5.2"
3110
+ esquery "^1.0.0"
3111
+ lodash "^4.17.4"
3112
+
3113
+ which-module@^1.0.0:
3114
+ version "1.0.0"
3115
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
3116
+ integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
3117
 
3118
  which-module@^2.0.0:
3119
  version "2.0.0"
3120
  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
3121
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
3122
 
3123
+ which@^1.2.14, which@^1.2.9:
3124
+ version "1.3.1"
3125
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
3126
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
3127
  dependencies:
3128
  isexe "^2.0.0"
3129
 
3130
  wordwrap@~1.0.0:
3131
  version "1.0.0"
3132
  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
3133
+ integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
3134
 
3135
  wrap-ansi@^2.0.0:
3136
  version "2.1.0"
3137
  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
3138
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
3139
  dependencies:
3140
  string-width "^1.0.1"
3141
  strip-ansi "^3.0.1"
3143
  wrappy@1:
3144
  version "1.0.2"
3145
  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
3146
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
3147
 
3148
  write@^0.2.1:
3149
  version "0.2.1"
3150
  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
3151
+ integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=
3152
  dependencies:
3153
  mkdirp "^0.5.1"
3154
 
3155
+ "xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.1:
3156
+ version "4.0.1"
3157
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
3158
+ integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
3159
+
3160
  y18n@^3.2.1:
3161
  version "3.2.1"
3162
  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
3163
+ integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
3164
 
3165
+ yallist@^3.0.2:
3166
+ version "3.0.2"
3167
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
3168
+ integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=
3169
+
3170
+ yargs-parser@^5.0.0:
3171
+ version "5.0.0"
3172
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
3173
+ integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=
3174
+ dependencies:
3175
+ camelcase "^3.0.0"
3176
 
3177
  yargs-parser@^8.0.0:
3178
  version "8.1.0"
3179
  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
3180
+ integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==
3181
  dependencies:
3182
  camelcase "^4.1.0"
3183
 
3184
  yargs@10.0.3:
3185
  version "10.0.3"
3186
  resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae"
3187
+ integrity sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==
3188
  dependencies:
3189
  cliui "^3.2.0"
3190
  decamelize "^1.1.1"
3198
  which-module "^2.0.0"
3199
  y18n "^3.2.1"
3200
  yargs-parser "^8.0.0"
3201
+
3202
+ yargs@^7.1.0:
3203
+ version "7.1.0"
3204
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
3205
+ integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=
3206
+ dependencies:
3207
+ camelcase "^3.0.0"
3208
+ cliui "^3.2.0"
3209
+ decamelize "^1.1.1"
3210
+ get-caller-file "^1.0.1"
3211
+ os-locale "^1.4.0"
3212
+ read-pkg-up "^1.0.1"
3213
+ require-directory "^2.1.1"
3214
+ require-main-filename "^1.0.1"
3215
+ set-blocking "^2.0.0"
3216
+ string-width "^1.0.2"
3217
+ which-module "^1.0.0"
3218
+ y18n "^3.2.1"
3219
+ yargs-parser "^5.0.0"
vendor/cbschuld/browser.php CHANGED
@@ -1 +1 @@
1
- Subproject commit 6bde9efb0b14a4917affe741500c29149419e491
1
+ Subproject commit f8655aedba32168ed34a6b89c7cceeb502fee3e4
vendor/composer/ClassLoader.php CHANGED
@@ -279,7 +279,7 @@ class ClassLoader
279
  */
280
  public function setApcuPrefix($apcuPrefix)
281
  {
282
- $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
283
  }
284
 
285
  /**
279
  */
280
  public function setApcuPrefix($apcuPrefix)
281
  {
282
+ $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
283
  }
284
 
285
  /**
vendor/composer/autoload_classmap.php CHANGED
@@ -6,4 +6,48 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'Boldgrid\\Library\\Util\\Load' => $vendorDir . '/boldgrid/library/src/Util/Load.php',
10
+ 'Boldgrid\\Library\\Util\\Option' => $vendorDir . '/boldgrid/library/src/Util/Option.php',
11
+ 'Boldgrid\\Library\\Util\\Plugin' => $vendorDir . '/boldgrid/library/src/Util/Plugin.php',
12
+ 'Boldgrid\\Library\\Util\\Registration' => $vendorDir . '/boldgrid/library/src/Util/Registration.php',
13
+ 'Boldgrid\\Library\\Util\\Registration\\Plugin' => $vendorDir . '/boldgrid/library/src/Util/Registration/Plugin.php',
14
+ 'Boldgrid\\Library\\Util\\Registration\\RegistrationInterface' => $vendorDir . '/boldgrid/library/src/Util/Registration/RegistrationInterface.php',
15
+ 'Boldgrid\\Library\\Util\\Registration\\Theme' => $vendorDir . '/boldgrid/library/src/Util/Registration/Theme.php',
16
+ 'Boldgrid\\Library\\Util\\Version' => $vendorDir . '/boldgrid/library/src/Util/Version.php',
17
+ 'Ifsnop\\Mysqldump\\CompressBzip2' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
18
+ 'Ifsnop\\Mysqldump\\CompressGzip' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
19
+ 'Ifsnop\\Mysqldump\\CompressManagerFactory' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
20
+ 'Ifsnop\\Mysqldump\\CompressMethod' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
21
+ 'Ifsnop\\Mysqldump\\CompressNone' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
22
+ 'Ifsnop\\Mysqldump\\Mysqldump' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
23
+ 'Ifsnop\\Mysqldump\\TypeAdapter' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
24
+ 'Ifsnop\\Mysqldump\\TypeAdapterDblib' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
25
+ 'Ifsnop\\Mysqldump\\TypeAdapterFactory' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
26
+ 'Ifsnop\\Mysqldump\\TypeAdapterMysql' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
27
+ 'Ifsnop\\Mysqldump\\TypeAdapterPgsql' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
28
+ 'Ifsnop\\Mysqldump\\TypeAdapterSqlite' => $vendorDir . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
29
+ 'phpseclib\\Crypt\\AES' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/AES.php',
30
+ 'phpseclib\\Crypt\\Base' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Base.php',
31
+ 'phpseclib\\Crypt\\Blowfish' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php',
32
+ 'phpseclib\\Crypt\\DES' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DES.php',
33
+ 'phpseclib\\Crypt\\Hash' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Hash.php',
34
+ 'phpseclib\\Crypt\\RC2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RC2.php',
35
+ 'phpseclib\\Crypt\\RC4' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RC4.php',
36
+ 'phpseclib\\Crypt\\RSA' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA.php',
37
+ 'phpseclib\\Crypt\\Random' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Random.php',
38
+ 'phpseclib\\Crypt\\Rijndael' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php',
39
+ 'phpseclib\\Crypt\\TripleDES' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php',
40
+ 'phpseclib\\Crypt\\Twofish' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php',
41
+ 'phpseclib\\File\\ANSI' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ANSI.php',
42
+ 'phpseclib\\File\\ASN1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1.php',
43
+ 'phpseclib\\File\\ASN1\\Element' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php',
44
+ 'phpseclib\\File\\X509' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/X509.php',
45
+ 'phpseclib\\Math\\BigInteger' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger.php',
46
+ 'phpseclib\\Net\\SCP' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Net/SCP.php',
47
+ 'phpseclib\\Net\\SFTP' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Net/SFTP.php',
48
+ 'phpseclib\\Net\\SFTP\\Stream' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php',
49
+ 'phpseclib\\Net\\SSH1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Net/SSH1.php',
50
+ 'phpseclib\\Net\\SSH2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Net/SSH2.php',
51
+ 'phpseclib\\System\\SSH\\Agent' => $vendorDir . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php',
52
+ 'phpseclib\\System\\SSH\\Agent\\Identity' => $vendorDir . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php',
53
  );
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit776c9eeda65acd21bdfcc1a2e8fa114e
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInit776c9eeda65acd21bdfcc1a2e8fa114e
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit776c9eeda65acd21bdfcc1a2e8fa114e', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit776c9eeda65acd21bdfcc1a2e8fa114e', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInit776c9eeda65acd21bdfcc1a2e8fa114e::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
@@ -48,19 +48,19 @@ class ComposerAutoloaderInit776c9eeda65acd21bdfcc1a2e8fa114e
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
- $includeFiles = Composer\Autoload\ComposerStaticInit776c9eeda65acd21bdfcc1a2e8fa114e::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
- composerRequire776c9eeda65acd21bdfcc1a2e8fa114e($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
- function composerRequire776c9eeda65acd21bdfcc1a2e8fa114e($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit26ac8f21c7de312bcc7b8f89cd106a20
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit26ac8f21c7de312bcc7b8f89cd106a20', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit26ac8f21c7de312bcc7b8f89cd106a20', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
+ call_user_func(\Composer\Autoload\ComposerStaticInit26ac8f21c7de312bcc7b8f89cd106a20::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
+ $includeFiles = Composer\Autoload\ComposerStaticInit26ac8f21c7de312bcc7b8f89cd106a20::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
+ composerRequire26ac8f21c7de312bcc7b8f89cd106a20($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
+ function composerRequire26ac8f21c7de312bcc7b8f89cd106a20($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit776c9eeda65acd21bdfcc1a2e8fa114e
8
  {
9
  public static $files = array (
10
  'f15d016d70663d5e96ccd2b863511eb8' => __DIR__ . '/..' . '/cbschuld/browser.php/lib/Browser.php',
@@ -41,11 +41,59 @@ class ComposerStaticInit776c9eeda65acd21bdfcc1a2e8fa114e
41
  ),
42
  );
43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  public static function getInitializer(ClassLoader $loader)
45
  {
46
  return \Closure::bind(function () use ($loader) {
47
- $loader->prefixLengthsPsr4 = ComposerStaticInit776c9eeda65acd21bdfcc1a2e8fa114e::$prefixLengthsPsr4;
48
- $loader->prefixDirsPsr4 = ComposerStaticInit776c9eeda65acd21bdfcc1a2e8fa114e::$prefixDirsPsr4;
 
49
 
50
  }, null, ClassLoader::class);
51
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit26ac8f21c7de312bcc7b8f89cd106a20
8
  {
9
  public static $files = array (
10
  'f15d016d70663d5e96ccd2b863511eb8' => __DIR__ . '/..' . '/cbschuld/browser.php/lib/Browser.php',
41
  ),
42
  );
43
 
44
+ public static $classMap = array (
45
+ 'Boldgrid\\Library\\Util\\Load' => __DIR__ . '/..' . '/boldgrid/library/src/Util/Load.php',
46
+ 'Boldgrid\\Library\\Util\\Option' => __DIR__ . '/..' . '/boldgrid/library/src/Util/Option.php',
47
+ 'Boldgrid\\Library\\Util\\Plugin' => __DIR__ . '/..' . '/boldgrid/library/src/Util/Plugin.php',
48
+ 'Boldgrid\\Library\\Util\\Registration' => __DIR__ . '/..' . '/boldgrid/library/src/Util/Registration.php',
49
+ 'Boldgrid\\Library\\Util\\Registration\\Plugin' => __DIR__ . '/..' . '/boldgrid/library/src/Util/Registration/Plugin.php',
50
+ 'Boldgrid\\Library\\Util\\Registration\\RegistrationInterface' => __DIR__ . '/..' . '/boldgrid/library/src/Util/Registration/RegistrationInterface.php',
51
+ 'Boldgrid\\Library\\Util\\Registration\\Theme' => __DIR__ . '/..' . '/boldgrid/library/src/Util/Registration/Theme.php',
52
+ 'Boldgrid\\Library\\Util\\Version' => __DIR__ . '/..' . '/boldgrid/library/src/Util/Version.php',
53
+ 'Ifsnop\\Mysqldump\\CompressBzip2' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
54
+ 'Ifsnop\\Mysqldump\\CompressGzip' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
55
+ 'Ifsnop\\Mysqldump\\CompressManagerFactory' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
56
+ 'Ifsnop\\Mysqldump\\CompressMethod' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
57
+ 'Ifsnop\\Mysqldump\\CompressNone' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
58
+ 'Ifsnop\\Mysqldump\\Mysqldump' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
59
+ 'Ifsnop\\Mysqldump\\TypeAdapter' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
60
+ 'Ifsnop\\Mysqldump\\TypeAdapterDblib' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
61
+ 'Ifsnop\\Mysqldump\\TypeAdapterFactory' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
62
+ 'Ifsnop\\Mysqldump\\TypeAdapterMysql' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
63
+ 'Ifsnop\\Mysqldump\\TypeAdapterPgsql' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
64
+ 'Ifsnop\\Mysqldump\\TypeAdapterSqlite' => __DIR__ . '/..' . '/ifsnop/mysqldump-php/src/Ifsnop/Mysqldump/Mysqldump.php',
65
+ 'phpseclib\\Crypt\\AES' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/AES.php',
66
+ 'phpseclib\\Crypt\\Base' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Base.php',
67
+ 'phpseclib\\Crypt\\Blowfish' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php',
68
+ 'phpseclib\\Crypt\\DES' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DES.php',
69
+ 'phpseclib\\Crypt\\Hash' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Hash.php',
70
+ 'phpseclib\\Crypt\\RC2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RC2.php',
71
+ 'phpseclib\\Crypt\\RC4' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RC4.php',
72
+ 'phpseclib\\Crypt\\RSA' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA.php',
73
+ 'phpseclib\\Crypt\\Random' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Random.php',
74
+ 'phpseclib\\Crypt\\Rijndael' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php',
75
+ 'phpseclib\\Crypt\\TripleDES' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php',
76
+ 'phpseclib\\Crypt\\Twofish' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php',
77
+ 'phpseclib\\File\\ANSI' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ANSI.php',
78
+ 'phpseclib\\File\\ASN1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1.php',
79
+ 'phpseclib\\File\\ASN1\\Element' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php',
80
+ 'phpseclib\\File\\X509' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/X509.php',
81
+ 'phpseclib\\Math\\BigInteger' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger.php',
82
+ 'phpseclib\\Net\\SCP' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Net/SCP.php',
83
+ 'phpseclib\\Net\\SFTP' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Net/SFTP.php',
84
+ 'phpseclib\\Net\\SFTP\\Stream' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php',
85
+ 'phpseclib\\Net\\SSH1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Net/SSH1.php',
86
+ 'phpseclib\\Net\\SSH2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Net/SSH2.php',
87
+ 'phpseclib\\System\\SSH\\Agent' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php',
88
+ 'phpseclib\\System\\SSH\\Agent\\Identity' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php',
89
+ );
90
+
91
  public static function getInitializer(ClassLoader $loader)
92
  {
93
  return \Closure::bind(function () use ($loader) {
94
+ $loader->prefixLengthsPsr4 = ComposerStaticInit26ac8f21c7de312bcc7b8f89cd106a20::$prefixLengthsPsr4;
95
+ $loader->prefixDirsPsr4 = ComposerStaticInit26ac8f21c7de312bcc7b8f89cd106a20::$prefixDirsPsr4;
96
+ $loader->classMap = ComposerStaticInit26ac8f21c7de312bcc7b8f89cd106a20::$classMap;
97
 
98
  }, null, ClassLoader::class);
99
  }
vendor/composer/installed.json CHANGED
@@ -1,20 +1,20 @@
1
  [
2
  {
3
  "name": "boldgrid/library",
4
- "version": "2.4.2",
5
- "version_normalized": "2.4.2.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/BoldGrid/library.git",
9
- "reference": "b07aeca037ad91a1f99af6cd618d91610089157e"
10
  },
11
  "dist": {
12
  "type": "zip",
13
- "url": "https://api.github.com/repos/BoldGrid/library/zipball/b07aeca037ad91a1f99af6cd618d91610089157e",
14
- "reference": "b07aeca037ad91a1f99af6cd618d91610089157e",
15
  "shasum": ""
16
  },
17
- "time": "2018-07-31T14:17:15+00:00",
18
  "type": "library",
19
  "installation-source": "dist",
20
  "autoload": {
@@ -57,15 +57,15 @@
57
  "source": {
58
  "type": "git",
59
  "url": "https://github.com/cbschuld/Browser.php.git",
60
- "reference": "6bde9efb0b14a4917affe741500c29149419e491"
61
  },
62
  "dist": {
63
  "type": "zip",
64
- "url": "https://api.github.com/repos/cbschuld/Browser.php/zipball/6bde9efb0b14a4917affe741500c29149419e491",
65
- "reference": "6bde9efb0b14a4917affe741500c29149419e491",
66
  "shasum": ""
67
  },
68
- "time": "2017-07-31T23:43:17+00:00",
69
  "type": "library",
70
  "extra": {
71
  "branch-alias": {
@@ -153,17 +153,17 @@
153
  },
154
  {
155
  "name": "phpseclib/phpseclib",
156
- "version": "2.0.11",
157
- "version_normalized": "2.0.11.0",
158
  "source": {
159
  "type": "git",
160
  "url": "https://github.com/phpseclib/phpseclib.git",
161
- "reference": "7053f06f91b3de78e143d430e55a8f7889efc08b"
162
  },
163
  "dist": {
164
  "type": "zip",
165
- "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/7053f06f91b3de78e143d430e55a8f7889efc08b",
166
- "reference": "7053f06f91b3de78e143d430e55a8f7889efc08b",
167
  "shasum": ""
168
  },
169
  "require": {
@@ -181,7 +181,7 @@
181
  "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
182
  "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
183
  },
184
- "time": "2018-04-15T16:55:05+00:00",
185
  "type": "library",
186
  "installation-source": "dist",
187
  "autoload": {
1
  [
2
  {
3
  "name": "boldgrid/library",
4
+ "version": "2.7.4",
5
+ "version_normalized": "2.7.4.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/BoldGrid/library.git",
9
+ "reference": "59aa87fcf2cab210e605b922e0e12c7d897d01d5"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/BoldGrid/library/zipball/59aa87fcf2cab210e605b922e0e12c7d897d01d5",
14
+ "reference": "59aa87fcf2cab210e605b922e0e12c7d897d01d5",
15
  "shasum": ""
16
  },
17
+ "time": "2018-12-04T19:41:29+00:00",
18
  "type": "library",
19
  "installation-source": "dist",
20
  "autoload": {
57
  "source": {
58
  "type": "git",
59
  "url": "https://github.com/cbschuld/Browser.php.git",
60
+ "reference": "f8655aedba32168ed34a6b89c7cceeb502fee3e4"
61
  },
62
  "dist": {
63
  "type": "zip",
64
+ "url": "https://api.github.com/repos/cbschuld/Browser.php/zipball/f8655aedba32168ed34a6b89c7cceeb502fee3e4",
65
+ "reference": "f8655aedba32168ed34a6b89c7cceeb502fee3e4",
66
  "shasum": ""
67
  },
68
+ "time": "2018-11-05T16:46:30+00:00",
69
  "type": "library",
70
  "extra": {
71
  "branch-alias": {
153
  },
154
  {
155
  "name": "phpseclib/phpseclib",
156
+ "version": "2.0.12",
157
+ "version_normalized": "2.0.12.0",
158
  "source": {
159
  "type": "git",
160
  "url": "https://github.com/phpseclib/phpseclib.git",
161
+ "reference": "8814dc7841db159daed0b32c2b08fb7e03c6afe7"
162
  },
163
  "dist": {
164
  "type": "zip",
165
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/8814dc7841db159daed0b32c2b08fb7e03c6afe7",
166
+ "reference": "8814dc7841db159daed0b32c2b08fb7e03c6afe7",
167
  "shasum": ""
168
  },
169
  "require": {
181
  "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
182
  "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
183
  },
184
+ "time": "2018-11-04T05:45:48+00:00",
185
  "type": "library",
186
  "installation-source": "dist",
187
  "autoload": {
vendor/phpseclib/phpseclib/README.md CHANGED
@@ -36,7 +36,7 @@ AES, Blowfish, Twofish, SSH-1, SSH-2, SFTP, and X.509
36
  * Composer compatible (PSR-0 autoloading)
37
  * Install using Composer: `composer require phpseclib/phpseclib ~1.0`
38
  * Install using PEAR: See [phpseclib PEAR Channel Documentation](http://phpseclib.sourceforge.net/pear.htm)
39
- * [Download 1.0.11 as ZIP](http://sourceforge.net/projects/phpseclib/files/phpseclib1.0.11.zip/download)
40
 
41
  ## Support
42
 
36
  * Composer compatible (PSR-0 autoloading)
37
  * Install using Composer: `composer require phpseclib/phpseclib ~1.0`
38
  * Install using PEAR: See [phpseclib PEAR Channel Documentation](http://phpseclib.sourceforge.net/pear.htm)
39
+ * [Download 1.0.12 as ZIP](http://sourceforge.net/projects/phpseclib/files/phpseclib1.0.12.zip/download)
40
 
41
  ## Support
42
 
vendor/phpseclib/phpseclib/appveyor.yml ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ build: false
2
+ shallow_clone: false
3
+ platform:
4
+ - x86
5
+ - x64
6
+ clone_folder: C:\projects\phpseclib
7
+
8
+ install:
9
+ - cinst -y OpenSSL.Light
10
+ - SET PATH=C:\Program Files\OpenSSL;%PATH%
11
+ - sc config wuauserv start= auto
12
+ - net start wuauserv
13
+ - cinst -y php --version 5.6.30
14
+ - cd c:\tools\php56
15
+ - copy php.ini-production php.ini
16
+ - echo date.timezone="UTC" >> php.ini
17
+ - echo extension_dir=ext >> php.ini
18
+ - echo extension=php_openssl.dll >> php.ini
19
+ - echo extension=php_gmp.dll >> php.ini
20
+ - cd C:\projects\phpseclib
21
+ - SET PATH=C:\tools\php56;%PATH%
22
+ - php.exe -r "readfile('http://getcomposer.org/installer');" | php.exe
23
+ - php.exe composer.phar install --prefer-source --no-interaction
24
+
25
+ test_script:
26
+ - cd C:\projects\phpseclib
27
+ - vendor\bin\phpunit.bat tests/Windows32Test.php
vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php CHANGED
@@ -649,10 +649,10 @@ abstract class Base
649
  case !function_exists('hash_algos'):
650
  case !in_array($hash, hash_algos()):
651
  $i = 1;
 
 
 
652
  while (strlen($key) < $dkLen) {
653
- $hmac = new Hash();
654
- $hmac->setHash($hash);
655
- $hmac->setKey($password);
656
  $f = $u = $hmac->hash($salt . pack('N', $i++));
657
  for ($j = 2; $j <= $count; ++$j) {
658
  $u = $hmac->hash($u);
649
  case !function_exists('hash_algos'):
650
  case !in_array($hash, hash_algos()):
651
  $i = 1;
652
+ $hmac = new Hash();
653
+ $hmac->setHash($hash);
654
+ $hmac->setKey($password);
655
  while (strlen($key) < $dkLen) {
 
 
 
656
  $f = $u = $hmac->hash($salt . pack('N', $i++));
657
  for ($j = 2; $j <= $count; ++$j) {
658
  $u = $hmac->hash($u);
vendor/phpseclib/phpseclib/phpseclib/Crypt/Hash.php CHANGED
@@ -112,6 +112,15 @@ class Hash
112
  */
113
  var $key = false;
114
 
 
 
 
 
 
 
 
 
 
115
  /**
116
  * Outer XOR (Internal HMAC)
117
  *
@@ -166,6 +175,43 @@ class Hash
166
  function setKey($key = false)
167
  {
168
  $this->key = $key;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
169
  }
170
 
171
  /**
@@ -215,6 +261,25 @@ class Hash
215
  $this->l = 64;
216
  }
217
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218
  switch ($hash) {
219
  case 'md2':
220
  $mode = CRYPT_HASH_MODE == self::MODE_HASH && in_array('md2', hash_algos()) ?
@@ -241,6 +306,7 @@ class Hash
241
  default:
242
  $this->hash = MHASH_SHA1;
243
  }
 
244
  return;
245
  case self::MODE_HASH:
246
  switch ($hash) {
@@ -257,35 +323,33 @@ class Hash
257
  default:
258
  $this->hash = 'sha1';
259
  }
 
260
  return;
261
  }
262
 
263
  switch ($hash) {
264
  case 'md2':
265
- $this->b = 16;
266
  $this->hash = array($this, '_md2');
267
  break;
268
  case 'md5':
269
- $this->b = 64;
270
  $this->hash = array($this, '_md5');
271
  break;
272
  case 'sha256':
273
- $this->b = 64;
274
  $this->hash = array($this, '_sha256');
275
  break;
276
  case 'sha384':
277
  case 'sha512':
278
- $this->b = 128;
279
  $this->hash = array($this, '_sha512');
280
  break;
281
  case 'sha1':
282
  default:
283
- $this->b = 64;
284
  $this->hash = array($this, '_sha1');
285
  }
286
 
287
  $this->ipad = str_repeat(chr(0x36), $this->b);
288
  $this->opad = str_repeat(chr(0x5C), $this->b);
 
 
289
  }
290
 
291
  /**
@@ -302,25 +366,19 @@ class Hash
302
  if (!empty($this->key) || is_string($this->key)) {
303
  switch ($mode) {
304
  case self::MODE_MHASH:
305
- $output = mhash($this->hash, $text, $this->key);
306
  break;
307
  case self::MODE_HASH:
308
- $output = hash_hmac($this->hash, $text, $this->key, true);
309
  break;
310
  case self::MODE_INTERNAL:
311
- /* "Applications that use keys longer than B bytes will first hash the key using H and then use the
312
- resultant L byte string as the actual key to HMAC."
313
-
314
- -- http://tools.ietf.org/html/rfc2104#section-2 */
315
- $key = strlen($this->key) > $this->b ? call_user_func($this->hash, $this->key) : $this->key;
316
-
317
- $key = str_pad($key, $this->b, chr(0)); // step 1
318
- $temp = $this->ipad ^ $key; // step 2
319
- $temp .= $text; // step 3
320
- $temp = call_user_func($this->hash, $temp); // step 4
321
- $output = $this->opad ^ $key; // step 5
322
- $output.= $temp; // step 6
323
- $output = call_user_func($this->hash, $output); // step 7
324
  }
325
  } else {
326
  switch ($mode) {
112
  */
113
  var $key = false;
114
 
115
+ /**
116
+ * Computed Key
117
+ *
118
+ * @see self::_computeKey()
119
+ * @var string
120
+ * @access private
121
+ */
122
+ var $computedKey = false;
123
+
124
  /**
125
  * Outer XOR (Internal HMAC)
126
  *
175
  function setKey($key = false)
176
  {
177
  $this->key = $key;
178
+ $this->_computeKey();
179
+ }
180
+
181
+ /**
182
+ * Pre-compute the key used by the HMAC
183
+ *
184
+ * Quoting http://tools.ietf.org/html/rfc2104#section-2, "Applications that use keys longer than B bytes
185
+ * will first hash the key using H and then use the resultant L byte string as the actual key to HMAC."
186
+ *
187
+ * As documented in https://www.reddit.com/r/PHP/comments/9nct2l/symfonypolyfill_hash_pbkdf2_correct_fix_for/
188
+ * when doing an HMAC multiple times it's faster to compute the hash once instead of computing it during
189
+ * every call
190
+ *
191
+ * @access private
192
+ */
193
+ function _computeKey()
194
+ {
195
+ if ($this->key === false) {
196
+ $this->computedKey = false;
197
+ return;
198
+ }
199
+
200
+ if (strlen($this->key) <= $this->b) {
201
+ $this->computedKey = $this->key;
202
+ return;
203
+ }
204
+
205
+ switch ($mode) {
206
+ case CRYPT_HASH_MODE_MHASH:
207
+ $this->computedKey = mhash($this->hash, $this->key);
208
+ break;
209
+ case CRYPT_HASH_MODE_HASH:
210
+ $this->computedKey = hash($this->hash, $this->key, true);
211
+ break;
212
+ case CRYPT_HASH_MODE_INTERNAL:
213
+ $this->computedKey = call_user_func($this->hash, $this->key);
214
+ }
215
  }
216
 
217
  /**
261
  $this->l = 64;
262
  }
263
 
264
+ switch ($hash) {
265
+ case 'md2-96':
266
+ case 'md2':
267
+ $this->b = 16;
268
+ case 'md5-96':
269
+ case 'sha1-96':
270
+ case 'sha224-96':
271
+ case 'sha256-96':
272
+ case 'md2':
273
+ case 'md5':
274
+ case 'sha1':
275
+ case 'sha224':
276
+ case 'sha256':
277
+ $this->b = 64;
278
+ break;
279
+ default:
280
+ $this->b = 128;
281
+ }
282
+
283
  switch ($hash) {
284
  case 'md2':
285
  $mode = CRYPT_HASH_MODE == self::MODE_HASH && in_array('md2', hash_algos()) ?
306
  default:
307
  $this->hash = MHASH_SHA1;
308
  }
309
+ $this->_computeKey();
310
  return;
311
  case self::MODE_HASH:
312
  switch ($hash) {
323
  default:
324
  $this->hash = 'sha1';
325
  }
326
+ $this->_computeKey();
327
  return;
328
  }
329
 
330
  switch ($hash) {
331
  case 'md2':
 
332
  $this->hash = array($this, '_md2');
333
  break;
334
  case 'md5':
 
335
  $this->hash = array($this, '_md5');
336
  break;
337
  case 'sha256':
 
338
  $this->hash = array($this, '_sha256');
339
  break;
340
  case 'sha384':
341
  case 'sha512':
 
342
  $this->hash = array($this, '_sha512');
343
  break;
344
  case 'sha1':
345
  default:
 
346
  $this->hash = array($this, '_sha1');
347
  }
348
 
349
  $this->ipad = str_repeat(chr(0x36), $this->b);
350
  $this->opad = str_repeat(chr(0x5C), $this->b);
351
+
352
+ $this->_computeKey();
353
  }
354
 
355
  /**
366
  if (!empty($this->key) || is_string($this->key)) {
367
  switch ($mode) {
368
  case self::MODE_MHASH:
369
+ $output = mhash($this->hash, $text, $this->computedKey);
370
  break;
371
  case self::MODE_HASH:
372
+ $output = hash_hmac($this->hash, $text, $this->computedKey, true);
373
  break;
374
  case self::MODE_INTERNAL:
375
+ $key = str_pad($this->computedKey, $this->b, chr(0)); // step 1
376
+ $temp = $this->ipad ^ $key; // step 2
377
+ $temp .= $text; // step 3
378
+ $temp = call_user_func($this->hash, $temp); // step 4
379
+ $output = $this->opad ^ $key; // step 5
380
+ $output.= $temp; // step 6
381
+ $output = call_user_func($this->hash, $output); // step 7
 
 
 
 
 
 
382
  }
383
  } else {
384
  switch ($mode) {
vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php CHANGED
@@ -1020,9 +1020,9 @@ class RSA
1020
  * @access private
1021
  * @see self::_convertPublicKey()
1022
  * @see self::_convertPrivateKey()
1023
- * @param string $key
1024
  * @param int $type
1025
- * @return array
1026
  */
1027
  function _parseKey($key, $type)
1028
  {
@@ -1505,8 +1505,9 @@ class RSA
1505
  * Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed)
1506
  *
1507
  * @access public
1508
- * @param string $key
1509
- * @param int $type optional
 
1510
  */
1511
  function loadKey($key, $type = false)
1512
  {
1020
  * @access private
1021
  * @see self::_convertPublicKey()
1022
  * @see self::_convertPrivateKey()
1023
+ * @param string|array $key
1024
  * @param int $type
1025
+ * @return array|bool
1026
  */
1027
  function _parseKey($key, $type)
1028
  {
1505
  * Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed)
1506
  *
1507
  * @access public
1508
+ * @param string|RSA|array $key
1509
+ * @param bool $type optional
1510
+ * @return bool
1511
  */
1512
  function loadKey($key, $type = false)
1513
  {
vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php CHANGED
@@ -308,6 +308,9 @@ class ASN1
308
  $remainingLength = $length;
309
  while ($remainingLength > 0) {
310
  $temp = $this->_decode_ber($content, $start, $content_pos);
 
 
 
311
  $length = $temp['length'];
312
  // end-of-content octets - see paragraph 8.1.5
313
  if (substr($content, $content_pos + $length, 2) == "\0\0") {
@@ -359,6 +362,9 @@ class ASN1
359
  $current['content'] = substr($content, $content_pos);
360
  } else {
361
  $temp = $this->_decode_ber($content, $start, $content_pos);
 
 
 
362
  $length-= (strlen($content) - $content_pos);
363
  $last = count($temp) - 1;
364
  for ($i = 0; $i < $last; $i++) {
@@ -383,6 +389,9 @@ class ASN1
383
  $length = 0;
384
  while (substr($content, $content_pos, 2) != "\0\0") {
385
  $temp = $this->_decode_ber($content, $length + $start, $content_pos);
 
 
 
386
  $content_pos += $temp['length'];
387
  // all subtags should be octet strings
388
  //if ($temp['type'] != self::TYPE_OCTET_STRING) {
@@ -415,6 +424,9 @@ class ASN1
415
  break 2;
416
  }
417
  $temp = $this->_decode_ber($content, $start + $offset, $content_pos);
 
 
 
418
  $content_pos += $temp['length'];
419
  $current['content'][] = $temp;
420
  $offset+= $temp['length'];
308
  $remainingLength = $length;
309
  while ($remainingLength > 0) {
310
  $temp = $this->_decode_ber($content, $start, $content_pos);
311
+ if ($temp === false) {
312
+ break;
313
+ }
314
  $length = $temp['length'];
315
  // end-of-content octets - see paragraph 8.1.5
316
  if (substr($content, $content_pos + $length, 2) == "\0\0") {
362
  $current['content'] = substr($content, $content_pos);
363
  } else {
364
  $temp = $this->_decode_ber($content, $start, $content_pos);
365
+ if ($temp === false) {
366
+ return false;
367
+ }
368
  $length-= (strlen($content) - $content_pos);
369
  $last = count($temp) - 1;
370
  for ($i = 0; $i < $last; $i++) {
389
  $length = 0;
390
  while (substr($content, $content_pos, 2) != "\0\0") {
391
  $temp = $this->_decode_ber($content, $length + $start, $content_pos);
392
+ if ($temp === false) {
393
+ return false;
394
+ }
395
  $content_pos += $temp['length'];
396
  // all subtags should be octet strings
397
  //if ($temp['type'] != self::TYPE_OCTET_STRING) {
424
  break 2;
425
  }
426
  $temp = $this->_decode_ber($content, $start + $offset, $content_pos);
427
+ if ($temp === false) {
428
+ return false;
429
+ }
430
  $content_pos += $temp['length'];
431
  $current['content'][] = $temp;
432
  $offset+= $temp['length'];
vendor/phpseclib/phpseclib/phpseclib/File/X509.php CHANGED
@@ -2092,7 +2092,7 @@ class X509
2092
  *
2093
  * If $date isn't defined it is assumed to be the current date.
2094
  *
2095
- * @param int $date optional
2096
  * @access public
2097
  */
2098
  function validateDate($date = null)
@@ -2102,7 +2102,7 @@ class X509
2102
  }
2103
 
2104
  if (!isset($date)) {
2105
- $date = new DateTime($date, new DateTimeZone(@date_default_timezone_get()));
2106
  }
2107
 
2108
  $notBefore = $this->currentCert['tbsCertificate']['validity']['notBefore'];
@@ -2111,6 +2111,14 @@ class X509
2111
  $notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter'];
2112
  $notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime'];
2113
 
 
 
 
 
 
 
 
 
2114
  switch (true) {
2115
  case $date < new DateTime($notBefore, new DateTimeZone(@date_default_timezone_get())):
2116
  case $date > new DateTime($notAfter, new DateTimeZone(@date_default_timezone_get())):
2092
  *
2093
  * If $date isn't defined it is assumed to be the current date.
2094
  *
2095
+ * @param \DateTime|string $date optional
2096
  * @access public
2097
  */
2098
  function validateDate($date = null)
2102
  }
2103
 
2104
  if (!isset($date)) {
2105
+ $date = new DateTime(null, new DateTimeZone(@date_default_timezone_get()));
2106
  }
2107
 
2108
  $notBefore = $this->currentCert['tbsCertificate']['validity']['notBefore'];
2111
  $notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter'];
2112
  $notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime'];
2113
 
2114
+ switch (true) {
2115
+ case is_string($date):
2116
+ $date = new DateTime($date, new DateTimeZone(@date_default_timezone_get()));
2117
+ default:
2118
+ $notBefore = new DateTime($notBefore, new DateTimeZone(@date_default_timezone_get()));
2119
+ $notAfter = new DateTime($notAfter, new DateTimeZone(@date_default_timezone_get()));
2120
+ }
2121
+
2122
  switch (true) {
2123
  case $date < new DateTime($notBefore, new DateTimeZone(@date_default_timezone_get())):
2124
  case $date > new DateTime($notAfter, new DateTimeZone(@date_default_timezone_get())):
vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php CHANGED
@@ -45,7 +45,6 @@
45
  * @author Jim Wigginton <terrafrost@php.net>
46
  * @copyright 2006 Jim Wigginton
47
  * @license http://www.opensource.org/licenses/mit-license.html MIT License
48
- * @link http://pear.php.net/package/Math_BigInteger
49
  */
50
 
51
  namespace phpseclib\Math;
45
  * @author Jim Wigginton <terrafrost@php.net>
46
  * @copyright 2006 Jim Wigginton
47
  * @license http://www.opensource.org/licenses/mit-license.html MIT License
 
48
  */
49
 
50
  namespace phpseclib\Math;
vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php CHANGED
@@ -864,7 +864,17 @@ class SFTP extends SSH2
864
  unset($files[$key]);
865
  continue;
866
  }
867
- if ($key != '.' && $key != '..' && is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key)))) {
 
 
 
 
 
 
 
 
 
 
868
  $depth++;
869
  $files[$key] = $this->rawlist($dir . '/' . $key, true);
870
  $depth--;
864
  unset($files[$key]);
865
  continue;
866
  }
867
+ $is_directory = false;
868
+ if ($key != '.' && $key != '..') {
869
+ if ($this->use_stat_cache) {
870
+ $is_directory = is_array($this->_query_stat_cache($this->_realpath($dir . '/' . $key)));
871
+ } else {
872
+ $stat = $this->lstat($dir . '/' . $key);
873
+ $is_directory = $stat && $stat['type'] === NET_SFTP_TYPE_DIRECTORY;
874
+ }
875
+ }
876
+
877
+ if ($is_directory) {
878
  $depth++;
879
  $files[$key] = $this->rawlist($dir . '/' . $key, true);
880
  $depth--;
vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php CHANGED
@@ -918,6 +918,22 @@ class SSH2
918
  */
919
  var $binary_packet_buffer = false;
920
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
921
  /**
922
  * Default Constructor.
923
  *
@@ -1124,11 +1140,12 @@ class SSH2
1124
  }
1125
  $elapsed = microtime(true) - $start;
1126
 
1127
- $this->curTimeout-= $elapsed;
1128
-
1129
- if ($this->curTimeout <= 0) {
1130
- $this->is_timeout = true;
1131
- return false;
 
1132
  }
1133
  }
1134
 
@@ -1193,6 +1210,7 @@ class SSH2
1193
  }
1194
 
1195
  if (feof($this->fsock)) {
 
1196
  user_error('Connection closed by server');
1197
  return false;
1198
  }
@@ -1206,7 +1224,7 @@ class SSH2
1206
 
1207
  $this->server_identifier = trim($temp, "\r\n");
1208
  if (strlen($extra)) {
1209
- $this->errors[] = utf8_decode($data);
1210
  }
1211
 
1212
  if (version_compare($matches[3], '1.99', '<')) {
@@ -1221,6 +1239,7 @@ class SSH2
1221
  if (!$this->send_kex_first) {
1222
  $response = $this->_get_binary_packet();
1223
  if ($response === false) {
 
1224
  user_error('Connection closed by server');
1225
  return false;
1226
  }
@@ -1309,6 +1328,8 @@ class SSH2
1309
  }
1310
 
1311
  $server_host_key_algorithms = array(
 
 
1312
  'ssh-rsa', // RECOMMENDED sign Raw RSA Key
1313
  'ssh-dss' // REQUIRED sign Raw DSS Key
1314
  );
@@ -1459,6 +1480,7 @@ class SSH2
1459
 
1460
  $kexinit_payload_server = $this->_get_binary_packet();
1461
  if ($kexinit_payload_server === false) {
 
1462
  user_error('Connection closed by server');
1463
  return false;
1464
  }
@@ -1595,6 +1617,7 @@ class SSH2
1595
 
1596
  $response = $this->_get_binary_packet();
1597
  if ($response === false) {
 
1598
  user_error('Connection closed by server');
1599
  return false;
1600
  }
@@ -1687,12 +1710,14 @@ class SSH2
1687
  $data = pack('CNa*', $clientKexInitMessage, strlen($eBytes), $eBytes);
1688
 
1689
  if (!$this->_send_binary_packet($data)) {
 
1690
  user_error('Connection closed by server');
1691
  return false;
1692
  }
1693
 
1694
  $response = $this->_get_binary_packet();
1695
  if ($response === false) {
 
1696
  user_error('Connection closed by server');
1697
  return false;
1698
  }
@@ -1782,7 +1807,18 @@ class SSH2
1782
  return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
1783
  }
1784
 
1785
- if ($public_key_format != $server_host_key_algorithm || $this->signature_format != $server_host_key_algorithm) {
 
 
 
 
 
 
 
 
 
 
 
1786
  user_error('Server Host Key Algorithm Mismatch');
1787
  return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
1788
  }
@@ -1799,6 +1835,7 @@ class SSH2
1799
  $response = $this->_get_binary_packet();
1800
 
1801
  if ($response === false) {
 
1802
  user_error('Connection closed by server');
1803
  return false;
1804
  }
@@ -1820,7 +1857,7 @@ class SSH2
1820
  $this->encrypt = $this->_encryption_algorithm_to_crypt_instance($encrypt);
1821
  if ($this->encrypt) {
1822
  if ($this->crypto_engine) {
1823
- $this->encrypt->setEngine($this->crypto_engine);
1824
  }
1825
  if ($this->encrypt->block_size) {
1826
  $this->encrypt_block_size = $this->encrypt->block_size;
@@ -1844,7 +1881,7 @@ class SSH2
1844
  $this->decrypt = $this->_encryption_algorithm_to_crypt_instance($decrypt);
1845
  if ($this->decrypt) {
1846
  if ($this->crypto_engine) {
1847
- $this->decrypt->setEngine($this->crypto_engine);
1848
  }
1849
  if ($this->decrypt->block_size) {
1850
  $this->decrypt_block_size = $this->decrypt->block_size;
@@ -2095,6 +2132,7 @@ class SSH2
2095
  function login($username)
2096
  {
2097
  $args = func_get_args();
 
2098
  return call_user_func_array(array(&$this, '_login'), $args);
2099
  }
2100
 
@@ -2166,6 +2204,7 @@ class SSH2
2166
  }
2167
  return $this->_login_helper($username, $password);
2168
  }
 
2169
  user_error('Connection closed by server');
2170
  return false;
2171
  }
@@ -2218,6 +2257,7 @@ class SSH2
2218
 
2219
  $response = $this->_get_binary_packet();
2220
  if ($response === false) {
 
2221
  user_error('Connection closed by server');
2222
  return false;
2223
  }
@@ -2276,6 +2316,7 @@ class SSH2
2276
 
2277
  $response = $this->_get_binary_packet();
2278
  if ($response === false) {
 
2279
  user_error('Connection closed by server');
2280
  return false;
2281
  }
@@ -2294,7 +2335,7 @@ class SSH2
2294
  return false;
2295
  }
2296
  extract(unpack('Nlength', $this->_string_shift($response, 4)));
2297
- $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . utf8_decode($this->_string_shift($response, $length));
2298
  return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER);
2299
  case NET_SSH2_MSG_USERAUTH_FAILURE:
2300
  // can we use keyboard-interactive authentication? if not then either the login is bad or the server employees
@@ -2376,6 +2417,7 @@ class SSH2
2376
  } else {
2377
  $orig = $response = $this->_get_binary_packet();
2378
  if ($response === false) {
 
2379
  user_error('Connection closed by server');
2380
  return false;
2381
  }
@@ -2564,6 +2606,7 @@ class SSH2
2564
 
2565
  $response = $this->_get_binary_packet();
2566
  if ($response === false) {
 
2567
  user_error('Connection closed by server');
2568
  return false;
2569
  }
@@ -2595,8 +2638,23 @@ class SSH2
2595
 
2596
  $packet = $part1 . chr(1) . $part2;
2597
  $privatekey->setSignatureMode(RSA::SIGNATURE_PKCS1);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2598
  $signature = $privatekey->sign(pack('Na*a*', strlen($this->session_id), $this->session_id, $packet));
2599
- $signature = pack('Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($signature), $signature);
2600
  $packet.= pack('Na*', strlen($signature), $signature);
2601
 
2602
  if (!$this->_send_binary_packet($packet)) {
@@ -2605,6 +2663,7 @@ class SSH2
2605
 
2606
  $response = $this->_get_binary_packet();
2607
  if ($response === false) {
 
2608
  user_error('Connection closed by server');
2609
  return false;
2610
  }
@@ -2731,6 +2790,7 @@ class SSH2
2731
 
2732
  $response = $this->_get_binary_packet();
2733
  if ($response === false) {
 
2734
  user_error('Connection closed by server');
2735
  return false;
2736
  }
@@ -2870,6 +2930,7 @@ class SSH2
2870
 
2871
  $response = $this->_get_binary_packet();
2872
  if ($response === false) {
 
2873
  user_error('Connection closed by server');
2874
  return false;
2875
  }
@@ -3184,6 +3245,66 @@ class SSH2
3184
  return (bool) ($this->bitmap & self::MASK_LOGIN);
3185
  }
3186
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3187
  /**
3188
  * Resets a connection for re-use
3189
  *
@@ -3322,7 +3443,7 @@ class SSH2
3322
  return false;
3323
  }
3324
  extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8)));
3325
- $this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . utf8_decode($this->_string_shift($payload, $length));
3326
  $this->bitmap = 0;
3327
  return false;
3328
  case NET_SSH2_MSG_IGNORE:
@@ -3334,7 +3455,7 @@ class SSH2
3334
  return false;
3335
  }
3336
  extract(unpack('Nlength', $this->_string_shift($payload, 4)));
3337
- $this->errors[] = 'SSH_MSG_DEBUG: ' . utf8_decode($this->_string_shift($payload, $length));
3338
  $payload = $this->_get_binary_packet($skip_channel_filter);
3339
  break;
3340
  case NET_SSH2_MSG_UNIMPLEMENTED:
@@ -3357,7 +3478,7 @@ class SSH2
3357
  return false;
3358
  }
3359
  extract(unpack('Nlength', $this->_string_shift($payload, 4)));
3360
- $this->banner_message = utf8_decode($this->_string_shift($payload, $length));
3361
  $payload = $this->_get_binary_packet();
3362
  }
3363
 
@@ -3584,6 +3705,7 @@ class SSH2
3584
 
3585
  $response = $this->_get_binary_packet(true);
3586
  if ($response === false) {
 
3587
  user_error('Connection closed by server');
3588
  return false;
3589
  }
@@ -3592,10 +3714,6 @@ class SSH2
3592
  if ($client_channel == -1 && $response === true) {
3593
  return true;
3594
  }
3595
- if (!strlen($response)) {
3596
- return '';
3597
- }
3598
-
3599
  if (!strlen($response)) {
3600
  return false;
3601
  }
@@ -4480,6 +4598,8 @@ class SSH2
4480
 
4481
  break;
4482
  case 'ssh-rsa':
 
 
4483
  if (strlen($server_public_host_key) < 4) {
4484
  return false;
4485
  }
@@ -4502,8 +4622,21 @@ class SSH2
4502
  $signature = $this->_string_shift($signature, $temp['length']);
4503
 
4504
  $rsa = new RSA();
 
 
 
 
 
 
 
 
 
 
 
 
4505
  $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
4506
  $rsa->loadKey(array('e' => $e, 'n' => $n), RSA::PUBLIC_FORMAT_RAW);
 
4507
  if (!$rsa->verify($this->exchange_hash, $signature)) {
4508
  user_error('Bad server signature');
4509
  return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE);
@@ -4530,7 +4663,30 @@ class SSH2
4530
  $s = $s->modPow($e, $n);
4531
  $s = $s->toBytes();
4532
 
4533
- $h = pack('N4H*', 0x00302130, 0x0906052B, 0x0E03021A, 0x05000414, sha1($this->exchange_hash));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4534
  $h = chr(0x01) . str_repeat(chr(0xFF), $nLength - 2 - strlen($h)) . $h;
4535
 
4536
  if ($s != $h) {
918
  */
919
  var $binary_packet_buffer = false;
920
 
921
+ /**
922
+ * Preferred Signature Format
923
+ *
924
+ * @var string|false
925
+ * @access private
926
+ */
927
+ var $preferred_signature_format = false;
928
+
929
+ /**
930
+ * Authentication Credentials
931
+ *
932
+ * @var array
933
+ * @access private
934
+ */
935
+ var $auth = array();
936
+
937
  /**
938
  * Default Constructor.
939
  *
1140
  }
1141
  $elapsed = microtime(true) - $start;
1142
 
1143
+ if ($this->curTimeout) {
1144
+ $this->curTimeout-= $elapsed;
1145
+ if ($this->curTimeout < 0) {
1146
+ $this->is_timeout = true;
1147
+ return false;
1148
+ }
1149
  }
1150
  }
1151
 
1210
  }
1211
 
1212
  if (feof($this->fsock)) {
1213
+ $this->bitmap = 0;
1214
  user_error('Connection closed by server');
1215
  return false;
1216
  }
1224
 
1225
  $this->server_identifier = trim($temp, "\r\n");
1226
  if (strlen($extra)) {
1227
+ $this->errors[] = $data;
1228
  }
1229
 
1230
  if (version_compare($matches[3], '1.99', '<')) {
1239
  if (!$this->send_kex_first) {
1240
  $response = $this->_get_binary_packet();
1241
  if ($response === false) {
1242
+ $this->bitmap = 0;
1243
  user_error('Connection closed by server');
1244
  return false;
1245
  }
1328
  }
1329
 
1330
  $server_host_key_algorithms = array(
1331
+ 'rsa-sha2-256', // RFC 8332
1332
+ 'rsa-sha2-512', // RFC 8332
1333
  'ssh-rsa', // RECOMMENDED sign Raw RSA Key
1334
  'ssh-dss' // REQUIRED sign Raw DSS Key
1335
  );
1480
 
1481
  $kexinit_payload_server = $this->_get_binary_packet();
1482
  if ($kexinit_payload_server === false) {
1483
+ $this->bitmap = 0;
1484
  user_error('Connection closed by server');
1485
  return false;
1486
  }
1617
 
1618
  $response = $this->_get_binary_packet();
1619
  if ($response === false) {
1620
+ $this->bitmap = 0;
1621
  user_error('Connection closed by server');
1622
  return false;
1623
  }
1710
  $data = pack('CNa*', $clientKexInitMessage, strlen($eBytes), $eBytes);
1711
 
1712
  if (!$this->_send_binary_packet($data)) {
1713
+ $this->bitmap = 0;
1714
  user_error('Connection closed by server');
1715
  return false;
1716
  }
1717
 
1718
  $response = $this->_get_binary_packet();
1719
  if ($response === false) {
1720
+ $this->bitmap = 0;
1721
  user_error('Connection closed by server');
1722
  return false;
1723
  }
1807
  return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
1808
  }
1809
 
1810
+ switch ($server_host_key_algorithm) {
1811
+ case 'ssh-dss':
1812
+ $expected_key_format = 'ssh-dss';
1813
+ break;
1814
+ //case 'rsa-sha2-256':
1815
+ //case 'rsa-sha2-512':
1816
+ //case 'ssh-rsa':
1817
+ default:
1818
+ $expected_key_format = 'ssh-rsa';
1819
+ }
1820
+
1821
+ if ($public_key_format != $expected_key_format || $this->signature_format != $server_host_key_algorithm) {
1822
  user_error('Server Host Key Algorithm Mismatch');
1823
  return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED);
1824
  }
1835
  $response = $this->_get_binary_packet();
1836
 
1837
  if ($response === false) {
1838
+ $this->bitmap = 0;
1839
  user_error('Connection closed by server');
1840
  return false;
1841
  }
1857
  $this->encrypt = $this->_encryption_algorithm_to_crypt_instance($encrypt);
1858
  if ($this->encrypt) {
1859
  if ($this->crypto_engine) {
1860
+ $this->encrypt->setPreferredEngine($this->crypto_engine);
1861
  }
1862
  if ($this->encrypt->block_size) {
1863
  $this->encrypt_block_size = $this->encrypt->block_size;
1881
  $this->decrypt = $this->_encryption_algorithm_to_crypt_instance($decrypt);
1882
  if ($this->decrypt) {
1883
  if ($this->crypto_engine) {
1884
+ $this->decrypt->setPreferredEngine($this->crypto_engine);
1885
  }
1886
  if ($this->decrypt->block_size) {
1887
  $this->decrypt_block_size = $this->decrypt->block_size;
2132
  function login($username)
2133
  {
2134
  $args = func_get_args();
2135
+ $this->auth[] = $args;
2136
  return call_user_func_array(array(&$this, '_login'), $args);
2137
  }
2138
 
2204
  }
2205
  return $this->_login_helper($username, $password);
2206
  }
2207
+ $this->bitmap = 0;
2208
  user_error('Connection closed by server');
2209
  return false;
2210
  }
2257
 
2258
  $response = $this->_get_binary_packet();
2259
  if ($response === false) {
2260
+ $this->bitmap = 0;
2261
  user_error('Connection closed by server');
2262
  return false;
2263
  }
2316
 
2317
  $response = $this->_get_binary_packet();
2318
  if ($response === false) {
2319
+ $this->bitmap = 0;
2320
  user_error('Connection closed by server');
2321
  return false;
2322
  }
2335
  return false;
2336
  }
2337
  extract(unpack('Nlength', $this->_string_shift($response, 4)));
2338
+ $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . $this->_string_shift($response, $length);
2339
  return $this->_disconnect(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER);
2340
  case NET_SSH2_MSG_USERAUTH_FAILURE:
2341
  // can we use keyboard-interactive authentication? if not then either the login is bad or the server employees
2417
  } else {
2418
  $orig = $response = $this->_get_binary_packet();
2419
  if ($response === false) {
2420
+ $this->bitmap = 0;
2421
  user_error('Connection closed by server');
2422
  return false;
2423
  }
2606
 
2607
  $response = $this->_get_binary_packet();
2608
  if ($response === false) {
2609
+ $this->bitmap = 0;
2610
  user_error('Connection closed by server');
2611
  return false;
2612
  }
2638
 
2639
  $packet = $part1 . chr(1) . $part2;
2640
  $privatekey->setSignatureMode(RSA::SIGNATURE_PKCS1);
2641
+ switch ($this->signature_format) {
2642
+ case 'rsa-sha2-512':
2643
+ $hash = 'sha512';
2644
+ $type = 'rsa-sha2-512';
2645
+ break;
2646
+ case 'rsa-sha2-256':
2647
+ $hash = 'sha256';
2648
+ $type = 'rsa-sha2-256';
2649
+ break;
2650
+ //case 'ssh-rsa':
2651
+ default:
2652
+ $hash = 'sha1';
2653
+ $type = 'ssh-rsa';
2654
+ }
2655
+ $privatekey->setHash($hash);
2656
  $signature = $privatekey->sign(pack('Na*a*', strlen($this->session_id), $this->session_id, $packet));
2657
+ $signature = pack('Na*Na*', strlen($type), $type, strlen($signature), $signature);
2658
  $packet.= pack('Na*', strlen($signature), $signature);
2659
 
2660
  if (!$this->_send_binary_packet($packet)) {
2663
 
2664
  $response = $this->_get_binary_packet();
2665
  if ($response === false) {
2666
+ $this->bitmap = 0;
2667
  user_error('Connection closed by server');
2668
  return false;
2669
  }
2790
 
2791
  $response = $this->_get_binary_packet();
2792
  if ($response === false) {
2793
+ $this->bitmap = 0;
2794
  user_error('Connection closed by server');
2795
  return false;
2796
  }
2930
 
2931
  $response = $this->_get_binary_packet();
2932
  if ($response === false) {
2933
+ $this->bitmap = 0;
2934
  user_error('Connection closed by server');
2935
  return false;
2936
  }
3245
  return (bool) ($this->bitmap & self::MASK_LOGIN);
3246
  }
3247
 
3248
+ /**
3249
+ * Pings a server connection, or tries to reconnect if the connection has gone down
3250
+ *
3251
+ * Inspired by http://php.net/manual/en/mysqli.ping.php
3252
+ *
3253
+ * @return bool
3254
+ * @access public
3255
+ */
3256
+ function ping()
3257
+ {
3258
+ if (!$this->isAuthenticated()) {
3259
+ return false;
3260
+ }
3261
+
3262
+ $this->window_size_server_to_client[NET_SSH2_CHANNEL_KEEP_ALIVE] = $this->window_size;
3263
+ $packet_size = 0x4000;
3264
+ $packet = pack(
3265
+ 'CNa*N3',
3266
+ NET_SSH2_MSG_CHANNEL_OPEN,
3267
+ strlen('session'),
3268
+ 'session',
3269
+ NET_SSH2_CHANNEL_KEEP_ALIVE,
3270
+ $this->window_size_server_to_client[NET_SSH2_CHANNEL_KEEP_ALIVE],
3271
+ $packet_size
3272
+ );
3273
+
3274
+ if (!@$this->_send_binary_packet($packet)) {
3275
+ return $this->_reconnect();
3276
+ }
3277
+
3278
+ $this->channel_status[NET_SSH2_CHANNEL_KEEP_ALIVE] = NET_SSH2_MSG_CHANNEL_OPEN;
3279
+
3280
+ $response = @$this->_get_channel_packet(NET_SSH2_CHANNEL_KEEP_ALIVE);
3281
+ if ($response !== false) {
3282
+ $this->_close_channel(NET_SSH2_CHANNEL_KEEP_ALIVE);
3283
+ return true;
3284
+ }
3285
+
3286
+ return $this->_reconnect();
3287
+ }
3288
+
3289
+ /**
3290
+ * In situ reconnect method
3291
+ *
3292
+ * @return boolean
3293
+ * @access private
3294
+ */
3295
+ function _reconnect()
3296
+ {
3297
+ $this->_reset_connection(NET_SSH2_DISCONNECT_CONNECTION_LOST);
3298
+ $this->retry_connect = true;
3299
+ if (!$this->_connect()) {
3300
+ return false;
3301
+ }
3302
+ foreach ($this->auth as $auth) {
3303
+ $result = call_user_func_array(array(&$this, 'parent::login'), $auth);
3304
+ }
3305
+ return $result;
3306
+ }
3307
+
3308
  /**
3309
  * Resets a connection for re-use
3310
  *
3443
  return false;
3444
  }
3445
  extract(unpack('Nreason_code/Nlength', $this->_string_shift($payload, 8)));
3446
+ $this->errors[] = 'SSH_MSG_DISCONNECT: ' . $this->disconnect_reasons[$reason_code] . "\r\n" . $this->_string_shift($payload, $length);
3447
  $this->bitmap = 0;
3448
  return false;
3449
  case NET_SSH2_MSG_IGNORE:
3455
  return false;
3456
  }
3457
  extract(unpack('Nlength', $this->_string_shift($payload, 4)));
3458
+ $this->errors[] = 'SSH_MSG_DEBUG: ' . $this->_string_shift($payload, $length);
3459
  $payload = $this->_get_binary_packet($skip_channel_filter);
3460
  break;
3461
  case NET_SSH2_MSG_UNIMPLEMENTED:
3478
  return false;
3479
  }
3480
  extract(unpack('Nlength', $this->_string_shift($payload, 4)));
3481
+ $this->banner_message = $this->_string_shift($payload, $length);
3482
  $payload = $this->_get_binary_packet();
3483
  }
3484
 
3705
 
3706
  $response = $this->_get_binary_packet(true);
3707
  if ($response === false) {
3708
+ $this->bitmap = 0;
3709
  user_error('Connection closed by server');
3710
  return false;
3711
  }
3714
  if ($client_channel == -1 && $response === true) {
3715
  return true;
3716
  }
 
 
 
 
3717
  if (!strlen($response)) {
3718
  return false;
3719
  }
4598
 
4599
  break;
4600
  case 'ssh-rsa':
4601
+ case 'rsa-sha2-256':
4602
+ case 'rsa-sha2-512':
4603
  if (strlen($server_public_host_key) < 4) {
4604
  return false;
4605
  }
4622
  $signature = $this->_string_shift($signature, $temp['length']);
4623
 
4624
  $rsa = new RSA();
4625
+ switch ($this->signature_format) {
4626
+ case 'rsa-sha2-512':
4627
+ $hash = 'sha512';
4628
+ break;
4629
+ case 'rsa-sha2-256':
4630
+ $hash = 'sha256';
4631
+ break;
4632
+ //case 'ssh-rsa':
4633
+ default:
4634
+ $hash = 'sha1';
4635
+ }
4636
+ $rsa->setHash($hash);
4637
  $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
4638
  $rsa->loadKey(array('e' => $e, 'n' => $n), RSA::PUBLIC_FORMAT_RAW);
4639
+
4640
  if (!$rsa->verify($this->exchange_hash, $signature)) {
4641
  user_error('Bad server signature');
4642
  return $this->_disconnect(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE);
4663
  $s = $s->modPow($e, $n);
4664
  $s = $s->toBytes();
4665
 
4666
+ switch ($this->signature_format) {
4667
+ case 'rsa-sha2-512':
4668
+ $hash = 'sha512';
4669
+ break;
4670
+ case 'rsa-sha2-256':
4671
+ $hash = 'sha256';
4672
+ break;
4673
+ //case 'ssh-rsa':
4674
+ default:
4675
+ $hash = 'sha1';
4676
+ }
4677
+ $hashObj = new Hash($hash);
4678
+ switch ($this->signature_format) {
4679
+ case 'rsa-sha2-512':
4680
+ $h = pack('N5a*', 0x00305130, 0x0D060960, 0x86480165, 0x03040203, 0x05000440, $hashObj->hash($this->exchange_hash));
4681
+ break;
4682
+ case 'rsa-sha2-256':
4683
+ $h = pack('N5a*', 0x00303130, 0x0D060960, 0x86480165, 0x03040201, 0x05000420, $hashObj->hash($this->exchange_hash));
4684
+ break;
4685
+ //case 'ssh-rsa':
4686
+ default:
4687
+ $hash = 'sha1';
4688
+ $h = pack('N4a*', 0x00302130, 0x0906052B, 0x0E03021A, 0x05000414, $hashObj->hash($this->exchange_hash));
4689
+ }
4690
  $h = chr(0x01) . str_repeat(chr(0xFF), $nLength - 2 - strlen($h)) . $h;
4691
 
4692
  if ($s != $h) {
vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php CHANGED
@@ -155,12 +155,14 @@ class Agent
155
  $packet = pack('NC', 1, self::SSH_AGENTC_REQUEST_IDENTITIES);
156
  if (strlen($packet) != fputs($this->fsock, $packet)) {
157
  user_error('Connection closed while requesting identities');
 
158
  }
159
 
160
  $length = current(unpack('N', fread($this->fsock, 4)));
161
  $type = ord(fread($this->fsock, 1));
162
  if ($type != self::SSH_AGENT_IDENTITIES_ANSWER) {
163
  user_error('Unable to request identities');
 
164
  }
165
 
166
  $identities = array();
155
  $packet = pack('NC', 1, self::SSH_AGENTC_REQUEST_IDENTITIES);
156
  if (strlen($packet) != fputs($this->fsock, $packet)) {
157
  user_error('Connection closed while requesting identities');
158
+ return array();
159
  }
160
 
161
  $length = current(unpack('N', fread($this->fsock, 4)));
162
  $type = ord(fread($this->fsock, 1));
163
  if ($type != self::SSH_AGENT_IDENTITIES_ANSWER) {
164
  user_error('Unable to request identities');
165
+ return array();
166
  }
167
 
168
  $identities = array();
vendor/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php CHANGED
@@ -126,6 +126,18 @@ class Identity
126
  {
127
  }
128
 
 
 
 
 
 
 
 
 
 
 
 
 
129
  /**
130
  * Create a signature
131
  *
126
  {
127
  }
128
 
129
+ /**
130
+ * Set Hash
131
+ *
132
+ * ssh-agent doesn't support using hashes for RSA other than SHA1
133
+ *
134
+ * @param string $hash
135
+ * @access public
136
+ */
137
+ function setHash($hash)
138
+ {
139
+ }
140
+
141
  /**
142
  * Create a signature
143
  *