commit a8cee257ab496810e8ad02b21a1d5714202b4f7b
Author: Assos Assos <assos+forge@centrale-marseille.fr>
Date:   Wed Oct 9 23:39:47 2019 +0200

    Weekly update of contrib modules

diff --git a/drupal7/sites/all/modules/captcha/captcha.admin.inc b/drupal7/sites/all/modules/captcha/captcha.admin.inc
index ac7dc8ab..99b19e17 100644
--- a/drupal7/sites/all/modules/captcha/captcha.admin.inc
+++ b/drupal7/sites/all/modules/captcha/captcha.admin.inc
@@ -44,6 +44,11 @@ function captcha_admin_settings() {
   // Use JavaScript for some added usability on admin form.
   drupal_add_js(drupal_get_path('module', 'captcha') . '/captcha.js');
 
+  // Load languages for configurable texts.
+  if (module_exists('locale')) {
+    $langs = locale_language_list();
+  }
+
   // Configuration of which forms to protect, with what challenge.
   $form['captcha_form_protection'] = array(
     '#type' => 'fieldset',
@@ -150,6 +155,32 @@ function captcha_admin_settings() {
     '#submit' => array('captcha_clear_captcha_placement_cache_submit'),
   );
 
+  // Textfield(s) for editing the error message.
+  if (module_exists('locale')) {
+    $form['captcha_error_messages'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Error message'),
+      '#description' => t('Message displayed when the CAPTCHA has not been solved. An empty entry will reset the error message to default.'),
+    );
+    foreach ($langs as $lang_code => $lang_name) {
+      $form['captcha_error_messages']['captcha_error_message_' . $lang_code] = array(
+        '#type' => 'textfield',
+        '#title' => t('For language %lang_name (code %lang_code)', array('%lang_name' => $lang_name, '%lang_code' => $lang_code)),
+        '#default_value' => _captcha_get_error_message($lang_code),
+        '#maxlength' => 256,
+      );
+    }
+  }
+  else {
+    $form['captcha_error_message'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Error message'),
+      '#description' => t('Message displayed when the CAPTCHA has not been solved. An empty entry will reset the error message to default.'),
+      '#default_value' => _captcha_get_error_message(),
+      '#maxlength' => 256,
+    );
+  }
+
   // Configuration option for adding a CAPTCHA description.
   $form['captcha_add_captcha_description'] = array(
     '#type' => 'checkbox',
@@ -159,7 +190,6 @@ function captcha_admin_settings() {
   );
   // Textfield(s) for the CAPTCHA description.
   if (module_exists('locale')) {
-    $langs = locale_language_list();
     $form['captcha_descriptions'] = array(
       '#type' => 'fieldset',
       '#title' => t('CAPTCHA description'),
@@ -286,6 +316,11 @@ function captcha_admin_settings_submit($form, &$form_state) {
   variable_set('captcha_default_challenge', $form_state['values']['captcha_default_challenge']);
   variable_set('captcha_default_challenge_on_nonlisted_forms', $form_state['values']['captcha_default_challenge_on_nonlisted_forms']);
 
+  // Load languages for configurable texts.
+  if (module_exists('locale')) {
+    $langs = locale_language_list();
+  }
+
   // Process CAPTCHA points.
   if (isset($form_state['values']['captcha_form_id_overview']['captcha_captcha_points'])) {
     // Load existing data.
@@ -320,11 +355,34 @@ function captcha_admin_settings_submit($form, &$form_state) {
     drupal_set_message(t('Added CAPTCHA point.'), 'status');
   }
 
+  // Error message.
+  if (module_exists('locale')) {
+    foreach ($langs as $lang_code => $lang_name) {
+      $description = $form_state['values']['captcha_error_message_' . $lang_code];
+      if ($description) {
+        variable_set('captcha_error_message_' . $lang_code, $description);
+      }
+      else {
+        variable_del('captcha_error_message_' . $lang_code);
+        drupal_set_message(t('Reset of error message for language %language.', array('%language' => $lang_name)), 'status');
+      }
+    }
+  }
+  else {
+    $description = $form_state['values']['captcha_error_message'];
+    if ($description) {
+      variable_set('captcha_error_message', $description);
+    }
+    else {
+      variable_del('captcha_error_message');
+      drupal_set_message(t('Reset of error message.'), 'status');
+    }
+  }
+
   // CAPTCHA description stuff.
   variable_set('captcha_add_captcha_description', $form_state['values']['captcha_add_captcha_description']);
   // Save (or reset) the CAPTCHA descriptions.
   if (module_exists('locale')) {
-    $langs = locale_language_list();
     foreach ($langs as $lang_code => $lang_name) {
       $description = $form_state['values']["captcha_description_$lang_code"];
       if ($description) {
diff --git a/drupal7/sites/all/modules/captcha/captcha.inc b/drupal7/sites/all/modules/captcha/captcha.inc
index 4dc6f824..36d84188 100644
--- a/drupal7/sites/all/modules/captcha/captcha.inc
+++ b/drupal7/sites/all/modules/captcha/captcha.inc
@@ -266,6 +266,35 @@ function _captcha_get_description($lang_code = NULL) {
   return filter_xss_admin($description);
 }
 
+/**
+ * Get the error message as configured on the general CAPTCHA settings page.
+ *
+ * If the locale module is enabled, the error message will be returned
+ * for the current language the page is rendered for. This language
+ * can optionally been overridden with the $lang_code argument.
+ *
+ * @param string|null $lang_code
+ *   an optional language code to get the description for.
+ *
+ * @return string
+ *   String with (localized) error message.
+ */
+function _captcha_get_error_message($lang_code = NULL) {
+  // If no language code is given: use the language of the current page.
+  global $language;
+  $lang_code = isset($lang_code) ? $lang_code : $language->language;
+  // The hardcoded but localizable default.
+  $default = t('The answer you entered for the CAPTCHA was not correct.', array(), array('langcode' => $lang_code));
+  // Look up the configured error message or fall back on the (localized) default.
+  if (module_exists('locale')) {
+    $message = variable_get('captcha_error_message_' . $lang_code, $default);
+  }
+  else {
+    $message = variable_get('captcha_error_message', $default);
+  }
+  return filter_xss_admin($message);
+}
+
 /**
  * Parse or interpret the given captcha_type.
  *
@@ -340,7 +369,7 @@ function _captcha_get_captcha_placement($form_id, $form) {
       if (count($buttons)) {
         // Pick first button.
         // TODO: make this more sofisticated? Use cases needed.
-        $placement = $buttons[0];
+        $placement = (isset($buttons[count($buttons) - 1])) ? $buttons[count($buttons) - 1] : $buttons[0];
       }
       else {
         // Use NULL when no buttons were found.
diff --git a/drupal7/sites/all/modules/captcha/captcha.info b/drupal7/sites/all/modules/captcha/captcha.info
index 5764f7d3..59eade10 100644
--- a/drupal7/sites/all/modules/captcha/captcha.info
+++ b/drupal7/sites/all/modules/captcha/captcha.info
@@ -10,9 +10,8 @@ files[] = captcha.admin.inc
 files[] = captcha.install
 files[] = captcha.test
 
-; Information added by Drupal.org packaging script on 2017-09-06
-version = "7.x-1.5"
+; Information added by Drupal.org packaging script on 2019-10-05
+version = "7.x-1.6"
 core = "7.x"
 project = "captcha"
-datestamp = "1504724060"
-
+datestamp = "1570300087"
diff --git a/drupal7/sites/all/modules/captcha/captcha.module b/drupal7/sites/all/modules/captcha/captcha.module
index 50cbe154..610b6a3f 100644
--- a/drupal7/sites/all/modules/captcha/captcha.module
+++ b/drupal7/sites/all/modules/captcha/captcha.module
@@ -184,12 +184,6 @@ function captcha_element_process($element, &$form_state, $complete_form) {
   // Add JavaScript for general CAPTCHA functionality.
   drupal_add_js(drupal_get_path('module', 'captcha') . '/captcha.js');
 
-  // Prevent caching of the page with CAPTCHA elements.
-  // This needs to be done even if the CAPTCHA will be ommitted later:
-  // other untrusted users should not get a cached page when
-  // the current untrusted user can skip the current CAPTCHA.
-  drupal_page_is_cacheable(FALSE);
-
   // Get the form ID of the form we are currently processing (which is not
   // necessary the same form that is submitted (if any).
   $this_form_id = $complete_form['form_id']['#value'];
@@ -296,6 +290,19 @@ function captcha_element_process($element, &$form_state, $complete_form) {
     // Store the solution in the #captcha_info array.
     $element['#captcha_info']['solution'] = $captcha['solution'];
 
+    // Store if this captcha type is cacheable:
+    // A cacheable captcha must not depend on the sid or solution, but be
+    // independent - like for example recaptcha.
+    $element['#captcha_info']['cacheable'] = !empty($captcha['cacheable']);
+
+    if (!empty($element['#captcha_info']['cacheable']) && drupal_page_is_cacheable()) {
+      // This is only used to avoid the re-use message.
+      $element['captcha_cacheable'] = array(
+        '#type' => 'hidden',
+        '#value' => TRUE,
+      );
+    }
+
     // Make sure we can use a top level form value $form_state['values']['captcha_response'], even if the form has #tree=true.
     $element['#tree'] = FALSE;
 
@@ -360,6 +367,12 @@ function captcha_captcha_default_points_alter(&$items) {
  */
 function theme_captcha($variables) {
   $element = $variables['element'];
+
+  if (empty($element['#description']) && !empty($element['#attributes']['title'])) {
+    // Fix for Bootstrap-based themes.
+    $element['#description'] = $element['#attributes']['title'];
+  }
+
   if (!empty($element['#description']) && isset($element['captcha_widgets'])) {
     $fieldset = array(
       '#type' => 'fieldset',
@@ -383,6 +396,7 @@ function theme_captcha($variables) {
  */
 function captcha_form_alter(&$form, &$form_state, $form_id) {
 
+  // If user has skip CAPTCHA permission, doesn't do anything.
   if (!user_access('skip CAPTCHA')) {
     // Visitor does not have permission to skip CAPTCHAs.
     module_load_include('inc', 'captcha');
@@ -406,7 +420,11 @@ function captcha_form_alter(&$form, &$form_state, $form_id) {
       _captcha_insert_captcha_element($form, $captcha_placement, $captcha_element);
     }
   }
-  elseif (
+
+  // If user has access to administer CAPTCHA settings and
+  // 'Add CAPTCHA administration links to forms' is enabled, display the
+  // helper widget.
+  if (
     variable_get('captcha_administration_mode', FALSE)
     && user_access('administer CAPTCHA settings')
     && (arg(0) != 'admin' || variable_get('captcha_allow_on_admin_pages', FALSE))
@@ -423,6 +441,7 @@ function captcha_form_alter(&$form, &$form_state, $form_id) {
       '#collapsed' => TRUE,
       '#attributes' => array('class' => array('captcha-admin-links')),
     );
+
     if ($captcha_point !== NULL && $captcha_point->captcha_type) {
       $captcha_element['#title'] = t('CAPTCHA: challenge "@type" enabled', array('@type' => $captcha_point->captcha_type));
       $captcha_element['#description'] = t('Untrusted users will see a CAPTCHA here (<a href="@settings">general CAPTCHA settings</a>).',
@@ -438,6 +457,7 @@ function captcha_form_alter(&$form, &$form_state, $form_id) {
           '@disable' => url("admin/config/people/captcha/captcha/captcha_point/$form_id/disable", array('query' => drupal_get_destination())),
         )),
       );
+
       // Add an example challenge with solution.
       // This does not work with the reCAPTCHA and Egglue challenges as
       // discussed in http://drupal.org/node/487032 and
@@ -464,12 +484,11 @@ function captcha_form_alter(&$form, &$form_state, $form_id) {
       $captcha_element['add_captcha'] = array(
         '#markup' => l(t('Place a CAPTCHA here for untrusted users.'), "admin/config/people/captcha/captcha/captcha_point/$form_id", array('query' => drupal_get_destination()))
       );
-
     }
+
     // Get placement in form and insert in form.
     $captcha_placement = _captcha_get_captcha_placement($form_id, $form);
     _captcha_insert_captcha_element($form, $captcha_placement, $captcha_element);
-
   }
 
   // Add a warning about caching on the Perfomance settings page.
@@ -637,7 +656,9 @@ function _captcha_get_posted_captcha_info($element, $form_state, $this_form_id)
         )->fetchField();
 
         if ($expected_captcha_token !== $posted_captcha_token) {
-          drupal_set_message(t('CAPTCHA session reuse attack detected.'), 'error');
+          if (empty($form_state['input']['captcha_cacheable'])) {
+            drupal_set_message(t('CAPTCHA session reuse attack detected.'), 'error');
+          }
           // Invalidate the CAPTCHA session.
           $posted_captcha_sid = NULL;
         }
@@ -731,7 +752,7 @@ function captcha_validate($element, &$form_state) {
         ->expression('attempts', 'attempts + 1')
         ->execute();
       // Set form error.
-      form_set_error('captcha_response', t('The answer you entered for the CAPTCHA was not correct.'));
+      form_set_error('captcha_response', _captcha_get_error_message());
       // Update wrong response counter.
       if (variable_get('captcha_enable_stats', FALSE)) {
         variable_set('captcha_wrong_response_counter', variable_get('captcha_wrong_response_counter', 0) + 1);
@@ -777,6 +798,20 @@ function captcha_pre_render_process($element) {
   // when the challenge is solved correctely on preview, the form is still
   // not completely submitted, but the CAPTCHA can be skipped.
   if (_captcha_required_for_user($captcha_sid, $form_id) || $element['#captcha_admin_mode'] || $element['#captcha_always']) {
+    // Prevent caching of the page with CAPTCHA elements.
+    // This needs to be done only if the captcha is actually displayed.
+    // The captcha display will be skipped only in 2 cases:
+    //   - The captcha sid has a solution already.
+    //   - The user has a SESSION.
+    // For a page to be cacheable, the user MUST not have a SESSION.
+    // For a SID to be solved already, it must be a POST request as else
+    // a new unsolved SID is generated.
+    // Therefore it is fine to disable the cache at this late stage here.
+    if (empty($captcha_info['cacheable'])) {
+      // The cache is only disabled if the captcha itself is not cacheable.
+      drupal_page_is_cacheable(FALSE);
+    }
+
     // Update captcha_sessions table: store the solution of the generated CAPTCHA.
     _captcha_update_captcha_session($captcha_sid, $captcha_info['solution']);
 
diff --git a/drupal7/sites/all/modules/captcha/captcha.test b/drupal7/sites/all/modules/captcha/captcha.test
index 41b6ab0c..21213cc6 100644
--- a/drupal7/sites/all/modules/captcha/captcha.test
+++ b/drupal7/sites/all/modules/captcha/captcha.test
@@ -417,7 +417,6 @@ class CaptchaAdminTestCase extends CaptchaBaseWebTestCase {
   function testAdminAccess() {
     $this->drupalLogin($this->normal_user);
     $this->drupalGet(self::CAPTCHA_ADMIN_PATH);
-    file_put_contents('tmp.simpletest.html', $this->drupalGetContent());
     $this->assertText(t('Access denied'), 'Normal users should not be able to access the CAPTCHA admin pages', 'CAPTCHA');
 
     $this->drupalLogin($this->admin_user);
diff --git a/drupal7/sites/all/modules/captcha/image_captcha/image_captcha.info b/drupal7/sites/all/modules/captcha/image_captcha/image_captcha.info
index fdd2f6df..93ed966c 100644
--- a/drupal7/sites/all/modules/captcha/image_captcha/image_captcha.info
+++ b/drupal7/sites/all/modules/captcha/image_captcha/image_captcha.info
@@ -11,9 +11,8 @@ files[] = image_captcha.admin.inc
 files[] = image_captcha.user.inc
 files[] = image_captcha.test
 
-; Information added by Drupal.org packaging script on 2017-09-06
-version = "7.x-1.5"
+; Information added by Drupal.org packaging script on 2019-10-05
+version = "7.x-1.6"
 core = "7.x"
 project = "captcha"
-datestamp = "1504724060"
-
+datestamp = "1570300087"
diff --git a/drupal7/sites/all/modules/captcha/image_captcha/image_captcha.user.inc b/drupal7/sites/all/modules/captcha/image_captcha/image_captcha.user.inc
index 18b81dda..340b8d68 100644
--- a/drupal7/sites/all/modules/captcha/image_captcha/image_captcha.user.inc
+++ b/drupal7/sites/all/modules/captcha/image_captcha/image_captcha.user.inc
@@ -31,7 +31,7 @@ function image_captcha_image() {
   if ($code !== FALSE) {
     // Seed the random generators used for image CAPTCHA distortion based on session and code
     // to counter attacks that re-request the same challenge and pick the simplest image one or combine info.
-    $seed = hexdec(substr(md5($captcha_sid . $code), 0, 8));
+    $seed = (int) hexdec(substr(md5($captcha_sid . $code), 0, 8));
     srand($seed);
     mt_srand($seed);
     // Generate the image.
diff --git a/drupal7/sites/all/modules/dhtml_menu/LICENSE.txt b/drupal7/sites/all/modules/dhtml_menu/LICENSE.txt
index 2c095c8d..d159169d 100644
--- a/drupal7/sites/all/modules/dhtml_menu/LICENSE.txt
+++ b/drupal7/sites/all/modules/dhtml_menu/LICENSE.txt
@@ -1,274 +1,339 @@
-GNU GENERAL PUBLIC LICENSE
-
-              Version 2, June 1991
-
-Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave,
-Cambridge, MA 02139, USA. Everyone is permitted to copy and distribute
-verbatim copies of this license document, but changing it is not allowed.
-
-                  Preamble
-
-The licenses for most software are designed to take away your freedom to
-share and change it. By contrast, the GNU General Public License is
-intended to guarantee your freedom to share and change free software--to
-make sure the software is free for all its users. This General Public License
-applies to most of the Free Software Foundation's software and to any other
-program whose authors commit to using it. (Some other Free Software
-Foundation software is covered by the GNU Library General Public License
-instead.) You can apply it to your programs, too.
-
-When we speak of free software, we are referring to freedom, not price. Our
-General Public Licenses are designed to make sure that you have the
-freedom to distribute copies of free software (and charge for this service if
-you wish), that you receive source code or can get it if you want it, that you
-can change the software or use pieces of it in new free programs; and that
-you know you can do these things.
-
-To protect your rights, we need to make restrictions that forbid anyone to
-deny you these rights or to ask you to surrender the rights. These restrictions
-translate to certain responsibilities for you if you distribute copies of the
-software, or if you modify it.
-
-For example, if you distribute copies of such a program, whether gratis or for
-a fee, you must give the recipients all the rights that you have. You must make
-sure that they, too, receive or can get the source code. And you must show
-them these terms so they know their rights.
-
-We protect your rights with two steps: (1) copyright the software, and (2)
-offer you this license which gives you legal permission to copy, distribute
-and/or modify the software.
-
-Also, for each author's protection and ours, we want to make certain that
-everyone understands that there is no warranty for this free software. If the
-software is modified by someone else and passed on, we want its recipients
-to know that what they have is not the original, so that any problems
-introduced by others will not reflect on the original authors' reputations.
-
-Finally, any free program is threatened constantly by software patents. We
-wish to avoid the danger that redistributors of a free program will individually
-obtain patent licenses, in effect making the program proprietary. To prevent
-this, we have made it clear that any patent must be licensed for everyone's
-free use or not licensed at all.
-
-The precise terms and conditions for copying, distribution and modification
-follow.
-
-           GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND
-               MODIFICATION
-
-0. This License applies to any program or other work which contains a notice
-placed by the copyright holder saying it may be distributed under the terms
-of this General Public License. The "Program", below, refers to any such
-program or work, and a "work based on the Program" means either the
-Program or any derivative work under copyright law: that is to say, a work
-containing the Program or a portion of it, either verbatim or with
-modifications and/or translated into another language. (Hereinafter, translation
-is included without limitation in the term "modification".) Each licensee is
-addressed as "you".
-
-Activities other than copying, distribution and modification are not covered
-by this License; they are outside its scope. The act of running the Program is
-not restricted, and the output from the Program is covered only if its contents
-constitute a work based on the Program (independent of having been made
-by running the Program). Whether that is true depends on what the Program
-does.
-
-1. You may copy and distribute verbatim copies of the Program's source
-code as you receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice and
-disclaimer of warranty; keep intact all the notices that refer to this License
-and to the absence of any warranty; and give any other recipients of the
-Program a copy of this License along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and you
-may at your option offer warranty protection in exchange for a fee.
-
-2. You may modify your copy or copies of the Program or any portion of it,
-thus forming a work based on the Program, and copy and distribute such
-modifications or work under the terms of Section 1 above, provided that you
-also meet all of these conditions:
-
-a) You must cause the modified files to carry prominent notices stating that
-you changed the files and the date of any change.
-
-b) You must cause any work that you distribute or publish, that in whole or in
-part contains or is derived from the Program or any part thereof, to be
-licensed as a whole at no charge to all third parties under the terms of this
-License.
-
-c) If the modified program normally reads commands interactively when run,
-you must cause it, when started running for such interactive use in the most
-ordinary way, to print or display an announcement including an appropriate
-copyright notice and a notice that there is no warranty (or else, saying that
-you provide a warranty) and that users may redistribute the program under
-these conditions, and telling the user how to view a copy of this License.
-(Exception: if the Program itself is interactive but does not normally print such
-an announcement, your work based on the Program is not required to print
-an announcement.)
-
-These requirements apply to the modified work as a whole. If identifiable
-sections of that work are not derived from the Program, and can be
-reasonably considered independent and separate works in themselves, then
-this License, and its terms, do not apply to those sections when you distribute
-them as separate works. But when you distribute the same sections as part
-of a whole which is a work based on the Program, the distribution of the
-whole must be on the terms of this License, whose permissions for other
-licensees extend to the entire whole, and thus to each and every part
-regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest your rights to
-work written entirely by you; rather, the intent is to exercise the right to
-control the distribution of derivative or collective works based on the
-Program.
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
 
 In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of a
-storage or distribution medium does not bring the other work under the scope
-of this License.
-
-3. You may copy and distribute the Program (or a work based on it, under
-Section 2) in object code or executable form under the terms of Sections 1
-and 2 above provided that you also do one of the following:
-
-a) Accompany it with the complete corresponding machine-readable source
-code, which must be distributed under the terms of Sections 1 and 2 above
-on a medium customarily used for software interchange; or,
-
-b) Accompany it with a written offer, valid for at least three years, to give
-any third party, for a charge no more than your cost of physically performing
-source distribution, a complete machine-readable copy of the corresponding
-source code, to be distributed under the terms of Sections 1 and 2 above on
-a medium customarily used for software interchange; or,
-
-c) Accompany it with the information you received as to the offer to distribute
-corresponding source code. (This alternative is allowed only for
-noncommercial distribution and only if you received the program in object
-code or executable form with such an offer, in accord with Subsection b
-above.)
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
 
 The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source code
-means all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation and
-installation of the executable. However, as a special exception, the source
-code distributed need not include anything that is normally distributed (in
-either source or binary form) with the major components (compiler, kernel,
-and so on) of the operating system on which the executable runs, unless that
-component itself accompanies the executable.
-
-If distribution of executable or object code is made by offering access to
-copy from a designated place, then offering equivalent access to copy the
-source code from the same place counts as distribution of the source code,
-even though third parties are not compelled to copy the source along with the
-object code.
-
-4. You may not copy, modify, sublicense, or distribute the Program except as
-expressly provided under this License. Any attempt otherwise to copy,
-modify, sublicense or distribute the Program is void, and will automatically
-terminate your rights under this License. However, parties who have received
-copies, or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-5. You are not required to accept this License, since you have not signed it.
-However, nothing else grants you permission to modify or distribute the
-Program or its derivative works. These actions are prohibited by law if you
-do not accept this License. Therefore, by modifying or distributing the
-Program (or any work based on the Program), you indicate your acceptance
-of this License to do so, and all its terms and conditions for copying,
-distributing or modifying the Program or works based on it.
-
-6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the original
-licensor to copy, distribute or modify the Program subject to these terms and
-conditions. You may not impose any further restrictions on the recipients'
-exercise of the rights granted herein. You are not responsible for enforcing
-compliance by third parties to this License.
-
-7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues), conditions
-are imposed on you (whether by court order, agreement or otherwise) that
-contradict the conditions of this License, they do not excuse you from the
-conditions of this License. If you cannot distribute so as to satisfy
-simultaneously your obligations under this License and any other pertinent
-obligations, then as a consequence you may not distribute the Program at all.
-For example, if a patent license would not permit royalty-free redistribution
-of the Program by all those who receive copies directly or indirectly through
-you, then the only way you could satisfy both it and this License would be to
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
 refrain entirely from distribution of the Program.
 
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply and
-the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any patents or
-other property right claims or to contest validity of any such claims; this
-section has the sole purpose of protecting the integrity of the free software
-distribution system, which is implemented by public license practices. Many
-people have made generous contributions to the wide range of software
-distributed through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing to
-distribute software through any other system and a licensee cannot impose
-that choice.
-
-This section is intended to make thoroughly clear what is believed to be a
-consequence of the rest of this License.
-
-8. If the distribution and/or use of the Program is restricted in certain
-countries either by patents or by copyrighted interfaces, the original copyright
-holder who places the Program under this License may add an explicit
-geographical distribution limitation excluding those countries, so that
-distribution is permitted only in or among countries not thus excluded. In such
-case, this License incorporates the limitation as if written in the body of this
-License.
-
-9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will be
-similar in spirit to the present version, but may differ in detail to address new
-problems or concerns.
-
-Each version is given a distinguishing version number. If the Program specifies
-a version number of this License which applies to it and "any later version",
-you have the option of following the terms and conditions either of that
-version or of any later version published by the Free Software Foundation. If
-the Program does not specify a version number of this License, you may
-choose any version ever published by the Free Software Foundation.
-
-10. If you wish to incorporate parts of the Program into other free programs
-whose distribution conditions are different, write to the author to ask for
-permission. For software which is copyrighted by the Free Software
-Foundation, write to the Free Software Foundation; we sometimes make
-exceptions for this. Our decision will be guided by the two goals of
-preserving the free status of all derivatives of our free software and of
-promoting the sharing and reuse of software generally.
-
-               NO WARRANTY
-
-11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE,
-THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT
-PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
-STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
-WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
-PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR
-AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR
-ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
-LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
-SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
-ARISING OUT OF THE USE OR INABILITY TO USE THE
-PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA
-OR DATA BEING RENDERED INACCURATE OR LOSSES
-SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
-PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN
-IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.
-
-          END OF TERMS AND CONDITIONS
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.admin.inc b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.admin.inc
index 5aa20e72..7f648c10 100644
--- a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.admin.inc
+++ b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.admin.inc
@@ -1,5 +1,4 @@
 <?php
-// $Id: dhtml_menu.admin.inc,v 1.22 2010/11/09 21:24:51 arancaytar Exp $
 
 
 /**
@@ -94,7 +93,7 @@ function dhtml_menu_settings($form, &$form_state) {
     '#title' => t('When a new page is loaded'),
     '#options' => array(
       'remember' => t('Remember which items were expanded on the last page.'),
-      0 => t('Expand only the currently active path.'),
+      '' => t('Expand only the currently active path.'),
     ),
     '#default_value' => $settings['effects']['remember'],
   );
@@ -123,6 +122,16 @@ function dhtml_menu_settings($form, &$form_state) {
     '#default_value' => $settings['filter']['list'],
     '#description' => t('DHTML will be used for all menus by default, but can be switched off for specific menus.'),
   );
+  
+  if (module_exists('menu_block')) {
+    $options['filter']['menu_block'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Menu Blocks'),
+      '#options' => _dhtml_menu_blocks(),
+      '#default_value' => $settings['filter']['menu_block'],
+      '#description' => t('You may enable/disable specific menu blocks here, as long as the corresponding menu is enabled.'),
+    );
+  }
 
   $options['#tree'] = TRUE;
   $form['dhtml_menu_settings'] = $options;
@@ -160,3 +169,19 @@ function _dhtml_menu_menus() {
   return $menu_names;
 }
 
+/**
+ * Build an option list for all menu blocks in the system.
+ * Only applicable if the Menu Block module is installed.
+ */
+function _dhtml_menu_blocks() {
+  if (function_exists('menu_block_block_info')) {
+    $block_names = array();
+    $blocks = menu_block_block_info();
+    foreach ($blocks as $delta => $block) {
+      $block_names['menu_block_' . $delta] = $block['info'];
+    }
+    
+    return $block_names;
+  }
+  return NULL;
+}
\ No newline at end of file
diff --git a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.css b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.css
index 4c15df0d..8df7759d 100644
--- a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.css
+++ b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.css
@@ -1,4 +1,3 @@
-/* $Id: dhtml_menu.css,v 1.9 2009/11/07 00:57:37 arancaytar Exp $ */
 
 /**
  * @file dhtml_menu.css
@@ -44,10 +43,13 @@ a.dhtml-menu-icon {
 /*
  * Provide large and visible folder icons for easy clicking.
  */
-li.dhtml-folder.expanded {
-  list-style-image: url("images/folder-open-white.png") !important;
+li.dhtml-folder {
+    list-style: none;
 }
-li.dhtml-folder.collapsed {
-  list-style-image: url("images/folder-closed-white.png") !important;
+li.dhtml-folder.expanded .dhtml-menu-icon {
+    background-image: url("images/folder-open-white.png");
+}
+li.dhtml-folder.collapsed .dhtml-menu-icon {
+    background-image: url("images/folder-closed-white.png");
 }
 
diff --git a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.info b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.info
index 0601b197..c7b922f5 100644
--- a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.info
+++ b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.info
@@ -1,4 +1,3 @@
-; $Id: dhtml_menu.info,v 1.10 2009/11/12 21:47:59 arancaytar Exp $
 name = DHTML Menu
 description = Opens menus dynamically to reduce page reloads.
 core = 7.x
@@ -8,10 +7,17 @@ files[] = dhtml_menu.install
 files[] = dhtml_menu.admin.inc
 files[] = dhtml_menu.theme.inc
 
+configure = admin/config/user-interface/dhtml_menu
 
-; Information added by drupal.org packaging script on 2010-11-09
-version = "7.x-1.0-beta1"
+; Information added by drupal.org packaging script on 2013-09-30
+version = "7.x-1.x-dev"
 core = "7.x"
 project = "dhtml_menu"
-datestamp = "1289339443"
+datestamp = "1380569449"
 
+
+; Information added by Drupal.org packaging script on 2019-10-07
+version = "7.x-1.0-beta2"
+core = "7.x"
+project = "dhtml_menu"
+datestamp = "1570442588"
diff --git a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.install b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.install
index a6be9bad..0b3487cd 100644
--- a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.install
+++ b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.install
@@ -1,5 +1,4 @@
 <?php
-// $Id: dhtml_menu.install,v 1.17 2010/08/16 10:39:57 arancaytar Exp $
 
 
 /**
@@ -183,3 +182,14 @@ function dhtml_menu_update_7104() {
   variable_del('dhtml_menu_theme');
 }
 
+/**
+ * #7105: Ensure that 'Filter type' is set.
+ */
+function dhtml_menu_update_7105() {
+  $settings = variable_get('dhtml_menu_settings');
+  if (!isset($settings['filter']['type'])) {
+    $settings['filter']['type'] = 'blacklist';
+    variable_set('dhtml_menu_settings', $settings);
+  }
+}
+
diff --git a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.js b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.js
index 807c8620..20b80fa6 100644
--- a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.js
+++ b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.js
@@ -1,4 +1,3 @@
-// $Id: dhtml_menu.js,v 1.49 2009/11/12 21:47:59 arancaytar Exp $
 
 
 
@@ -16,7 +15,7 @@ Drupal.dhtmlMenu.animation = {show:{}, hide:{}, count:0};
  * Initialize the module's JS functions
  */
 Drupal.behaviors.dhtmlMenu = {
-  attach: function() {
+  attach: function(context, settings) {
     var settings = Drupal.settings.dhtmlMenu;
 
     // Initialize the animation effects from the settings.
@@ -29,13 +28,13 @@ Drupal.behaviors.dhtmlMenu = {
     }
 
     // Sanitize by removing "expanded" on menus already marked "collapsed".
-    $('li.dhtml-menu.collapsed.expanded').removeClass('expanded');
+    $('li.dhtml-menu.collapsed.expanded', context).removeClass('expanded');
 
     /* Relevant only on "open-only" menus:
      * The links of expanded items should be marked for emphasis.
      */
     if (settings.nav == 'open') {
-      $('li.dhtml-menu.expanded').addClass('dhtml-menu-open');
+      $('li.dhtml-menu.expanded', context).addClass('dhtml-menu-open');
     }
 
     /* Relevant only when hovering:
@@ -55,7 +54,9 @@ Drupal.behaviors.dhtmlMenu = {
     else if (settings.nav == 'hover') {
       var freeze = false;
       $('ul.menu').mouseenter(function() {freeze = false});
+      $('ul.menu').focus(function() {freeze = false});
       $('body').mouseleave(function() {freeze = true});
+      $('body').blur(function() {freeze = true});
     }
 
     /* Relevant only on bullet-icon expansion:
@@ -63,7 +64,12 @@ Drupal.behaviors.dhtmlMenu = {
      */
     else if (settings.nav == 'bullet') {
       var bullet = $('<a href="#" class="dhtml-menu-icon"></a>');
-      var rtl = $('html').attr('dir') == 'rtl' ? Math.ceil($('.menu li').css('margin-right').replace('px', '')) + 1 : 0;
+      var rtl = 0;
+      if ($('html').attr('dir') === 'rtl') {
+        if (typeof($('.menu li').css('margin-right')) !== 'undefined') {
+          rtl = Math.ceil($('.menu li').css('margin-right').replace('px', '')) + 1;
+        }
+      }
     }
 
     /* Relevant only when adding cloned links:
@@ -75,7 +81,8 @@ Drupal.behaviors.dhtmlMenu = {
     }
 
     /* Add jQuery effects and listeners to all menu items. */
-    $('ul.menu li.dhtml-menu:not(.leaf)').each(function() {
+    $('ul.menu li.dhtml-menu:not(.leaf,.dhtml-processed)', context).each(function() {
+      $(this).addClass("dhtml-processed");
       var li = $(this);
       var link = $(this).find('a:first');
       var ul = $(this).find('ul:first');
@@ -105,7 +112,7 @@ Drupal.behaviors.dhtmlMenu = {
          * - @TODO: Explore whether "float:right" in dhtml_menu-rtl.css could solve this.
          */
         else if (settings.nav == 'bullet') {
-          li.addClass('dhtml-folder');
+          li.addClass('dhtml-folder dhtml-menu-processed');
           var b = bullet.clone().prependTo(link).click(function(e) {
             Drupal.dhtmlMenu.toggleMenu(li, link, ul);
             if (settings.effects.remember) {
@@ -125,6 +132,9 @@ Drupal.behaviors.dhtmlMenu = {
          * - Add mouse-hovering events.
          */
         else if (settings.nav == 'hover') {
+          link.focus(function(e) {
+            Drupal.dhtmlMenu.switchMenu(li, link, ul, true);
+          });
           link.mouseenter(function(e) {
               Drupal.dhtmlMenu.switchMenu(li, link, ul, true);
           });
@@ -142,6 +152,20 @@ Drupal.behaviors.dhtmlMenu = {
               }, 10);
             }
           });
+          li.blur(function(e) {
+            // Only collapse the menu if it was initially collapsed.
+            if (li.hasClass('start-collapsed')) {
+              /* As explained earlier, this event fires before the body event.
+               * We need to wait to make sure that the user isn't browsing a
+               * context menu right now, in which case the menu isn't collapsed.
+               */
+              setTimeout(function() {
+                if (!freeze) {
+                  Drupal.dhtmlMenu.switchMenu(li, link, ul, false);
+                }
+              }, 10);
+            }
+          });
         }
 
         /* When using menus that cannot collapse:
@@ -174,11 +198,16 @@ Drupal.behaviors.dhtmlMenu = {
     });
 
     // When using LTR, all icons can be shifted as one, as the text width is not relevant.
-    if (settings.nav == 'bullet' && !rtl) {
+    if (settings.nav == 'bullet' && !rtl && $('.menu li.dhtml-folder').length) {
       // Shift overlay to the left by the width of the icon and the distance between icon and text.
-      var shift = '-' + (Math.ceil(($('.menu li').css('margin-left').replace('px', ''))) + 16) + 'px';
-      // Shift the overlay using a negative left-hand offset, and the text using a negative right-hand margin.
-      $('.dhtml-menu-icon').css('left', shift).css('margin-right', shift);
+      if ($('.menu li').hasClass('margin-left')) {
+        // Saved for a later backport if needs.
+        if (typeof($('.menu li').css('margin-right')) !== 'undefined') {
+          var shift = '-' + (Math.ceil(($('.menu li').css('margin-left').replace('px', ''))) + 16) + 'px';
+          // Shift the overlay using a negative left-hand offset, and the text using a negative right-hand margin.
+          $('.dhtml-menu-icon').css('left', shift).css('margin-right', shift);
+        }
+      }
     }
   }
 }
diff --git a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.module b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.module
index b1a505da..61d19203 100644
--- a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.module
+++ b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.module
@@ -1,5 +1,4 @@
 <?php
-// $Id: dhtml_menu.module,v 1.50 2010/08/16 10:39:57 arancaytar Exp $
 
 
 /**
@@ -7,6 +6,8 @@
  * Initialization and various hook implementations.
  */
 
+require_once 'dhtml_menu.theme.inc';
+
 /**
  * Implementation of hook_help().
  */
@@ -24,7 +25,6 @@ function dhtml_menu_help($path) {
  * Adds CSS, Javascript and settings to the page.
  */
 function dhtml_menu_init() {
-  module_load_include('inc', 'dhtml_menu', 'dhtml_menu.theme');
   drupal_add_css(drupal_get_path('module', 'dhtml_menu') . '/dhtml_menu.css');
   drupal_add_js(drupal_get_path('module', 'dhtml_menu') . '/dhtml_menu.js');
   drupal_add_js(array('dhtmlMenu' => variable_get('dhtml_menu_settings')), 'setting');
diff --git a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.theme.inc b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.theme.inc
index 95cc456f..697c0667 100644
--- a/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.theme.inc
+++ b/drupal7/sites/all/modules/dhtml_menu/dhtml_menu.theme.inc
@@ -1,5 +1,4 @@
 <?php
-// $Id: dhtml_menu.theme.inc,v 1.14 2009/11/12 21:47:59 arancaytar Exp $
 
 
 /**
@@ -29,9 +28,22 @@ function dhtml_menu_preprocess_menu_link(&$variables) {
   $l = &$variables['element']['#original_link'];
 
   // Determine if the menu is blacklisted or not whitelisted.
-  $disabled = ($settings['filter']['type'] == 'blacklist') == !empty($settings['filter']['list'][$l['menu_name']]);
-  if (empty($l['menu_name']) || empty($l['mlid']) || $disabled) {
-    return;
+  // First check menu blocks.
+  if (!empty($variables['element']['#bid']['module']) &&
+      !empty($variables['element']['#bid']['delta']) &&
+      $variables['element']['#bid']['module'] == 'menu_block') {
+    $checked = !empty($settings['filter']['menu_block']['menu_block_' . $variables['element']['#bid']['delta']]);
+    if ($checked == ($settings['filter']['type'] == 'blacklist')) {
+      // This menu block is either blacklisted, or not whitelisted, hence it is disabled.
+      return;
+    }
+  }
+  // Then check menus.
+  else {
+    $disabled = ($settings['filter']['type'] == 'blacklist') == !empty($settings['filter']['list'][$l['menu_name']]);
+    if (empty($l['menu_name']) || empty($l['mlid']) || $disabled) {
+      return;
+    }
   }
 
   // Add the ID and class attributes.
@@ -46,8 +58,12 @@ function dhtml_menu_preprocess_menu_link(&$variables) {
 
   // If the current item can expand, and is neither saved as open nor in the active trail, close it.
   if ($l['has_children'] && !$l['in_active_trail'] && !in_array($variables['element']['#attributes']['id'], $cookie)) {
-    $variables['element']['#attributes']['class'][] = 'collapsed';
-    $variables['element']['#attributes']['class'][] = 'start-collapsed';
+    if (!in_array('collapsed', $variables['element']['#attributes']['class'])) {
+      $variables['element']['#attributes']['class'][] = 'collapsed';
+    }
+    if (!in_array('start-collapsed', $variables['element']['#attributes']['class'])) {
+      $variables['element']['#attributes']['class'][] = 'start-collapsed';
+    }
   }
 }
 
diff --git a/drupal7/sites/all/modules/field_permissions/field_permissions.info b/drupal7/sites/all/modules/field_permissions/field_permissions.info
index 0747a9cb..20f384fa 100644
--- a/drupal7/sites/all/modules/field_permissions/field_permissions.info
+++ b/drupal7/sites/all/modules/field_permissions/field_permissions.info
@@ -5,9 +5,8 @@ core = 7.x
 files[] = field_permissions.test
 configure = admin/reports/fields/permissions
 
-; Information added by Drupal.org packaging script on 2016-10-16
-version = "7.x-1.0"
+; Information added by Drupal.org packaging script on 2019-10-03
+version = "7.x-1.1"
 core = "7.x"
 project = "field_permissions"
-datestamp = "1476649740"
-
+datestamp = "1570136288"
diff --git a/drupal7/sites/all/modules/field_permissions/field_permissions.install b/drupal7/sites/all/modules/field_permissions/field_permissions.install
index e4fac9a3..68201c28 100644
--- a/drupal7/sites/all/modules/field_permissions/field_permissions.install
+++ b/drupal7/sites/all/modules/field_permissions/field_permissions.install
@@ -24,7 +24,7 @@ function field_permissions_uninstall() {
   // Collect all the field data that reference "field_permissions", within
   // the field_config table.
   //
-  $records = db_query("SELECT * FROM field_config WHERE data LIKE '%field_permissions%'");
+  $records = db_query("SELECT * FROM {field_config} WHERE data LIKE '%field_permissions%'");
 
   foreach ($records as $record) {
     $data = $record->data;
@@ -33,7 +33,7 @@ function field_permissions_uninstall() {
     $data = serialize($data);
 
     // Update the record.
-    db_query("UPDATE field_config SET data = :data WHERE id = :id",
+    db_query("UPDATE {field_config} SET data = :data WHERE id = :id",
       array(':data' => $data, ':id' => $record->id));
   }
 }
diff --git a/drupal7/sites/all/modules/file_entity/file_entity.admin.inc b/drupal7/sites/all/modules/file_entity/file_entity.admin.inc
index 5837c760..4efa4078 100644
--- a/drupal7/sites/all/modules/file_entity/file_entity.admin.inc
+++ b/drupal7/sites/all/modules/file_entity/file_entity.admin.inc
@@ -362,7 +362,7 @@ function file_entity_admin_files() {
       $count_query = db_select('file_usage', 'fu')
         ->fields('fu', array('fid', 'count'))
         ->condition('fu.fid', $file_result->fid, '=');
-      $count_query->addExpression('SUM(fu.count)', 'total_count');
+      $count_query->addExpression('fu.count', 'total_count');
       $count_result = $count_query->execute()->fetchAll();
 
       if (!empty($count_result[0]->total_count)) {
diff --git a/drupal7/sites/all/modules/file_entity/file_entity.field.inc b/drupal7/sites/all/modules/file_entity/file_entity.field.inc
index 8181469b..8ac06f2e 100644
--- a/drupal7/sites/all/modules/file_entity/file_entity.field.inc
+++ b/drupal7/sites/all/modules/file_entity/file_entity.field.inc
@@ -59,6 +59,7 @@ function file_entity_field_formatter_info() {
         'remote_playback' => 'remote_playback',
       ),
       'autoplay' => FALSE,
+      'playsinline' => FALSE,
       'loop' => FALSE,
       'muted' => FALSE,
       'width' => NULL,
@@ -194,6 +195,11 @@ function file_entity_field_formatter_settings_form($field, $instance, $view_mode
       '#type' => 'checkbox',
       '#default_value' => $settings['autoplay'],
     );
+    $element['playsinline'] = array(
+      '#title' => t('Plays inline'),
+      '#type' => 'checkbox',
+      '#default_value' => $settings['playsinline'],
+    );
     $element['loop'] = array(
       '#title' => t('Loop'),
       '#type' => 'checkbox',
@@ -304,6 +310,9 @@ function file_entity_field_formatter_settings_summary($field, $instance, $view_m
     if (isset($settings['autoplay'])) {
       $summary[] = t('Autoplay: %autoplay', array('%autoplay' => $settings['autoplay'] ? t('yes') : t('no')));
     }
+    if (isset($settings['playsinline'])) {
+      $summary[] = t('Plays inline: %playsinline', array('%playsinline' => $settings['playsinline'] ? t('yes') : t('no')));
+    }
     if (isset($settings['loop'])) {
       $summary[] = t('Loop: %loop', array('%loop' => $settings['loop'] ? t('yes') : t('no')));
     }
@@ -351,7 +360,8 @@ function file_entity_field_formatter_view($entity_type, $entity, $field, $instan
           if (variable_get('file_entity_protect_repeated_render', TRUE)) {
             // Protect ourselves from repeated rendering.
             static $repeated_render_depth = array();
-            $repeated_render_id = $entity_type . $field['field_name'] . $item['fid'];
+            list($entity_id) = entity_extract_ids($entity_type, $entity);
+            $repeated_render_id = $entity_type . $entity_id . $field['field_name'] . $item['fid'];
             if (isset($repeated_render_depth[$repeated_render_id])) {
               $repeated_render_depth[$repeated_render_id]++;
             }
@@ -388,6 +398,16 @@ function file_entity_field_formatter_view($entity_type, $entity, $field, $instan
           $file->referencing_entity_type = $entity_type;
           $file->referencing_field = $field['field_name'];
 
+          // Prevent recursion by checking if the referencing entity is itself
+          // do not display it again (return an empty array).
+          // This senario is created a few lines below when file_view is called
+          // it returns an array containing a referncing entity that is itself.
+          // This is likely treating the symptom and not the root cause which is
+          // probably buried in some hook_file_view() setting the referencing
+          // entity.
+          if (!empty($entity->fid) && $entity->fid === $item['fid']) {
+            return $element;
+          }
           // Untranslatable fields are rendered with no language code, fall back
           // to the content language in that case.
           $element[$delta] = file_view($file, $settings['file_view_mode'], $langcode !== LANGUAGE_NONE ? $langcode : NULL);
@@ -488,6 +508,7 @@ function file_entity_field_formatter_view($entity_type, $entity, $field, $instan
           '#controls' => $settings['controls'],
           '#controls_list' => $settings['controls_list'],
           '#autoplay' => $settings['autoplay'],
+          '#playsinline' => $settings['playsinline'],
           '#loop' => $settings['loop'],
           '#muted' => $settings['muted'],
           '#width' => $settings['width'],
diff --git a/drupal7/sites/all/modules/file_entity/file_entity.file_api.inc b/drupal7/sites/all/modules/file_entity/file_entity.file_api.inc
index ae9e06da..eb899ad9 100644
--- a/drupal7/sites/all/modules/file_entity/file_entity.file_api.inc
+++ b/drupal7/sites/all/modules/file_entity/file_entity.file_api.inc
@@ -77,6 +77,10 @@ function file_info_cache_clear() {
 function file_view_multiple($files, $view_mode = 'full', $weight = 0, $langcode = NULL) {
   $build = array();
 
+  if (empty($files)) {
+    return $build;
+  }
+
   $entities_by_view_mode = entity_view_mode_prepare('file', $files, $view_mode, $langcode);
   foreach ($entities_by_view_mode as $entity_view_mode => $entities) {
     field_attach_prepare_view('file', $entities, $entity_view_mode, $langcode);
diff --git a/drupal7/sites/all/modules/file_entity/file_entity.file_default_displays.inc b/drupal7/sites/all/modules/file_entity/file_entity.file_default_displays.inc
index a7b396b2..b46db8b8 100644
--- a/drupal7/sites/all/modules/file_entity/file_entity.file_default_displays.inc
+++ b/drupal7/sites/all/modules/file_entity/file_entity.file_default_displays.inc
@@ -153,6 +153,7 @@ function file_entity_file_default_displays() {
       'remote_playback' => 'remote_playback',
     ),
     'autoplay' => 0,
+    'playsinline' => 0,
     'loop' => 0,
     'width' => '',
     'height' => '',
@@ -181,6 +182,7 @@ function file_entity_file_default_displays() {
       'remote_playback' => 'remote_playback',
     ),
     'autoplay' => 0,
+    'playsinline' => 0,
     'loop' => 0,
     'width' => '',
     'height' => '',
diff --git a/drupal7/sites/all/modules/file_entity/file_entity.info b/drupal7/sites/all/modules/file_entity/file_entity.info
index 924d0d15..aa44b587 100644
--- a/drupal7/sites/all/modules/file_entity/file_entity.info
+++ b/drupal7/sites/all/modules/file_entity/file_entity.info
@@ -32,8 +32,8 @@ configure = admin/config/media/file-settings
 ; We have to add a fake version so Git checkouts do not fail Media dependencies
 version = 7.x-2.x-dev
 
-; Information added by Drupal.org packaging script on 2018-11-09
-version = "7.x-2.25"
+; Information added by Drupal.org packaging script on 2019-09-29
+version = "7.x-2.26"
 core = "7.x"
 project = "file_entity"
-datestamp = "1541794687"
+datestamp = "1569787388"
diff --git a/drupal7/sites/all/modules/file_entity/file_entity.module b/drupal7/sites/all/modules/file_entity/file_entity.module
index 2ca63b80..b1fe0f72 100644
--- a/drupal7/sites/all/modules/file_entity/file_entity.module
+++ b/drupal7/sites/all/modules/file_entity/file_entity.module
@@ -914,6 +914,7 @@ function file_entity_theme() {
           'remote_playback' => 'remote_playback',
         ),
         'autoplay' => FALSE,
+        'playsinline' => FALSE,
         'loop' => FALSE,
         'muted' => FALSE,
         'width' => NULL,
diff --git a/drupal7/sites/all/modules/file_entity/file_entity.pages.inc b/drupal7/sites/all/modules/file_entity/file_entity.pages.inc
index 79f1d33d..56cda6b8 100644
--- a/drupal7/sites/all/modules/file_entity/file_entity.pages.inc
+++ b/drupal7/sites/all/modules/file_entity/file_entity.pages.inc
@@ -56,6 +56,10 @@ function file_entity_download_page($file) {
     // For local files, transfer the file and do not reveal the actual URL.
     file_transfer($file->uri, $headers);
   }
+  else if (file_uri_scheme($file->uri) == 's3') {
+    $url = file_create_url($file->uri);
+    drupal_goto($url);
+  }
   else {
     // For remote files, just redirect the user to that file's actual URL.
     $headers['Location'] = file_create_url($file->uri);
@@ -282,9 +286,27 @@ function file_entity_usage_page($file) {
         $entity_uri = empty($entities[$entity_id]) ? NULL : entity_uri($entity_type, $entities[$entity_id]);
 
         // Link the label to the URI when possible.
-        if (!empty($entity_uri['path'])) {
+        if (!empty($entity_uri['path']) && $entity_type != 'paragraphs_item') {
           $entity_label = l($label, $entity_uri['path']);
         }
+        // For paragraphs items, we are searching for usages in nodes.
+        elseif ($entity_type == 'paragraphs_item') {
+          $paragraph_fields = field_read_fields(array('type' => 'paragraphs'));
+          foreach ($paragraph_fields as $paragraph_field) {
+            $field_name = $paragraph_field['field_name'];
+            $query = new EntityFieldQuery();
+            $query->entityCondition('entity_type', 'node')
+              ->fieldCondition($field_name, 'value', $entity_id, '=');
+            $nid = $query->execute();
+            if (!empty($nid)) {
+              $nid = implode(array_keys($nid['node']));
+              if ($nid) {
+                $node = node_load($nid);
+                $entity_label = l($node->title, 'node/' . $nid);
+              }
+            }
+          }
+        }
         else {
           $entity_label = check_plain($label);
         }
@@ -522,7 +544,7 @@ function file_entity_upload_destination_uri(array $params, array $data = array()
   $destination = trim($params['file_directory'], '/');
 
   // Replace tokens.
-  $destination = token_replace($destination, $data);
+  $destination = decode_entities(token_replace($destination, $data));
 
   return $params['uri_scheme'] . '://' . $destination;
 }
@@ -654,12 +676,15 @@ function file_entity_edit($form, &$form_state, $file) {
   // Add a 'replace this file' upload field if the file is writeable.
   if (file_entity_file_is_writeable($file)) {
     // Set up replacement file validation.
-    $replacement_options = array();
+    $replacement_options = !empty($form_state['#upload_options']) ? $form_state['#upload_options'] : array();
 
     // The replacement file must have an extension valid for the original type.
     $file_extensions = array();
     $file_type_name = isset($file->type) ? $file->type : file_get_type($file);
-    if ($file_type_name && ($file_type = file_type_load($file_type_name))) {
+    if (!empty($replacement_options['file_extensions'])) {
+      $file_extensions = explode(' ', $replacement_options['file_extensions']);
+    }
+    elseif ($file_type_name && ($file_type = file_type_load($file_type_name))) {
       $file_extensions = file_type_get_valid_extensions($file_type);
     }
 
@@ -1187,7 +1212,7 @@ function file_entity_upload_archive_form_submit($form, &$form_state) {
       $extract_dir = file_default_scheme() . '://' . pathinfo($archive->filename, PATHINFO_FILENAME);
       $extract_dir = file_destination($extract_dir, FILE_EXISTS_RENAME);
       if (!file_prepare_directory($extract_dir, FILE_MODIFY_PERMISSIONS | FILE_CREATE_DIRECTORY)) {
-        throw new Exception(t('Unable to prepar, e directory %dir for extraction.', array('%dir' => $extract_dir)));
+        throw new Exception(t('Unable to prepare directory %dir for extraction.', array('%dir' => $extract_dir)));
       }
 
       $archiver->extract($extract_dir);
diff --git a/drupal7/sites/all/modules/file_entity/file_entity.theme.inc b/drupal7/sites/all/modules/file_entity/file_entity.theme.inc
index f6c449a7..17f2a2e0 100644
--- a/drupal7/sites/all/modules/file_entity/file_entity.theme.inc
+++ b/drupal7/sites/all/modules/file_entity/file_entity.theme.inc
@@ -187,6 +187,8 @@ function theme_file_entity_file_audio($variables) {
  *   - muted: Boolean indicating whether or not the sound should be muted.
  *   - width: Width, in pixels, of the video player.
  *   - height: Height, in pixels, of the video player.
+ *   - playsinline: Boolean indicating if video should automatically play on
+ *     mobile (iOS).
  *
  * @ingroup themeable
  */
@@ -236,6 +238,9 @@ function theme_file_entity_file_video($variables) {
   if (!empty($variables['preload'])) {
     $video_attributes['preload'] = $variables['preload'];
   }
+  if ($variables['playsinline']) {
+    $video_attributes['playsinline'] = 'playsinline';
+  }
 
   $output .= '<video' . drupal_attributes($video_attributes) . '>';
   foreach ($files as $delta => $file) {
diff --git a/drupal7/sites/all/modules/file_entity/file_entity.tokens.inc b/drupal7/sites/all/modules/file_entity/file_entity.tokens.inc
index 63a8db63..cfef998a 100644
--- a/drupal7/sites/all/modules/file_entity/file_entity.tokens.inc
+++ b/drupal7/sites/all/modules/file_entity/file_entity.tokens.inc
@@ -185,7 +185,9 @@ function file_entity_tokens($type, $tokens, array $data = array(), array $option
             }
           }
           else {
-            $replacements[$original] = $return;
+            if (!is_null($return)) {
+              $replacements[$original] = $return;
+            }
           }
         }
 
@@ -317,8 +319,8 @@ function _file_entity_tokens_get_property($files, $property, $array_handler = 'f
       }
 
       // If file type is video
-      elseif ($file['type'] == 'video') {
-        list($provider, $filename) = explode('://v/', $file['uri']);
+      elseif ($file['type'] == 'video' && strpos($file['uri'], '://v')) {
+        list($provider, $filename) = preg_split('!://v.*/!', $file['uri']);
         $imageuri = "public://file_entity-$provider/$filename.jpg";
       }
 
diff --git a/drupal7/sites/all/modules/file_entity/tests/file_entity_test.info b/drupal7/sites/all/modules/file_entity/tests/file_entity_test.info
index 43a8c413..2784ca7a 100644
--- a/drupal7/sites/all/modules/file_entity/tests/file_entity_test.info
+++ b/drupal7/sites/all/modules/file_entity/tests/file_entity_test.info
@@ -5,8 +5,8 @@ core = 7.x
 dependencies[] = file_entity
 hidden = TRUE
 
-; Information added by Drupal.org packaging script on 2018-11-09
-version = "7.x-2.25"
+; Information added by Drupal.org packaging script on 2019-09-29
+version = "7.x-2.26"
 core = "7.x"
 project = "file_entity"
-datestamp = "1541794687"
+datestamp = "1569787388"
diff --git a/drupal7/sites/all/modules/media_youtube/media_youtube.file.inc b/drupal7/sites/all/modules/media_youtube/media_youtube.file.inc
index 6eb99520..101410c5 100644
--- a/drupal7/sites/all/modules/media_youtube/media_youtube.file.inc
+++ b/drupal7/sites/all/modules/media_youtube/media_youtube.file.inc
@@ -24,19 +24,26 @@ function media_youtube_file_operations() {
  */
 function media_youtube_cache_clear($fids) {
   $fids = array_keys($fids);
+  $folder = variable_get('youtube_thumb_dir');
 
   $query = new EntityFieldQuery();
   $results = $query
-    ->entityCondition('entity_type', 'file')
-    ->propertyCondition('uri', 'youtube:', 'STARTS_WITH')
-    ->propertyCondition('fid', $fids)
-    ->execute();
+  ->entityCondition('entity_type', 'file')
+  ->propertyCondition('uri', '%' . $folder . '%', 'LIKE')
+  ->propertyCondition('fid', $fids)
+  ->execute();
 
-  $files = file_load_multiple(array_keys($results['file']));
+  if (!empty($results)) {
+    $files = file_load_multiple(array_keys($results['file']));
 
-  foreach ($files as $file) {
-    $wrapper = file_stream_wrapper_get_instance_by_uri($file->uri);
-    $local_path = $wrapper->getLocalThumbnailPath();
-    file_unmanaged_delete($local_path);
+    foreach ($files as $file) {
+      foreach (image_styles() as $isid => $style) {
+        $path = image_style_url($isid, $file->uri);
+        if ($path) {
+          image_path_flush($path);
+        }
+      }
+      drupal_set_message(t('Refreshed thumbnail and derivatives for %filename', array('%filename' => $file->filename)));
+    }
   }
 }
diff --git a/drupal7/sites/all/modules/media_youtube/media_youtube.info b/drupal7/sites/all/modules/media_youtube/media_youtube.info
index 3a5ff93c..4318215e 100644
--- a/drupal7/sites/all/modules/media_youtube/media_youtube.info
+++ b/drupal7/sites/all/modules/media_youtube/media_youtube.info
@@ -11,8 +11,8 @@ files[] = media_youtube.test
 files[] = includes/MediaYouTubeStreamWrapper.inc
 files[] = includes/MediaInternetYouTubeHandler.inc
 
-; Information added by Drupal.org packaging script on 2019-02-14
-version = "7.x-3.8"
+; Information added by Drupal.org packaging script on 2019-10-03
+version = "7.x-3.9"
 core = "7.x"
 project = "media_youtube"
-datestamp = "1550118784"
+datestamp = "1570113188"
diff --git a/drupal7/sites/all/modules/media_youtube/tests/media_youtube_test.info b/drupal7/sites/all/modules/media_youtube/tests/media_youtube_test.info
index 0624d1c1..dcd8d97a 100644
--- a/drupal7/sites/all/modules/media_youtube/tests/media_youtube_test.info
+++ b/drupal7/sites/all/modules/media_youtube/tests/media_youtube_test.info
@@ -8,8 +8,8 @@ hidden = TRUE
 files[] = includes/MediaYouTubeTestStreamWrapper.inc
 files[] = includes/MediaYouTubeTestHandler.inc
 
-; Information added by Drupal.org packaging script on 2019-02-14
-version = "7.x-3.8"
+; Information added by Drupal.org packaging script on 2019-10-03
+version = "7.x-3.9"
 core = "7.x"
 project = "media_youtube"
-datestamp = "1550118784"
+datestamp = "1570113188"
